[
  {
    "path": ".github/ci-gradle.properties",
    "content": "#\n# Copyright 2020 The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\norg.gradle.daemon=false\norg.gradle.parallel=true\norg.gradle.jvmargs=-Xmx5120m\norg.gradle.workers.max=2\n\nkotlin.incremental=false\nkotlin.compiler.execution.strategy=in-process"
  },
  {
    "path": ".github/workflows/iosched.yaml",
    "content": "name: iosched\n\non:\n  push:\n    branches:\n      - main\n      - compose\n  pull_request:\n    branches:\n      - main\n      - compose\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    timeout-minutes: 30\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      - name: Copy CI gradle.properties\n        run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties\n\n      - name: Set up JDK 11\n        uses: actions/setup-java@v1\n        with:\n          java-version: 11\n\n      - uses: actions/cache@v2\n        with:\n          path: |\n            ~/.gradle/caches/modules-*\n            ~/.gradle/caches/jars-*\n            ~/.gradle/caches/build-cache-*\n          key: gradle-${{ hashFiles('checksum.txt') }}\n\n      - name: Build project\n        run: ./gradlew spotlessCheck assembleDebug --stacktrace\n\n      - name: Upload build reports\n        if: always()\n        uses: actions/upload-artifact@v2\n        with:\n          name: build-reports\n          path: mobile/build/reports/\n\n  test:\n    runs-on: macOS-latest # enables hardware acceleration in the virtual machine\n    timeout-minutes: 30\n    strategy:\n      matrix:\n        api-level: [23, 26, 29]\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      - name: Copy CI gradle.properties\n        run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties\n\n      - name: Set up JDK 11\n        uses: actions/setup-java@v1\n        with:\n          java-version: 11\n\n      - name: Run instrumentation tests\n        uses: reactivecircus/android-emulator-runner@v2\n        with:\n          api-level: ${{ matrix.api-level }}\n          arch: x86\n          disable-animations: true\n          script: ./gradlew mobile:cAT --stacktrace\n\n      - name: Upload test reports\n        if: always()\n        uses: actions/upload-artifact@v2\n        with:\n          name: test-reports\n          path: mobile/build/reports/\n"
  },
  {
    "path": ".gitignore",
    "content": "# built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\ngen/\nout/\nbuild/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Eclipse project files\n.classpath\n.project\n\n# Windows thumbnail db\n.DS_Store\n\n# IDEA/Android Studio project files, because\n# the project can be imported from settings.gradle.kts\n*.iml\n.idea/*\n!.idea/copyright\n!.idea/codeStyles/codeStyleConfig.xml\n\n# Gradle cache\n.gradle\n\n# Sandbox stuff\n_sandbox\n\n# Android Studio captures folder\ncaptures/\n"
  },
  {
    "path": ".idea/copyright/iosched.xml",
    "content": "<component name=\"CopyrightManager\">\n  <copyright>\n    <option name=\"notice\" value=\"Copyright &amp;#36;today.year Google LLC&#10;&#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10;    https://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License.\" />\n    <option name=\"myName\" value=\"iosched\" />\n  </copyright>\n</component>"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"iosched\" />\n</component>"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to become a contributor and submit your own code\n\n## Contributor License Agreements\n\nWe'd love to accept your sample apps and patches! Before we can take them, we\nhave to jump a couple of legal hurdles.\n\nPlease fill out either the individual or corporate Contributor License Agreement\n(CLA).\n\n  * If you are an individual writing original source code and you're sure you\n    own the intellectual property, then you'll need to sign an [individual CLA]\n    (https://developers.google.com/open-source/cla/individual).\n  * If you work for a company that wants to allow you to contribute your work,\n    then you'll need to sign a [corporate CLA]\n    (https://developers.google.com/open-source/cla/corporate).\n\nFollow either of the two links above to access the appropriate CLA and\ninstructions for how to sign and return it. Once we receive it, we'll be able to\naccept your pull requests.\n\n## Contributing A Patch\n\n1. Submit an issue describing your proposed change to the repo in question.\n1. The repo owner will respond to your issue promptly.\n1. If your proposed change is accepted, and you haven't already done so, sign a\n   Contributor License Agreement (see details above).\n1. Fork the desired repo, develop and test your code changes.\n1. Ensure that your code adheres to the existing style in the sample to which\n   you are contributing. Refer to the\n   [Google Cloud Platform Samples Style Guide]\n   (https://github.com/GoogleCloudPlatform/Template/wiki/style.html) for the\n   recommended coding standards for this organization.\n1. Ensure that your code has an appropriate set of unit tests which all pass.\n1. Submit a pull request.\n\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": "Google I/O Android App (ARCHIVED)\n======================\n\n## 2023 Update\n\n**This repository has been archived.** The Google I/O app has guided online and in-person visitors through the Google I/O conference for 10 years since 2009. It has also helped thousands of developers as an open-source sample. \n\nTo follow Modern Android Development best practices, check out the [Now in Android](https://github.com/android/nowinandroid) repository, which replaces iosched as our real-world sample. \n\n## 2021 Update\n\n**Due to global events, Google I/O 2020 was canceled and Google I/O 2021 is an online-only event, so\nthe companion app hasn't been updated since 2019. However, the `iosched` team has continued\nadding several architecture improvements to its codebase.\nThe general look and feel of the app is unchanged, and the app\nstill uses the data from Google I/O 2019.**\n\nMajor improvements implemented in 2021:\n* Migration from LiveData to Kotlin Flows to observe data.\n* Support for large screens and other form factors.\n* Migration from SharedPreferences to [Jetpack DataStore](https://developer.android.com/topic/libraries/architecture/datastore).\n* (Experimental) Partial migration to Jetpack Compose\n(in the [`compose`](https://github.com/google/iosched/tree/compose) branch)\n\n# Description\nGoogle I/O is a developer conference with several days of deep\ntechnical content featuring technical sessions and hundreds of demonstrations\nfrom developers showcasing their technologies.\n\nThis project is the Android app for the conference.\n\n# Running the app\n\nThe project contains a `staging` variant that replaces some modules at compile time so they\ndon't depend on remote services such as Firebase. This allows you to try out and test the app\nwithout the API keys.\n\n# Features\n\nThe app displays a list of conference events - sessions, office hours, app\nreviews, codelabs, etc. - and allows the user to filter these events by event\ntypes and by topics (Android, Firebase, etc.). Users can see details about\nevents, and they can star events that interest them. Conference attendees can\nreserve events to guarantee a seat.\n\nOther features include a Map of the venue, informational pages to\nguide attendees during the conference in Info, and time-relevant information\nduring the conference in Home.\n\n<div>\n  <img align=\"center\" src=\"schedule.png\" alt=\"Schedule screenshot\" height=\"640\" width=\"320\">\n</div>\n\n# Development Environment\n\nThe app is written entirely in Kotlin and uses the Gradle build system.\n\nTo build the app, use the `gradlew build` command or use \"Import Project\" in\nAndroid Studio. Android Studio Arctic Fox or newer is required and may be downloaded\n[here](https://developer.android.com/studio/preview).\n\n# Architecture\n\nThe architecture is built around\n[Android Architecture Components](https://developer.android.com/topic/libraries/architecture/)\nand follows the recommendations laid out in the\n[Guide to App Architecture](https://developer.android.com/jetpack/docs/guide). Logic is kept away\nfrom Activities and Fragments and moved to\n[ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel)s.\nData is observed using\n[Kotlin Flows](https://developer.android.com/kotlin/flow/stateflow-and-sharedflow)\nand the [Data Binding Library](https://developer.android.com/topic/libraries/data-binding/)\nbinds UI components in layouts to the app's data sources.\n\nThe Repository layer handles data operations. IOSched's data comes\nfrom a few different sources -  user data is stored in\n[Cloud Firestore](https://firebase.google.com/docs/firestore/)\n(either remotely or in\na local cache for offline use), user preferences and settings are stored in\nDataStore, conference data is stored remotely and is fetched and stored\nin memory for the app to use, etc. - and the repository modules\nare responsible for handling all data operations and abstracting the data sources\nfrom the rest of the app.\n\nA lightweight domain layer sits between the data layer\nand the presentation layer, and handles discrete pieces of business logic off\nthe UI thread. See the `.\\*UseCase.kt` files under `shared/domain` for\n[examples](https://github.com/google/iosched/search?q=UseCase&unscoped_q=UseCase).\n\nThe [Navigation component](https://developer.android.com/guide/navigation) is used\nto implement navigation in the app, handling Fragment transactions and providing a consistent\nuser experience.\n\n[Room](https://developer.android.com/jetpack/androidx/releases/room) is used\nfor Full Text Search using [Fts4](https://developer.android.com/reference/androidx/room/Fts4)\nto search for a session, speaker, or codelab.\n\nUI tests are written with [Espresso](https://developer.android.com/training/testing/espresso/)\nand unit tests use Junit4 with\n[Mockito](https://github.com/mockito/mockito) when necessary.\n\nThe [Jetpack Benchmark library](https://developer.android.com/studio/profile/benchmark)\nmakes it easy to benchmark your code from within Android Studio.\nThe library handles warmup, measures your code performance, and outputs benchmarking\nresults to the Android Studio console. We added a few benchmark tests around\ncritical paths during app startup - in particular, the parsing of the bootstrap\ndata. This enables us to automate measuring and monitoring initial startup time.\nHere is an example from a benchmark run:\n\n```\nStarted running tests\n\nConnected to process 30763 on device 'google-pixel_3'.\nbenchmark:\nbenchmark:    76,076,101 ns BootstrapConferenceDataSourceBenchmark.benchmark_json_parsing\nTests ran to completion.\n```\n\nDependency Injection is implemented with\n[Hilt](https://developer.android.com/training/dependency-injection/hilt-android). For more details\non migrating from *dagger-android* to Hilt, read the\n([migration article](https://medium.com/androiddevelopers/migrating-the-google-i-o-app-to-hilt-f3edf03affe5).\n\n[ViewPager2](https://developer.android.com/training/animation/screen-slide-2) offers enhanced functionality over the\noriginal ViewPager library, such as right-to-left and vertical orientation support.\nFor more details on migrating from ViewPager to ViewPager2, please see this\n[migration guide](https://developer.android.com/training/animation/vp2-migration).\n\n## Firebase\n\nThe app makes considerable use of the following Firebase components:\n\n- [Cloud Firestore](https://firebase.google.com/docs/firestore/) is our source\nfor all user data (events starred or reserved by a user). Firestore gave us\nautomatic sync  and also seamlessly managed offline functionality\nfor us.\n- [Firebase Cloud Functions](https://firebase.google.com/docs/functions/)\nallowed us to run backend code. The reservations feature heavily depended on Cloud\nFunctions working in conjuction with Firestore.\n- [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/concept-options)\nlet us inform the app about changes to conference data on our server.\n- [Remote Config](https://firebase.google.com/docs/remote-config/) helped us\nmanage in-app constants.\n\nFor 2020, the implementation was migrated to the Firebase Kotlin extension (KTX) libraries to\nwrite more idiomatic Kotlin code when calling Firebase APIs. To learn more,\nread this\n[Firebase blog article](https://firebase.googleblog.com/2020/03/firebase-kotlin-ga.html)\non the Firebase KTX libraries.\n\n## Kotlin\n\nThe app is entirely written in Kotlin and uses Jetpack's\n[Android Ktx extensions](https://developer.android.com/kotlin/ktx).\n\nAsynchronous tasks are handled with\n[coroutines](https://developer.android.com/kotlin/coroutines). Coroutines allow for simple\nand safe management of one-shot operations as well as building and consuming streams of data using\n[Kotlin Flows](https://developer.android.com/kotlin/flow).\n\nAll build scripts are written with the\n[Kotlin DSL](https://docs.gradle.org/current/userguide/kotlin_dsl.html).\n\n# Copyright\n\n    Copyright 2014 Google Inc. All rights reserved.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS 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"
  },
  {
    "path": "androidTest-shared/build.gradle.kts",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id(\"com.android.library\")\n    kotlin(\"android\")\n}\n\nandroid {\n    compileSdk = Versions.COMPILE_SDK\n    defaultConfig {\n        minSdk = Versions.MIN_SDK\n        targetSdk = Versions.TARGET_SDK\n\n        testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    lint {\n        // Version changes are beyond our control, so don't warn. The IDE will still mark these.\n        disable += \"GradleDependency\"\n    }\n}\n\ndependencies {\n    api(platform(project(\":depconstraints\")))\n\n    implementation(Libs.KOTLIN_STDLIB)\n\n    // Architecture Components\n    implementation(Libs.LIFECYCLE_LIVE_DATA_KTX)\n    implementation(Libs.LIFECYCLE_VIEW_MODEL_KTX)\n}\n"
  },
  {
    "path": "androidTest-shared/src/main/AndroidManifest.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.google.samples.apps.iosched.androidtest.util\" />\n"
  },
  {
    "path": "androidTest-shared/src/main/java/com/google/samples/apps/iosched/androidtest/util/LiveDataTestUtil.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.androidtest.util\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.Observer\nimport java.util.concurrent.CountDownLatch\nimport java.util.concurrent.TimeUnit\n\n/**\n * Safely handles observables from LiveData for testing.\n */\nobject LiveDataTestUtil {\n\n    /**\n     * Gets the value of a LiveData safely.\n     */\n    @Throws(InterruptedException::class)\n    fun <T> getValue(liveData: LiveData<T>): T? {\n        var data: T? = null\n        val latch = CountDownLatch(1)\n        val observer = object : Observer<T> {\n            override fun onChanged(o: T?) {\n                data = o\n                latch.countDown()\n                liveData.removeObserver(this)\n            }\n        }\n        liveData.observeForever(observer)\n        latch.await(2, TimeUnit.SECONDS)\n\n        return data\n    }\n}\n\n/**\n * Observes a [LiveData] until the `block` is done executing.\n */\nfun <T> LiveData<T>.observeForTesting(block: () -> Unit) {\n    val observer = Observer<T> { }\n    try {\n        observeForever(observer)\n        block()\n    } finally {\n        removeObserver(observer)\n    }\n}\n"
  },
  {
    "path": "ar/build.gradle.kts",
    "content": "/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id(\"com.android.library\")\n    kotlin(\"android\")\n    kotlin(\"kapt\")\n}\n\nandroid {\n    compileSdk = Versions.COMPILE_SDK\n    defaultConfig {\n        minSdk = Versions.MIN_SDK\n        targetSdk = Versions.TARGET_SDK\n        testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles(\"consumer-proguard-rules.pro\")\n    }\n\n    buildTypes {\n        maybeCreate(\"staging\")\n        getByName(\"staging\") {\n            initWith(getByName(\"debug\"))\n\n            // Specifies a sorted list of fallback build types that the\n            // plugin should try to use when a dependency does not include a\n            // \"staging\" build type.\n            // Used with :test-shared, which doesn't have a staging variant.\n            matchingFallbacks += listOf(\"debug\")\n        }\n        maybeCreate(\"benchmark\")\n        getByName(\"benchmark\") {\n            initWith(getByName(\"staging\"))\n            // Specifies a sorted list of fallback build types that the\n            // plugin should try to use when a dependency does not include a\n            // \"staging\" build type.\n            // Used with :test-shared, which doesn't have a staging variant.\n            matchingFallbacks += listOf(\"staging\", \"debug\")\n        }\n    }\n\n    lint {\n        disable += \"InvalidPackage\"\n        // Version changes are beyond our control, so don't warn. The IDE will still mark these.\n        disable += \"GradleDependency\"\n    }\n\n    // Required by ArWebView\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_1_8\n        targetCompatibility = JavaVersion.VERSION_1_8\n    }\n}\n\ndependencies {\n    api(platform(project(\":depconstraints\")))\n    implementation(project(\":shared\"))\n    implementation(Libs.APPCOMPAT)\n    implementation(Libs.ARCORE)\n    implementation(Libs.GOOGLE_PLAY_SERVICES_VISION)\n    implementation(Libs.KOTLIN_STDLIB)\n}\n"
  },
  {
    "path": "ar/consumer-proguard-rules.pro",
    "content": "# Copyright 2019 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Proguard configuration for the AR feature\n\n-keep class com.google.ar.web.** { *; }\n-dontwarn com.google.ar.web.**\n"
  },
  {
    "path": "ar/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.google.samples.apps.iosched.ar\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.CAMERA\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n\n    <application>\n\n        <activity android:name=\".ArActivity\"\n            android:screenOrientation=\"portrait\"\n            android:theme=\"@style/AppTheme.NoActionBar.BlackStatusBar\" />\n    </application>\n</manifest>\n"
  },
  {
    "path": "ar/src/main/java/com/google/samples/apps/iosched/ar/ArActivity.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ar\n\nimport android.os.Bundle\nimport android.view.WindowManager\nimport android.webkit.WebView\nimport android.webkit.WebViewClient\nimport androidx.appcompat.app.AppCompatActivity\nimport com.google.samples.apps.iosched.shared.domain.ar.ArConstants\n\nclass ArActivity : AppCompatActivity() {\n\n    private lateinit var arWebView: WebView\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val pinnedSessionsJson =\n            intent?.extras?.getString(ArConstants.PINNED_SESSIONS_JSON_KEY, \"\") ?: \"\"\n        val canSignedInUserDemoAr =\n            intent?.extras?.getBoolean(ArConstants.CAN_SIGNED_IN_USER_DEMO_AR, false) ?: false\n\n        arWebView = WebView(this)\n        setContentView(arWebView)\n        arWebView.apply {\n            webViewClient =\n                ArWebViewClient(pinnedSessionsJson, canSignedInUserDemoAr)\n            settings.apply {\n                mediaPlaybackRequiresUserGesture = false\n                domStorageEnabled = true\n                databaseEnabled = true\n            }\n            // Loading a single entry point because all the user flow happens in JavaScript from the\n            // teaser page and requesting ARCore apk and camera permission\n            loadUrl(\"https://sp-io2019.appspot.com/\")\n        }\n        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n    }\n\n    override fun onRestart() {\n        super.onRestart()\n        arWebView.reload()\n    }\n\n    override fun onStop() {\n        super.onStop()\n        val addOverlayScript =\n            \"if (window.app && window.app.addIntroOverlay) \" +\n                \"window.app.addIntroOverlay();\"\n        arWebView.evaluateJavascript(addOverlayScript) {}\n    }\n\n    override fun onDestroy() {\n        arWebView.destroy()\n        window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n        super.onDestroy()\n    }\n\n    /**\n     * WebViewClient that sends the pinned sessions as json to the WebView.\n     * Defining it as a class otherwise an anonymous class was stripped from proguard.\n     */\n    private class ArWebViewClient(\n        val json: String,\n        val canDemoAr: Boolean\n    ) : WebViewClient() {\n\n        override fun onPageFinished(view: WebView?, url: String?) {\n            super.onPageFinished(view, url)\n            val evalAgendaScript =\n                \"if (window.app && window.app.sendIOAppUserAgenda) \" +\n                    \"window.app.sendIOAppUserAgenda('$json');\"\n            view?.evaluateJavascript(evalAgendaScript) {}\n            if (canDemoAr) {\n                val evalSetDebugUserScript = \"if (window.app && window.app.setDebugUser) \" +\n                    \"window.app.setDebugUser()\"\n                view?.evaluateJavascript(evalSetDebugUserScript) {}\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ar/src/main/res/values/styles.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<resources>\n\n    <style name=\"AppTheme.NoActionBar.BlackStatusBar\" parent=\"@style/Theme.AppCompat.NoActionBar\">\n        <item name=\"android:statusBarColor\">@color/black</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "benchmark/build.gradle.kts",
    "content": "/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id(\"com.android.library\")\n    kotlin(\"android\")\n    id(\"androidx.benchmark\")\n    kotlin(\"kapt\")\n}\n\nandroid {\n    compileSdk = Versions.COMPILE_SDK\n    defaultConfig {\n        minSdk = Versions.MIN_SDK\n        targetSdk = Versions.TARGET_SDK\n        testInstrumentationRunner = \"androidx.benchmark.junit4.AndroidBenchmarkRunner\"\n    }\n\n    buildTypes {\n        maybeCreate(\"benchmark\")\n        getByName(\"benchmark\") {\n            initWith(getByName(\"release\"))\n            signingConfig = signingConfigs.getByName(\"debug\")\n            isDefault = true\n            isMinifyEnabled = true\n            proguardFiles(getDefaultProguardFile(\"proguard-android-optimize.txt\"))\n\n            // Specifies a sorted list of fallback build types that the\n            // plugin should try to use when a dependency does not include a\n            // \"staging\" build type.\n            // Used with :test-shared, which doesn't have a staging variant.\n            matchingFallbacks += listOf(\"staging\", \"debug\")\n        }\n    }\n\n    testBuildType = \"benchmark\"\n\n    // To avoid the compile error from benchmarkRule.measureRepeated\n    // Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM\n    // target 1.6\n    kotlinOptions.jvmTarget = \"1.8\"\n\n    packagingOptions {\n        resources.excludes += \"META-INF/AL2.0\"\n        resources.excludes += \"META-INF/LGPL2.1\"\n    }\n}\n\ndependencies {\n    androidTestImplementation(platform(project(\":depconstraints\")))\n    kapt(platform(project(\":depconstraints\")))\n    androidTestImplementation(project(\":model\"))\n    androidTestImplementation(project(\":shared\"))\n    androidTestImplementation(project(\":test-shared\"))\n    androidTestImplementation(project(\":androidTest-shared\"))\n\n    // ThreeTenBP is for Date and time API for Java.\n    androidTestImplementation(Libs.THREETENABP)\n\n    // Instrumentation tests\n    androidTestImplementation(Libs.HAMCREST)\n    androidTestImplementation(Libs.EXT_JUNIT)\n    androidTestImplementation(Libs.RUNNER)\n    androidTestImplementation(Libs.RULES)\n\n    // Benchmark testing\n    androidTestImplementation(Libs.BENCHMARK)\n}\n"
  },
  {
    "path": "benchmark/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.google.samples.apps.iosched.benchmark\">\n\n    <!-- Important: disable debuggable for accurate performance results. -->\n    <application\n        android:debuggable=\"false\"\n        tools:ignore=\"HardcodedDebugMode\"\n        tools:replace=\"android:debuggable\">\n\n        <profileable android:shell=\"true\" />\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "benchmark/src/androidTest/java/com/google/samples/apps/iosched/benchmark/BootstrapConferenceDataSourceBenchmark.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.benchmark\n\nimport androidx.benchmark.junit4.BenchmarkRule\nimport androidx.benchmark.junit4.measureRepeated\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.shared.data.BootstrapConferenceDataSource\nimport org.hamcrest.core.IsNot.not\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Benchmark test for parsing offline data. To keep startup times optimized, this benchmark\n * test is used to monitor potential hot spots when the app first loads content.\n */\n@RunWith(AndroidJUnit4::class)\nclass BootstrapConferenceDataSourceBenchmark {\n    @get:Rule\n    val benchmarkRule = BenchmarkRule()\n\n    // Parsing JSON data can be quite time consuming. We have custom deserializers to improve the\n    // performance. We parse this data when the app starts up which is a critical user path. This\n    // benchmark is to ensure we maintain the level of quality around bootstrapping data to minimize\n    // the app startup latency. Note that loadAndParseBootstrapData() also normalizes after it has\n    // been parsed.\n    @Test\n    fun benchmark_json_parsing() = benchmarkRule.measureRepeated {\n        BootstrapConferenceDataSource.loadAndParseBootstrapData()\n    }\n}\n"
  },
  {
    "path": "benchmark/src/androidTest/java/com/google/samples/apps/iosched/benchmark/LoadAgendaUseCaseBenchmark.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.benchmark\n\nimport androidx.benchmark.junit4.BenchmarkRule\nimport androidx.benchmark.junit4.measureRepeated\nimport androidx.test.core.app.ApplicationProvider\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.shared.data.FakeAppConfigDataSource\nimport com.google.samples.apps.iosched.shared.data.agenda.DefaultAgendaRepository\nimport com.google.samples.apps.iosched.shared.domain.agenda.LoadAgendaUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.result.succeeded\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.jakewharton.threetenabp.AndroidThreeTen\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.hamcrest.collection.IsCollectionWithSize.hasSize\nimport org.hamcrest.core.Is.`is`\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Simple benchmark test for loading the agenda. To keep startup times optimized, this benchmark\n * test is used to monitor potential hot spots when the app first loads content.\n */\n@RunWith(AndroidJUnit4::class)\nclass LoadAgendaUseCaseBenchmark {\n    @get:Rule\n    val benchmarkRule = BenchmarkRule()\n\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun loadAgendaUseCase() {\n        AndroidThreeTen.init(ApplicationProvider.getApplicationContext())\n        // Using FakeAppConfigDataSource to stub out the network call to Firebase's remote config.\n        // The repository and useCase do not perform any caching so the creation of the useCase\n        // occurs before measuring to focus the benchmark on the creation of the agenda.\n        val useCase = LoadAgendaUseCase(\n            DefaultAgendaRepository(FakeAppConfigDataSource()),\n            coroutineRule.testDispatcher\n        )\n\n        benchmarkRule.measureRepeated {\n            runTest {\n                val result: Result<List<Block>> = useCase.invoke(parameters = true)\n\n                assertThat(result.succeeded, `is`(true))\n                assertThat(result.data, hasSize(29))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "benchmark/src/main/AndroidManifest.xml",
    "content": "<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.google.samples.apps.iosched.benchmark\" />\n"
  },
  {
    "path": "build.gradle.kts",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Top-level build file where you can add configuration options common to all\n// sub-projects/modules.\nimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n\nbuildscript {\n\n    repositories {\n        google()\n        mavenCentral()\n        jcenter()\n        // Android Build Server\n        maven { url = uri(\"../iosched-prebuilts/m2repository\") }\n    }\n    dependencies {\n        classpath(\"com.android.tools.build:gradle:${Versions.ANDROID_GRADLE_PLUGIN}\")\n        classpath(\"org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.KOTLIN}\")\n        classpath(\"com.google.gms:google-services:${Versions.GOOGLE_SERVICES}\")\n        classpath(\"androidx.benchmark:benchmark-gradle-plugin:${Versions.BENCHMARK}\")\n        classpath(\"androidx.navigation:navigation-safe-args-gradle-plugin:${Versions.NAVIGATION}\")\n        classpath(\"com.google.firebase:firebase-crashlytics-gradle:${Versions.FIREBASE_CRASHLYTICS}\")\n        classpath(\"com.google.dagger:hilt-android-gradle-plugin:${Versions.HILT_AGP}\")\n    }\n}\n\nplugins {\n    id(\"com.diffplug.gradle.spotless\") version \"3.27.1\"\n}\n\nallprojects {\n    repositories {\n        google()\n        mavenCentral()\n        jcenter()\n\n        // For Android Build Server\n        // - Material Design Components\n        maven { url = uri(\"${project.rootDir}/../iosched-prebuilts/repository\") }\n        // - Other dependencies\n        maven { url = uri(\"${project.rootDir}/../iosched-prebuilts/m2repository\") }\n        // - Support Libraries, etc\n        maven {\n            url = uri(\"${project.rootDir}/../../../prebuilts/fullsdk/linux/extras/support/m2repository\")\n        }\n\n        flatDir {\n            dirs = setOf(file(\"libs\"), project(\":ar\").file(\"libs\"))\n        }\n    }\n}\n\nsubprojects {\n    apply(plugin = \"com.diffplug.gradle.spotless\")\n    val ktlintVer = \"0.40.0\"\n    spotless {\n        kotlin {\n            target(\"**/*.kt\")\n            ktlint(ktlintVer).userData(\n                mapOf(\"max_line_length\" to \"100\", \"disabled_rules\" to \"import-ordering\")\n            )\n            licenseHeaderFile(project.rootProject.file(\"copyright.kt\"))\n        }\n        kotlinGradle {\n            // same as kotlin, but for .gradle.kts files (defaults to '*.gradle.kts')\n            target(\"**/*.gradle.kts\")\n            ktlint(ktlintVer)\n            licenseHeaderFile(project.rootProject.file(\"copyright.kt\"), \"(plugins |import |include)\")\n        }\n    }\n\n    // `spotlessCheck` runs when a build includes `check`, notably during presubmit. In these cases\n    // we prefer `spotlessCheck` run as early as possible since it fails in seconds. This prevents a\n    // build from running for several minutes doing other intensive tasks (resource processing, code\n    // generation, compilation, etc) only to fail on a formatting nit.\n    // Using `mustRunAfter` avoids creating a task dependency. The order is enforced only if\n    // `spotlessCheck` is already scheduled to run, so we can still build and launch from the IDE\n    // while the code is \"dirty\".\n    tasks.whenTaskAdded {\n        if (name == \"preBuild\") {\n            mustRunAfter(\"spotlessCheck\")\n        }\n    }\n\n    // TODO: Remove when the Coroutine and Flow APIs leave experimental/internal/preview.\n    tasks.withType<KotlinCompile>().configureEach {\n        kotlinOptions.freeCompilerArgs +=\n            \"-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi\"\n    }\n}\n"
  },
  {
    "path": "buildSrc/build.gradle.kts",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    `kotlin-dsl`\n}\n\nrepositories {\n    gradlePluginPortal()\n}"
  },
  {
    "path": "buildSrc/src/main/java/Libs.kt",
    "content": "/*\n * Copyright 2020 Google LLC.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS 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\nobject Libs {\n    const val ACTIVITY_COMPOSE = \"androidx.activity:activity-compose\"\n    const val ACTIVITY_KTX = \"androidx.activity:activity-ktx\"\n    const val APPCOMPAT = \"androidx.appcompat:appcompat\"\n    const val APP_STARTUP = \"androidx.startup:startup-runtime\"\n    const val ARCH_TESTING = \"androidx.arch.core:core-testing\"\n    const val ARCORE = \"com.google.ar:core\"\n    const val BENCHMARK = \"androidx.benchmark:benchmark-junit4\"\n    const val BENCHMARK_MACRO = \"androidx.benchmark:benchmark-macro-junit4\"\n    const val BROWSER = \"androidx.browser:browser\"\n    const val CARDVIEW = \"androidx.cardview:cardview\"\n    const val CONSTRAINT_LAYOUT = \"androidx.constraintlayout:constraintlayout\"\n    const val CORE_KTX = \"androidx.core:core-ktx\"\n    const val CRASHLYTICS = \"com.google.firebase:firebase-crashlytics\"\n    const val COMPOSE_ANIMATION = \"androidx.compose.animation:animation\"\n    const val COMPOSE_MATERIAL = \"androidx.compose.material:material\"\n    const val COMPOSE_RUNTIME = \"androidx.compose.runtime:runtime\"\n    const val COMPOSE_TEST = \"androidx.compose.ui:ui-test-junit4\"\n    const val COMPOSE_THEME_ADAPTER = \"com.google.android.material:compose-theme-adapter\"\n    const val COMPOSE_TOOLING = \"androidx.compose.ui:ui-tooling\"\n    const val COROUTINES = \"org.jetbrains.kotlinx:kotlinx-coroutines-core\"\n    const val COROUTINES_TEST = \"org.jetbrains.kotlinx:kotlinx-coroutines-test\"\n    const val DATA_STORE_PREFERENCES = \"androidx.datastore:datastore-preferences\"\n    const val DRAWER_LAYOUT = \"androidx.drawerlayout:drawerlayout\"\n    const val ESPRESSO_CONTRIB = \"androidx.test.espresso:espresso-contrib\"\n    const val ESPRESSO_CORE = \"androidx.test.espresso:espresso-core\"\n    const val EXT_JUNIT = \"androidx.test.ext:junit\"\n    const val FIREBASE_ANALYTICS = \"com.google.firebase:firebase-analytics-ktx\"\n    const val FIREBASE_AUTH = \"com.google.firebase:firebase-auth-ktx\"\n    const val FIREBASE_CONFIG = \"com.google.firebase:firebase-config-ktx\"\n    const val FIREBASE_FIRESTORE = \"com.google.firebase:firebase-firestore-ktx\"\n    const val FIREBASE_FUNCTIONS = \"com.google.firebase:firebase-functions-ktx\"\n    const val FIREBASE_MESSAGING = \"com.google.firebase:firebase-messaging\"\n    const val FIREBASE_UI_AUTH = \"com.firebaseui:firebase-ui-auth\"\n    const val FLEXBOX = \"com.google.android:flexbox\"\n    const val FRAGMENT_KTX = \"androidx.fragment:fragment-ktx\"\n    const val FRAGMENT_TEST = \"androidx.fragment:fragment-testing\"\n    const val GLIDE = \"com.github.bumptech.glide:glide\"\n    const val GLIDE_COMPILER = \"com.github.bumptech.glide:compiler\"\n    const val GOOGLE_MAP_UTILS_KTX = \"com.google.maps.android:maps-utils-ktx\"\n    const val GOOGLE_PLAY_SERVICES_MAPS_KTX = \"com.google.maps.android:maps-ktx\"\n    const val GOOGLE_PLAY_SERVICES_VISION = \"com.google.android.gms:play-services-vision\"\n    const val GSON = \"com.google.code.gson:gson\"\n    const val HAMCREST = \"org.hamcrest:hamcrest-library\"\n    const val HILT_ANDROID = \"com.google.dagger:hilt-android\"\n    const val HILT_COMPILER = \"com.google.dagger:hilt-android-compiler\"\n    const val HILT_TESTING = \"com.google.dagger:hilt-android-testing\"\n    const val INK_PAGE_INDICATOR = \"com.pacioianu.david:ink-page-indicator\"\n    const val JUNIT = \"junit:junit\"\n    const val KOTLIN_STDLIB = \"org.jetbrains.kotlin:kotlin-stdlib-jdk7\"\n    const val LIFECYCLE_COMPILER = \"androidx.lifecycle:lifecycle-compiler\"\n    const val LIFECYCLE_LIVE_DATA_KTX = \"androidx.lifecycle:lifecycle-livedata-ktx\"\n    const val LIFECYCLE_RUNTIME_KTX = \"androidx.lifecycle:lifecycle-runtime-ktx\"\n    const val LIFECYCLE_VIEW_MODEL_KTX = \"androidx.lifecycle:lifecycle-viewmodel-ktx\"\n    const val LOTTIE = \"com.airbnb.android:lottie\"\n    const val MATERIAL = \"com.google.android.material:material\"\n    const val MDC_COMPOSE_THEME_ADAPTER = \"com.google.android.material:compose-theme-adapter\"\n    const val MOCKITO_CORE = \"org.mockito:mockito-core\"\n    const val MOCKITO_KOTLIN = \"com.nhaarman:mockito-kotlin\"\n    const val NAVIGATION_FRAGMENT_KTX = \"androidx.navigation:navigation-fragment-ktx\"\n    const val NAVIGATION_UI_KTX = \"androidx.navigation:navigation-ui-ktx\"\n    const val OKHTTP = \"com.squareup.okhttp3:okhttp\"\n    const val OKHTTP_LOGGING_INTERCEPTOR = \"com.squareup.okhttp3:logging-interceptor\"\n    const val OKIO = \"com.squareup.okio:okio\"\n    const val PROFILE_INSTALLER = \"androidx.profileinstaller:profileinstaller\"\n    const val ROOM_COMPILER = \"androidx.room:room-compiler\"\n    const val ROOM_KTX = \"androidx.room:room-ktx\"\n    const val ROOM_RUNTIME = \"androidx.room:room-runtime\"\n    const val RULES = \"androidx.test:rules\"\n    const val RUNNER = \"androidx.test:runner\"\n    const val SLIDING_PANE_LAYOUT = \"androidx.slidingpanelayout:slidingpanelayout\"\n    const val THREETENABP = \"com.jakewharton.threetenabp:threetenabp\"\n    const val THREETENBP = \"org.threeten:threetenbp\"\n    const val TIMBER = \"com.jakewharton.timber:timber\"\n    const val UI_AUTOMATOR = \"androidx.test.uiautomator:uiautomator\"\n    const val VIEWMODEL_COMPOSE = \"androidx.lifecycle:lifecycle-viewmodel-compose\"\n    const val VIEWPAGER2 = \"androidx.viewpager2:viewpager2\"\n}\n"
  },
  {
    "path": "buildSrc/src/main/java/Versions.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nobject Versions {\n    val versionName = \"7.0.15\" // X.Y.Z; X = Major, Y = minor, Z = Patch level\n    private val versionCodeBase = 70150 // XYYZZM; M = Module (tv, mobile)\n    val versionCodeMobile = versionCodeBase + 3\n\n    const val COMPILE_SDK = 31\n    const val TARGET_SDK = 30\n    const val MIN_SDK = 21\n\n    const val ANDROID_GRADLE_PLUGIN = \"7.2.0\"\n    const val BENCHMARK = \"1.1.0-rc02\"\n    const val COMPOSE = \"1.1.1\"\n    const val FIREBASE_CRASHLYTICS = \"2.3.0\"\n    const val GOOGLE_SERVICES = \"4.3.3\"\n    const val HILT_AGP = \"2.40.5\"\n    const val KOTLIN = \"1.6.10\"\n    const val NAVIGATION = \"2.4.1\"\n    const val PROFILE_INSTALLER = \"1.2.0-beta01\"\n\n    // TODO: Remove this once the version for\n    //  \"org.threeten:threetenbp:${Versions.threetenbp}:no-tzdb\" using java-platform in the\n    //  depconstraints/build.gradle.kts is defined\n    const val THREETENBP = \"1.3.6\"\n}\n"
  },
  {
    "path": "build_android_release.sh",
    "content": "#!/usr/bin/env bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\nMOBILE_OUT=$DIR/mobile/build/outputs\n\nexport ANDROID_HOME=\"$(cd $DIR/../../../prebuilts/fullsdk/linux && pwd )\"\n\necho \"ANDROID_HOME=$ANDROID_HOME\"\ncd $DIR\n\n# Build\nGRADLE_PARAMS=\" --stacktrace\"\n$DIR/gradlew clean assemble ${GRADLE_PARAMS}\nBUILD_RESULT=$?\n\n# Debug\ncp $MOBILE_OUT/apk/debug/mobile-debug.apk $DIST_DIR\n\n# Staging\ncp $MOBILE_OUT/apk/staging/mobile-staging.apk $DIST_DIR\n\n# Release\ncp $MOBILE_OUT/apk/release/mobile-release-unsigned.apk $DIST_DIR/mobile-release.apk\ncp $MOBILE_OUT/mapping/release/mapping.txt $DIST_DIR/mobile-release-apk-mapping.txt\n\n# Build App Bundles\n# Don't clean here, otherwise all apks are gone.\n$DIR/gradlew bundle ${GRADLE_PARAMS}\n\n# Debug\ncp $MOBILE_OUT/bundle/debug/mobile-debug.aab $DIST_DIR/mobile-debug.aab\n\n# Staging\ncp $MOBILE_OUT/bundle/staging/mobile-staging.aab $DIST_DIR/mobile-staging.aab\n\n# Release\ncp $MOBILE_OUT/bundle/release/mobile-release.aab $DIST_DIR/mobile-release.aab\ncp $MOBILE_OUT/mapping/release/mapping.txt $DIST_DIR/mobile-release-aab-mapping.txt\nBUILD_RESULT=$?\n\nexit $BUILD_RESULT\n"
  },
  {
    "path": "copyright.kt",
    "content": "/*\n * Copyright $YEAR Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n"
  },
  {
    "path": "depconstraints/build.gradle.kts",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id(\"java-platform\")\n    id(\"maven-publish\")\n}\n\nval appcompat = \"1.1.0\"\nval activity = \"1.2.0-rc01\"\nval activityCompose = \"1.3.0-alpha03\"\nval appStartup = \"1.1.0-beta01\"\nval cardview = \"1.0.0\"\nval archTesting = \"2.0.0\"\nval arcore = \"1.7.0\"\nval benchmark = Versions.BENCHMARK\nval browser = \"1.0.0\"\nval compose = Versions.COMPOSE\nval composeMaterial = \"1.1.0\"\nval constraintLayout = \"1.1.3\"\nval core = \"1.3.2\"\nval coroutines = \"1.6.0\"\nval coroutinesTest = \"1.6.0\"\nval crashlytics = \"17.2.2\"\nval dataStore = \"1.0.0-beta01\"\nval drawerLayout = \"1.1.0-rc01\"\nval espresso = \"3.1.1\"\nval firebaseAnalytics = \"17.4.0\"\nval firebaseAuth = \"19.3.1\"\nval firebaseConfig = \"19.1.4\"\nval firebaseFirestore = \"21.4.3\"\nval firebaseFunctions = \"19.0.2\"\nval firebaseMessaging = \"20.1.6\"\nval firebaseUi = \"4.0.0\"\nval flexbox = \"1.1.0\"\nval fragment = \"1.3.0\"\nval glide = \"4.9.0\"\nval googlePlayServicesMapsKtx = \"3.0.0\"\nval googlePlayServicesVision = \"17.0.2\"\nval gson = \"2.8.6\"\nval hamcrest = \"1.3\"\nval hilt = Versions.HILT_AGP\nval junit = \"4.13.2\"\nval junitExt = \"1.1.1\"\nval lifecycle = \"2.4.1\"\nval lottie = \"3.0.0\"\nval material = \"1.4.0-beta01\"\nval mockito = \"3.3.1\"\nval mockitoKotlin = \"1.5.0\"\nval okhttp = \"3.10.0\"\nval okio = \"1.14.0\"\nval pageIndicator = \"1.3.0\"\nval playCore = \"1.6.5\"\nval profileInstaller = Versions.PROFILE_INSTALLER\nval room = \"2.4.2\"\nval rules = \"1.1.1\"\nval runner = \"1.2.0\"\nval slidingpanelayout = \"1.2.0-alpha01\"\nval threetenabp = \"1.0.5\"\nval timber = \"5.0.1\"\nval viewpager2 = \"1.0.0\"\nval viewModelCompose = \"1.0.0-alpha02\"\nval uiAutomator = \"2.2.0\"\n\ndependencies {\n    constraints {\n        api(\"${Libs.ACTIVITY_COMPOSE}:$activityCompose\")\n        api(\"${Libs.ACTIVITY_KTX}:$activity\")\n        api(\"${Libs.APPCOMPAT}:$appcompat\")\n        api(\"${Libs.APP_STARTUP}:$appStartup\")\n        api(\"${Libs.CARDVIEW}:$cardview\")\n        api(\"${Libs.ARCH_TESTING}:$archTesting\")\n        api(\"${Libs.ARCORE}:$arcore\")\n        api(\"${Libs.BENCHMARK}:$benchmark\")\n        api(\"${Libs.BENCHMARK_MACRO}:$benchmark\")\n        api(\"${Libs.BROWSER}:$browser\")\n        api(\"${Libs.COMPOSE_ANIMATION}:$compose\")\n        api(\"${Libs.COMPOSE_MATERIAL}:$compose\")\n        api(\"${Libs.COMPOSE_RUNTIME}:$compose\")\n        api(\"${Libs.COMPOSE_TEST}:$compose\")\n        api(\"${Libs.COMPOSE_THEME_ADAPTER}:$composeMaterial\")\n        api(\"${Libs.COMPOSE_TOOLING}:$compose\")\n        api(\"${Libs.CONSTRAINT_LAYOUT}:$constraintLayout\")\n        api(\"${Libs.CORE_KTX}:$core\")\n        api(\"${Libs.COROUTINES}:$coroutines\")\n        api(\"${Libs.COROUTINES_TEST}:$coroutinesTest\")\n        api(\"${Libs.CRASHLYTICS}:$crashlytics\")\n        api(\"${Libs.DATA_STORE_PREFERENCES}:$dataStore\")\n        api(\"${Libs.DRAWER_LAYOUT}:$drawerLayout\")\n        api(\"${Libs.ESPRESSO_CORE}:$espresso\")\n        api(\"${Libs.ESPRESSO_CONTRIB}:$espresso\")\n        api(\"${Libs.FIREBASE_AUTH}:$firebaseAuth\")\n        api(\"${Libs.FIREBASE_CONFIG}:$firebaseConfig\")\n        api(\"${Libs.FIREBASE_ANALYTICS}:$firebaseAnalytics\")\n        api(\"${Libs.FIREBASE_FIRESTORE}:$firebaseFirestore\")\n        api(\"${Libs.FIREBASE_FUNCTIONS}:$firebaseFunctions\")\n        api(\"${Libs.FIREBASE_MESSAGING}:$firebaseMessaging\")\n        api(\"${Libs.FIREBASE_UI_AUTH}:$firebaseUi\")\n        api(\"${Libs.FLEXBOX}:$flexbox\")\n        api(\"${Libs.FRAGMENT_KTX}:$fragment\")\n        api(\"${Libs.FRAGMENT_TEST}:$fragment\")\n        api(\"${Libs.GLIDE}:$glide\")\n        api(\"${Libs.GLIDE_COMPILER}:$glide\")\n        api(\"${Libs.GOOGLE_MAP_UTILS_KTX}:$googlePlayServicesMapsKtx\")\n        api(\"${Libs.GOOGLE_PLAY_SERVICES_MAPS_KTX}:$googlePlayServicesMapsKtx\")\n        api(\"${Libs.GOOGLE_PLAY_SERVICES_VISION}:$googlePlayServicesVision\")\n        api(\"${Libs.GSON}:$gson\")\n        api(\"${Libs.HAMCREST}:$hamcrest\")\n        api(\"${Libs.HILT_ANDROID}:$hilt\")\n        api(\"${Libs.HILT_COMPILER}:$hilt\")\n        api(\"${Libs.HILT_TESTING}:$hilt\")\n        api(\"${Libs.JUNIT}:$junit\")\n        api(\"${Libs.EXT_JUNIT}:$junitExt\")\n        api(\"${Libs.KOTLIN_STDLIB}:${Versions.KOTLIN}\")\n        api(\"${Libs.LIFECYCLE_COMPILER}:$lifecycle\")\n        api(\"${Libs.LIFECYCLE_LIVE_DATA_KTX}:$lifecycle\")\n        api(\"${Libs.LIFECYCLE_RUNTIME_KTX}:$lifecycle\")\n        api(\"${Libs.LIFECYCLE_VIEW_MODEL_KTX}:$lifecycle\")\n        api(\"${Libs.LOTTIE}:$lottie\")\n        api(\"${Libs.MATERIAL}:$material\")\n        api(\"${Libs.MDC_COMPOSE_THEME_ADAPTER}:$compose\")\n        api(\"${Libs.MOCKITO_CORE}:$mockito\")\n        api(\"${Libs.MOCKITO_KOTLIN}:$mockitoKotlin\")\n        api(\"${Libs.NAVIGATION_FRAGMENT_KTX}:${Versions.NAVIGATION}\")\n        api(\"${Libs.NAVIGATION_UI_KTX}:${Versions.NAVIGATION}\")\n        api(\"${Libs.PROFILE_INSTALLER}:$profileInstaller\")\n        api(\"${Libs.ROOM_KTX}:$room\")\n        api(\"${Libs.ROOM_RUNTIME}:$room\")\n        api(\"${Libs.ROOM_COMPILER}:$room\")\n        api(\"${Libs.OKHTTP}:$okhttp\")\n        api(\"${Libs.OKHTTP_LOGGING_INTERCEPTOR}:$okhttp\")\n        api(\"${Libs.OKIO}:$okio\")\n        api(\"${Libs.INK_PAGE_INDICATOR}:$pageIndicator\")\n        api(\"${Libs.RULES}:$rules\")\n        api(\"${Libs.RUNNER}:$runner\")\n        api(\"${Libs.SLIDING_PANE_LAYOUT}:$slidingpanelayout\")\n        api(\"${Libs.THREETENABP}:$threetenabp\")\n        api(\"${Libs.THREETENBP}:${Versions.THREETENBP}\")\n        api(\"${Libs.TIMBER}:$timber\")\n        api(\"${Libs.UI_AUTOMATOR}:$uiAutomator\")\n        api(\"${Libs.VIEWPAGER2}:$viewpager2\")\n        api(\"${Libs.VIEWMODEL_COMPOSE}:$viewModelCompose\")\n    }\n}\n\npublishing {\n    publications {\n        create<MavenPublication>(\"myPlatform\") {\n            from(components[\"javaPlatform\"])\n        }\n    }\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.4.2-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2g\norg.gradle.caching=true\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\n# AndroidX\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n\n# R8\nandroid.enableR8.fullMode=true\n\n# IOSCHED values\n## Date/Time ##\nconference_timezone=\"America/Los_Angeles\"\n\nconference_day1_start=\"2019-05-07T07:00:00-07:00\"\nconference_day1_end=\"2019-05-07T22:00:01-07:00\"\nconference_day2_start=\"2019-05-08T08:00:00-07:00\"\nconference_day2_end=\"2019-05-08T22:00:01-07:00\"\nconference_day3_start=\"2019-05-09T08:00:00-07:00\"\nconference_day3_end=\"2019-05-09T22:00:00-07:00\"\n\nconference_day1_afterhours_start=\"2019-05-07T18:30:00-07:00\"\nconference_day2_concert_start=\"2019-05-08T19:30:00-07:00\"\n\n## Wifi ##\nconference_wifi_offering_start=\"2019-05-04T07:00:00-07:00\"\n\n## Endpoints ##\nbootstrap_conference_data_filename=\"conference_data_2019.json\"\n\n## Map ##\n# The supported zoom level range of the map viewport.\nmap_viewport_min_zoom=16\nmap_viewport_max_zoom=19.75\n\n# Conference location map bounds\nmap_viewport_bound_ne=37.428343, -122.074584\nmap_viewport_bound_sw=37.423205, -122.081757\n\n# Initial camera configuration when the map is displayed.\nmap_default_camera_bearing=0.0\nmap_default_camera_target_lat=37.425842\nmap_default_camera_target_lng=-122.079933\nmap_default_camera_zoom=16.4\nmap_default_camera_tilt=0\n\n# Zoom level to use when camera is programmatically centered on a marker\nmap_camera_focus_zoom=19f\n\n# enable incremental annotation processing\nkapt.incremental.apt=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\nAPP_HOME=$( cd \"${APP_HOME:-./}\" && pwd -P ) || exit\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=${0##*/}\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    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\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n# Collect all arguments for the java command;\n#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of\n#     shell script including quotes and variable substitutions, so put them in\n#     double quotes to make sure that they get re-expanded; and\n#   * put everything else in single quotes, so that it's not re-expanded.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "kokoro/build.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\n# Fail on any error.\nset -e\n# Display commands to stderr.\nset -x\n\nGRADLE_FLAGS=()\nif [[ -n \"$GRADLE_DEBUG\" ]]; then\n  GRADLE_FLAGS=( --debug --stacktrace )\nfi\n\n# Workaround of b/123314680\n# We need to update the required dependencies since the Kokoro team stopped updating the custom VM.\nexport ANDROID_HOME=/opt/android-sdk/current\necho \"Installing build-tools...\"\necho y | ${ANDROID_HOME}/tools/bin/sdkmanager \"build-tools;30.0.3\" > /dev/null\necho y | ${ANDROID_HOME}/tools/bin/sdkmanager --licenses\n\n# Workaround for b/148189425\n# AGP requires a specific NDK version for running Gradle\necho \"Installing NDK that matches the current version of AGP ...\"\necho y | ${ANDROID_HOME}/tools/bin/sdkmanager \"ndk;21.0.6113669\" > /dev/null\n\ncd $KOKORO_ARTIFACTS_DIR/git/iosched\n\n# Use Java 11 (b/181627163)\n# This needs to be set after sdkmanager runs, as sdkmanager errors using Java 11\nexport JAVA_HOME=${KOKORO_GFILE_DIR}\nexport PATH=\"$JAVA_HOME/bin:$PATH\"\n\n$JAVA_HOME/bin/javac -version\n\n./gradlew \"${GRADLE_FLAGS[@]}\" build\n\n\n# For Firebase Test Lab\nSERVICE_ACCOUNT_KEY=${KOKORO_GFILE_DIR}/events-dev-62d2e-072ce72b3067.json\ngcloud config set project events-dev-62d2e\ngcloud auth activate-service-account firebasetestlabforkokoro@events-dev-62d2e.iam.gserviceaccount.com --key-file ${SERVICE_ACCOUNT_KEY}\n\n./gradlew mobile:assembleAndroidTest\n./gradlew mobile:assembleStaging\n\nMAX_RETRY=3\nrun_firebase_test_lab() {\n  ## Retry can be done by passing the --num-flaky-test-attempts to gcloud, but gcloud SDK in the\n  ## kokoro server doesn't support it yet.\n\n  set +e # To not exit on an error to retry flaky tests\n  local counter=0\n  local result=1\n  while [ $result != 0 -a $counter -lt $MAX_RETRY ]; do\n    ## TODO: Add os-version 29 once it's available\n    gcloud firebase test android run \\\n        --type instrumentation \\\n        --app  mobile/build/outputs/apk/staging/mobile-staging.apk \\\n        --test mobile/build/outputs/apk/androidTest/staging/mobile-staging-androidTest.apk \\\n        --device-ids hammerhead,walleye,blueline \\\n        --os-version-ids 21,26,28 \\\n        --locales en \\\n        --timeout 60\n    result=$? ;\n    let counter=counter+1\n  done\n  return $result\n}\n\nrun_firebase_test_lab\nexit $?\n"
  },
  {
    "path": "kokoro/continuous.cfg",
    "content": "# Location of the continuous bash script.\nbuild_file: \"iosched/kokoro/continuous.sh\"\n\n# Extra input files/directories for the build\ngfile_resources: \"/x20/teams/iosched-android/keys\"\n\n# Use Java 11 (b/181627163)\n# Copy a JDK 11 installation from x20\ngfile_resources: \"/x20/projects/java-platform/linux-amd64/jdk-11-latest\"\n\nenv_vars {\n  key: \"GRADLE_DEBUG\"\n  value: \"\"\n}\n"
  },
  {
    "path": "kokoro/continuous.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Fail on any error.\nset -e\n# Display commands to stderr.\nset -x\n\nenv | sort\npwd\nfind .\ngit/iosched/kokoro/build.sh\n"
  },
  {
    "path": "kokoro/presubmit.cfg",
    "content": "# Location of the continuous bash script.\nbuild_file: \"iosched/kokoro/presubmit.sh\"\n\n# Extra input files/directories for the build\ngfile_resources: \"/x20/teams/iosched-android/keys\"\n\n# Use Java 11 (b/181627163)\n# Copy a JDK 11 installation from x20\ngfile_resources: \"/x20/projects/java-platform/linux-amd64/jdk-11-latest\"\n\n"
  },
  {
    "path": "kokoro/presubmit.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Fail on any error.\nset -e\n# Display commands to stderr.\nset -x\n\nenv | sort\npwd\nfind .\ngit/iosched/kokoro/build.sh\n"
  },
  {
    "path": "macrobenchmark/.gitignore",
    "content": "/build"
  },
  {
    "path": "macrobenchmark/build.gradle",
    "content": "plugins {\n    id 'com.android.test'\n    id 'kotlin-android'\n}\n\nandroid {\n    compileSdkVersion Versions.COMPILE_SDK\n    defaultConfig {\n        minSdkVersion 23 // Macrobenchmark doesn't work on lower API\n        targetSdkVersion Versions.TARGET_SDK\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    kotlinOptions {\n        jvmTarget = '1.8'\n    }\n\n    buildTypes {\n        // declare a build type to match the target app's build type\n        benchmark {\n            debuggable = true\n            signingConfig = debug.signingConfig\n        }\n    }\n\n    targetProjectPath = \":mobile\"\n    experimentalProperties[\"android.experimental.self-instrumenting\"] = true\n}\n\nandroidComponents {\n    beforeVariants(selector().all()) {\n        // enable only the release buildType, since we only want to measure\n        // release build performance\n        enabled = buildType == 'benchmark'\n    }\n}\n\ndependencies {\n    api platform(project(\":depconstraints\"))\n    implementation Libs.BENCHMARK_MACRO\n    implementation Libs.ESPRESSO_CORE\n    implementation Libs.EXT_JUNIT\n    implementation Libs.KOTLIN_STDLIB\n    implementation Libs.TIMBER\n    implementation Libs.UI_AUTOMATOR\n}\n"
  },
  {
    "path": "macrobenchmark/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "macrobenchmark/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "macrobenchmark/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.google.samples.apps.iosched.macrobenchmark\">\n\n    <uses-permission\n        android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"\n        tools:ignore=\"ScopedStorage\" />\n\n</manifest>\n"
  },
  {
    "path": "macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/BaselineProfileGenerator.kt",
    "content": "/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.macrobenchmark\n\nimport androidx.benchmark.macro.ExperimentalBaselineProfilesApi\nimport androidx.benchmark.macro.junit4.BaselineProfileRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@LargeTest\n@RunWith(AndroidJUnit4::class)\n@ExperimentalBaselineProfilesApi\nclass BaselineProfileGenerator {\n\n    @get:Rule\n    val rule = BaselineProfileRule()\n\n    @Test\n    fun generate() {\n        rule.collectBaselineProfile(TARGET_PACKAGE) {\n            // This block defines the app's critical user journey. Here we are interested in\n            // optimizing for app startup. But you can also navigate and scroll\n            // through your most important UI.\n            pressHome()\n            startMainAndConfirmDialogs()\n            scrollSchedule()\n        }\n    }\n}\n"
  },
  {
    "path": "macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/BenchmarkUtils.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.macrobenchmark\n\nimport android.content.Intent\nimport androidx.benchmark.macro.MacrobenchmarkScope\nimport androidx.test.uiautomator.By\nimport androidx.test.uiautomator.BySelector\nimport androidx.test.uiautomator.Direction\nimport androidx.test.uiautomator.Until\nimport timber.log.Timber\n\nconst val TARGET_PACKAGE = \"com.google.samples.apps.iosched\"\n\nval scheduleRecyclerSelector: BySelector\n    get() = By.res(TARGET_PACKAGE, \"recyclerview_schedule\")\n\nfun MacrobenchmarkScope.startMainAndWait() {\n    // Start activity defined by an action\n    val intent = Intent(\"$TARGET_PACKAGE.STARTUP_ACTIVITY\")\n    Timber.tag(\"Benchmark\")\n    Timber.d(\"Starting activity $intent\")\n\n    // This can be usually without the intent, but in our case we have LauncherActivity with onboarding.\n    startActivityAndWait(intent)\n}\n\nfun MacrobenchmarkScope.startMainAndConfirmDialogs() {\n    startMainAndWait()\n\n    // The first time the app is run, customize schedule dialog is shown\n    confirmDialog()\n\n    // Later, it may show I/O notifications dialog\n    // Sometimes it happens that both dialogs are shown one after another\n    confirmDialog()\n}\n\nfun MacrobenchmarkScope.scrollSchedule() {\n    // Need to wait until schedule is loaded\n    device.wait(Until.hasObject(scheduleRecyclerSelector), 10_000)\n\n    val recycler = device.findObject(scheduleRecyclerSelector)\n    // Need to set, otherwise scrolling could trigger system gesture navigation\n    recycler.setGestureMargin(device.displayWidth / 5)\n\n    // Fling several times\n    repeat(3) { recycler.fling(Direction.DOWN) }\n}\n\nfun MacrobenchmarkScope.confirmDialog() {\n    // Check if button is appeared or return\n    val dialogPositiveButton = device.findObject(By.res(\"android\", \"button1\")) ?: return\n    dialogPositiveButton.click()\n    device.waitForIdle()\n    // Need short delay, because it may be animating the dialog out\n    Thread.sleep(1_000)\n}\n"
  },
  {
    "path": "macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/OpenDetailBenchmarks.kt",
    "content": "/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.macrobenchmark\n\nimport androidx.benchmark.macro.FrameTimingMetric\nimport androidx.benchmark.macro.StartupMode\nimport androidx.benchmark.macro.junit4.MacrobenchmarkRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.uiautomator.By\nimport androidx.test.uiautomator.Direction\nimport androidx.test.uiautomator.Until\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport timber.log.Timber\n\n@LargeTest\n@RunWith(AndroidJUnit4::class)\nclass OpenDetailBenchmarks {\n    @get:Rule\n    val benchmarkRule = MacrobenchmarkRule()\n\n    @Test\n    fun openDetail() {\n        // need to keep track which index was selected so we can always select different one\n        var selectedIndex = 0\n\n        benchmarkRule.measureRepeated(\n            packageName = TARGET_PACKAGE,\n            metrics = listOf(FrameTimingMetric()),\n            startupMode = StartupMode.COLD,\n            iterations = 5,\n            setupBlock = {\n                pressHome()\n                startMainAndConfirmDialogs()\n\n                //  the children count is only visible part of the screen,\n                //  so if we have too many iterations, we must scroll the recycler to other items\n                val recycler = device.findObject(scheduleRecyclerSelector)\n                if (selectedIndex >= recycler.childCount) {\n                    // need to set, otherwise scrolling could trigger system gesture navigation\n                    recycler.setGestureMargin(device.displayWidth / 5)\n                    // since scroll is unreliable, we scroll surely far enough to have new items\n                    repeat(recycler.childCount) { recycler.scroll(Direction.DOWN, 1f) }\n                    // and start again at first visible item on the screen\n                    selectedIndex = 0\n                }\n            }\n        ) {\n            val recycler = device.findObject(scheduleRecyclerSelector)\n\n            // click on item which navigates to event detail\n            val item = recycler.children[selectedIndex]\n                ?: error(\"Session on index $selectedIndex not found\")\n\n            val itemTitleView = item.findObject(By.res(TARGET_PACKAGE, \"title\"))\n            Timber.tag(\"Benchmark\")\n            Timber.d(\"Opening detail(${itemTitleView?.text}) at index $selectedIndex\")\n            item.click()\n\n            // wait until detail title is shown\n            device.wait(Until.hasObject(By.res(TARGET_PACKAGE, \"session_detail_title\")), 10_000)\n\n            // next time select different item\n            selectedIndex++\n        }\n    }\n}\n"
  },
  {
    "path": "macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/ScheduleBenchmarks.kt",
    "content": "/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.macrobenchmark\n\nimport androidx.benchmark.macro.FrameTimingMetric\nimport androidx.benchmark.macro.StartupMode\nimport androidx.benchmark.macro.junit4.MacrobenchmarkRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@LargeTest\n@RunWith(AndroidJUnit4::class)\nclass ScheduleBenchmarks {\n\n    @get:Rule\n    val benchmarkRule = MacrobenchmarkRule()\n\n    @Test\n    fun scrollSchedule() {\n        benchmarkRule.measureRepeated(\n            metrics = listOf(FrameTimingMetric()),\n            packageName = TARGET_PACKAGE,\n            iterations = 5,\n            startupMode = StartupMode.COLD,\n            setupBlock = {\n                pressHome()\n                startMainAndConfirmDialogs()\n            }\n        ) {\n            scrollSchedule()\n        }\n    }\n}\n"
  },
  {
    "path": "macrobenchmark/src/main/java/com/google/samples/apps/iosched/macrobenchmark/StartupBenchmarks.kt",
    "content": "/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.macrobenchmark\n\nimport androidx.benchmark.macro.CompilationMode\nimport androidx.benchmark.macro.StartupMode\nimport androidx.benchmark.macro.StartupTimingMetric\nimport androidx.benchmark.macro.junit4.MacrobenchmarkRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@LargeTest\n@RunWith(AndroidJUnit4::class)\nclass StartupBenchmarks {\n    @get:Rule\n    val benchmarkRule = MacrobenchmarkRule()\n\n    @Test\n    fun startupCompilationNone() = startup(CompilationMode.None())\n\n    @Test\n    fun startupCompilationPartial() = startup(CompilationMode.Partial())\n\n    @Test\n    fun startupCompilationFull() = startup(CompilationMode.Full())\n\n    private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated(\n        packageName = TARGET_PACKAGE,\n        compilationMode = compilationMode,\n        startupMode = StartupMode.COLD,\n        iterations = 5,\n        metrics = listOf(StartupTimingMetric()),\n        setupBlock = {\n            pressHome()\n        }\n    ) {\n        startMainAndWait()\n    }\n}\n"
  },
  {
    "path": "mobile/build.gradle.kts",
    "content": "/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id(\"com.android.application\")\n    kotlin(\"android\")\n    kotlin(\"kapt\")\n    id(\"androidx.navigation.safeargs.kotlin\")\n    id(\"com.google.firebase.crashlytics\")\n    id(\"dagger.hilt.android.plugin\")\n}\n\nandroid {\n    compileSdk = Versions.COMPILE_SDK\n    defaultConfig {\n        applicationId = \"com.google.samples.apps.iosched\"\n        minSdk = Versions.MIN_SDK\n        targetSdk = Versions.TARGET_SDK\n        versionCode = Versions.versionCodeMobile\n        versionName = Versions.versionName\n        testInstrumentationRunner = \"com.google.samples.apps.iosched.tests.CustomTestRunner\"\n\n        buildConfigField(\n            \"com.google.android.gms.maps.model.LatLng\",\n            \"MAP_VIEWPORT_BOUND_NE\",\n            \"new com.google.android.gms.maps.model.LatLng(${project.properties[\"map_viewport_bound_ne\"]})\"\n        )\n        buildConfigField(\n            \"com.google.android.gms.maps.model.LatLng\",\n            \"MAP_VIEWPORT_BOUND_SW\",\n            \"new com.google.android.gms.maps.model.LatLng(${project.properties[\"map_viewport_bound_sw\"]})\"\n        )\n\n        buildConfigField(\"float\", \"MAP_CAMERA_FOCUS_ZOOM\", project.properties[\"map_camera_focus_zoom\"] as String)\n\n        resValue(\"dimen\", \"map_camera_bearing\", project.properties[\"map_default_camera_bearing\"] as String)\n        resValue(\"dimen\", \"map_camera_target_lat\", project.properties[\"map_default_camera_target_lat\"] as String)\n        resValue(\"dimen\", \"map_camera_target_lng\", project.properties[\"map_default_camera_target_lng\"] as String)\n        resValue(\"dimen\", \"map_camera_tilt\", project.properties[\"map_default_camera_tilt\"] as String)\n        resValue(\"dimen\", \"map_camera_zoom\", project.properties[\"map_default_camera_zoom\"] as String)\n        resValue(\"dimen\", \"map_viewport_min_zoom\", project.properties[\"map_viewport_min_zoom\"] as String)\n        resValue(\"dimen\", \"map_viewport_max_zoom\", project.properties[\"map_viewport_max_zoom\"] as String)\n\n        manifestPlaceholders[\"crashlyticsEnabled\"] = true\n\n        vectorDrawables.useSupportLibrary = true\n\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments[\"room.incremental\"] = \"true\"\n            }\n        }\n    }\n    buildTypes {\n        getByName(\"release\") {\n            isMinifyEnabled = true\n            // TODO: b/120517460 shrinkResource can't be used with dynamic-feature at this moment.\n            //       Need to ensure the app size has not increased\n            manifestPlaceholders[\"crashlyticsEnabled\"] = true\n            proguardFiles(getDefaultProguardFile(\"proguard-android-optimize.txt\"), \"proguard-rules.pro\")\n            resValue(\n                \"string\",\n                \"google_maps_key\",\n                \"AIzaSyD5jqwKMm1SeoYsW25vxCXfTlhDBeZ4H5c\"\n            )\n\n            buildConfigField(\"String\", \"MAP_TILE_URL_BASE\", \"\\\"https://storage.googleapis.com/io2019-festivus-prod/images/maptiles\\\"\")\n        }\n        getByName(\"debug\") {\n            versionNameSuffix = \"-debug\"\n            manifestPlaceholders[\"crashlyticsEnabled\"] = false\n            resValue(\n                \"string\",\n                \"google_maps_key\",\n                \"AIzaSyAhJx57ikQH9rYc8IT8W3d2As5cGHMBvuo\"\n            )\n\n            buildConfigField(\"String\", \"MAP_TILE_URL_BASE\", \"\\\"https://storage.googleapis.com/io2019-festivus/images/maptiles\\\"\")\n        }\n        maybeCreate(\"staging\")\n        getByName(\"staging\") {\n            initWith(getByName(\"debug\"))\n            versionNameSuffix = \"-staging\"\n\n            // Specifies a sorted list of fallback build types that the\n            // plugin should try to use when a dependency does not include a\n            // \"staging\" build type.\n            // Used with :test-shared, which doesn't have a staging variant.\n            matchingFallbacks += listOf(\"debug\")\n        }\n\n        maybeCreate(\"benchmark\")\n        getByName(\"benchmark\") {\n            initWith(getByName(\"staging\"))\n            versionNameSuffix = \"-benchmark\"\n            isMinifyEnabled = true\n            isDebuggable = false\n            proguardFiles(getDefaultProguardFile(\"proguard-android-optimize.txt\"), \"proguard-rules.pro\", \"proguard-rules-benchmark.pro\")\n\n            // Specifies a sorted list of fallback build types that the\n            // plugin should try to use when a dependency does not include a\n            // \"benchmark\" build type.\n            // Used with :test-shared, which doesn't have a benchmark variant.\n            matchingFallbacks += listOf(\"staging\", \"debug\")\n        }\n    }\n\n    buildFeatures {\n        viewBinding = true\n        dataBinding = true\n        compose = true\n    }\n\n    composeOptions {\n        kotlinCompilerExtensionVersion = Versions.COMPOSE\n    }\n\n    signingConfigs {\n        // We need to sign debug builds with a debug key to make firebase auth happy\n        getByName(\"debug\") {\n            storeFile = file(\"../debug.keystore\")\n            keyAlias = \"androiddebugkey\"\n            keyPassword = \"android\"\n            storePassword = \"android\"\n        }\n    }\n\n    // debug and release variants share the same source dir\n    sourceSets {\n        getByName(\"debug\") {\n            java.srcDir(\"src/debugRelease/java\")\n        }\n        getByName(\"release\") {\n            java.srcDir(\"src/debugRelease/java\")\n        }\n        getByName(\"benchmark\") {\n            java.srcDir(\"src/staging/java\")\n            res.srcDir(\"src/staging/res\")\n        }\n    }\n\n    lint {\n        // Eliminates UnusedResources false positives for resources used in DataBinding layouts\n        checkGeneratedSources = true\n        // Running lint over the debug variant is enough\n        checkReleaseBuilds = false\n        // See lint.xml for rules configuration\n\n        // TODO: Remove when upgrading lifecycle from `2.4.0-alpha01`.\n        // Fix: https://android-review.googlesource.com/c/platform/frameworks/support/+/1697465\n        // Bug: https://issuetracker.google.com/184830263\n        disable += \"NullSafeMutableLiveData\"\n    }\n\n    testBuildType = \"staging\"\n\n    // Required for AR because it includes a library built with Java 8\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_1_8\n        targetCompatibility = JavaVersion.VERSION_1_8\n    }\n    // To avoid the compile error: \"Cannot inline bytecode built with JVM target 1.8\n    // into bytecode that is being built with JVM target 1.6\"\n    kotlinOptions {\n        val options = this as org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions\n        options.jvmTarget = \"1.8\"\n    }\n\n    packagingOptions {\n        resources.excludes += \"META-INF/AL2.0\"\n        resources.excludes += \"META-INF/LGPL2.1\"\n    }\n}\n\nkapt {\n    arguments {\n        arg(\"dagger.hilt.shareTestComponents\", \"true\")\n    }\n}\n\ndependencies {\n    api(platform(project(\":depconstraints\")))\n    kapt(platform(project(\":depconstraints\")))\n    androidTestApi(platform(project(\":depconstraints\")))\n\n    implementation(project(\":shared\"))\n    implementation(project(\":ar\"))\n    testImplementation(project(\":test-shared\"))\n    testImplementation(project(\":androidTest-shared\"))\n    implementation(fileTree(mapOf(\"dir\" to \"libs\", \"include\" to listOf(\"*.jar\"))))\n\n    implementation(Libs.CORE_KTX)\n    implementation(Libs.APP_STARTUP)\n    implementation(Libs.PROFILE_INSTALLER)\n\n    // UI\n    implementation(Libs.ACTIVITY_KTX)\n    implementation(Libs.APPCOMPAT)\n    implementation(Libs.FRAGMENT_KTX)\n    implementation(Libs.CARDVIEW)\n    implementation(Libs.BROWSER)\n    implementation(Libs.CONSTRAINT_LAYOUT)\n    implementation(Libs.DRAWER_LAYOUT)\n    implementation(Libs.MATERIAL)\n    implementation(Libs.FLEXBOX)\n    implementation(Libs.LOTTIE)\n    implementation(Libs.INK_PAGE_INDICATOR)\n    implementation(Libs.SLIDING_PANE_LAYOUT)\n\n    // Architecture Components\n    implementation(Libs.LIFECYCLE_LIVE_DATA_KTX)\n    implementation(Libs.LIFECYCLE_RUNTIME_KTX)\n    kapt(Libs.LIFECYCLE_COMPILER)\n    testImplementation(Libs.ARCH_TESTING)\n    implementation(Libs.NAVIGATION_FRAGMENT_KTX)\n    implementation(Libs.NAVIGATION_UI_KTX)\n    implementation(Libs.ROOM_KTX)\n    implementation(Libs.ROOM_RUNTIME)\n    kapt(Libs.ROOM_COMPILER)\n    testImplementation(Libs.ROOM_KTX)\n    testImplementation(Libs.ROOM_RUNTIME)\n\n    // Compose\n    implementation(Libs.ACTIVITY_COMPOSE)\n    implementation(Libs.COMPOSE_ANIMATION)\n    implementation(Libs.COMPOSE_MATERIAL)\n    implementation(Libs.COMPOSE_RUNTIME)\n    implementation(Libs.COMPOSE_THEME_ADAPTER)\n    implementation(Libs.COMPOSE_TOOLING)\n    implementation(Libs.VIEWMODEL_COMPOSE)\n    implementation(Libs.MDC_COMPOSE_THEME_ADAPTER)\n    androidTestImplementation(Libs.COMPOSE_TEST)\n\n    // Dagger Hilt\n    implementation(Libs.HILT_ANDROID)\n    androidTestImplementation(Libs.HILT_TESTING)\n    kapt(Libs.HILT_COMPILER)\n    kaptAndroidTest(Libs.HILT_COMPILER)\n\n    // DataStore\n    implementation(Libs.DATA_STORE_PREFERENCES)\n    androidTestImplementation(Libs.DATA_STORE_PREFERENCES)\n\n    // Glide\n    implementation(Libs.GLIDE)\n    kapt(Libs.GLIDE_COMPILER)\n\n    // Fabric and Firebase\n    implementation(Libs.FIREBASE_UI_AUTH)\n    implementation(Libs.CRASHLYTICS)\n\n    // Date and time API for Java.\n    implementation(Libs.THREETENABP)\n    testImplementation(Libs.THREETENBP)\n\n    // Kotlin\n    implementation(Libs.KOTLIN_STDLIB)\n\n    // Instrumentation tests\n    androidTestImplementation(Libs.ESPRESSO_CORE)\n    androidTestImplementation(Libs.ESPRESSO_CONTRIB)\n    androidTestImplementation(Libs.EXT_JUNIT)\n    androidTestImplementation(Libs.RUNNER)\n    androidTestImplementation(Libs.RULES)\n    androidTestImplementation(Libs.FRAGMENT_TEST)\n    debugImplementation(Libs.FRAGMENT_TEST)\n    add(\"stagingImplementation\", Libs.FRAGMENT_TEST)\n\n    // Local unit tests\n    testImplementation(Libs.JUNIT)\n    testImplementation(Libs.MOCKITO_CORE)\n    testImplementation(Libs.MOCKITO_KOTLIN)\n    testImplementation(Libs.HAMCREST)\n\n    // Solve conflicts with gson. DataBinding is using an old version.\n    implementation(Libs.GSON)\n\n    implementation(Libs.ARCORE)\n}\n\napply(plugin = \"com.google.gms.google-services\")\n"
  },
  {
    "path": "mobile/google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_number\": \"447780894619\",\n    \"firebase_url\": \"https://events-dev-62d2e.firebaseio.com\",\n    \"project_id\": \"events-dev-62d2e\",\n    \"storage_bucket\": \"events-dev-62d2e.appspot.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:447780894619:android:66c485c6a5187053\",\n        \"android_client_info\": {\n          \"package_name\": \"com.google.samples.apps.iosched\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"447780894619-an6s48nvj18f25v4nc5te03q2c4g9dqf.apps.googleusercontent.com\",\n          \"client_type\": 3\n        },\n        {\n          \"client_id\": \"447780894619-u3o7j05aqv0u0mb0nmu7btseg1csrrlg.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.google.samples.apps.iosched\",\n            \"certificate_hash\": \"e499e9081b4ddf63788f4dfb4e7018c54f93188b\"\n          }\n        },\n        {\n          \"client_id\": \"447780894619-tbe57ou9oflnoic5scbc8mj8tnnj9o2r.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyC_LbkKaCrAaBJSBp7DbDZgwLLR3BYUJV0\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"appinvite_service\": {\n          \"status\": 2,\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"447780894619-an6s48nvj18f25v4nc5te03q2c4g9dqf.apps.googleusercontent.com\",\n              \"client_type\": 3\n            },\n            {\n              \"client_id\": \"447780894619-c9ovo169ue58khaq7pmj9pvvkbmjt6l2.apps.googleusercontent.com\",\n              \"client_type\": 2,\n              \"ios_info\": {\n                \"bundle_id\": \"com.google.iosched.dev\"\n              }\n            }\n          ]\n        },\n        \"ads_service\": {\n          \"status\": 2\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}"
  },
  {
    "path": "mobile/lint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<lint>\n    <issue id=\"InvalidPackage\" severity=\"ignore\" />\n\n    <!-- Version changes are beyond our control, so don't warn. The IDE will still mark these. -->\n    <issue id=\"GradleDependency\" severity=\"ignore\" />\n\n    <!-- Timber needs to update its Lint check -->\n    <issue id=\"ObsoleteLintCustomCheck\" severity=\"ignore\" />\n\n    <!-- Translations are added incrementally -->\n    <issue id=\"MissingTranslation\" severity=\"ignore\" />\n\n    <!-- We leave these up to translators -->\n    <issue id=\"TypographyDashes\" severity=\"ignore\" />\n    <issue id=\"Typos\" severity=\"ignore\" />\n\n    <!-- We configure Lint check generated sources to eliminate UnusedResources false positives for\n         resources used in DataBinding layouts. However, the generated files produce other Lint\n         errors that we can ignore.\n    -->\n    <issue id=\"RestrictedApi\">\n        <ignore path=\"build\" />\n    </issue>\n\n    <issue id=\"UnusedResources\">\n        <!-- Some dependencies & gradle plugins generate resources that we don't use -->\n        <ignore path=\"build\" />\n        <!-- Map markers are referenced by name at runtime -->\n        <ignore regexp=\"res/drawable/map_marker_.+\\.xml\" />\n    </issue>\n</lint>\n"
  },
  {
    "path": "mobile/proguard-rules-benchmark.pro",
    "content": "# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Obsfuscation must be disabled for the build variant that generates Baseline Profile, otherwise\n# wrong symbols would be generated. The generated Baseline Profile will be properly applied if generated\n# without obfuscation and your app is being obfuscated.\n-dontobfuscate"
  },
  {
    "path": "mobile/proguard-rules.pro",
    "content": "# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Glide\n-keep public class * implements com.bumptech.glide.module.GlideModule\n-keep public class * extends com.bumptech.glide.module.AppGlideModule\n-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {\n  **[] $VALUES;\n  public *;\n}\n-keepattributes *Annotation*\n-keepattributes SourceFile,LineNumberTable\n-keep public class * extends java.lang.Exception\n-keep class com.crashlytics.** { *; }\n-dontwarn com.crashlytics.**\n\n# https://github.com/firebase/FirebaseUI-Android/issues/1429\n-keep class com.firebase.ui.auth.** { * ; }\n\n# Firebase Functions\n-keep class org.json.** { *; }\n"
  },
  {
    "path": "mobile/sampledata/codelabs.json",
    "content": "{\n  \"comment\": \"Sample codelab data for use with tools:... attributes in layouts\",\n  \"codelabs\": [\n    {\n      \"title\": \"Accelerated Mobile Pages Foundations\",\n      \"description\": \"In this codelab, you'll learn how to build Accelerated Mobile Pages, or AMP for short. You will implement a simple news article web page that conforms to the AMP specifications while incorporating several typical web features commonly used on mobile news sites.\",\n      \"duration\": \"39 min\"\n    },\n    {\n      \"title\": \"Add Voice Interactions to Your App\",\n      \"description\": \"In this codelab, you'll learn how to add voice interactions to your app with the Voice Interaction API. The Voice Interaction API allows users of your app to confirm actions and select from a list of options using only their voice.\",\n      \"duration\": \"19 min\"\n    },\n    {\n      \"title\": \"Android Data Binding codelab\",\n      \"description\": \"In this codelab you'll learn how to set up Data Binding, use layout expressions, work with observable objects and create custom Binding Adapters to reduce boilerplate to a minimum.\",\n      \"duration\": \"45 min\"\n    },\n    {\n      \"title\": \"Android Persistence codelab\",\n      \"description\": \"In this codelab, you begin with a sample app and add code through a series of steps, integrating the various persistence components as you progress.\",\n      \"duration\": \"50 min\"\n    },\n    {\n      \"title\": \"Android & TensorFlow: Artistic Style Transfer\",\n      \"description\": \"This codelab will walk you through the process of using an artistic style transfer neural network in an Android app in just 9 lines of code. You can also use the techniques outlined in this codelab to implement any TensorFlow network you have already trained.\",\n      \"duration\": \"22 min\"\n    },\n    {\n      \"title\": \"Building Beautiful UIs with Flutter\",\n      \"description\": \"Learn how to write a Flutter app that looks natural on both iOS and Android; how to debug your Flutter app; and how to run your Flutter app on a simulator/emulator and on a device.\",\n      \"duration\": \"90 min\"\n    },\n    {\n      \"title\": \"Build a Fast Checkout Experience on the Web with Google Pay\",\n      \"description\": \"This codelab walks you through integrating Google Pay into an existing site, including determining whether a user is able to pay using a payment method supported by Google Pay, the placement and design of the payment button and the execution of the transaction\",\n      \"duration\": \"30 min:\"\n    },\n    {\n      \"title\": \"Build Actions for the Google Assistant (Level 1)\",\n      \"description\": \"In this codelab, you'll build a simple conversational Action. This codelab covers beginner-level concepts for developing with Actions on Google. You do not need to have any prior experience with the platform to follow this codelab.\",\n      \"duration\": \"50 min\"\n    },\n    {\n      \"title\": \"Cloud Functions for Firebase\",\n      \"description\": \"In this codelab, you'll learn how to use the Firebase SDK for Google Cloud Functions to improve a Chat Web app and how to use Cloud Functions to send notifications to users of the Chat app.\",\n      \"duration\": \"62 min\"\n    },\n    {\n      \"title\": \"Enable Deep Linking to your App\",\n      \"description\": \"In this codelab, you'll learn how to handle deep links in a sample Android app. You'll be able to play with the sample app to simulate deep linking from search results on your own Android device.\",\n      \"duration\": \"14 min\"\n    }\n  ]\n}\n"
  },
  {
    "path": "mobile/sampledata/day_indicator.json",
    "content": "{\n  \"comment\": \"Sample day indicators for use with tools:... attributes in layouts\",\n  \"indicators\": [\n    {\n      \"label\": \"May 7\",\n      \"checked\": false\n    },\n    {\n      \"label\": \"May 8\",\n      \"checked\": true\n    },\n    {\n      \"label\": \"May 9\",\n      \"checked\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "mobile/sampledata/map_variants.json",
    "content": "{\n  \"comment\": \"Sample map variant data for use with tools:... attributes in layouts\",\n  \"variants\": [\n    {\n      \"title\": \"Daytime\",\n      \"checked\": true\n    },\n    {\n      \"title\": \"After dark\",\n      \"checked\": false\n    },\n    {\n      \"title\": \"Concert\",\n      \"checked\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "mobile/sampledata/tags.json",
    "content": "{\n  \"comment\": \"Sample tag data for use with tools:... attributes in layouts, primarily list items\",\n  \"tags\": [\n    {\n      \"name\": \"Ads\",\n      \"color\": \"#B0BEC5\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Android\",\n      \"color\": \"#AED581\",\n      \"checked\": true\n    },\n    {\n      \"name\": \"Assistant\",\n      \"color\": \"#1ce8b5\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Cloud\",\n      \"color\": \"#80CBC4\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Design\",\n      \"color\": \"#F8BBD0\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Firebase\",\n      \"color\": \"#FFD54F\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"IoT\",\n      \"color\": \"#BCAAA4\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Location & Maps\",\n      \"color\": \"#EF9A9A\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Look how long the name of this track is!\",\n      \"color\": \"#33b5e5\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Machine Learning & AI\",\n      \"color\": \"#bcc8fb\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Misc\",\n      \"color\": \"#C5C9E9\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Mobile Web\",\n      \"color\": \"#FFF176\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"Search\",\n      \"color\": \"#90CAF9\",\n      \"checked\": false\n    },\n    {\n      \"name\": \"VR\",\n      \"color\": \"#FF8A65\",\n      \"checked\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "mobile/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<manifest\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.google.samples.apps.iosched\">\n\n    <application>\n        <provider\n            android:name=\"androidx.startup.InitializationProvider\"\n            android:authorities=\"${applicationId}.androidx-startup\"\n            android:exported=\"false\"\n            tools:node=\"merge\">\n            <meta-data\n                android:name=\"com.google.samples.apps.iosched.util.initializers.AndroidThreeTenInitializer\"\n                android:value=\"androidx.startup\"\n                tools:node=\"remove\"/>\n            <meta-data\n                android:name=\"com.google.samples.apps.iosched.util.initializers.StrictModeInitializer\"\n                android:value=\"androidx.startup\"\n                tools:node=\"remove\"/>\n            <meta-data\n                android:name=\"com.google.samples.apps.iosched.util.initializers.TimberInitializer\"\n                android:value=\"androidx.startup\"\n                tools:node=\"remove\"/>\n            <meta-data\n                android:name=\"com.google.samples.apps.iosched.util.initializers.AnalyticsHelperInitializer\"\n                android:value=\"androidx.startup\"\n                tools:node=\"remove\"/>\n        </provider>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/CustomTestRunner.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests\n\nimport android.app.Application\nimport android.content.Context\nimport androidx.test.runner.AndroidJUnitRunner\nimport dagger.hilt.android.testing.CustomTestApplication\n\n/**\n * A custom [AndroidJUnitRunner] used to replace the application used in tests. Note that Hilt\n * generates a [CustomTestRunner_Application] based on the the [MainTestApplication] defined in\n * the [CustomBaseTestApplication] annotation.\n */\n@CustomTestApplication(MainTestApplication::class)\nclass CustomTestRunner : AndroidJUnitRunner() {\n\n    override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application {\n        return super.newApplication(cl, CustomTestRunner_Application::class.java.name, context)\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/FixedTimeRule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests\n\nimport com.google.samples.apps.iosched.shared.time.DefaultTimeProvider\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport org.junit.rules.TestWatcher\nimport org.junit.runner.Description\nimport org.threeten.bp.Instant\n\n/**\n * Rule to be used in tests that sets the clocked used by DefaultTimeProvider.\n */\nclass FixedTimeRule(\n    private val fixedTime: FixedTimeProvider = FixedTimeProvider(1_000_000)\n) : TestWatcher() {\n\n    override fun starting(description: Description?) {\n        super.starting(description)\n        DefaultTimeProvider.setDelegate(fixedTime)\n    }\n\n    override fun finished(description: Description?) {\n        super.finished(description)\n        DefaultTimeProvider.setDelegate(null)\n    }\n}\n\n/**\n * Fix the TimeProvider to a fixed time\n */\nclass FixedTimeProvider(private var instant: Instant) : TimeProvider {\n    constructor(timeInMilis: Long) : this(Instant.ofEpochMilli(timeInMilis))\n\n    override fun now(): Instant {\n        return instant\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/MainTestApplication.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests\n\nimport android.app.Application\nimport com.jakewharton.threetenabp.AndroidThreeTen\nimport timber.log.Timber\n\n/**\n * Used as a base application for Hilt to run instrumented tests through the [CustomTestRunner].\n */\nopen class MainTestApplication : Application() {\n\n    override fun onCreate() {\n        // ThreeTenBP for times and dates, called before super to be available for objects\n        AndroidThreeTen.init(this)\n        Timber.plant(Timber.DebugTree())\n        super.onCreate()\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/SetPreferencesRule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests\n\nimport androidx.test.core.app.ApplicationProvider\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport dagger.hilt.EntryPoint\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.EntryPointAccessors\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.test.runTest\nimport org.junit.rules.TestWatcher\nimport org.junit.runner.Description\n\n/**\n * Rule to be used in tests that sets the preferences needed for avoiding onboarding flows,\n * resetting filters, etc.\n */\nclass SetPreferencesRule : TestWatcher() {\n\n    @InstallIn(SingletonComponent::class)\n    @EntryPoint\n    interface SetPreferencesRuleEntryPoint {\n        fun preferenceStorage(): PreferenceStorage\n        @ApplicationScope\n        fun applicationScope(): CoroutineScope\n    }\n\n    override fun starting(description: Description?) {\n        super.starting(description)\n\n        EntryPointAccessors.fromApplication(\n            ApplicationProvider.getApplicationContext(),\n            SetPreferencesRuleEntryPoint::class.java\n        ).preferenceStorage().apply {\n            runTest {\n                completeOnboarding(true)\n                showScheduleUiHints(true)\n                preferConferenceTimeZone(true)\n                selectFilters(\"\")\n                sendUsageStatistics(false)\n                showNotificationsPreference(true)\n            }\n        }\n    }\n\n    override fun finished(description: Description) {\n        // At the end of every test, cancel the application scope\n        // So DataStore is closed\n        EntryPointAccessors.fromApplication(\n            ApplicationProvider.getApplicationContext(),\n            SetPreferencesRuleEntryPoint::class.java\n        ).applicationScope().cancel()\n        super.finished(description)\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/di/HiltExt.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.di\n\nimport android.content.ComponentName\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.annotation.StyleRes\nimport androidx.core.util.Preconditions\nimport androidx.fragment.app.Fragment\nimport androidx.test.core.app.ActivityScenario\nimport androidx.test.core.app.ApplicationProvider\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.test.HiltTestActivity\n\n/**\n * launchFragmentInContainer from the androidx.fragment:fragment-testing library\n * is NOT possible to use right now as it uses a hardcoded Activity under the hood\n * (i.e. [EmptyFragmentActivity]) which is not annotated with @AndroidEntryPoint.\n *\n * As a workaround, use this function that is equivalent. It requires you to add\n * [HiltTestActivity] in the debug folder and include it in the debug AndroidManifest.xml file\n * as can be found in this project.\n */\ninline fun <reified T : Fragment> launchFragmentInHiltContainer(\n    fragmentArgs: Bundle? = null,\n    @StyleRes themeResId: Int = R.style.FragmentScenarioEmptyFragmentActivityTheme,\n    crossinline action: Fragment.() -> Unit = {}\n) {\n    val startActivityIntent = Intent.makeMainActivity(\n        ComponentName(\n            ApplicationProvider.getApplicationContext(),\n            HiltTestActivity::class.java\n        )\n    ).putExtra(\n        \"androidx.fragment.app.testing.FragmentScenario\" +\n            \".EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY\",\n        themeResId\n    )\n\n    ActivityScenario.launch<HiltTestActivity>(startActivityIntent).onActivity { activity ->\n        val fragment: Fragment = activity.supportFragmentManager.fragmentFactory.instantiate(\n            Preconditions.checkNotNull(T::class.java.classLoader),\n            T::class.java.name\n        )\n        fragment.arguments = fragmentArgs\n        activity.supportFragmentManager\n            .beginTransaction()\n            .add(android.R.id.content, fragment, \"\")\n            .commitNow()\n\n        fragment.action()\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/di/TestCoroutinesModule.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.di\n\nimport android.os.AsyncTask\nimport com.google.samples.apps.iosched.di.CoroutinesModule\nimport com.google.samples.apps.iosched.shared.di.DefaultDispatcher\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport com.google.samples.apps.iosched.shared.di.MainImmediateDispatcher\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.components.SingletonComponent\nimport dagger.hilt.testing.TestInstallIn\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.asCoroutineDispatcher\n\n@TestInstallIn(\n    components = [SingletonComponent::class],\n    replaces = [CoroutinesModule::class]\n)\n@Module\nobject TestCoroutinesModule {\n\n    @DefaultDispatcher\n    @Provides\n    fun providesDefaultDispatcher(): CoroutineDispatcher =\n        AsyncTask.THREAD_POOL_EXECUTOR.asCoroutineDispatcher()\n\n    @IoDispatcher\n    @Provides\n    fun providesIoDispatcher(): CoroutineDispatcher =\n        AsyncTask.THREAD_POOL_EXECUTOR.asCoroutineDispatcher()\n\n    @MainDispatcher\n    @Provides\n    fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main\n\n    @MainImmediateDispatcher\n    @Provides\n    fun providesMainImmediateDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/di/TestPreferencesStorageModule.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.di\n\nimport android.content.Context\nimport androidx.datastore.core.DataStore\nimport androidx.datastore.preferences.SharedPreferencesMigration\nimport androidx.datastore.preferences.core.PreferenceDataStoreFactory\nimport androidx.datastore.preferences.core.Preferences\nimport androidx.datastore.preferences.preferencesDataStoreFile\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.Companion.PREFS_NAME\nimport com.google.samples.apps.iosched.di.PreferencesStorageModule\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport dagger.hilt.testing.TestInstallIn\nimport kotlinx.coroutines.CoroutineScope\nimport javax.inject.Singleton\n\n@TestInstallIn(\n    components = [SingletonComponent::class],\n    replaces = [PreferencesStorageModule::class]\n)\n@Module\nobject TestPreferencesStorageModule {\n\n    @Singleton\n    @Provides\n    fun providePreferenceStorage(dataStore: DataStore<Preferences>): PreferenceStorage =\n        DataStorePreferenceStorage(dataStore)\n\n    @Singleton\n    @Provides\n    fun provideDataStore(\n        @ApplicationContext context: Context,\n        @ApplicationScope applicationScope: CoroutineScope\n    ): DataStore<Preferences> {\n        // Using PreferenceDataStoreFactory so we can set our own application scope\n        // that we can control and cancel in UI tests\n        val datastore = PreferenceDataStoreFactory.create(\n            migrations = listOf(SharedPreferencesMigration(context, PREFS_NAME)),\n            scope = applicationScope\n        ) {\n            context.preferencesDataStoreFile(PREFS_NAME)\n        }\n        return datastore\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/prefs/DataStorePreferenceStorageTest.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.prefs\n\nimport android.content.Context\nimport androidx.datastore.preferences.preferencesDataStore\nimport androidx.test.core.app.ApplicationProvider\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\n\nval Context.dataStore by preferencesDataStore(name = \"test\")\n\nclass DataStorePreferenceStorageTest {\n\n    private lateinit var context: Context\n    private lateinit var preferenceStorage: PreferenceStorage\n\n    @Before\n    fun init() {\n        context = ApplicationProvider.getApplicationContext()\n        preferenceStorage = DataStorePreferenceStorage(context.dataStore)\n    }\n\n    @Test\n    fun completeOnboarding() = runTest {\n        preferenceStorage.completeOnboarding(true)\n        val result = preferenceStorage.onboardingCompleted.first()\n        assertTrue(result)\n    }\n\n    @Test\n    fun showScheduleUiHints() = runTest {\n        preferenceStorage.showScheduleUiHints(true)\n        val result = preferenceStorage.areScheduleUiHintsShown()\n        assertTrue(result)\n    }\n\n    @Test\n    fun showNotificationsPreference() = runTest {\n        preferenceStorage.showNotificationsPreference(true)\n        val result = preferenceStorage.notificationsPreferenceShown.first()\n        assertTrue(result)\n    }\n\n    @Test\n    fun preferToReceiveNotifications() = runTest {\n        preferenceStorage.preferToReceiveNotifications(true)\n        val result = preferenceStorage.preferToReceiveNotifications.first()\n        assertTrue(result)\n    }\n\n    @Test\n    fun optInMyLocation() = runTest {\n        preferenceStorage.optInMyLocation(true)\n        val result = preferenceStorage.myLocationOptedIn.first()\n        assertTrue(result)\n    }\n\n    @Test\n    fun stopSnackbar() = runTest {\n        preferenceStorage.stopSnackbar(true)\n        val result = preferenceStorage.isSnackbarStopped()\n        assertTrue(result)\n    }\n\n    @Test\n    fun sendUsageStatistics() = runTest {\n        preferenceStorage.sendUsageStatistics(true)\n        val result = preferenceStorage.sendUsageStatistics.first()\n        assertTrue(result)\n    }\n\n    @Test\n    fun preferConferenceTimeZone() = runTest {\n        preferenceStorage.preferConferenceTimeZone(true)\n        val result = preferenceStorage.preferConferenceTimeZone.first()\n        assertTrue(result)\n    }\n\n    @Test\n    fun selectFilters() = runTest {\n        val filters = \"filter1, filter2\"\n        preferenceStorage.selectFilters(filters)\n        val result = preferenceStorage.selectedFilters.first()\n        assertEquals(filters, result)\n    }\n\n    @Test\n    fun selectTheme() = runTest {\n        val theme = \"theme\"\n        preferenceStorage.selectTheme(theme)\n        val result = preferenceStorage.selectedTheme.first()\n        assertEquals(theme, result)\n    }\n\n    @Test\n    fun showCodelabsInfo() = runTest {\n        preferenceStorage.showCodelabsInfo(true)\n        val result = preferenceStorage.codelabsInfoShown.first()\n        assertTrue(result)\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/AgendaTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport android.widget.TextView\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.espresso.matcher.ViewMatchers.withParent\nimport androidx.test.espresso.matcher.ViewMatchers.withText\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.tests.SetPreferencesRule\nimport dagger.hilt.android.testing.HiltAndroidRule\nimport dagger.hilt.android.testing.HiltAndroidTest\nimport org.hamcrest.CoreMatchers.allOf\nimport org.hamcrest.CoreMatchers.instanceOf\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@HiltAndroidTest\n@RunWith(AndroidJUnit4::class)\nclass AgendaTest {\n\n    @get:Rule(order = 0)\n    var hiltRule = HiltAndroidRule(this)\n\n    // Sets the preferences so no welcome screens are shown\n    @get:Rule(order = 1)\n    var preferencesRule = SetPreferencesRule()\n\n    @get:Rule(order = 2)\n    var activityRule = MainActivityTestRule(R.id.navigation_agenda)\n\n    @Test\n    fun agenda_basicViewsDisplayed() {\n        // Title\n        onView(allOf(instanceOf(TextView::class.java), withParent(withId(R.id.toolbar))))\n            .check(matches(withText(R.string.agenda)))\n        // One of the blocks\n        onView(withText(\"Breakfast\")).check(matches(isDisplayed()))\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/CodelabTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport android.widget.TextView\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.espresso.matcher.ViewMatchers.withParent\nimport androidx.test.espresso.matcher.ViewMatchers.withText\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.data.FakeConferenceDataSource\nimport com.google.samples.apps.iosched.tests.SetPreferencesRule\nimport dagger.hilt.android.testing.HiltAndroidRule\nimport dagger.hilt.android.testing.HiltAndroidTest\nimport org.hamcrest.CoreMatchers.allOf\nimport org.hamcrest.CoreMatchers.instanceOf\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@HiltAndroidTest\n@RunWith(AndroidJUnit4::class)\nclass CodelabTest {\n\n    @get:Rule(order = 0)\n    var hiltRule = HiltAndroidRule(this)\n\n    // Sets the preferences so no welcome screens are shown\n    @get:Rule(order = 1)\n    var preferencesRule = SetPreferencesRule()\n\n    @get:Rule(order = 2)\n    var activityRule = MainActivityTestRule(R.id.navigation_codelabs)\n\n    @Test\n    fun codelab_basicViewsDisplayed() {\n        // Title\n        onView(allOf(instanceOf(TextView::class.java), withParent(withId(R.id.toolbar))))\n            .check(matches(withText(R.string.event_codelabs_title)))\n        // One of the codelabs\n        Thread.sleep(400) // TODO: RecyclerView is async so it makes the test fail\n        onView(withText(FakeConferenceDataSource.FAKE_CODELAB_TITLE)).check(matches(isDisplayed()))\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/HomeTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport android.widget.TextView\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.action.ViewActions.scrollTo\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.espresso.matcher.ViewMatchers.withParent\nimport androidx.test.espresso.matcher.ViewMatchers.withText\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.tests.SetPreferencesRule\nimport dagger.hilt.android.testing.HiltAndroidRule\nimport dagger.hilt.android.testing.HiltAndroidTest\nimport org.hamcrest.CoreMatchers.allOf\nimport org.hamcrest.CoreMatchers.instanceOf\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@HiltAndroidTest\n@RunWith(AndroidJUnit4::class)\nclass HomeTest {\n\n    @get:Rule(order = 0)\n    var hiltRule = HiltAndroidRule(this)\n\n    // Sets the preferences so no welcome screens are shown\n    @get:Rule(order = 1)\n    var preferencesRule = SetPreferencesRule()\n\n    @get:Rule(order = 2)\n    var activityRule = MainActivityTestRule(R.id.navigation_feed)\n\n    @Test\n    fun home_basicViewsDisplayed() {\n        // Title\n        onView(allOf(instanceOf(TextView::class.java), withParent(withId(R.id.toolbar))))\n            .check(matches(withText(R.string.title_home)))\n\n        // For some reason, recycler view auto scrolls to the bottom in espresso test. Preventing\n        // that by scrolling to the top.\n        onView(withId(R.id.recyclerView))\n            .perform(actionOnItemAtPosition<ViewHolder>(0, scrollTo()))\n\n        // One of the blocks\n        onView(withText(R.string.feed_announcement_title)).check(matches(isDisplayed()))\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/InfoTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport android.content.Context\nimport android.widget.TextView\nimport androidx.test.core.app.ApplicationProvider\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.action.ViewActions.click\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.matcher.ViewMatchers\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withParent\nimport androidx.test.espresso.matcher.ViewMatchers.withText\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.R.id\nimport com.google.samples.apps.iosched.tests.SetPreferencesRule\nimport dagger.hilt.android.testing.HiltAndroidRule\nimport dagger.hilt.android.testing.HiltAndroidTest\nimport org.hamcrest.CoreMatchers.allOf\nimport org.hamcrest.CoreMatchers.instanceOf\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Espresso tests for the Info screen, covering main use case.\n */\n@HiltAndroidTest\n@RunWith(AndroidJUnit4::class)\nclass InfoTest {\n\n    @get:Rule(order = 0)\n    var hiltRule = HiltAndroidRule(this)\n\n    // Sets the preferences so no welcome screens are shown\n    @get:Rule(order = 1)\n    var preferencesRule = SetPreferencesRule()\n\n    @get:Rule(order = 2)\n    var activityRule = MainActivityTestRule(R.id.navigation_info)\n\n    private val resources = ApplicationProvider.getApplicationContext<Context>().resources\n\n    @Test\n    fun info_basicViewsDisplayed() {\n        // Title\n        onView(allOf(instanceOf(TextView::class.java), withParent(ViewMatchers.withId(id.toolbar))))\n            .check(matches(withText(R.string.title_info)))\n        onView(withText(resources.getString(R.string.event_types_header)))\n            .check(matches(isDisplayed()))\n        // Travel tab\n        onView(withText(resources.getString(R.string.travel_title))).perform(click())\n        onView(withText(resources.getString(R.string.travel_what_to_bring_title)))\n            .check(matches(isDisplayed()))\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/MainActivityTestRule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport android.content.Intent\nimport androidx.test.rule.ActivityTestRule\nimport com.google.samples.apps.iosched.ui.MainActivity\n\n/**\n * ActivityTestRule for [MainActivity] that can launch with any initial navigation target.\n */\nclass MainActivityTestRule(\n    private val initialNavId: Int\n) : ActivityTestRule<MainActivity>(MainActivity::class.java) {\n\n    override fun getActivityIntent(): Intent {\n        return Intent(Intent.ACTION_MAIN).apply {\n            putExtra(MainActivity.EXTRA_NAVIGATION_ID, initialNavId)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/MapTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport android.widget.TextView\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.espresso.matcher.ViewMatchers.withParent\nimport androidx.test.espresso.matcher.ViewMatchers.withText\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.R.id\nimport com.google.samples.apps.iosched.tests.SetPreferencesRule\nimport dagger.hilt.android.testing.HiltAndroidRule\nimport dagger.hilt.android.testing.HiltAndroidTest\nimport org.hamcrest.CoreMatchers.allOf\nimport org.hamcrest.CoreMatchers.instanceOf\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Espresso tests for the Map screen.\n */\n@HiltAndroidTest\n@RunWith(AndroidJUnit4::class)\nclass MapTest {\n\n    @get:Rule(order = 0)\n    var hiltRule = HiltAndroidRule(this)\n\n    // Sets the preferences so no welcome screens are shown\n    @get:Rule(order = 1)\n    var preferencesRule = SetPreferencesRule()\n\n    @get:Rule(order = 2)\n    var activityRule = MainActivityTestRule(R.id.navigation_map)\n\n    @Test\n    fun map_basicViewsDisplayed() {\n        onView(allOf(instanceOf(TextView::class.java), withParent(withId(id.toolbar))))\n            .check(matches(withText(R.string.title_map)))\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/ScheduleTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport android.content.Context\nimport androidx.test.core.app.ApplicationProvider\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.action.ViewActions.click\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.contrib.RecyclerViewActions\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.espresso.matcher.ViewMatchers.withText\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.tests.FixedTimeRule\nimport com.google.samples.apps.iosched.tests.SetPreferencesRule\nimport com.google.samples.apps.iosched.ui.sessioncommon.SessionViewHolder\nimport dagger.hilt.android.testing.HiltAndroidRule\nimport dagger.hilt.android.testing.HiltAndroidTest\nimport org.junit.Ignore\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Basic Espresso tests for the schedule screen.\n */\n@HiltAndroidTest\n@RunWith(AndroidJUnit4::class)\nclass ScheduleTest {\n\n    @get:Rule(order = 0)\n    var hiltRule = HiltAndroidRule(this)\n\n    // Sets the time to before the conference\n    @get:Rule(order = 1)\n    var timeProviderRule = FixedTimeRule()\n\n    // Sets the preferences so no welcome screens are shown\n    @get:Rule(order = 1)\n    var preferencesRule = SetPreferencesRule()\n\n    @get:Rule(order = 2)\n    var activityRule = MainActivityTestRule(R.id.navigation_schedule)\n\n    private val resources = ApplicationProvider.getApplicationContext<Context>().resources\n\n    @Test\n    fun showFirstDay_sessionOnFirstDayShown() {\n        onView(withText(FAKE_SESSION_ON_DAY1))\n            .check(matches(isDisplayed()))\n    }\n\n    @Test\n    @Ignore(\n        \"Session Details are shown in another pane owned by a parent fragment. This test runs in \" +\n            \"a test Activity that does not include the other pane, so it will never pass.\"\n    )\n    fun clickOnFirstItem_detailsShown() {\n        onView(withId(R.id.recyclerview_schedule))\n            .perform(RecyclerViewActions.actionOnItemAtPosition<SessionViewHolder>(0, click()))\n\n        onView(withId(R.id.session_detail_title)).check(matches(isDisplayed()))\n    }\n\n/* TODO(jdkoren) move to new schedule screen\n    @Test\n    fun clickFilters_showFilters() {\n        checkAnimationsDisabled()\n\n        onView(withId(R.id.filter_fab)).perform(click())\n\n        val uncheckedFilterContentDesc =\n            getDisabledFilterContDesc(FakeConferenceDataSource.FAKE_SESSION_TAG_NAME)\n        val checkedFilterContentDesc =\n            getActiveFilterContDesc(FakeConferenceDataSource.FAKE_SESSION_TAG_NAME)\n\n        // Scroll to the filter\n        onView(allOf(withId(R.id.recyclerview_filter), withParent(withId(R.id.filter_sheet))))\n            .perform(\n                RecyclerViewActions.scrollTo<ScheduleFilterAdapter.FilterViewHolder>(\n                    withContentDescription(uncheckedFilterContentDesc)\n                )\n            )\n\n        onView(withContentDescription(uncheckedFilterContentDesc))\n            .check(matches(isDisplayed()))\n            .perform(click())\n\n        // Check that the filter is enabled\n        onView(\n            allOf(\n                withId(R.id.filter_label),\n                withContentDescription(checkedFilterContentDesc),\n                not(withParent(withId(R.id.filter_description_tags)))\n            )\n        )\n            .check(matches(isDisplayed()))\n            .perform(click())\n    }\n\n    @Test\n    fun filters_applyAFilter() {\n        checkAnimationsDisabled()\n        val sessionName = FakeConferenceDataSource.FAKE_SESSION_NAME\n\n        // Apply the filter that will show the session\n        applyFilter(FakeConferenceDataSource.FAKE_SESSION_TAG_NAME)\n\n        // Check that it's displayed now\n        onView(withText(sessionName))\n            .check(matches(isDisplayed()))\n    }\n\n    @Test\n    fun filters_clearFilters() {\n        // Apply the filter that will show the session\n        val filter = FakeConferenceDataSource.FAKE_SESSION_TAG_NAME\n        applyFilter(filter)\n\n        // Clear\n        onView(withId(R.id.clear_filters_shortcut)).perform(click())\n\n        onView(\n            allOf(\n                withId(R.id.filter_label),\n                withContentDescription(getActiveFilterContDesc(filter)),\n                withParent(withId(R.id.filter_description_tags))\n            )\n        ).check(matches(isCompletelyDisplayed()))\n    }\n\n    private fun applyFilter(filter: String) {\n        // Open the filters sheet\n        onView(withId(R.id.filter_fab)).perform(click())\n\n        // Get the content description of the view we need to click on\n        val uncheckedFilterContentDesc =\n            resources.getString(R.string.a11y_filter_not_applied, filter)\n\n        onView(allOf(withId(R.id.recyclerview_filter), withParent(withId(R.id.filter_sheet))))\n            .check(matches(isDisplayed()))\n\n        // Scroll to the filter\n        onView(allOf(withId(R.id.recyclerview_filter), withParent(withId(R.id.filter_sheet))))\n            .perform(\n                RecyclerViewActions.scrollTo<ScheduleFilterAdapter.FilterViewHolder>(\n                    withContentDescription(uncheckedFilterContentDesc)\n                )\n            )\n\n        // Click on the filter\n        onView(withContentDescription(uncheckedFilterContentDesc))\n            .check(matches(isDisplayed()))\n            .perform(click())\n\n        pressBack()\n    }\n\n    private fun getDisabledFilterContDesc(filter: String) =\n        resources.getString(R.string.a11y_filter_not_applied, filter)\n\n    private fun getActiveFilterContDesc(filter: String) =\n        resources.getString(R.string.a11y_filter_applied, filter)\n\n    private fun checkAnimationsDisabled() {\n        val scale = Settings.Global.getFloat(\n            ApplicationProvider.getApplicationContext<Context>().contentResolver,\n            Settings.Global.ANIMATOR_DURATION_SCALE,\n            1f\n        )\n\n        if (scale > 0) {\n            throw Exception(\n                \"Device must have animations disabled. \" +\n                    \"Developer options -> Animator duration scale\"\n            )\n        }\n    }\n*/\n    companion object {\n        private const val FAKE_SESSION_ON_DAY1 = \"Fake session on day 1\"\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/SessionDetailTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.contrib.RecyclerViewActions\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.espresso.matcher.ViewMatchers.withText\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.data.FakeConferenceDataSource\nimport com.google.samples.apps.iosched.tests.FixedTimeRule\nimport com.google.samples.apps.iosched.tests.SetPreferencesRule\nimport com.google.samples.apps.iosched.tests.di.launchFragmentInHiltContainer\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailFragment\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailFragmentArgs\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder\nimport dagger.hilt.android.testing.HiltAndroidRule\nimport dagger.hilt.android.testing.HiltAndroidTest\nimport org.hamcrest.CoreMatchers.allOf\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Espresso tests for the details screen.\n *\n * TODO\n * * Youtube intent\n * * Information is correct, titles, tags, date and time\n * * Start event\n * * Related events present\n * * Star related events\n * * Speakers present\n * * Share intent\n * * Map intent\n * * Navigate to related event\n * * Navigate to speaker\n *\n */\n@HiltAndroidTest\n@RunWith(AndroidJUnit4::class)\nclass SessionDetailTest {\n\n    @get:Rule(order = 0)\n    var hiltRule = HiltAndroidRule(this)\n\n    // Sets the time to before the conference\n    @get:Rule(order = 1)\n    var timeProviderRule = FixedTimeRule()\n\n    // Sets the preferences so no welcome screens are shown\n    @get:Rule(order = 1)\n    var preferencesRule = SetPreferencesRule()\n\n    @Before\n    fun launchScreen() {\n        val fragmentArgs =\n            SessionDetailFragmentArgs(FakeConferenceDataSource.FAKE_SESSION_ID).toBundle()\n        launchFragmentInHiltContainer<SessionDetailFragment>(fragmentArgs, R.style.AppTheme)\n    }\n\n    @Test\n    fun details_basicViewsDisplayed() {\n        // On the details screen, scroll down to the speaker\n        onView(withId(R.id.session_detail_recycler_view))\n            .perform(RecyclerViewActions.scrollToPosition<SessionDetailViewHolder>(2))\n\n        // Check that the speaker name is displayed\n        onView(\n            allOf(\n                withId(R.id.speaker_item_name),\n                withText(FakeConferenceDataSource.FAKE_SESSION_SPEAKER_NAME)\n            )\n        ).check(matches(isDisplayed()))\n\n        // Scroll down to the related events\n        onView(withId(R.id.session_detail_recycler_view))\n            .perform(RecyclerViewActions.scrollToPosition<SessionDetailViewHolder>(4))\n\n        // Check that the title is correct\n        onView(allOf(withId(R.id.session_detail_title), withText(\"Fake session on day 1\")))\n            .check(matches(isDisplayed()))\n    }\n}\n"
  },
  {
    "path": "mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/SettingsTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.tests.ui\n\nimport android.content.Context\nimport android.widget.TextView\nimport androidx.test.core.app.ApplicationProvider\nimport androidx.test.espresso.Espresso.onView\nimport androidx.test.espresso.assertion.ViewAssertions.matches\nimport androidx.test.espresso.matcher.ViewMatchers.isDisplayed\nimport androidx.test.espresso.matcher.ViewMatchers.withId\nimport androidx.test.espresso.matcher.ViewMatchers.withParent\nimport androidx.test.espresso.matcher.ViewMatchers.withText\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.R.id\nimport com.google.samples.apps.iosched.tests.SetPreferencesRule\nimport dagger.hilt.android.testing.HiltAndroidRule\nimport dagger.hilt.android.testing.HiltAndroidTest\nimport org.hamcrest.CoreMatchers.allOf\nimport org.hamcrest.CoreMatchers.instanceOf\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Espresso tests for Settings screen\n */\n@HiltAndroidTest\n@RunWith(AndroidJUnit4::class)\nclass SettingsTest {\n\n    @get:Rule(order = 0)\n    var hiltRule = HiltAndroidRule(this)\n\n    // Sets the preferences so no welcome screens are shown\n    @get:Rule(order = 1)\n    var preferencesRule = SetPreferencesRule()\n\n    @get:Rule(order = 2)\n    var activityRule = MainActivityTestRule(R.id.navigation_settings)\n\n    private val resources = ApplicationProvider.getApplicationContext<Context>().resources\n\n    @Test\n    fun settings_basicViewsDisplayed() {\n        // Title\n        onView(allOf(instanceOf(TextView::class.java), withParent(withId(id.toolbar))))\n            .check(matches(withText(R.string.settings_title)))\n        // Preference toggle\n        onView(withText(resources.getString(R.string.settings_enable_notifications)))\n            .check(matches(isDisplayed()))\n        // About label\n        onView(withText(resources.getString(R.string.about_title)))\n            .check(matches(isDisplayed()))\n    }\n}\n"
  },
  {
    "path": "mobile/src/debugRelease/java/com/google/samples/apps/iosched/di/SignInModule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.di\n\nimport com.google.firebase.auth.FirebaseAuth\nimport com.google.firebase.auth.ktx.auth\nimport com.google.firebase.firestore.FirebaseFirestore\nimport com.google.firebase.ktx.Firebase\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthIdDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthStateUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.FirebaseAuthStateUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.FirestoreRegisteredUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.RegisteredUserDataSource\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport com.google.samples.apps.iosched.shared.domain.sessions.NotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.fcm.FcmTokenUpdater\nimport com.google.samples.apps.iosched.util.signin.FirebaseAuthSignInHandler\nimport com.google.samples.apps.iosched.util.signin.SignInHandler\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\ninternal class SignInModule {\n\n    @Provides\n    fun provideSignInHandler(\n        @ApplicationScope applicationScope: CoroutineScope\n    ): SignInHandler = FirebaseAuthSignInHandler(applicationScope)\n\n    @Singleton\n    @Provides\n    fun provideRegisteredUserDataSource(\n        firestore: FirebaseFirestore\n    ): RegisteredUserDataSource {\n        return FirestoreRegisteredUserDataSource(firestore)\n    }\n\n    @Singleton\n    @Provides\n    fun provideAuthStateUserDataSource(\n        firebase: FirebaseAuth,\n        firestore: FirebaseFirestore,\n        notificationAlarmUpdater: NotificationAlarmUpdater,\n        @ApplicationScope applicationScope: CoroutineScope,\n        @IoDispatcher ioDispatcher: CoroutineDispatcher,\n        @MainDispatcher mainDispatcher: CoroutineDispatcher\n    ): AuthStateUserDataSource {\n\n        return FirebaseAuthStateUserDataSource(\n            firebase,\n            FcmTokenUpdater(applicationScope, mainDispatcher, firestore),\n            notificationAlarmUpdater,\n            applicationScope,\n            ioDispatcher\n        )\n    }\n\n    @Singleton\n    @Provides\n    fun provideFirebaseAuth(): FirebaseAuth {\n        return Firebase.auth\n    }\n\n    @Singleton\n    @Provides\n    fun providesAuthIdDataSource(\n        firebaseAuth: FirebaseAuth\n    ): AuthIdDataSource {\n        return object : AuthIdDataSource {\n            override fun getUserId() = firebaseAuth.currentUser?.uid\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.google.samples.apps.iosched\">\n\n    <uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n\n    <application\n        android:name=\".MainApplication\"\n        android:allowBackup=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n\n        <!-- Required for apps targeting API 28 and above and using Google Maps. -->\n        <uses-library android:name=\"org.apache.http.legacy\" android:required=\"false\" />\n\n        <meta-data android:name=\"com.google.ar.core\" android:value=\"optional\" />\n\n        <meta-data tools:replace=\"android:value\"\n            android:name=\"com.google.ar.core.min_apk_version\"\n            android:value=\"190128000\" />\n\n        <activity\n            android:name=\".ui.LauncherActivity\"\n            android:theme=\"@style/AppTheme.Launcher\">\n            <!-- This will have to be placed wherever the activity-alias is pointing to. -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <!-- Accept URIs that begin with \"iosched://sessions” -->\n                <data android:scheme=\"iosched\"\n                    android:host=\"sessions\" />\n            </intent-filter>\n         </activity>\n\n        <activity\n            android:name=\".ui.MainActivity\" >\n            <intent-filter>\n                <action android:name=\"com.google.samples.apps.iosched.STARTUP_ACTIVITY\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\".ui.onboarding.OnboardingActivity\"\n            android:theme=\"@style/AppTheme.Onboarding\" />\n\n        <meta-data\n            android:name=\"preloaded_fonts\"\n            android:resource=\"@array/preloaded_fonts\" />\n\n        <meta-data\n            android:name=\"com.google.android.gms.version\"\n            android:value=\"@integer/google_play_services_version\" />\n\n        <meta-data\n            android:name=\"com.google.android.geo.API_KEY\"\n            android:value=\"@string/google_maps_key\" />\n\n        <meta-data\n            android:name=\"firebase_crashlytics_collection_enabled\"\n            android:value=\"${crashlyticsEnabled}\" />\n\n        <!-- By default, these are not exported since they do not have an intent filter.\n             However, explicitly saying exported=\"false\" to communicate that these are not for\n             other apps to call -->\n        <receiver android:name=\".shared.notifications.AlarmBroadcastReceiver\"\n            android:exported=\"false\" />\n        <receiver android:name=\".shared.notifications.CancelNotificationBroadcastReceiver\"\n            android:exported=\"false\" />\n\n        <provider\n            android:name=\"androidx.startup.InitializationProvider\"\n            android:authorities=\"${applicationId}.androidx-startup\"\n            android:exported=\"false\"\n            tools:node=\"merge\">\n            <meta-data\n                android:name=\"com.google.samples.apps.iosched.util.initializers.AndroidThreeTenInitializer\"\n                android:value=\"androidx.startup\" />\n            <meta-data\n                android:name=\"com.google.samples.apps.iosched.util.initializers.StrictModeInitializer\"\n                android:value=\"androidx.startup\" />\n            <meta-data\n                android:name=\"com.google.samples.apps.iosched.util.initializers.TimberInitializer\"\n                android:value=\"androidx.startup\" />\n\n        </provider>\n        <!-- enable profiling by macrobenchmark -->\n        <profileable\n            android:shell=\"true\"\n            tools:targetApi=\"q\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "mobile/src/main/assets/anim/0.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":194,\"nm\":\"00\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-0 .darkfill\",\"cl\":\"number-0 darkfill\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[60.061,31.625],[-67.939,31.625],[-67.939,-32.375],[60.061,-32.375]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.203921571374,0.658823549747,0.32549020648,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-0 .darkfill\",\"cl\":\"number-0 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[-61,97,0],\"e\":[69,97,0],\"to\":[21.6666660308838,0,0],\"ti\":[-21.6666660308838,0,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97,0],\"e\":[69,97,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97,0],\"e\":[-61,97,0],\"to\":[-21.6666660308838,0,0],\"ti\":[21.6666660308838,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[60.061,31.625],[-67.939,31.625],[-67.939,-32.375],[60.061,-32.375]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.203921571374,0.658823549747,0.32549020648,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-0 .lightfill\",\"cl\":\"number-0 lightfill\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-35.346,0],[0,35.346],[0,0]],\"o\":[[35.346,0],[0,0],[0,35.346]],\"v\":[[-3.939,95.625],[60.061,31.625],[-67.939,31.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\".number-0. lightfill\",\"cl\":\"number-0 \",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[69,31.5,0],\"e\":[69,97,0],\"to\":[0,10.9166669845581,0],\"ti\":[0,-10.9166669845581,0]},{\"i\":{\"x\":0.629,\"y\":0.629},\"o\":{\"x\":0.912,\"y\":0.912},\"n\":\"0p629_0p629_0p912_0p912\",\"t\":15,\"s\":[69,97,0],\"e\":[69,97,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97,0],\"e\":[69,31.5,0],\"to\":[0,-10.9166669845581,0],\"ti\":[0,10.9166669845581,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-35.346,0],[0,35.346],[0,0]],\"o\":[[35.346,0],[0,0],[0,35.346]],\"v\":[[-3.939,95.625],[60.061,31.625],[-67.939,31.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\".number-0 .lightstroke\",\"cl\":\"number-0 lightstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[-33.073,0],[-1.317,-32.755]],\"o\":[[1.317,-32.755],[33.073,0],[0,0]],\"v\":[[-65.389,-34.875],[-3.939,-93.875],[57.51,-34.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[{\"tm\":15,\"cm\":\"1\",\"dr\":0},{\"tm\":30,\"cm\":\"2\",\"dr\":0}]}"
  },
  {
    "path": "mobile/src/main/assets/anim/1.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":193,\"nm\":\"01\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-1\",\"cl\":\"number-1\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[34.5,96.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-0.833,1.332],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[-1.571,0]],\"v\":[[-34.027,-34.935],[4.061,-95.875],[60.061,-95.875],[60.061,-31.875],[-32.331,-31.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.984313726425,0.737254917622,0.015686275437,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-1 .darkfill\",\"cl\":\"number-1 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[34.5,162,0],\"e\":[34.5,96.5,0],\"to\":[0,-10.9166669845581,0],\"ti\":[0,10.9166669845581,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[34.5,96.5,0],\"e\":[34.5,96.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[34.5,96.5,0],\"e\":[34.5,162,0],\"to\":[0,10.9166669845581,0],\"ti\":[0,-10.9166669845581,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-0.833,1.332],[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0],[-1.571,0]],\"v\":[[-34.027,-34.935],[-9.065,-74.875],[4.061,-95.875],[60.061,-95.875],[60.061,-31.875],[-32.331,-31.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.984313726425,0.737254917622,0.015686275437,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-1 .lightfill\",\"cl\":\"number-1 lightfill\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[34.5,96.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-1.85,93.625],[-1.85,-29.375],[57.15,-29.375],[57.15,93.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.996078431373,0.937254901961,0.764705882353,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":6,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[{\"tm\":15,\"cm\":\"1\",\"dr\":0},{\"tm\":30,\"cm\":\"2\",\"dr\":0}]}\n"
  },
  {
    "path": "mobile/src/main/assets/anim/2.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":193,\"nm\":\"02\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-2\",\"cl\":\"number-2\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":15,\"s\":[69,95,0],\"e\":[69,95,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"t\":30}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,35.346],[0,0],[0,0]],\"o\":[[0,0],[0,0],[35.346,0]],\"v\":[[60.061,-31.375],[-3.939,-31.375],[-3.939,32.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.258823543787,0.521568655968,0.956862747669,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-2 .darkfill\",\"cl\":\"number-2 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.271,\"y\":0.895},\"o\":{\"x\":0.912,\"y\":0},\"n\":\"0p271_0p895_0p912_0\",\"t\":0,\"s\":[69,29,0],\"e\":[69,94.843,0],\"to\":[0,10.7926044464111,0],\"ti\":[0,-11.9904975891113,0]},{\"i\":{\"x\":0.629,\"y\":1},\"o\":{\"x\":0.138,\"y\":1},\"n\":\"0p629_1_0p138_1\",\"t\":13,\"s\":[69,94.843,0],\"e\":[69,95,0],\"to\":[0,0.23041497170925,0],\"ti\":[0,-0.20739570260048,0]},{\"i\":{\"x\":-0.037,\"y\":-0.037},\"o\":{\"x\":0.545,\"y\":0.545},\"n\":\"-0p037_-0p037_0p545_0p545\",\"t\":15,\"s\":[69,95,0],\"e\":[69,95,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,95,0],\"e\":[69,29,0],\"to\":[0,-11,0],\"ti\":[0,11,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,35.346],[0,0],[0,0]],\"o\":[[0,0],[0,0],[35.346,0]],\"v\":[[60.061,-31.375],[-3.939,-31.375],[-3.939,32.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.258823543787,0.521568655968,0.956862747669,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-2\",\"cl\":\"number-2\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,95.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[60.061,96.625],[-67.939,96.625],[-67.939,32.625],[60.061,32.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.823529422283,0.890196084976,0.988235294819,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\".number-2 .lightfill\",\"cl\":\"number-2 lightfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[-58.5,94,0],\"e\":[70,94,0],\"to\":[21.4166660308838,0,0],\"ti\":[-21.4166660308838,0,0]},{\"i\":{\"x\":-0.037,\"y\":-0.037},\"o\":{\"x\":0.545,\"y\":0.545},\"n\":\"-0p037_-0p037_0p545_0p545\",\"t\":15,\"s\":[70,94,0],\"e\":[70,94,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[70,94,0],\"e\":[-58.5,94,0],\"to\":[-21.4166660308838,0,0],\"ti\":[21.4166660308838,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[60.061,96.625],[-67.939,96.625],[-67.939,32.625],[60.061,32.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.823529422283,0.890196084976,0.988235294819,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\".number-2 .darkstroke\",\"cl\":\"number-2 darkstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,95.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-63.429,30.125],[-26.554,-28.875],[-6.439,-28.875],[-6.439,30.125]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.68235296011,0.796078443527,0.96862745285,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":4,\"nm\":\".number-2 .lightstroke\",\"cl\":\"number-2 lightstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,95.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[-33.073,0],[-1.317,-32.755]],\"o\":[[1.317,-32.755],[33.073,0],[0,0]],\"v\":[[-65.389,-33.875],[-3.939,-92.875],[57.51,-33.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.823529422283,0.890196084976,0.988235294819,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[{\"tm\":15,\"cm\":\"1\",\"dr\":0},{\"tm\":30,\"cm\":\"2\",\"dr\":0}]}"
  },
  {
    "path": "mobile/src/main/assets/anim/3.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":140,\"h\":194,\"nm\":\"03\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-3 .darkstroke\",\"cl\":\"number-3 darkstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[73.5,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-1.439,30.125],[-1.439,-28.875],[57.561,-28.875],[57.561,30.125]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.658823549747,0.854901969433,0.709803938866,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-3\",\"cl\":\"number-3\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[73.5,32,0],\"e\":[73.5,97,0],\"to\":[0,10.8333330154419,0],\"ti\":[0,-10.8333330154419,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[73.5,97,0],\"e\":[73.5,97,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[73.5,97,0],\"e\":[73.5,32,0],\"to\":[0,-10.8333330154419,0],\"ti\":[0,10.8333330154419,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-35.346,0],[0,35.346],[0,0]],\"o\":[[35.346,0],[0,0],[0,35.346]],\"v\":[[-3.939,96.625],[60.061,32.625],[-67.939,32.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-3 .lightfill\",\"cl\":\"number-3 lightfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[74,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-35.346,0],[0,35.346],[0,0]],\"o\":[[35.346,0],[0,0],[0,35.346]],\"v\":[[-3.939,96.625],[60.061,32.625],[-67.939,32.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\".number-3\",\"cl\":\"number-3\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[74,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,-17.673],[-17.673,0],[0,0]],\"o\":[[0,17.673],[0,0],[-17.673,0]],\"v\":[[-35.939,0.625],[-3.939,32.625],[-3.939,-31.375]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.203921571374,0.658823549747,0.32549020648,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\".number-3 .darkfill\",\"cl\":\"number-3 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[108.5,97,0],\"e\":[73.5,97,0],\"to\":[-5.83333349227905,0,0],\"ti\":[5.83333349227905,0,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[73.5,97,0],\"e\":[73.5,97,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[73.5,97,0],\"e\":[108.5,97,0],\"to\":[5.83333349227905,0,0],\"ti\":[-5.83333349227905,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,-17.673],[-17.673,0],[0,0]],\"o\":[[0,17.673],[0,0],[-17.673,0]],\"v\":[[-35.939,0.625],[-3.939,32.625],[-3.939,-31.375]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.203921571374,0.658823549747,0.32549020648,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":4,\"nm\":\".number-3 .lightstroke\",\"cl\":\"number-3 lightstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[73.5,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[-33.073,0],[-1.317,-32.755]],\"o\":[[1.317,-32.755],[33.073,0],[0,0]],\"v\":[[-65.389,-33.875],[-3.939,-92.875],[57.51,-33.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[{\"tm\":15,\"cm\":\"1\",\"dr\":0},{\"tm\":30,\"cm\":\"2\",\"dr\":0}]}"
  },
  {
    "path": "mobile/src/main/assets/anim/4.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":193,\"nm\":\"04\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-4\",\"cl\":\"number-4\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[68,96.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-3.939,32.125],[60.061,32.125],[60.061,-31.875],[-3.939,-31.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.898039221764,0.266666680574,0.247058823705,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-4 .darkfill\",\"cl\":\"number-4 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[3,96.5,0],\"e\":[68,96.5,0],\"to\":[10.8333330154419,0,0],\"ti\":[-10.8333330154419,0,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[68,96.5,0],\"e\":[68,96.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[68,96.5,0],\"e\":[3,96.5,0],\"to\":[-10.8333330154419,0,0],\"ti\":[10.8333330154419,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-3.939,32.125],[60.061,32.125],[60.061,-31.875],[-3.939,-31.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.898039221764,0.266666680574,0.247058823705,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-4 .lightstroke\",\"cl\":\"number-4 lightstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[68,96.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-65.439,29.625],[-65.439,-54.489],[-6.439,-91.364],[-6.439,29.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.980392158031,0.823529422283,0.811764717102,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\".number-4 .darkstroke\",\"cl\":\"number-4 darkstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[68,96.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-1.439,93.625],[-1.439,34.625],[57.561,34.625],[57.561,93.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.980392158031,0.823529422283,0.811764717102,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\".number-4 .darkfill\",\"cl\":\"number-4 darkfill\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[68,96.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-3.939,32.125],[60.061,32.125],[60.061,-31.875],[-3.939,-31.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.898039221764,0.266666680574,0.247058823705,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":4,\"nm\":\".number-4 .lightfill\",\"cl\":\"number-4 lightfill\",\"tt\":2,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[68,160,0],\"e\":[68,96.5,0],\"to\":[0,-10.5833330154419,0],\"ti\":[0,10.5833330154419,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[68,96.5,0],\"e\":[68,96.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[68,96.5,0],\"e\":[68,160,0],\"to\":[0,10.5833330154419,0],\"ti\":[0,-10.5833330154419,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,-17.673],[17.673,0],[0,17.673],[-17.673,0]],\"o\":[[0,17.673],[-17.673,0],[0,-17.673],[17.673,0]],\"v\":[[60.061,-63.875],[28.061,-31.875],[-3.939,-63.875],[28.061,-95.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.988235294819,0.909803926945,0.901960790157,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[{\"tm\":15,\"cm\":\"1\",\"dr\":0},{\"tm\":30,\"cm\":\"2\",\"dr\":0}]}"
  },
  {
    "path": "mobile/src/main/assets/anim/5.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":195,\"nm\":\"05\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-5 .lightstroke\",\"cl\":\"number-5 lightstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[16.266,0],[0,16.266],[-16.266,0],[0,-16.266]],\"o\":[[-16.266,0],[0,-16.266],[16.266,0],[0,16.266]],\"v\":[[-35.939,93.625],[-65.439,64.125],[-35.939,34.625],[-6.439,64.125]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.823529422283,0.890196084976,0.988235294819,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-5\",\"cl\":\"number-5\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[65.061,34.125,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[-3.939,-63.875,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[60.061,-31.875],[-67.939,-31.875],[-67.939,-95.875],[60.061,-95.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.823529422283,0.890196084976,0.988235294819,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-5 .lightfill\",\"cl\":\"number-5 lightfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[-61,97.5,0],\"e\":[69,97.5,0],\"to\":[21.6666660308838,0,0],\"ti\":[-21.6666660308838,0,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97.5,0],\"e\":[69,97.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97.5,0],\"e\":[-61,97.5,0],\"to\":[-21.6666660308838,0,0],\"ti\":[21.6666660308838,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[60.061,-31.875],[-67.939,-31.875],[-67.939,-95.875],[60.061,-95.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.823529422283,0.890196084976,0.988235294819,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\".number-5 .darkstroke\",\"cl\":\"number-5 darkstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,-33.073],[32.755,-1.317]],\"o\":[[32.755,1.317],[0,33.073],[0,0]],\"v\":[[-1.439,-29.325],[57.561,32.125],[-1.439,93.575]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.68235296011,0.796078443527,0.96862745285,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\".number-5\",\"cl\":\"number-5\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":15,\"s\":[69,97.5,0],\"e\":[69,97.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"t\":30}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-3.939,32.125],[-67.939,-7.875],[-67.939,-31.875],[-3.939,-31.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.258823543787,0.521568655968,0.956862747669,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":4,\"nm\":\".number-5 .darkfill\",\"cl\":\"number-5 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[69,32.5,0],\"e\":[69,97.5,0],\"to\":[0,10.8333330154419,0],\"ti\":[0,-10.8333330154419,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97.5,0],\"e\":[69,97.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97.5,0],\"e\":[69,32.5,0],\"to\":[0,-10.8333330154419,0],\"ti\":[0,10.8333330154419,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-3.939,32.125],[-67.939,-7.875],[-67.939,-31.875],[-3.939,-31.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.258823543787,0.521568655968,0.956862747669,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[]}"
  },
  {
    "path": "mobile/src/main/assets/anim/6.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":195,\"nm\":\"06\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-6\",\"cl\":\"number-6\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.688,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[35.346,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,-35.346]],\"v\":[[-3.939,-32.375],[-3.939,31.625],[60.061,31.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.203921571374,0.658823549747,0.32549020648,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-6 .darkfill\",\"cl\":\"number-6 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[2,97.75,0],\"e\":[69,97.75,0],\"to\":[11.1666669845581,0,0],\"ti\":[-11.1666669845581,0,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97.75,0],\"e\":[69,97.75,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97.75,0],\"e\":[2,97.75,0],\"to\":[-11.1666669845581,0,0],\"ti\":[11.1666669845581,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[35.346,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,-35.346]],\"v\":[[-3.939,-32.375],[-3.939,31.625],[60.061,31.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.203921571374,0.658823549747,0.32549020648,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-6\",\"cl\":\"number-6\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-35.346,0],[0,35.346],[0,0]],\"o\":[[35.346,0],[0,0],[0,35.346]],\"v\":[[-3.939,95.625],[60.061,31.625],[-67.939,31.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\".number-6 .lightfill\",\"cl\":\"number-6 lightfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[69,31.5,0],\"e\":[69,97.5,0],\"to\":[0,11,0],\"ti\":[0,-11,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97.5,0],\"e\":[69,97.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97.5,0],\"e\":[69,31.5,0],\"to\":[0,-11,0],\"ti\":[0,11,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-35.346,0],[0,35.346],[0,0]],\"o\":[[35.346,0],[0,0],[0,35.346]],\"v\":[[-3.939,95.625],[60.061,31.625],[-67.939,31.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\".number-6 .darkstroke\",\"cl\":\"number-6 darkstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[-32.755,1.317],[0,0]],\"o\":[[0,0],[0,-33.073],[0,0],[0,0]],\"v\":[[-65.439,29.125],[-65.439,-32.375],[-6.439,-93.825],[-6.439,29.125]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.658823549747,0.854901969433,0.709803938866,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":4,\"nm\":\".number-6 .lightstroke\",\"cl\":\"number-6 lightstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[16.266,0],[0,16.266],[-16.266,0],[0,-16.266]],\"o\":[[-16.266,0],[0,-16.266],[16.266,0],[0,16.266]],\"v\":[[28.061,-34.875],[-1.439,-64.375],[28.061,-93.875],[57.561,-64.375]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.807843148708,0.917647063732,0.839215695858,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[]}"
  },
  {
    "path": "mobile/src/main/assets/anim/7.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":194,\"nm\":\"07\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-7 .lightstroke\",\"cl\":\"number-7 lightstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69.5,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-65.439,93.625],[-65.439,9.511],[-6.439,-27.364],[-6.439,93.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.980392158031,0.823529422283,0.811764717102,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-7\",\"cl\":\"number-7\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,35.346],[0,0],[0,0]],\"o\":[[0,0],[0,0],[35.346,0]],\"v\":[[60.061,-31.875],[-3.939,-31.875],[-3.939,32.125]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.898039221764,0.266666680574,0.247058823705,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-7 .darkfill\",\"cl\":\"number-7 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[4,97,0],\"e\":[69,97,0],\"to\":[10.8333330154419,0,0],\"ti\":[-10.8333330154419,0,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97,0],\"e\":[69,97,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97,0],\"e\":[4,97,0],\"to\":[-10.8333330154419,0,0],\"ti\":[10.8333330154419,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,35.346],[0,0],[0,0]],\"o\":[[0,0],[0,0],[35.346,0]],\"v\":[[60.061,-31.875],[-3.939,-31.875],[-3.939,32.125]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.898039221764,0.266666680574,0.247058823705,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\".number-7\",\"cl\":\"number-7\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[60.061,-31.875],[-67.939,-31.875],[-67.939,-95.875],[60.061,-95.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.988235294819,0.909803926945,0.901960790157,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\".number-7 .lightfill\",\"cl\":\"number-7 lightfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[200,97,0],\"e\":[69,97,0],\"to\":[-21.8333339691162,0,0],\"ti\":[21.8333339691162,0,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97,0],\"e\":[69,97,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97,0],\"e\":[200,97,0],\"to\":[21.8333339691162,0,0],\"ti\":[-21.8333339691162,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[60.061,-31.875],[-67.939,-31.875],[-67.939,-95.875],[60.061,-95.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.988235294819,0.909803926945,0.901960790157,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[]}"
  },
  {
    "path": "mobile/src/main/assets/anim/8.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":195,\"nm\":\"08\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-8\",\"cl\":\"number-8\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-35.346,0],[0,35.346],[0,0]],\"o\":[[35.346,0],[0,0],[0,35.346]],\"v\":[[-3.939,94.875],[60.061,30.875],[-67.939,30.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.258823543787,0.521568655968,0.956862747669,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-8 .darkfill\",\"cl\":\"number-8 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[69,31.5,0],\"e\":[69,97.5,0],\"to\":[0,11,0],\"ti\":[0,-11,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97.5,0],\"e\":[69,97.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97.5,0],\"e\":[69,31.5,0],\"to\":[0,-11,0],\"ti\":[0,11,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-35.346,0],[0,35.346],[0,0]],\"o\":[[35.346,0],[0,0],[0,35.346]],\"v\":[[-3.939,94.875],[60.061,30.875],[-67.939,30.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.258823543787,0.521568655968,0.956862747669,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-8 .darkstroke\",\"cl\":\"number-8 darkstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[-33.073,0],[-1.317,-32.755]],\"o\":[[1.317,-32.755],[33.073,0],[0,0]],\"v\":[[-65.389,28.375],[-3.939,-30.625],[57.51,28.375]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.68235296011,0.796078443527,0.96862745285,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":5,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\".number-8\",\"cl\":\"number-8\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[35.346,0],[0,-35.346],[0,0]],\"o\":[[-35.346,0],[0,0],[0,-35.346]],\"v\":[[-3.939,-97.125],[-67.939,-33.125],[60.061,-33.125]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.823529422283,0.890196084976,0.988235294819,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\".number-8 .lightfill\",\"cl\":\"number-8 lightfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[69,167.5,0],\"e\":[69,97.5,0],\"to\":[0,-11.6666669845581,0],\"ti\":[0,11.6666669845581,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[69,97.5,0],\"e\":[69,97.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[69,97.5,0],\"e\":[69,167.5,0],\"to\":[0,11.6666669845581,0],\"ti\":[0,-11.6666669845581,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[35.346,0],[0,-35.346],[0,0]],\"o\":[[-35.346,0],[0,0],[0,-35.346]],\"v\":[[-3.939,-97.125],[-67.939,-33.125],[60.061,-33.125]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.823529422283,0.890196084976,0.988235294819,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[]}"
  },
  {
    "path": "mobile/src/main/assets/anim/9.json",
    "content": "{\"v\":\"5.4.3\",\"fr\":30,\"ip\":0,\"op\":45,\"w\":130,\"h\":195,\"nm\":\"09\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\".number-9 .lightstroke\",\"cl\":\"number-9 lightstroke\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[68.5,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-1.939,93.625],[-1.939,-91.364],[57.061,-54.489],[57.061,93.625]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.992156863213,0.929411768913,0.772549033165,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":6,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":10,\"ml2\":{\"a\":0,\"k\":10,\"ix\":8},\"bm\":0,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".lightstroke\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"lightstroke\"},{\"ty\":\"tm\",\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":0,\"s\":[100],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":15,\"s\":[0],\"e\":[0]},{\"i\":{\"x\":[0.16],\"y\":[1]},\"o\":{\"x\":[0.84],\"y\":[0]},\"n\":[\"0p16_1_0p84_0\"],\"t\":30,\"s\":[0],\"e\":[100]},{\"t\":44}],\"ix\":1},\"e\":{\"a\":0,\"k\":100,\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\".number-9\",\"cl\":\"number-9\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[69.5,97.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,-35.346],[-35.346,0],[0,0]],\"o\":[[0,35.346],[0,0],[-35.346,0]],\"v\":[[-68.44,-31.875],[-4.44,32.125],[-4.44,-95.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.972549021244,0.721568644047,0.223529413342,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\".number-9 .darkfill\",\"cl\":\"number-9 darkfill\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":0,\"s\":[138.5,97.5,0],\"e\":[68.5,97.5,0],\"to\":[-11.6666669845581,0,0],\"ti\":[11.6666669845581,0,0]},{\"i\":{\"x\":0.16,\"y\":0.16},\"o\":{\"x\":0.84,\"y\":0.84},\"n\":\"0p16_0p16_0p84_0p84\",\"t\":15,\"s\":[68.5,97.5,0],\"e\":[68.5,97.5,0],\"to\":[0,0,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.16,\"y\":1},\"o\":{\"x\":0.84,\"y\":0},\"n\":\"0p16_1_0p84_0\",\"t\":30,\"s\":[68.5,97.5,0],\"e\":[138.5,97.5,0],\"to\":[11.6666669845581,0,0],\"ti\":[-11.6666669845581,0,0]},{\"t\":44}],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,-35.346],[-35.346,0],[0,0]],\"o\":[[0,35.346],[0,0],[-35.346,0]],\"v\":[[-68.44,-31.875],[-4.44,32.125],[-4.44,-95.875]],\"c\":true},\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.972549021244,0.721568644047,0.223529413342,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\".darkfill\",\"np\":2,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false,\"cl\":\"darkfill\"}],\"ip\":0,\"op\":45,\"st\":0,\"bm\":0}],\"markers\":[]}"
  },
  {
    "path": "mobile/src/main/assets/licenses.html",
    "content": "<html>\n<head>\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <style>\n        body{font-family: sans-serif }\n        pre{background-color: #eeeeee; padding: 1em; margin-left: -2em; margin-right: -2em;\n        white-space: pre-wrap}\n    </style>\n    <title>Open source licenses</title>\n</head>\n<body>\n<h3>Notice for packages:</h3>\n<ul>\n    <li>\n        <a href='#-1438937074'>ThreeTen backport</a>\n    </li>\n    <a name='-1438937074'/>\n    <pre>\n        /*\n * Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n *  * Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n *\n *  * Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n *\n *  * Neither the name of JSR-310 nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n    </pre>\n    <li>\n        <a href='#-1073689995'>Glide</a>\n    </li>\n    <li>\n        <a href='#-1073689995'>Glide Annotations</a>\n    </li>\n    <a name='-1073689995'/>\n    <pre>\nLicense for everything not in third_party and not otherwise marked:\n\nCopyright 2014 Google, Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are\npermitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of\n         conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list\n         of conditions and the following disclaimer in the documentation and/or other materials\n         provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY GOOGLE, INC. ``AS IS'' AND ANY EXPRESS OR IMPLIED\nWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE, INC. OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\nADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nThe views and conclusions contained in the software and documentation are those of the\nauthors and should not be interpreted as representing official policies, either expressed\nor implied, of Google, Inc.\n---------------------------------------------------------------------------------------------\nLicense for third_party/disklrucache:\n\nCopyright 2012 Jake Wharton\nCopyright 2011 The Android Open Source Project\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n---------------------------------------------------------------------------------------------\nLicense for third_party/gif_decoder:\n\nCopyright (c) 2013 Xcellent Creations, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n---------------------------------------------------------------------------------------------\nLicense for third_party/gif_encoder/AnimatedGifEncoder.java and\nthird_party/gif_encoder/LZWEncoder.java:\n\nNo copyright asserted on the source code of this class. May be used for any\npurpose, however, refer to the Unisys LZW patent for restrictions on use of\nthe associated LZWEncoder class. Please forward any corrections to\nkweiner@fmsware.com.\n\n-----------------------------------------------------------------------------\nLicense for third_party/gif_encoder/NeuQuant.java\n\nCopyright (c) 1994 Anthony Dekker\n\nNEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. See\n\"Kohonen neural networks for optimal colour quantization\" in \"Network:\nComputation in Neural Systems\" Vol. 5 (1994) pp 351-367. for a discussion of\nthe algorithm.\n\nAny party obtaining a copy of these files from the author, directly or\nindirectly, is granted, free of charge, a full and unrestricted irrevocable,\nworld-wide, paid up, royalty-free, nonexclusive right and license to deal in\nthis software and documentation files (the \"Software\"), including without\nlimitation the rights to use, copy, modify, merge, publish, distribute,\nsublicense, and/or sell copies of the Software, and to permit persons who\nreceive copies from any such party to do so, with the only requirement being\nthat this copyright notice remain intact.\n    </pre>\n\n    <li>\n        <a href='#-1073689995'>Glide Disk LRU Cache Library</a>\n    </li>\n    <a name='-1073689995'/>\n    <pre>\n        Copyright 2012 Jake Wharton\nCopyright 2011 The Android Open Source Project\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n    </pre>\n    <li>\n        <a href='#-1073689995'>Glide GIF Decoder Library</a>\n    </li>\n    <a name='-1073689995'/>\n    <pre>\n        Copyright (c) 2013 Xcellent Creations, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n    </pre>\n    <li>\n        <a href='#1073041841'>Lottie</a>\n    </li>\n    <a name='1073041841'/>\n    <pre>                                 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</pre>\n    <li>\n        <a href='#1288284111'>Adapters</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android AppCompat Library v7</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Arch-Common</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Arch-Runtime</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android ConstraintLayout</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android ConstraintLayout Solver</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Design Support Library</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android KTX Core</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Lifecycle Extensions</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Lifecycle LiveData</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Lifecycle LiveData Core</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Lifecycle Runtime</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Lifecycle ViewModel</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Lifecycle-Common</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support AnimatedVectorDrawable</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support CardView v7</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support Custom Tabs</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support Library Annotations</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support Library compat</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support Library core UI</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support Library core utils</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support Library fragment</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support Library media compat</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support Library v4</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support RecyclerView v7</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Support VectorDrawable</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Android Transition Support Library</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Dagger</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Dagger Android</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Dagger Android Support</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Data Binding Base Library</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Firebase-ui-auth</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Flexbox-layout</a>\n    </li>\n    <li>\n        <a href='#1288284111'>IntelliJ IDEA Annotations</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Javax.inject</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Library</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Org.jetbrains.kotlin:kotlin-stdlib</a>\n    </li>\n    <li>\n        <a href='#1288284111'>Org.jetbrains.kotlin:kotlin-stdlib-jre7</a>\n    </li>\n    <a name='1288284111'/>\n    <pre>                                 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</pre>\n    <li>\n        <a href='#1288284111'>ThreeTenAbp</a>\n    </li>\n    <pre>\n        Copyright (C) 2015 Jake Wharton\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n    </pre>\n</ul>\n</body>\n</html>\n"
  },
  {
    "path": "mobile/src/main/baseline-prof.txt",
    "content": "HPLandroidx/activity/result/ActivityResultRegistry;->registerKey(Ljava/lang/String;)I\nHPLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;II)I\nHPLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nHPLandroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources;\nHPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;\nHPLandroidx/appcompat/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;\nHPLandroidx/appcompat/view/SupportMenuInflater$MenuState;->setItem(Landroid/view/MenuItem;)V\nHPLandroidx/appcompat/view/SupportMenuInflater;->parseMenu(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/view/Menu;)V\nHPLandroidx/appcompat/view/menu/ActionMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V\nHPLandroidx/appcompat/view/menu/ActionMenuItemView;->onMeasure(II)V\nHPLandroidx/appcompat/view/menu/ActionMenuItemView;->updateTextButtonVisibility()V\nHPLandroidx/appcompat/view/menu/MenuBuilder;->getVisibleItems()Ljava/util/ArrayList;\nHPLandroidx/appcompat/view/menu/MenuBuilder;->hasVisibleItems()Z\nHPLandroidx/appcompat/view/menu/MenuBuilder;->onItemsChanged(Z)V\nHPLandroidx/appcompat/view/menu/MenuBuilder;->size()I\nHPLandroidx/appcompat/view/menu/MenuBuilder;->stopDispatchingItemsChanged()V\nHPLandroidx/appcompat/view/menu/MenuItemImpl;->isVisible()Z\nHPLandroidx/appcompat/widget/ActionMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;\nHPLandroidx/appcompat/widget/ActionMenuPresenter;->updateMenuView(Z)V\nHPLandroidx/appcompat/widget/ActionMenuView;->onMeasure(II)V\nHPLandroidx/appcompat/widget/AppCompatBackgroundHelper;-><init>(Landroid/view/View;)V\nHPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V\nHPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V\nHPLandroidx/appcompat/widget/AppCompatDrawableManager;->get()Landroidx/appcompat/widget/AppCompatDrawableManager;\nHPLandroidx/appcompat/widget/AppCompatDrawableManager;->tintDrawable(Landroid/graphics/drawable/Drawable;Lokhttp3/ConnectionSpec$Builder;[I)V\nHPLandroidx/appcompat/widget/AppCompatImageButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\nHPLandroidx/appcompat/widget/AppCompatImageButton;->drawableStateChanged()V\nHPLandroidx/appcompat/widget/AppCompatImageButton;->hasOverlappingRendering()Z\nHPLandroidx/appcompat/widget/AppCompatImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\nHPLandroidx/appcompat/widget/AppCompatImageView;->drawableStateChanged()V\nHPLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z\nHPLandroidx/appcompat/widget/AppCompatTextClassifierHelper;-><init>(Landroid/widget/TextView;)V\nHPLandroidx/appcompat/widget/AppCompatTextHelper$1;-><init>(Landroidx/appcompat/widget/AppCompatTextHelper;IILjava/lang/ref/WeakReference;)V\nHPLandroidx/appcompat/widget/AppCompatTextHelper;-><init>(Landroid/widget/TextView;)V\nHPLandroidx/appcompat/widget/AppCompatTextHelper;->applyCompoundDrawablesTints()V\nHPLandroidx/appcompat/widget/AppCompatTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V\nHPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetTextAppearance(Landroid/content/Context;I)V\nHPLandroidx/appcompat/widget/AppCompatTextHelper;->updateTypefaceAndStyle(Landroid/content/Context;Lcom/google/firebase/iid/zzk;)V\nHPLandroidx/appcompat/widget/AppCompatTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\nHPLandroidx/appcompat/widget/AppCompatTextView;->consumeTextFutureAndSetBlocking()V\nHPLandroidx/appcompat/widget/AppCompatTextView;->drawableStateChanged()V\nHPLandroidx/appcompat/widget/AppCompatTextView;->getText()Ljava/lang/CharSequence;\nHPLandroidx/appcompat/widget/AppCompatTextView;->onLayout(ZIIII)V\nHPLandroidx/appcompat/widget/AppCompatTextView;->onMeasure(II)V\nHPLandroidx/appcompat/widget/AppCompatTextView;->onTextChanged(Ljava/lang/CharSequence;III)V\nHPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\nHPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\nHPLandroidx/appcompat/widget/AppCompatTextView;->setTypeface(Landroid/graphics/Typeface;I)V\nHPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;-><init>(Landroid/widget/TextView;)V\nHPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;->supportsAutoSizeText()Z\nHPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V\nHPLandroidx/appcompat/widget/LinearLayoutCompat;->hasDividerBeforeChildAt(I)Z\nHPLandroidx/appcompat/widget/LinearLayoutCompat;->onLayout(ZIIII)V\nHPLandroidx/appcompat/widget/LinearLayoutCompat;->onMeasure(II)V\nHPLandroidx/appcompat/widget/ResourceManagerInternal;->createDrawableIfNeeded(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;\nHPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;IZ)Landroid/graphics/drawable/Drawable;\nHPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList;\nHPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z\nHPLandroidx/appcompat/widget/ThemeUtils;->checkAppCompatTheme(Landroid/view/View;Landroid/content/Context;)V\nHPLandroidx/appcompat/widget/TintContextWrapper;->wrap(Landroid/content/Context;)Landroid/content/Context;\nHPLandroidx/appcompat/widget/Toolbar;->addCustomViewsWithGravity(Ljava/util/List;I)V\nHPLandroidx/appcompat/widget/Toolbar;->getChildHorizontalGravity(I)I\nHPLandroidx/appcompat/widget/Toolbar;->getChildTop(Landroid/view/View;I)I\nHPLandroidx/appcompat/widget/Toolbar;->getContentInsetEnd()I\nHPLandroidx/appcompat/widget/Toolbar;->getContentInsetStart()I\nHPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetEnd()I\nHPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetStart()I\nHPLandroidx/appcompat/widget/Toolbar;->getHorizontalMargins(Landroid/view/View;)I\nHPLandroidx/appcompat/widget/Toolbar;->getNavigationIcon()Landroid/graphics/drawable/Drawable;\nHPLandroidx/appcompat/widget/Toolbar;->getVerticalMargins(Landroid/view/View;)I\nHPLandroidx/appcompat/widget/Toolbar;->layoutChildLeft(Landroid/view/View;I[II)I\nHPLandroidx/appcompat/widget/Toolbar;->layoutChildRight(Landroid/view/View;I[II)I\nHPLandroidx/appcompat/widget/Toolbar;->measureChildCollapseMargins(Landroid/view/View;IIII[I)I\nHPLandroidx/appcompat/widget/Toolbar;->measureChildConstrained(Landroid/view/View;IIIII)V\nHPLandroidx/appcompat/widget/Toolbar;->onLayout(ZIIII)V\nHPLandroidx/appcompat/widget/Toolbar;->onMeasure(II)V\nHPLandroidx/appcompat/widget/Toolbar;->shouldLayout(Landroid/view/View;)Z\nHPLandroidx/appcompat/widget/ViewUtils;->isLayoutRtl(Landroid/view/View;)Z\nHPLandroidx/arch/core/executor/ArchTaskExecutor;->getInstance()Landroidx/arch/core/executor/ArchTaskExecutor;\nHPLandroidx/arch/core/executor/ArchTaskExecutor;->isMainThread()Z\nHPLandroidx/arch/core/executor/DefaultTaskExecutor;->isMainThread()Z\nHPLandroidx/arch/core/internal/FastSafeIterableMap;->contains(Ljava/lang/Object;)Z\nHPLandroidx/arch/core/internal/FastSafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry;\nHPLandroidx/arch/core/internal/FastSafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/arch/core/internal/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/arch/core/internal/SafeIterableMap$Entry;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V\nHPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getValue()Ljava/lang/Object;\nHPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;-><init>(Landroidx/arch/core/internal/SafeIterableMap;)V\nHPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z\nHPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/lang/Object;\nHPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->next()Ljava/lang/Object;\nHPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->nextNode()Landroidx/arch/core/internal/SafeIterableMap$Entry;\nHPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V\nHPLandroidx/arch/core/internal/SafeIterableMap;-><init>()V\nHPLandroidx/arch/core/internal/SafeIterableMap;->iteratorWithAdditions()Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;\nHPLandroidx/arch/core/internal/SafeIterableMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry;\nHPLandroidx/arch/core/internal/SafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/collection/LongSparseArray;-><init>(I)V\nHPLandroidx/collection/LongSparseArray;->clear()V\nHPLandroidx/collection/LongSparseArray;->size()I\nHPLandroidx/collection/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/collection/SimpleArrayMap;-><init>()V\nHPLandroidx/collection/SimpleArrayMap;->allocArrays(I)V\nHPLandroidx/collection/SimpleArrayMap;->clear()V\nHPLandroidx/collection/SimpleArrayMap;->freeArrays([I[Ljava/lang/Object;I)V\nHPLandroidx/collection/SimpleArrayMap;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/collection/SimpleArrayMap;->indexOf(Ljava/lang/Object;I)I\nHPLandroidx/collection/SimpleArrayMap;->indexOfKey(Ljava/lang/Object;)I\nHPLandroidx/collection/SimpleArrayMap;->keyAt(I)Ljava/lang/Object;\nHPLandroidx/collection/SimpleArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/collection/SimpleArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/collection/SimpleArrayMap;->removeAt(I)Ljava/lang/Object;\nHPLandroidx/collection/SimpleArrayMap;->valueAt(I)Ljava/lang/Object;\nHPLandroidx/collection/SparseArrayCompat;->valueAt(I)Ljava/lang/Object;\nHPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->ordinal(I)I\nHPLandroidx/compose/material/ScaffoldKt$Scaffold$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLandroidx/compose/runtime/Latch$await$2$2;->invoke()V\nHPLandroidx/compose/runtime/SnapshotThreadLocal;->dayForPosition(I)Lcom/google/samples/apps/iosched/model/ConferenceDay;\nHPLandroidx/compose/runtime/SnapshotThreadLocal;->insertOrUpdatePersistedInstallationEntry(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;\nHPLandroidx/compose/runtime/SnapshotThreadLocal;->readJSONFromFile()Lorg/json/JSONObject;\nHPLandroidx/compose/runtime/SnapshotThreadLocal;->readPersistedInstallationEntryValue()Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;\nHPLandroidx/compose/runtime/Stack;->zza(ILjava/lang/Object;Lcom/google/android/gms/internal/measurement/zzhf;)V\nHPLandroidx/constraintlayout/solver/ArrayLinkedVariables;-><init>(Landroidx/constraintlayout/solver/ArrayRow;Lcom/google/firebase/iid/zzaw;)V\nHPLandroidx/constraintlayout/solver/ArrayRow;-><init>()V\nHPLandroidx/constraintlayout/solver/ArrayRow;-><init>(Lcom/google/firebase/iid/zzaw;)V\nHPLandroidx/constraintlayout/solver/ArrayRow;->addError(Landroidx/constraintlayout/solver/LinearSystem;I)Landroidx/constraintlayout/solver/ArrayRow;\nHPLandroidx/constraintlayout/solver/ArrayRow;->createRowGreaterThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;I)Landroidx/constraintlayout/solver/ArrayRow;\nHPLandroidx/constraintlayout/solver/ArrayRow;->createRowLowerThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;I)Landroidx/constraintlayout/solver/ArrayRow;\nHPLandroidx/constraintlayout/solver/ArrayRow;->isNew(Landroidx/constraintlayout/solver/SolverVariable;)Z\nHPLandroidx/constraintlayout/solver/ArrayRow;->pivot(Landroidx/constraintlayout/solver/SolverVariable;)V\nHPLandroidx/constraintlayout/solver/ArrayRow;->updateFromFinalVariable(Landroidx/constraintlayout/solver/SolverVariable;Z)V\nHPLandroidx/constraintlayout/solver/ArrayRow;->updateFromRow(Landroidx/constraintlayout/solver/ArrayRow;Z)V\nHPLandroidx/constraintlayout/solver/LinearSystem$ValuesRow;-><init>(Landroidx/constraintlayout/solver/LinearSystem;Lcom/google/firebase/iid/zzaw;)V\nHPLandroidx/constraintlayout/solver/LinearSystem;-><init>()V\nHPLandroidx/constraintlayout/solver/LinearSystem;->acquireSolverVariable$enumunboxing$(ILjava/lang/String;)Landroidx/constraintlayout/solver/SolverVariable;\nHPLandroidx/constraintlayout/solver/LinearSystem;->addCentering(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;IFLandroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V\nHPLandroidx/constraintlayout/solver/LinearSystem;->addConstraint(Landroidx/constraintlayout/solver/ArrayRow;)V\nHPLandroidx/constraintlayout/solver/LinearSystem;->addEquality(Landroidx/constraintlayout/solver/SolverVariable;I)V\nHPLandroidx/constraintlayout/solver/LinearSystem;->addEquality(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)Landroidx/constraintlayout/solver/ArrayRow;\nHPLandroidx/constraintlayout/solver/LinearSystem;->addGreaterThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V\nHPLandroidx/constraintlayout/solver/LinearSystem;->addLowerThan(Landroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;II)V\nHPLandroidx/constraintlayout/solver/LinearSystem;->addRow(Landroidx/constraintlayout/solver/ArrayRow;)V\nHPLandroidx/constraintlayout/solver/LinearSystem;->computeValues()V\nHPLandroidx/constraintlayout/solver/LinearSystem;->createErrorVariable(ILjava/lang/String;)Landroidx/constraintlayout/solver/SolverVariable;\nHPLandroidx/constraintlayout/solver/LinearSystem;->createObjectVariable(Ljava/lang/Object;)Landroidx/constraintlayout/solver/SolverVariable;\nHPLandroidx/constraintlayout/solver/LinearSystem;->createRow()Landroidx/constraintlayout/solver/ArrayRow;\nHPLandroidx/constraintlayout/solver/LinearSystem;->createSlackVariable()Landroidx/constraintlayout/solver/SolverVariable;\nHPLandroidx/constraintlayout/solver/LinearSystem;->getObjectVariableValue(Ljava/lang/Object;)I\nHPLandroidx/constraintlayout/solver/LinearSystem;->increaseTableSize()V\nHPLandroidx/constraintlayout/solver/LinearSystem;->minimizeGoal(Landroidx/constraintlayout/solver/ArrayRow;)V\nHPLandroidx/constraintlayout/solver/LinearSystem;->optimize(Landroidx/constraintlayout/solver/ArrayRow;)I\nHPLandroidx/constraintlayout/solver/LinearSystem;->releaseRows()V\nHPLandroidx/constraintlayout/solver/LinearSystem;->reset()V\nHPLandroidx/constraintlayout/solver/PriorityGoalRow;-><init>(Lcom/google/firebase/iid/zzaw;)V\nHPLandroidx/constraintlayout/solver/PriorityGoalRow;->addError(Landroidx/constraintlayout/solver/SolverVariable;)V\nHPLandroidx/constraintlayout/solver/PriorityGoalRow;->addToGoal(Landroidx/constraintlayout/solver/SolverVariable;)V\nHPLandroidx/constraintlayout/solver/PriorityGoalRow;->clear()V\nHPLandroidx/constraintlayout/solver/PriorityGoalRow;->getPivotCandidate(Landroidx/constraintlayout/solver/LinearSystem;[Z)Landroidx/constraintlayout/solver/SolverVariable;\nHPLandroidx/constraintlayout/solver/PriorityGoalRow;->removeGoal(Landroidx/constraintlayout/solver/SolverVariable;)V\nHPLandroidx/constraintlayout/solver/PriorityGoalRow;->updateFromRow(Landroidx/constraintlayout/solver/ArrayRow;Z)V\nHPLandroidx/constraintlayout/solver/SolverVariable;-><init>(I)V\nHPLandroidx/constraintlayout/solver/SolverVariable;->addToRow(Landroidx/constraintlayout/solver/ArrayRow;)V\nHPLandroidx/constraintlayout/solver/SolverVariable;->removeFromRow(Landroidx/constraintlayout/solver/ArrayRow;)V\nHPLandroidx/constraintlayout/solver/SolverVariable;->reset()V\nHPLandroidx/constraintlayout/solver/SolverVariable;->setFinalValue(Landroidx/constraintlayout/solver/LinearSystem;F)V\nHPLandroidx/constraintlayout/solver/SolverVariable;->updateReferencesWithNewDefinition(Landroidx/constraintlayout/solver/ArrayRow;)V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;-><init>(Landroidx/constraintlayout/solver/ArrayRow;Lcom/google/firebase/iid/zzaw;)V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->add(Landroidx/constraintlayout/solver/SolverVariable;FZ)V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->addToHashMap(Landroidx/constraintlayout/solver/SolverVariable;I)V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->addVariable(ILandroidx/constraintlayout/solver/SolverVariable;F)V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->clear()V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->contains(Landroidx/constraintlayout/solver/SolverVariable;)Z\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->divideByAmount(F)V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->get(Landroidx/constraintlayout/solver/SolverVariable;)F\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->getCurrentSize()I\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->getVariable(I)Landroidx/constraintlayout/solver/SolverVariable;\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->getVariableValue(I)F\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->indexOf(Landroidx/constraintlayout/solver/SolverVariable;)I\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->invert()V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->put(Landroidx/constraintlayout/solver/SolverVariable;F)V\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->remove(Landroidx/constraintlayout/solver/SolverVariable;Z)F\nHPLandroidx/constraintlayout/solver/SolverVariableValues;->use(Landroidx/constraintlayout/solver/ArrayRow;Z)F\nHPLandroidx/constraintlayout/solver/widgets/Barrier;->addToSolver(Landroidx/constraintlayout/solver/LinearSystem;)V\nHPLandroidx/constraintlayout/solver/widgets/ChainHead;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;IZ)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->connect(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;IIZ)Z\nHPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->getMargin()I\nHPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->hasCenteredDependents()Z\nHPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->isConnected()Z\nHPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->reset()V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;->resetSolverVariable()V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;-><init>()V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->addToSolver(Landroidx/constraintlayout/solver/LinearSystem;)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->applyConstraints$enumunboxing$(Landroidx/constraintlayout/solver/LinearSystem;ZZZZLandroidx/constraintlayout/solver/SolverVariable;Landroidx/constraintlayout/solver/SolverVariable;IZLandroidx/constraintlayout/solver/widgets/ConstraintAnchor;Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;IIIIFZZZZIIIIFZ)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->createObjectVariables(Landroidx/constraintlayout/solver/LinearSystem;)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getAnchor(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getDimensionBehaviour$enumunboxing$(I)I\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getHeight()I\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getHorizontalDimensionBehaviour$enumunboxing$()I\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getVerticalDimensionBehaviour$enumunboxing$()I\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getWidth()I\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getX()I\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getY()I\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isChainHead(I)Z\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isInHorizontalChain()Z\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->isInVerticalChain()Z\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->reset()V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->resetSolverVariables(Lcom/google/firebase/iid/zzaw;)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setHeight(I)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setMinHeight(I)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setMinWidth(I)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->setWidth(I)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->updateFromSolver(Landroidx/constraintlayout/solver/LinearSystem;)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;-><init>()V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->addChain(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;I)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->addChildrenToSolver(Landroidx/constraintlayout/solver/LinearSystem;)Z\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->invalidateGraph()V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->layout()V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->resetSolverVariables(Lcom/google/firebase/iid/zzaw;)V\nHPLandroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;->setOptimizationLevel(I)V\nHPLandroidx/constraintlayout/solver/widgets/Guideline;-><init>()V\nHPLandroidx/constraintlayout/solver/widgets/Guideline;->addToSolver(Landroidx/constraintlayout/solver/LinearSystem;)V\nHPLandroidx/constraintlayout/solver/widgets/Guideline;->getAnchor(Landroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/solver/widgets/ConstraintAnchor;\nHPLandroidx/constraintlayout/solver/widgets/Guideline;->setOrientation(I)V\nHPLandroidx/constraintlayout/solver/widgets/Guideline;->updateFromSolver(Landroidx/constraintlayout/solver/LinearSystem;)V\nHPLandroidx/constraintlayout/solver/widgets/analyzer/DependencyGraph;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;)V\nHPLandroidx/constraintlayout/solver/widgets/analyzer/DependencyNode;-><init>(Landroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;)V\nHPLandroidx/constraintlayout/solver/widgets/analyzer/DimensionDependency;-><init>(Landroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;)V\nHPLandroidx/constraintlayout/solver/widgets/analyzer/HorizontalWidgetRun;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V\nHPLandroidx/constraintlayout/solver/widgets/analyzer/VerticalWidgetRun;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V\nHPLandroidx/constraintlayout/solver/widgets/analyzer/WidgetRun;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidget;)V\nHPLandroidx/constraintlayout/widget/Barrier;->init(Landroid/util/AttributeSet;)V\nHPLandroidx/constraintlayout/widget/ConstraintHelper;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLandroidx/constraintlayout/widget/ConstraintHelper;->addID(Ljava/lang/String;)V\nHPLandroidx/constraintlayout/widget/ConstraintHelper;->addRscID(I)V\nHPLandroidx/constraintlayout/widget/ConstraintHelper;->findId(Landroidx/constraintlayout/widget/ConstraintLayout;Ljava/lang/String;)I\nHPLandroidx/constraintlayout/widget/ConstraintHelper;->onAttachedToWindow()V\nHPLandroidx/constraintlayout/widget/ConstraintHelper;->setIds(Ljava/lang/String;)V\nHPLandroidx/constraintlayout/widget/ConstraintHelper;->validateParams()V\nHPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->resolveLayoutDirection(I)V\nHPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams;->validate()V\nHPLandroidx/constraintlayout/widget/ConstraintLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->dispatchDraw(Landroid/graphics/Canvas;)V\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->getPaddingWidth()I\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->getViewWidget(Landroid/view/View;)Landroidx/constraintlayout/solver/widgets/ConstraintWidget;\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->init(Landroid/util/AttributeSet;II)V\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->isRtl()Z\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->onLayout(ZIIII)V\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->onViewAdded(Landroid/view/View;)V\nHPLandroidx/constraintlayout/widget/ConstraintLayout;->requestLayout()V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->acquireTempRect()Landroid/graphics/Rect;\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getChildRect(Landroid/view/View;ZLandroid/graphics/Rect;)V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getDependencies(Landroid/view/View;)Ljava/util/List;\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getDescendantRect(Landroid/view/View;Landroid/graphics/Rect;)V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getLastWindowInsets()Landroidx/core/view/WindowInsetsCompat;\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getResolvedLayoutParams(Landroid/view/View;)Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumHeight()I\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->getSuggestedMinimumWidth()I\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onChildViewsChanged(I)V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayout(ZIIII)V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onLayoutChild(Landroid/view/View;I)V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasure(II)V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onMeasureChild(Landroid/view/View;IIII)V\nHPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->performIntercept(Landroid/view/MotionEvent;I)Z\nHPLandroidx/coordinatorlayout/widget/ViewGroupUtils;->offsetDescendantMatrix(Landroid/view/ViewParent;Landroid/view/View;Landroid/graphics/Matrix;)V\nHPLandroidx/core/R$dimen;->binarySearch([III)I\nHPLandroidx/core/R$dimen;->getLifecycleScope(Landroidx/lifecycle/LifecycleOwner;)Landroidx/lifecycle/LifecycleCoroutineScopeImpl;\nHPLandroidx/core/R$dimen;->loadFont(Landroid/content/Context;ILandroid/util/TypedValue;ILcom/google/common/collect/Maps;Landroid/os/Handler;ZZ)Landroid/graphics/Typeface;\nHPLandroidx/core/R$id;->Channel$default(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;I)Lkotlinx/coroutines/channels/Channel;\nHPLandroidx/core/R$id;->applyChainConstraints(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;Landroidx/constraintlayout/solver/LinearSystem;I)V\nHPLandroidx/core/R$id;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I\nHPLandroidx/core/R$id;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;ZZ)I\nHPLandroidx/core/R$id;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/OrientationHelper;Landroid/view/View;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Z)I\nHPLandroidx/core/R$id;->configureSharing$FlowKt__ShareKt(Lkotlinx/coroutines/flow/Flow;I)Lcom/google/firebase/iid/zzab;\nHPLandroidx/core/R$id;->coroutineScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLandroidx/core/R$id;->getOrCreateCancellableContinuation(Lkotlin/coroutines/Continuation;)Lkotlinx/coroutines/CancellableContinuationImpl;\nHPLandroidx/core/R$id;->newStaticLayout(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)Landroid/text/StaticLayout;\nHPLandroidx/core/R$id;->plus(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;\nHPLandroidx/core/graphics/Insets;-><init>(IIII)V\nHPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets;\nHPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets;\nHPLandroidx/core/graphics/TypefaceCompat;->createFromResourcesFamilyXml(Landroid/content/Context;Landroidx/core/content/res/FontResourcesParserCompat$FamilyResourceEntry;Landroid/content/res/Resources;IILcom/google/common/collect/Maps;Landroid/os/Handler;Z)Landroid/graphics/Typeface;\nHPLandroidx/core/graphics/TypefaceCompat;->createResourceUid(Landroid/content/res/Resources;II)Ljava/lang/String;\nHPLandroidx/core/provider/FontRequest;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V\nHPLandroidx/core/provider/FontRequestWorker$2;->accept(Landroidx/core/provider/FontRequestWorker$TypefaceResult;)V\nHPLandroidx/core/provider/FontRequestWorker;->createCacheId(Landroidx/core/provider/FontRequest;I)Ljava/lang/String;\nHPLandroidx/core/util/Pools$SimplePool;-><init>(II)V\nHPLandroidx/core/util/Pools$SimplePool;->acquire()Ljava/lang/Object;\nHPLandroidx/core/util/Pools$SimplePool;->release(Ljava/lang/Object;)Z\nHPLandroidx/core/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object;\nHPLandroidx/core/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z\nHPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;-><init>(Landroidx/core/view/AccessibilityDelegateCompat;)V\nHPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider;\nHPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V\nHPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V\nHPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z\nHPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V\nHPLandroidx/core/view/AccessibilityDelegateCompat;-><init>()V\nHPLandroidx/core/view/AccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/PointerIconCompat;\nHPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V\nHPLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedPreScroll(II[I[II)Z\nHPLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedScrollInternal(IIII[II[I)Z\nHPLandroidx/core/view/NestedScrollingChildHelper;->getNestedScrollingParentForType(I)Landroid/view/ViewParent;\nHPLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll(I)V\nHPLandroidx/core/view/ViewCompat$2;-><init>(ILjava/lang/Class;II)V\nHPLandroidx/core/view/ViewCompat$2;-><init>(ILjava/lang/Class;III)V\nHPLandroidx/core/view/ViewCompat$2;->frameworkGet(Landroid/view/View;)Ljava/lang/Boolean;\nHPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;-><init>(ILjava/lang/Class;I)V\nHPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;-><init>(ILjava/lang/Class;II)V\nHPLandroidx/core/view/ViewCompat$AccessibilityViewProperty;->get(Landroid/view/View;)Ljava/lang/Object;\nHPLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat;\nHPLandroidx/core/view/ViewCompat$Api29Impl;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V\nHPLandroidx/core/view/ViewCompat;->getAccessibilityDelegate(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat;\nHPLandroidx/core/view/ViewCompat;->getAccessibilityDelegateInternal(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate;\nHPLandroidx/core/view/ViewCompat;->getAccessibilityPaneTitle(Landroid/view/View;)Ljava/lang/CharSequence;\nHPLandroidx/core/view/ViewCompat;->notifyViewAccessibilityStateChangedIfNeeded(Landroid/view/View;I)V\nHPLandroidx/core/view/ViewCompat;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V\nHPLandroidx/core/view/ViewCompat;->setAccessibilityDelegate(Landroid/view/View;Landroidx/core/view/AccessibilityDelegateCompat;)V\nHPLandroidx/core/view/WindowInsetsCompat$Impl20;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V\nHPLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets;\nHPLandroidx/core/view/WindowInsetsCompat$Impl21;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V\nHPLandroidx/core/view/WindowInsetsCompat$Impl29;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V\nHPLandroidx/core/view/WindowInsetsCompat$Impl29;->getSystemGestureInsets()Landroidx/core/graphics/Insets;\nHPLandroidx/core/view/WindowInsetsCompat$Impl;-><init>(Landroidx/core/view/WindowInsetsCompat;)V\nHPLandroidx/core/view/WindowInsetsCompat;-><init>(Landroid/view/WindowInsets;)V\nHPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetBottom()I\nHPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetLeft()I\nHPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetRight()I\nHPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I\nHPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat;\nHPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->obtain(IIIIZZ)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;\nHPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;-><init>(Landroid/view/accessibility/AccessibilityNodeInfo;)V\nHPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionItemInfo(Ljava/lang/Object;)V\nHPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V\nHPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V\nHPLandroidx/customview/widget/ViewDragHelper;->shouldInterceptTouchEvent(Landroid/view/MotionEvent;)Z\nHPLandroidx/databinding/BaseObservable;->notifyPropertyChanged(I)V\nHPLandroidx/databinding/MergedDataBinderMapper;->getDataBinder(Landroidx/databinding/DataBindingComponent;Landroid/view/View;I)Landroidx/databinding/ViewDataBinding;\nHPLandroidx/databinding/ViewDataBinding$6;->onViewAttachedToWindow(Landroid/view/View;)V\nHPLandroidx/databinding/ViewDataBinding$7;->run()V\nHPLandroidx/databinding/ViewDataBinding$8;->doFrame(J)V\nHPLandroidx/databinding/ViewDataBinding;-><init>(Ljava/lang/Object;Landroid/view/View;I)V\nHPLandroidx/databinding/ViewDataBinding;->executeBindingsInternal()V\nHPLandroidx/databinding/ViewDataBinding;->executePendingBindings()V\nHPLandroidx/databinding/ViewDataBinding;->handleFieldChange(ILjava/lang/Object;I)V\nHPLandroidx/databinding/ViewDataBinding;->isNumeric(Ljava/lang/String;I)Z\nHPLandroidx/databinding/ViewDataBinding;->mapBindings(Landroidx/databinding/DataBindingComponent;Landroid/view/View;[Ljava/lang/Object;Lcom/google/firebase/iid/zzk;Landroid/util/SparseIntArray;Z)V\nHPLandroidx/databinding/ViewDataBinding;->registerTo(ILjava/lang/Object;Landroidx/databinding/CreateWeakListener;)V\nHPLandroidx/databinding/ViewDataBinding;->requestRebind()V\nHPLandroidx/databinding/ViewDataBinding;->safeUnbox(Ljava/lang/Boolean;)Z\nHPLandroidx/databinding/ViewDataBinding;->setLifecycleOwner(Landroidx/lifecycle/LifecycleOwner;)V\nHPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1$invokeSuspend$$inlined$collect$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1;-><init>(Landroidx/databinding/ViewDataBindingKtx$StateFlowListener;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V\nHPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nHPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener;->setLifecycleOwner(Landroidx/lifecycle/LifecycleOwner;)V\nHPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener;->startCollection(Landroidx/lifecycle/LifecycleOwner;Lkotlinx/coroutines/flow/Flow;)V\nHPLandroidx/databinding/ViewStubProxy;->arrayContains([II)Z\nHPLandroidx/databinding/ViewStubProxy;->getTintListForDrawableRes(Landroid/content/Context;I)Landroid/content/res/ColorStateList;\nHPLandroidx/datastore/core/SingleProcessDataStore$data$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/fragment/app/Fragment;-><init>()V\nHPLandroidx/fragment/app/Fragment;->getParentFragmentManager()Landroidx/fragment/app/FragmentManager;\nHPLandroidx/fragment/app/Fragment;->getViewModelStore()Landroidx/lifecycle/ViewModelStore;\nHPLandroidx/fragment/app/Fragment;->initState()V\nHPLandroidx/fragment/app/Fragment;->performAttach()V\nHPLandroidx/fragment/app/Fragment;->performCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)V\nHPLandroidx/fragment/app/Fragment;->performStart()V\nHPLandroidx/fragment/app/FragmentActivity;->dispatchFragmentsOnCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;\nHPLandroidx/fragment/app/FragmentActivity;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;\nHPLandroidx/fragment/app/FragmentActivity;->onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;\nHPLandroidx/fragment/app/FragmentContainerView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;Landroidx/fragment/app/FragmentManager;)V\nHPLandroidx/fragment/app/FragmentContainerView;->dispatchDraw(Landroid/graphics/Canvas;)V\nHPLandroidx/fragment/app/FragmentContainerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z\nHPLandroidx/fragment/app/FragmentLayoutInflaterFactory;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;\nHPLandroidx/fragment/app/FragmentManager;-><init>()V\nHPLandroidx/fragment/app/FragmentManager;->attachController(Landroidx/fragment/app/FragmentHostCallback;Landroidx/fragment/app/FragmentContainer;Landroidx/fragment/app/Fragment;)V\nHPLandroidx/fragment/app/FragmentManager;->collectAllSpecialEffectsController()Ljava/util/Set;\nHPLandroidx/fragment/app/FragmentManager;->dispatchDestroy()V\nHPLandroidx/fragment/app/FragmentManager;->dispatchStateChange(I)V\nHPLandroidx/fragment/app/FragmentManager;->ensureExecReady(Z)V\nHPLandroidx/fragment/app/FragmentManager;->execPendingActions(Z)Z\nHPLandroidx/fragment/app/FragmentManager;->executeOpsTogether(Ljava/util/ArrayList;Ljava/util/ArrayList;II)V\nHPLandroidx/fragment/app/FragmentManager;->getSpecialEffectsControllerFactory()Landroidx/fragment/app/FragmentManager$3;\nHPLandroidx/fragment/app/FragmentManager;->isLoggingEnabled(I)Z\nHPLandroidx/fragment/app/FragmentManager;->moveToState(IZ)V\nHPLandroidx/fragment/app/FragmentManager;->noteStateNotSaved()V\nHPLandroidx/fragment/app/FragmentManager;->saveAllStateInternal()Landroid/os/Parcelable;\nHPLandroidx/fragment/app/FragmentManager;->startPendingDeferredFragments()V\nHPLandroidx/fragment/app/FragmentManager;->updateOnBackPressedCallbackEnabled()V\nHPLandroidx/fragment/app/FragmentStateManager;->attach()V\nHPLandroidx/fragment/app/FragmentStateManager;->computeExpectedState()I\nHPLandroidx/fragment/app/FragmentStateManager;->createView()V\nHPLandroidx/fragment/app/FragmentStateManager;->destroy()V\nHPLandroidx/fragment/app/FragmentStateManager;->moveToExpectedState()V\nHPLandroidx/fragment/app/FragmentViewLifecycleOwner;->getLifecycle()Landroidx/lifecycle/Lifecycle;\nHPLandroidx/fragment/app/FragmentViewLifecycleOwner;->initialize()V\nHPLandroidx/fragment/app/SpecialEffectsController$1;->run()V\nHPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;-><init>(IILandroidx/fragment/app/FragmentStateManager;Landroidx/core/os/CancellationSignal;)V\nHPLandroidx/fragment/app/SpecialEffectsController;->findPendingOperation(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;\nHPLandroidx/fragment/app/SpecialEffectsController;->forceCompleteAllOperations()V\nHPLandroidx/fragment/app/SpecialEffectsController;->getOrCreateController(Landroid/view/ViewGroup;Landroidx/fragment/app/FragmentManager$3;)Landroidx/fragment/app/SpecialEffectsController;\nHPLandroidx/fragment/app/SpecialEffectsController;->updateFinalState()V\nHPLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;->invokeMethodsForEvent(Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;Ljava/lang/Object;)V\nHPLandroidx/lifecycle/DispatchQueue;-><init>()V\nHPLandroidx/lifecycle/DispatchQueue;->canRun()Z\nHPLandroidx/lifecycle/DispatchQueue;->drainQueue()V\nHPLandroidx/lifecycle/Lifecycle$Event;->downFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event;\nHPLandroidx/lifecycle/Lifecycle$Event;->getTargetState()Landroidx/lifecycle/Lifecycle$State;\nHPLandroidx/lifecycle/Lifecycle$Event;->upFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event;\nHPLandroidx/lifecycle/LifecycleController$observer$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/lifecycle/LifecycleController;-><init>(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/DispatchQueue;Lkotlinx/coroutines/Job;)V\nHPLandroidx/lifecycle/LifecycleController;->finish()V\nHPLandroidx/lifecycle/LifecycleCoroutineScope$launchWhenCreated$1;-><init>(Landroidx/lifecycle/LifecycleCoroutineScopeImpl;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V\nHPLandroidx/lifecycle/LifecycleCoroutineScope$launchWhenCreated$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nHPLandroidx/lifecycle/LifecycleCoroutineScope$launchWhenCreated$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;-><init>(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V\nHPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/lifecycle/LifecycleRegistry;-><init>(Landroidx/lifecycle/LifecycleOwner;)V\nHPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V\nHPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State;\nHPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V\nHPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/lifecycle/LifecycleRegistry;->min(Landroidx/lifecycle/Lifecycle$State;Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$State;\nHPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V\nHPLandroidx/lifecycle/LifecycleRegistry;->popParentState()V\nHPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V\nHPLandroidx/lifecycle/PausingDispatcher;-><init>()V\nHPLandroidx/lifecycle/PausingDispatcher;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z\nHPLandroidx/lifecycle/PausingDispatcherKt$whenStateAtLeast$2;-><init>(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V\nHPLandroidx/lifecycle/PausingDispatcherKt$whenStateAtLeast$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/lifecycle/PausingDispatcherKt$whenStateAtLeast$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/lifecycle/ReflectiveGenericLifecycleObserver;-><init>(Ljava/lang/Object;)V\nHPLandroidx/lifecycle/ReflectiveGenericLifecycleObserver;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLandroidx/lifecycle/ViewModelProvider;->acquire(Landroid/content/Context;Ljava/lang/String;)Landroidx/lifecycle/ViewModelProvider;\nHPLandroidx/lifecycle/ViewModelProvider;->get(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;\nHPLandroidx/navigation/NavBackStackEntry;-><init>(Landroid/content/Context;Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/lifecycle/Lifecycle$State;Landroidx/navigation/NavViewModelStoreProvider;Ljava/lang/String;Landroid/os/Bundle;)V\nHPLandroidx/navigation/NavBackStackEntry;->hashCode()I\nHPLandroidx/navigation/NavBackStackEntry;->updateState()V\nHPLandroidx/navigation/NavController$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/navigation/NavDestination;-><init>(Landroidx/navigation/Navigator;)V\nHPLandroidx/navigation/NavDestination;->equals(Ljava/lang/Object;)Z\nHPLandroidx/navigation/NavDestination;->hashCode()I\nHPLandroidx/navigation/NavDestination;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLandroidx/navigation/NavHostController;-><init>(Landroid/content/Context;)V\nHPLandroidx/navigation/NavHostController;->addEntryToBackStack(Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/navigation/NavBackStackEntry;Ljava/util/List;)V\nHPLandroidx/navigation/NavHostController;->onGraphCreated(Landroid/os/Bundle;)V\nHPLandroidx/navigation/NavHostController;->updateBackStackLifecycle$navigation_runtime_release()V\nHPLandroidx/navigation/NavInflater;->inflate(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/util/AttributeSet;I)Landroidx/navigation/NavDestination;\nHPLandroidx/navigation/NavInflater;->inflateArgument(Landroid/content/res/TypedArray;Landroid/content/res/Resources;I)Landroidx/navigation/NavArgument;\nHPLandroidx/navigation/NavigatorProvider;->getNavigator(Ljava/lang/String;)Landroidx/navigation/Navigator;\nHPLandroidx/navigation/R$id;->checkNotEmpty(Ljava/lang/String;)Ljava/lang/String;\nHPLandroidx/navigation/R$id;->read(Ljava/io/InputStream;I)[B\nHPLandroidx/navigation/R$id;->readUInt(Ljava/io/InputStream;I)J\nHPLandroidx/navigation/R$id;->readUInt16(Ljava/io/InputStream;)I\nHPLandroidx/navigation/R$id;->resumeCancellableWith(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V\nHPLandroidx/navigation/R$id;->writeUInt(Ljava/io/OutputStream;JI)V\nHPLandroidx/navigation/R$id;->writeUInt16(Ljava/io/OutputStream;I)V\nHPLandroidx/navigation/fragment/FragmentNavigator$Destination;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLandroidx/navigation/fragment/FragmentNavigator;->navigate(Ljava/util/List;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V\nHPLandroidx/navigation/fragment/NavHostFragment;->onCreate(Landroid/os/Bundle;)V\nHPLandroidx/recyclerview/widget/AdapterHelper;-><init>(Landroidx/recyclerview/widget/RecyclerView$4;)V\nHPLandroidx/recyclerview/widget/AdapterHelper;->consumePostponedUpdates()V\nHPLandroidx/recyclerview/widget/AdapterHelper;->consumeUpdatesInOnePass()V\nHPLandroidx/recyclerview/widget/AdapterHelper;->dispatchAndUpdateViewHolders(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V\nHPLandroidx/recyclerview/widget/AdapterHelper;->findPositionOffset(II)I\nHPLandroidx/recyclerview/widget/AdapterHelper;->hasPendingUpdates()Z\nHPLandroidx/recyclerview/widget/AdapterHelper;->obtainUpdateOp(IIILjava/lang/Object;)Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;\nHPLandroidx/recyclerview/widget/AdapterHelper;->preProcess()V\nHPLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOpsAndClearList(Ljava/util/List;)V\nHPLandroidx/recyclerview/widget/AsyncListDiffer$1$2;->run()V\nHPLandroidx/recyclerview/widget/AsyncListDiffer$1;->run()V\nHPLandroidx/recyclerview/widget/ChildHelper$Bucket;->clear(I)V\nHPLandroidx/recyclerview/widget/ChildHelper$Bucket;->countOnesBefore(I)I\nHPLandroidx/recyclerview/widget/ChildHelper$Bucket;->get(I)Z\nHPLandroidx/recyclerview/widget/ChildHelper$Bucket;->insert(IZ)V\nHPLandroidx/recyclerview/widget/ChildHelper$Bucket;->remove(I)Z\nHPLandroidx/recyclerview/widget/ChildHelper;-><init>(Landroidx/recyclerview/widget/RecyclerView$4;)V\nHPLandroidx/recyclerview/widget/ChildHelper;->addView(Landroid/view/View;IZ)V\nHPLandroidx/recyclerview/widget/ChildHelper;->attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)V\nHPLandroidx/recyclerview/widget/ChildHelper;->detachViewFromParent(I)V\nHPLandroidx/recyclerview/widget/ChildHelper;->getChildAt(I)Landroid/view/View;\nHPLandroidx/recyclerview/widget/ChildHelper;->getChildCount()I\nHPLandroidx/recyclerview/widget/ChildHelper;->getOffset(I)I\nHPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildAt(I)Landroid/view/View;\nHPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildCount()I\nHPLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z\nHPLandroidx/recyclerview/widget/ChildHelper;->removeViewAt(I)V\nHPLandroidx/recyclerview/widget/DefaultItemAnimator;-><init>()V\nHPLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimations()V\nHPLandroidx/recyclerview/widget/DefaultItemAnimator;->isRunning()Z\nHPLandroidx/recyclerview/widget/DiffUtil$DiffResult;-><init>(Landroidx/recyclerview/widget/OpReorderer;Ljava/util/List;[I[IZ)V\nHPLandroidx/recyclerview/widget/FastScroller$2;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V\nHPLandroidx/recyclerview/widget/GapWorker;->postFromTraversal(Landroidx/recyclerview/widget/RecyclerView;II)V\nHPLandroidx/recyclerview/widget/GapWorker;->prefetch(J)V\nHPLandroidx/recyclerview/widget/GapWorker;->prefetchPositionWithDeadline(Landroidx/recyclerview/widget/RecyclerView;IJ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder;\nHPLandroidx/recyclerview/widget/GapWorker;->run()V\nHPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignFromView(Landroid/view/View;I)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->reset()V\nHPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->hasMore(Landroidx/recyclerview/widget/RecyclerView$State;)Z\nHPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;->next(Landroidx/recyclerview/widget/RecyclerView$Recycler;)Landroid/view/View;\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->calculateExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;[I)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollHorizontally()Z\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollVertically()Z\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->collectAdjacentPrefetchPositions(IILandroidx/recyclerview/widget/RecyclerView$State;Lcom/google/android/gms/internal/vision/zzfc;)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->collectPrefetchPositionsForLayoutState(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Lcom/google/android/gms/internal/vision/zzfc;)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->computeVerticalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->ensureLayoutState()V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->fill(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Landroidx/recyclerview/widget/RecyclerView$State;Z)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleChildClosestToEnd(ZZ)Landroid/view/View;\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleChildClosestToStart(ZZ)Landroid/view/View;\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstVisibleItemPosition()I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->findLastVisibleItemPosition()I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->findOneVisibleChild(IIZZ)Landroid/view/View;\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->findReferenceChild(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;III)Landroid/view/View;\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutEndGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->fixLayoutStartGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToEnd()Landroid/view/View;\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToStart()Landroid/view/View;\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->isLayoutRTL()Z\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleByLayoutState(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->recycleChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;II)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveIsInfinite()Z\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->resolveShouldLayoutReverse()V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->scrollBy(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->scrollVerticallyBy(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->shouldMeasureTwice()Z\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->supportsPredictiveItemAnimations()Z\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutState(IIZLandroidx/recyclerview/widget/RecyclerView$State;)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillEnd(II)V\nHPLandroidx/recyclerview/widget/LinearLayoutManager;->updateLayoutStateToFillStart(II)V\nHPLandroidx/recyclerview/widget/ListAdapter;->getItemCount()I\nHPLandroidx/recyclerview/widget/OpReorderer;->areItemsTheSame(II)Z\nHPLandroidx/recyclerview/widget/OpReorderer;->getChangePayload(II)Ljava/lang/Object;\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedEnd(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurement(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurementInOther(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedStart(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getEnd()I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndAfterPadding()I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndPadding()I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getMode()I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getStartAfterPadding()I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getTotalSpace()I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->getTransformedEndWithDecoration(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/OrientationHelper$1;->offsetChildren(I)V\nHPLandroidx/recyclerview/widget/RecyclerView$4;->findViewHolder(I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder;\nHPLandroidx/recyclerview/widget/RecyclerView$4;->getChildAt(I)Landroid/view/View;\nHPLandroidx/recyclerview/widget/RecyclerView$4;->getChildCount()I\nHPLandroidx/recyclerview/widget/RecyclerView$4;->markViewHoldersUpdated(IILjava/lang/Object;)V\nHPLandroidx/recyclerview/widget/RecyclerView$4;->removeViewAt(I)V\nHPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;-><init>()V\nHPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildEnd(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildStart(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentEnd()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentStart()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;-><init>()V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->addViewInt(Landroid/view/View;IZ)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->calculateItemDecorationsForChild(Landroid/view/View;Landroid/graphics/Rect;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->chooseSize(III)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachAndScrapAttachedViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getBottomDecorationHeight(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildAt(I)Landroid/view/View;\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildCount()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildMeasureSpec(IIIIZ)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBottom(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBoundsWithMargins(Landroid/view/View;Landroid/graphics/Rect;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedLeft(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredHeight(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredWidth(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedRight(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedTop(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getFocusedChild()Landroid/view/View;\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLayoutDirection()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLeftDecorationWidth(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumHeight()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumWidth()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingBottom()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingEnd()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingLeft()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingRight()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingStart()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingTop()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPosition(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRightDecorationWidth(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTopDecorationHeight(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTransformedBoundingBox(Landroid/view/View;ZLandroid/graphics/Rect;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isMeasurementUpToDate(III)Z\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->layoutDecoratedWithMargins(Landroid/view/View;IIII)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->offsetChildrenHorizontal(I)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->offsetChildrenVertical(I)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfoForItem(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleAllViews(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleScrapInt(Landroidx/recyclerview/widget/RecyclerView$Recycler;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleViewAt(ILandroidx/recyclerview/widget/RecyclerView$Recycler;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setExactMeasureSpecsFrom(Landroidx/recyclerview/widget/RecyclerView;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasureSpecs(II)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimension(Landroid/graphics/Rect;II)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimensionFromChildren(II)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->shouldMeasureChild(Landroid/view/View;IILandroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->getViewLayoutPosition()I\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemChanged()Z\nHPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemRemoved()Z\nHPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->getScrapDataForType(I)Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData;\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->addViewHolderToRecycledViewPool(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Z)V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clear()V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool;\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getViewForPosition(I)Landroid/view/View;\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleAndClearCachedViews()V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleCachedViewAt(I)V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleView(Landroid/view/View;)V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleViewHolderInternal(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->scrapView(Landroid/view/View;)V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->unscrapView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nHPLandroidx/recyclerview/widget/RecyclerView$Recycler;->updateViewCacheSize()V\nHPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeChanged(IILjava/lang/Object;)V\nHPLandroidx/recyclerview/widget/RecyclerView$State;-><init>()V\nHPLandroidx/recyclerview/widget/RecyclerView$State;->assertLayoutStep(I)V\nHPLandroidx/recyclerview/widget/RecyclerView$State;->getItemCount()I\nHPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->postOnAnimation()V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->run()V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewFlinger;->stop()V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;-><init>(Landroid/view/View;)V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addFlags(I)V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearReturnedFromScrapFlag()V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAdapterPosition()I\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getLayoutPosition()I\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getUnmodifiedPayloads()Ljava/util/List;\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->hasAnyOfTheFlags(I)Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isAttachedToTransitionOverlay()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isBound()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isInvalid()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRecyclable()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRemoved()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isScrap()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isTmpDetached()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isUpdated()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->resetInternal()V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setFlags(II)V\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->shouldIgnore()Z\nHPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->wasReturnedFromScrap()Z\nHPLandroidx/recyclerview/widget/RecyclerView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\nHPLandroidx/recyclerview/widget/RecyclerView;->access$000(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->access$100(Landroidx/recyclerview/widget/RecyclerView;I)V\nHPLandroidx/recyclerview/widget/RecyclerView;->access$200(Landroidx/recyclerview/widget/RecyclerView;)Z\nHPLandroidx/recyclerview/widget/RecyclerView;->access$300(Landroidx/recyclerview/widget/RecyclerView;II)V\nHPLandroidx/recyclerview/widget/RecyclerView;->assertNotInLayoutOrScroll(Ljava/lang/String;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z\nHPLandroidx/recyclerview/widget/RecyclerView;->clearNestedRecyclerViewIfNotNested(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->clearOldPositions()V\nHPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollExtent()I\nHPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollOffset()I\nHPLandroidx/recyclerview/widget/RecyclerView;->computeVerticalScrollRange()I\nHPLandroidx/recyclerview/widget/RecyclerView;->considerReleasingGlowsOnScroll(II)V\nHPLandroidx/recyclerview/widget/RecyclerView;->consumePendingUpdateOperations()V\nHPLandroidx/recyclerview/widget/RecyclerView;->defaultOnMeasure(II)V\nHPLandroidx/recyclerview/widget/RecyclerView;->dispatchChildDetached(Landroid/view/View;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayout()V\nHPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep1()V\nHPLandroidx/recyclerview/widget/RecyclerView;->dispatchLayoutStep2()V\nHPLandroidx/recyclerview/widget/RecyclerView;->dispatchNestedPreScroll(II[I[II)Z\nHPLandroidx/recyclerview/widget/RecyclerView;->dispatchNestedScroll(IIII[II[I)V\nHPLandroidx/recyclerview/widget/RecyclerView;->dispatchOnScrolled(II)V\nHPLandroidx/recyclerview/widget/RecyclerView;->draw(Landroid/graphics/Canvas;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z\nHPLandroidx/recyclerview/widget/RecyclerView;->fillRemainingScrollValues(Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->findMinMaxChildLayoutPositions([I)V\nHPLandroidx/recyclerview/widget/RecyclerView;->findNestedRecyclerView(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView;\nHPLandroidx/recyclerview/widget/RecyclerView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;\nHPLandroidx/recyclerview/widget/RecyclerView;->getAccessibilityClassName()Ljava/lang/CharSequence;\nHPLandroidx/recyclerview/widget/RecyclerView;->getAdapterPositionFor(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I\nHPLandroidx/recyclerview/widget/RecyclerView;->getBaseline()I\nHPLandroidx/recyclerview/widget/RecyclerView;->getChildAdapterPosition(Landroid/view/View;)I\nHPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolder(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder;\nHPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolderInt(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder;\nHPLandroidx/recyclerview/widget/RecyclerView;->getItemDecorInsetsForChild(Landroid/view/View;)Landroid/graphics/Rect;\nHPLandroidx/recyclerview/widget/RecyclerView;->getLayoutManager()Landroidx/recyclerview/widget/RecyclerView$LayoutManager;\nHPLandroidx/recyclerview/widget/RecyclerView;->getNanoTime()J\nHPLandroidx/recyclerview/widget/RecyclerView;->getScrollState()I\nHPLandroidx/recyclerview/widget/RecyclerView;->getScrollingChildHelper()Landroidx/core/view/NestedScrollingChildHelper;\nHPLandroidx/recyclerview/widget/RecyclerView;->hasPendingAdapterUpdates()Z\nHPLandroidx/recyclerview/widget/RecyclerView;->isAttachedToWindow()Z\nHPLandroidx/recyclerview/widget/RecyclerView;->isComputingLayout()Z\nHPLandroidx/recyclerview/widget/RecyclerView;->markItemDecorInsetsDirty()V\nHPLandroidx/recyclerview/widget/RecyclerView;->onAttachedToWindow()V\nHPLandroidx/recyclerview/widget/RecyclerView;->onDetachedFromWindow()V\nHPLandroidx/recyclerview/widget/RecyclerView;->onDraw(Landroid/graphics/Canvas;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->onEnterLayoutOrScroll()V\nHPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll(Z)V\nHPLandroidx/recyclerview/widget/RecyclerView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z\nHPLandroidx/recyclerview/widget/RecyclerView;->onLayout(ZIIII)V\nHPLandroidx/recyclerview/widget/RecyclerView;->onMeasure(II)V\nHPLandroidx/recyclerview/widget/RecyclerView;->onTouchEvent(Landroid/view/MotionEvent;)Z\nHPLandroidx/recyclerview/widget/RecyclerView;->processAdapterUpdatesAndSetAnimationFlags()V\nHPLandroidx/recyclerview/widget/RecyclerView;->processDataSetCompletelyChanged(Z)V\nHPLandroidx/recyclerview/widget/RecyclerView;->removeAndRecycleViews()V\nHPLandroidx/recyclerview/widget/RecyclerView;->requestLayout()V\nHPLandroidx/recyclerview/widget/RecyclerView;->scrollStep(II[I)V\nHPLandroidx/recyclerview/widget/RecyclerView;->sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->setAdapter(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->setLayoutManager(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V\nHPLandroidx/recyclerview/widget/RecyclerView;->setScrollState(I)V\nHPLandroidx/recyclerview/widget/RecyclerView;->startInterceptRequestLayout()V\nHPLandroidx/recyclerview/widget/RecyclerView;->stopInterceptRequestLayout(Z)V\nHPLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll()V\nHPLandroidx/recyclerview/widget/RecyclerView;->stopScroll()V\nHPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/PointerIconCompat;\nHPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nHPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V\nHPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nHPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;->shouldIgnore()Z\nHPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->boundsMatch()Z\nHPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;->compare(II)I\nHPLandroidx/recyclerview/widget/ViewInfoStore;-><init>(I)V\nHPLandroidx/recyclerview/widget/ViewInfoStore;->clear()V\nHPLandroidx/recyclerview/widget/ViewInfoStore;->findOneViewWithinBoundFlags(IIII)Landroid/view/View;\nHPLandroidx/recyclerview/widget/ViewInfoStore;->removeFromDisappearedInLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nHPLandroidx/recyclerview/widget/ViewInfoStore;->removeViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nHPLandroidx/room/QueryInterceptorProgram;->bindString(ILjava/lang/String;)V\nHPLandroidx/room/Room$$ExternalSyntheticOutline0;->m(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nHPLandroidx/room/Room$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;\nHPLandroidx/room/Room;->getCoroutineScope(Landroidx/lifecycle/Lifecycle;)Landroidx/lifecycle/LifecycleCoroutineScopeImpl;\nHPLandroidx/room/Room;->parse(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroidx/core/content/res/FontResourcesParserCompat$FamilyResourceEntry;\nHPLandroidx/room/Room;->readCerts(Landroid/content/res/Resources;I)Ljava/util/List;\nHPLandroidx/room/Room;->setText(Landroid/widget/TextView;Ljava/lang/CharSequence;)V\nHPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/savedstate/SavedStateRegistry$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nHPLandroidx/savedstate/SavedStateRegistry;-><init>()V\nHPLandroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V\nHPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->draw(Landroid/graphics/Canvas;)V\nHPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z\nHPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->getSystemGestureInsets()Landroidx/core/graphics/Insets;\nHPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->isDimmed(Landroid/view/View;)Z\nHPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->isLayoutRtlSupport()Z\nHPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z\nHPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onLayout(ZIIII)V\nHPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onMeasure(II)V\nHPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onMeasure(II)V\nHPLandroidx/transition/GhostViewPort$1;->onPreDraw()Z\nHPLandroidx/transition/Transition;-><init>()V\nHPLandroidx/transition/ViewOverlayApi14;->zzd()V\nHPLandroidx/transition/ViewOverlayApi14;->zzn()Landroid/content/Context;\nHPLandroidx/transition/ViewOverlayApi14;->zzr()Lcom/google/android/gms/measurement/internal/zzes;\nHPLandroidx/transition/ViewOverlayApi14;->zzt()Lcom/google/android/gms/measurement/internal/zzy;\nHPLandroidx/transition/ViewOverlayApi14;->zzu()Lcom/google/firebase/auth/internal/zzaf;\nHPLandroidx/viewpager/widget/ViewPager$MyAccessibilityDelegate;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nHPLcom/airbnb/lottie/parser/IntegerParser;->zza()Ljava/lang/Object;\nHPLcom/airbnb/lottie/parser/PathParser;->zza()Ljava/lang/Object;\nHPLcom/airbnb/lottie/parser/PointFParser;->zza()Ljava/lang/Object;\nHPLcom/airbnb/lottie/parser/ScaleXYParser;->zza()Ljava/lang/Object;\nHPLcom/airbnb/lottie/parser/ShapeDataParser;->zza()Ljava/lang/Object;\nHPLcom/bumptech/glide/load/engine/DecodeHelper;->getLoadPath(Ljava/lang/Class;)Lcom/bumptech/glide/load/engine/LoadPath;\nHPLcom/bumptech/glide/request/BaseRequestOptions;->apply(Lcom/bumptech/glide/request/BaseRequestOptions;)Lcom/bumptech/glide/request/BaseRequestOptions;\nHPLcom/google/android/flexbox/FlexLine;-><init>()V\nHPLcom/google/android/flexbox/FlexLine;->getItemCountNotGone()I\nHPLcom/google/android/flexbox/FlexboxHelper;->addFlexLine(Ljava/util/List;Lcom/google/android/flexbox/FlexLine;II)V\nHPLcom/google/android/flexbox/FlexboxHelper;->checkSizeConstraints(Landroid/view/View;I)V\nHPLcom/google/android/flexbox/FlexboxHelper;->clearFlexLines(Ljava/util/List;I)V\nHPLcom/google/android/flexbox/FlexboxHelper;->determineMainSize(III)V\nHPLcom/google/android/flexbox/FlexboxHelper;->ensureIndexToFlexLine(I)V\nHPLcom/google/android/flexbox/FlexboxHelper;->ensureMeasureSpecCache(I)V\nHPLcom/google/android/flexbox/FlexboxHelper;->ensureMeasuredSizeCache(I)V\nHPLcom/google/android/flexbox/FlexboxHelper;->getChildHeightMeasureSpecInternal(ILcom/google/android/flexbox/FlexItem;I)I\nHPLcom/google/android/flexbox/FlexboxHelper;->getFlexItemMarginEndCross(Lcom/google/android/flexbox/FlexItem;Z)I\nHPLcom/google/android/flexbox/FlexboxHelper;->getFlexItemMarginEndMain(Lcom/google/android/flexbox/FlexItem;Z)I\nHPLcom/google/android/flexbox/FlexboxHelper;->getFlexItemMarginStartMain(Lcom/google/android/flexbox/FlexItem;Z)I\nHPLcom/google/android/flexbox/FlexboxHelper;->layoutSingleChildHorizontal(Landroid/view/View;Lcom/google/android/flexbox/FlexLine;IIII)V\nHPLcom/google/android/flexbox/FlexboxHelper;->shrinkFlexItems(IILcom/google/android/flexbox/FlexLine;IIZ)V\nHPLcom/google/android/flexbox/FlexboxHelper;->stretchViewVertically(Landroid/view/View;II)V\nHPLcom/google/android/flexbox/FlexboxHelper;->stretchViews(I)V\nHPLcom/google/android/flexbox/FlexboxHelper;->updateMeasureCache(IIILandroid/view/View;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;->access$1600(Lcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;->access$800(Lcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getAlignSelf()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getFlexBasisPercent()F\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getFlexGrow()F\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getFlexShrink()F\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getHeight()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMarginBottom()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMarginLeft()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMarginRight()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMarginTop()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMaxHeight()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMaxWidth()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMinHeight()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getMinWidth()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->getWidth()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;->isWrapBefore()Z\nHPLcom/google/android/flexbox/FlexboxLayoutManager;-><init>(Landroid/content/Context;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->canScrollHorizontally()Z\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->canScrollVertically()Z\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->checkLayoutParams(Landroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->ensureOrientationHelper()V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->fill(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Lcom/google/android/flexbox/FlexboxLayoutManager$LayoutState;)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->findFirstReferenceChild(I)Landroid/view/View;\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->findFirstReferenceViewInLine(Landroid/view/View;Lcom/google/android/flexbox/FlexLine;)Landroid/view/View;\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->findLastReferenceViewInLine(Landroid/view/View;Lcom/google/android/flexbox/FlexLine;)Landroid/view/View;\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->findOneVisibleChild(IIZ)Landroid/view/View;\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->findReferenceChild(III)Landroid/view/View;\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->fixLayoutEndGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->fixLayoutStartGap(ILandroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Z)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getAlignItems()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getChildHeightMeasureSpec(III)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getChildWidthMeasureSpec(III)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getDecorationLengthCrossAxis(Landroid/view/View;)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getDecorationLengthMainAxis(Landroid/view/View;II)I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexDirection()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexItemAt(I)Landroid/view/View;\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexItemCount()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexLinesInternal()Ljava/util/List;\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getFlexWrap()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getLargestMainSize()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getMaxLine()I\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->getReorderedFlexItemAt(I)Landroid/view/View;\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->isMainAxisDirectionHorizontal()Z\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->isMeasurementUpToDate(III)Z\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->onNewFlexItemAdded(Landroid/view/View;IILcom/google/android/flexbox/FlexLine;)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->resolveInfiniteAmount()V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->shouldMeasureChild(Landroid/view/View;IILandroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->updateLayoutStateToFillEnd(Lcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;ZZ)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->updateLayoutStateToFillStart(Lcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;ZZ)V\nHPLcom/google/android/flexbox/FlexboxLayoutManager;->updateViewCache(ILandroid/view/View;)V\nHPLcom/google/android/gms/common/util/concurrent/zza;-><init>(Ljava/lang/Object;II)V\nHPLcom/google/android/gms/common/util/concurrent/zza;->run()V\nHPLcom/google/android/gms/common/wrappers/Wrappers;->packageManager(Landroid/content/Context;)Lcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;\nHPLcom/google/android/gms/internal/measurement/zzbs$zzg;-><init>()V\nHPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Lcom/google/android/gms/internal/measurement/zzbs$zzk;)V\nHPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzbu()V\nHPLcom/google/android/gms/internal/measurement/zzbs$zzk$zza;->zza(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza;\nHPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzcn;->zzc()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzdd;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzdm;-><init>()V\nHPLcom/google/android/gms/internal/measurement/zzdp;->zza()Z\nHPLcom/google/android/gms/internal/measurement/zzel$zza;->zza(J)V\nHPLcom/google/android/gms/internal/measurement/zzel$zza;->zza(Ljava/lang/String;)V\nHPLcom/google/android/gms/internal/measurement/zzel$zza;->zzb(I)V\nHPLcom/google/android/gms/internal/measurement/zzfe$zza;-><init>(Lcom/google/android/gms/internal/measurement/zzfe;)V\nHPLcom/google/android/gms/internal/measurement/zzfe$zza;->zzu()Lcom/google/android/gms/internal/measurement/zzgm;\nHPLcom/google/android/gms/internal/measurement/zzfe$zza;->zzv()Lcom/google/android/gms/internal/measurement/zzgm;\nHPLcom/google/android/gms/internal/measurement/zzfe;-><init>()V\nHPLcom/google/android/gms/internal/measurement/zzgq;->zza(ILjava/lang/Object;Landroidx/compose/runtime/Stack;)V\nHPLcom/google/android/gms/internal/measurement/zzgq;->zzb(Ljava/lang/Object;)I\nHPLcom/google/android/gms/internal/measurement/zzgq;->zzb(Ljava/lang/Object;Landroidx/compose/runtime/Stack;)V\nHPLcom/google/android/gms/internal/measurement/zzgq;->zzc(Ljava/lang/Object;)V\nHPLcom/google/android/gms/internal/measurement/zzha;->add(Ljava/lang/Object;)Z\nHPLcom/google/android/gms/internal/measurement/zzhb;->zza(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzhf;\nHPLcom/google/android/gms/internal/measurement/zzif;->zza(Ljava/lang/CharSequence;)I\nHPLcom/google/android/gms/internal/measurement/zzig;->zza(Ljava/lang/CharSequence;[BII)I\nHPLcom/google/android/gms/internal/measurement/zzit;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zziu;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zziz;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzja;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzjf;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzjg;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzjl;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzjm;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzjm;->zzb()Z\nHPLcom/google/android/gms/internal/measurement/zzjr;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzjs;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzjx;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzjy;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzkd;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzke;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzkj;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzkk;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzkp;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzkq;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzkv;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzkw;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzlb;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzlb;->zzb()Z\nHPLcom/google/android/gms/internal/measurement/zzlc;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzlh;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzli;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzln;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzlo;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzlt;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzlu;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzlz;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzma;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzmf;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzmg;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzml;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzmm;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzmr;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzms;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzmx;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zzmy;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/measurement/zznd;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/internal/vision/zzfc;->addPosition(II)V\nHPLcom/google/android/gms/internal/vision/zzfc;->collectPrefetchPositionsFromView(Landroidx/recyclerview/widget/RecyclerView;Z)V\nHPLcom/google/android/gms/internal/vision/zzfc;->lastPrefetchIncludedPosition(I)Z\nHPLcom/google/android/gms/internal/vision/zziu$zzd;->zza(Ljava/lang/Object;JI)V\nHPLcom/google/android/gms/measurement/internal/zzad;->c_()Landroid/database/sqlite/SQLiteDatabase;\nHPLcom/google/android/gms/measurement/internal/zzad;->zza(JLjava/lang/String;JZZZZZ)Lcom/google/android/gms/measurement/internal/zzac;\nHPLcom/google/android/gms/measurement/internal/zzad;->zza(Lcom/google/android/gms/measurement/internal/zzak;)V\nHPLcom/google/android/gms/measurement/internal/zzad;->zza(Lcom/google/android/gms/measurement/internal/zzal;JZ)Z\nHPLcom/google/android/gms/measurement/internal/zzad;->zza(Ljava/lang/String;)Ljava/util/List;\nHPLcom/google/android/gms/measurement/internal/zzad;->zza(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/gms/measurement/internal/zzak;\nHPLcom/google/android/gms/measurement/internal/zzad;->zza(Ljava/lang/String;[Ljava/lang/String;)Ljava/util/List;\nHPLcom/google/android/gms/measurement/internal/zzad;->zzb(Ljava/lang/String;)Lcom/google/android/gms/measurement/internal/zzf;\nHPLcom/google/android/gms/measurement/internal/zzae;->getWritableDatabase()Landroid/database/sqlite/SQLiteDatabase;\nHPLcom/google/android/gms/measurement/internal/zzae;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V\nHPLcom/google/android/gms/measurement/internal/zzag;->zza(J)V\nHPLcom/google/android/gms/measurement/internal/zzal;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJLandroid/os/Bundle;)V\nHPLcom/google/android/gms/measurement/internal/zzaq;-><clinit>()V\nHPLcom/google/android/gms/measurement/internal/zzbb;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbd;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbe;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbf;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbg;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbh;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbi;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbj;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbk;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbl;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbm;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbn;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbo;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbp;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbq;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbr;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbs;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbt;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbu;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbv;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbw;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbx;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzby;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzbz;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzca;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcb;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcc;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcd;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzce;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcf;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcg;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzch;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzci;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcj;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzck;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcl;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcm;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcn;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzco;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcp;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcq;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcr;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcs;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzct;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcu;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcv;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcw;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcx;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcy;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzcz;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzd;->zzd()V\nHPLcom/google/android/gms/measurement/internal/zzda;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdb;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdc;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdd;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzde;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdf;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdg;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdh;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdi;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdj;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdk;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdl;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdm;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdn;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdo;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdp;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdq;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdr;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzds;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdt;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdu;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdv;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdw;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzdx;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzec;->zza()Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzel;->zza(Ljava/lang/Object;)Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzeo;->zza(I[B)Z\nHPLcom/google/android/gms/measurement/internal/zzes;->zzy()Ljava/lang/String;\nHPLcom/google/android/gms/measurement/internal/zzeu;->zza(Ljava/lang/String;)V\nHPLcom/google/android/gms/measurement/internal/zzf;->zzb(Ljava/lang/String;)V\nHPLcom/google/android/gms/measurement/internal/zzf;->zzc(Ljava/lang/String;)V\nHPLcom/google/android/gms/measurement/internal/zzfe;->zza(Ljava/lang/String;)Landroid/util/Pair;\nHPLcom/google/android/gms/measurement/internal/zzfe;->zzv()Ljava/lang/Boolean;\nHPLcom/google/android/gms/measurement/internal/zzfq;->zza(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nHPLcom/google/android/gms/measurement/internal/zzfq;->zzi(Ljava/lang/String;)V\nHPLcom/google/android/gms/measurement/internal/zzft;->zzd()V\nHPLcom/google/android/gms/measurement/internal/zzfw;->zzac()I\nHPLcom/google/android/gms/measurement/internal/zzfw;->zzb(Lcom/google/android/gms/measurement/internal/zzgq;)V\nHPLcom/google/android/gms/measurement/internal/zzfw;->zzc()Lcom/google/android/gms/measurement/internal/zzfe;\nHPLcom/google/android/gms/measurement/internal/zzfw;->zzi()Lcom/google/android/gms/measurement/internal/zzkm;\nHPLcom/google/android/gms/measurement/internal/zzfw;->zzq()Lcom/google/android/gms/measurement/internal/zzft;\nHPLcom/google/android/gms/measurement/internal/zzfw;->zzr()Lcom/google/android/gms/measurement/internal/zzes;\nHPLcom/google/android/gms/measurement/internal/zzgq;->zzz()Z\nHPLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;JLandroid/os/Bundle;ZZZLjava/lang/String;)V\nHPLcom/google/android/gms/measurement/internal/zzif;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze$zza;Ljava/lang/Object;)V\nHPLcom/google/android/gms/measurement/internal/zzif;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza;Ljava/lang/Object;)V\nHPLcom/google/android/gms/measurement/internal/zzil;->zza(Lcom/google/android/gms/measurement/internal/zzek;Lcom/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable;Lcom/google/android/gms/measurement/internal/zzn;)V\nHPLcom/google/android/gms/measurement/internal/zzil;->zza(Z)Lcom/google/android/gms/measurement/internal/zzn;\nHPLcom/google/android/gms/measurement/internal/zzil;->zzaf()V\nHPLcom/google/android/gms/measurement/internal/zzka;->zza(Lcom/google/android/gms/measurement/internal/zzao;Lcom/google/android/gms/measurement/internal/zzn;)V\nHPLcom/google/android/gms/measurement/internal/zzka;->zzb(Lcom/google/android/gms/measurement/internal/zzao;Lcom/google/android/gms/measurement/internal/zzn;)V\nHPLcom/google/android/gms/measurement/internal/zzka;->zzb(Lcom/google/android/gms/measurement/internal/zzkb;)V\nHPLcom/google/android/gms/measurement/internal/zzka;->zzc(Lcom/google/android/gms/measurement/internal/zzn;)Lcom/google/android/gms/measurement/internal/zzf;\nHPLcom/google/android/gms/measurement/internal/zzka;->zze()Lcom/google/android/gms/measurement/internal/zzad;\nHPLcom/google/android/gms/measurement/internal/zzka;->zzh()Lcom/google/android/gms/measurement/internal/zzif;\nHPLcom/google/android/gms/measurement/internal/zzka;->zzz()V\nHPLcom/google/android/gms/measurement/internal/zzkm;->zza(ILjava/lang/Object;ZZ)Ljava/lang/Object;\nHPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Z\nHPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/List;ZZ)Landroid/os/Bundle;\nHPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Landroid/os/Bundle;Ljava/util/List;ZZ)I\nHPLcom/google/android/gms/measurement/internal/zzkm;->zzb(Ljava/lang/String;Ljava/lang/String;)Z\nHPLcom/google/android/gms/measurement/internal/zzkm;->zzc(Landroid/content/Context;Ljava/lang/String;)Z\nHPLcom/google/android/gms/measurement/internal/zzn;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;JJLjava/lang/String;ZZLjava/lang/String;JJIZZZLjava/lang/String;Ljava/lang/Boolean;JLjava/util/List;Ljava/lang/String;)V\nHPLcom/google/android/gms/measurement/internal/zzy;->zza(Lcom/google/android/gms/measurement/internal/zzel;)Z\nHPLcom/google/android/gms/measurement/internal/zzy;->zzd(Ljava/lang/String;)Ljava/lang/Boolean;\nHPLcom/google/android/gms/measurement/internal/zzy;->zzd(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzel;)Z\nHPLcom/google/android/gms/measurement/internal/zzy;->zzz()Landroid/os/Bundle;\nHPLcom/google/android/gms/tasks/zzd;->run()V\nHPLcom/google/android/gms/tasks/zzr;->zza(Lcom/google/android/gms/tasks/Task;)V\nHPLcom/google/android/gms/tasks/zzr;->zza(Lcom/google/android/gms/tasks/zzq;)V\nHPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->findFirstScrollingChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)Landroid/view/View;\nHPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)Z\nHPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;IIII)Z\nHPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->updateAccessibilityActions(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;)V\nHPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->updateAppBarLayoutDrawableState(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Lcom/google/android/material/appbar/AppBarLayout;IIZ)V\nHPLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;->findFirstDependency(Ljava/util/List;)Lcom/google/android/material/appbar/AppBarLayout;\nHPLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z\nHPLcom/google/android/material/appbar/AppBarLayout;->getTopInset()I\nHPLcom/google/android/material/appbar/AppBarLayout;->getTotalScrollRange()I\nHPLcom/google/android/material/appbar/AppBarLayout;->onLayout(ZIIII)V\nHPLcom/google/android/material/appbar/AppBarLayout;->onMeasure(II)V\nHPLcom/google/android/material/appbar/AppBarLayout;->shouldOffsetFirstChild()Z\nHPLcom/google/android/material/appbar/HeaderScrollingViewBehavior;->layoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)V\nHPLcom/google/android/material/appbar/HeaderScrollingViewBehavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;IIII)Z\nHPLcom/google/android/material/appbar/ViewOffsetBehavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)Z\nHPLcom/google/android/material/appbar/ViewOffsetHelper;->applyOffsets()V\nHPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->onMeasure(II)V\nHPLcom/google/android/material/button/MaterialButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLcom/google/android/material/button/MaterialButtonHelper;->updateBackground()V\nHPLcom/google/android/material/internal/BaselineLayout;->onMeasure(II)V\nHPLcom/google/android/material/internal/CheckableImageButton;->onCreateDrawableState(I)[I\nHPLcom/google/android/material/internal/CheckableImageButton;->setChecked(Z)V\nHPLcom/google/android/material/navigation/NavigationBarItemView;-><init>(Landroid/content/Context;)V\nHPLcom/google/android/material/navigation/NavigationBarItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V\nHPLcom/google/android/material/navigation/NavigationBarItemView;->onCreateDrawableState(I)[I\nHPLcom/google/android/material/navigation/NavigationBarItemView;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V\nHPLcom/google/android/material/navigation/NavigationBarItemView;->setChecked(Z)V\nHPLcom/google/android/material/navigation/NavigationBarItemView;->updateActiveIndicatorLayoutParams(I)V\nHPLcom/google/android/material/navigation/NavigationBarMenuView;->buildMenuView()V\nHPLcom/google/android/material/shadow/ShadowRenderer;-><init>()V\nHPLcom/google/android/material/shadow/ShadowRenderer;->setShadowColor(I)V\nHPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;-><init>(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V\nHPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;-><init>(Lcom/google/android/material/shape/ShapeAppearanceModel;Lcom/google/android/material/elevation/ElevationOverlayProvider;)V\nHPLcom/google/android/material/shape/MaterialShapeDrawable;-><init>(Lcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;)V\nHPLcom/google/android/material/shape/MaterialShapeDrawable;->calculateTintFilter(Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;Landroid/graphics/Paint;Z)Landroid/graphics/PorterDuffColorFilter;\nHPLcom/google/android/material/shape/MaterialShapeDrawable;->draw(Landroid/graphics/Canvas;)V\nHPLcom/google/android/material/shape/MaterialShapeDrawable;->drawShape(Landroid/graphics/Canvas;Landroid/graphics/Paint;Landroid/graphics/Path;Lcom/google/android/material/shape/ShapeAppearanceModel;Landroid/graphics/RectF;)V\nHPLcom/google/android/material/shape/MaterialShapeDrawable;->getBoundsAsRectF()Landroid/graphics/RectF;\nHPLcom/google/android/material/shape/MaterialShapeDrawable;->hasStroke()Z\nHPLcom/google/android/material/shape/MaterialShapeDrawable;->isRoundRect()Z\nHPLcom/google/android/material/shape/MaterialShapeDrawable;->isStateful()Z\nHPLcom/google/android/material/shape/MaterialShapeDrawable;->updateTintFilter()Z\nHPLcom/google/android/material/shape/ShapeAppearanceModel;-><init>(Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;Lkotlin/ResultKt;)V\nHPLcom/google/android/material/shape/ShapeAppearanceModel;->isRoundRect(Landroid/graphics/RectF;)Z\nHPLcom/google/android/material/shape/ShapeAppearancePathProvider;->calculatePath(Lcom/google/android/material/shape/ShapeAppearanceModel;FLandroid/graphics/RectF;Lio/grpc/Attributes$Key;Landroid/graphics/Path;)V\nHPLcom/google/android/material/shape/ShapeAppearancePathProvider;->pathOverlapsCorner(Landroid/graphics/Path;I)Z\nHPLcom/google/android/material/shape/ShapePath;->addArc(FFFFFF)V\nHPLcom/google/android/material/shape/ShapePath;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V\nHPLcom/google/android/material/shape/ShapePath;->lineTo(FF)V\nHPLcom/google/android/material/shape/ShapePath;->reset(FFFF)V\nHPLcom/google/android/material/textview/MaterialTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLcom/google/android/material/textview/MaterialTextView;->applyLineHeightFromViewAppearance(Landroid/content/res/Resources$Theme;I)V\nHPLcom/google/android/material/textview/MaterialTextView;->readFirstAvailableDimension(Landroid/content/Context;Landroid/content/res/TypedArray;[I)I\nHPLcom/google/android/material/theme/MaterialComponentsViewInflater;->createTextView(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatTextView;\nHPLcom/google/ar/core/w;->run()V\nHPLcom/google/common/collect/Maps;-><init>()V\nHPLcom/google/common/collect/Maps;->callbackFailAsync(ILandroid/os/Handler;)V\nHPLcom/google/common/collect/Maps;->getHandler(Landroid/os/Handler;)Landroid/os/Handler;\nHPLcom/google/common/collect/Maps;->resolve(Landroid/content/Context;I)Landroid/util/TypedValue;\nHPLcom/google/firebase/FirebaseApp;->checkNotDeleted()V\nHPLcom/google/firebase/FirebaseApp;->getPersistenceKey()Ljava/lang/String;\nHPLcom/google/firebase/auth/internal/zzaf;->zza()Z\nHPLcom/google/firebase/iid/FirebaseInstanceId;->getId()Ljava/lang/String;\nHPLcom/google/firebase/iid/FirebaseInstanceId;->zzl()Ljava/lang/String;\nHPLcom/google/firebase/iid/zzab;-><init>(Lorg/threeten/bp/temporal/TemporalAccessor;Lorg/threeten/bp/format/DateTimeFormatter;)V\nHPLcom/google/firebase/iid/zzab;->getValue(Lorg/threeten/bp/temporal/TemporalField;)Ljava/lang/Long;\nHPLcom/google/firebase/iid/zzaq;->zza()Ljava/lang/Object;\nHPLcom/google/firebase/iid/zzar;->zza()Ljava/lang/Object;\nHPLcom/google/firebase/iid/zzaw;-><init>(I)V\nHPLcom/google/firebase/iid/zzaw;->addNode(Ljava/lang/Object;)V\nHPLcom/google/firebase/iid/zzaw;->applySupportImageTint()V\nHPLcom/google/firebase/iid/zzaw;->burpActive()V\nHPLcom/google/firebase/iid/zzaw;->dfs(Ljava/lang/Object;Ljava/util/ArrayList;Ljava/util/HashSet;)V\nHPLcom/google/firebase/iid/zzaw;->getActiveFragmentStateManagers()Ljava/util/List;\nHPLcom/google/firebase/iid/zzaw;->getEmptyList()Ljava/util/ArrayList;\nHPLcom/google/firebase/iid/zzaw;->getFragments()Ljava/util/List;\nHPLcom/google/firebase/iid/zzaw;->loadFromAttributes(Landroid/util/AttributeSet;I)V\nHPLcom/google/firebase/iid/zzaw;->poolList(Ljava/util/ArrayList;)V\nHPLcom/google/firebase/iid/zzaw;->shouldApplyFrameworkTintUsingColorFilter()Z\nHPLcom/google/firebase/iid/zzf;->zza()Ljava/lang/Object;\nHPLcom/google/firebase/iid/zzh;->startUndispatchedOrReturn(Lkotlinx/coroutines/internal/ScopeCoroutine;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\nHPLcom/google/firebase/iid/zzk;-><init>(Landroid/content/Context;Landroid/content/res/TypedArray;)V\nHPLcom/google/firebase/iid/zzk;-><init>(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;)V\nHPLcom/google/firebase/iid/zzk;->getDimensionPixelSize(II)I\nHPLcom/google/firebase/iid/zzk;->getFont(IILcom/google/common/collect/Maps;)Landroid/graphics/Typeface;\nHPLcom/google/firebase/iid/zzk;->getInt(II)I\nHPLcom/google/firebase/iid/zzk;->getResourceId(II)I\nHPLcom/google/firebase/iid/zzk;->getString(I)Ljava/lang/String;\nHPLcom/google/firebase/iid/zzk;->hasValue(I)Z\nHPLcom/google/firebase/iid/zzk;->measureChildren(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;)V\nHPLcom/google/firebase/iid/zzk;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III)Lcom/google/firebase/iid/zzk;\nHPLcom/google/firebase/iid/zzk;->recycle()V\nHPLcom/google/firebase/iid/zzk;->solveLinearSystem(Landroidx/constraintlayout/solver/widgets/ConstraintWidgetContainer;II)V\nHPLcom/google/firebase/iid/zzv;->zza()Ljava/lang/Object;\nHPLcom/google/firebase/installations/FirebaseInstallations$$Lambda$2;->run()V\nHPLcom/google/firebase/installations/FirebaseInstallations;->preConditionChecks()V\nHPLcom/google/firebase/installations/FirebaseInstallations;->registerFidWithServer(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;\nHPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;-><init>(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;Lcom/google/common/collect/Maps;)V\nHPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->build()Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;\nHPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;-><init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;JJLjava/lang/String;Lcom/google/common/collect/Maps;)V\nHPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->logFisCommunicationError(Ljava/net/HttpURLConnection;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nHPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->openHttpURLConnection(Ljava/net/URL;Ljava/lang/String;)Ljava/net/HttpURLConnection;\nHPLcom/google/firebase/messaging/zzl;->zza()Ljava/lang/Object;\nHPLcom/google/gson/Gson$3;->read(Lcom/google/gson/stream/JsonReader;)Lcom/google/gson/JsonElement;\nHPLcom/google/gson/Gson$3;->read(Lcom/google/gson/stream/JsonReader;)Ljava/lang/Object;\nHPLcom/google/gson/Gson;-><init>(Lcom/google/gson/internal/Excluder;Lcom/google/gson/FieldNamingStrategy;Ljava/util/Map;ZZZZZZZLcom/google/gson/LongSerializationPolicy;Ljava/lang/String;IILjava/util/List;Ljava/util/List;Ljava/util/List;)V\nHPLcom/google/gson/Gson;->getAdapter(Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nHPLcom/google/gson/JsonArray;-><init>()V\nHPLcom/google/gson/JsonArray;->iterator()Ljava/util/Iterator;\nHPLcom/google/gson/JsonElement;-><init>()V\nHPLcom/google/gson/JsonElement;->getAsJsonArray()Lcom/google/gson/JsonArray;\nHPLcom/google/gson/JsonElement;->getAsJsonObject()Lcom/google/gson/JsonObject;\nHPLcom/google/gson/JsonObject;-><init>()V\nHPLcom/google/gson/JsonObject;->get(Ljava/lang/String;)Lcom/google/gson/JsonElement;\nHPLcom/google/gson/JsonPrimitive;-><init>(Ljava/lang/Boolean;)V\nHPLcom/google/gson/JsonPrimitive;-><init>(Ljava/lang/Number;)V\nHPLcom/google/gson/JsonPrimitive;-><init>(Ljava/lang/String;)V\nHPLcom/google/gson/JsonPrimitive;->getAsBoolean()Z\nHPLcom/google/gson/JsonPrimitive;->getAsLong()J\nHPLcom/google/gson/JsonPrimitive;->getAsNumber()Ljava/lang/Number;\nHPLcom/google/gson/JsonPrimitive;->getAsString()Ljava/lang/String;\nHPLcom/google/gson/internal/LazilyParsedNumber;-><init>(Ljava/lang/String;)V\nHPLcom/google/gson/internal/LazilyParsedNumber;->longValue()J\nHPLcom/google/gson/internal/LinkedTreeMap$Node;-><init>()V\nHPLcom/google/gson/internal/LinkedTreeMap$Node;-><init>(Lcom/google/gson/internal/LinkedTreeMap$Node;Ljava/lang/Object;Lcom/google/gson/internal/LinkedTreeMap$Node;Lcom/google/gson/internal/LinkedTreeMap$Node;)V\nHPLcom/google/gson/internal/LinkedTreeMap;-><init>()V\nHPLcom/google/gson/internal/LinkedTreeMap;->findByObject(Ljava/lang/Object;)Lcom/google/gson/internal/LinkedTreeMap$Node;\nHPLcom/google/gson/internal/LinkedTreeMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLcom/google/gson/internal/LinkedTreeMap;->rebalance(Lcom/google/gson/internal/LinkedTreeMap$Node;Z)V\nHPLcom/google/gson/internal/LinkedTreeMap;->replaceInParent(Lcom/google/gson/internal/LinkedTreeMap$Node;Lcom/google/gson/internal/LinkedTreeMap$Node;)V\nHPLcom/google/gson/internal/LinkedTreeMap;->rotateLeft(Lcom/google/gson/internal/LinkedTreeMap$Node;)V\nHPLcom/google/gson/internal/bind/MapTypeAdapterFactory$Adapter;->read(Lcom/google/gson/stream/JsonReader;)Ljava/lang/Object;\nHPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nHPLcom/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper;-><init>(Lcom/google/gson/Gson;Lcom/google/gson/TypeAdapter;Ljava/lang/reflect/Type;)V\nHPLcom/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper;->read(Lcom/google/gson/stream/JsonReader;)Ljava/lang/Object;\nHPLcom/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V\nHPLcom/google/gson/reflect/TypeToken;-><init>(Ljava/lang/reflect/Type;)V\nHPLcom/google/gson/reflect/TypeToken;->equals(Ljava/lang/Object;)Z\nHPLcom/google/gson/stream/JsonReader;->beginArray()V\nHPLcom/google/gson/stream/JsonReader;->beginObject()V\nHPLcom/google/gson/stream/JsonReader;->endArray()V\nHPLcom/google/gson/stream/JsonReader;->endObject()V\nHPLcom/google/gson/stream/JsonReader;->fillBuffer(I)Z\nHPLcom/google/gson/stream/JsonReader;->hasNext()Z\nHPLcom/google/gson/stream/JsonReader;->isLiteral(C)Z\nHPLcom/google/gson/stream/JsonReader;->nextBoolean()Z\nHPLcom/google/gson/stream/JsonReader;->nextName()Ljava/lang/String;\nHPLcom/google/gson/stream/JsonReader;->nextNonWhitespace(Z)I\nHPLcom/google/gson/stream/JsonReader;->nextString()Ljava/lang/String;\nHPLcom/google/gson/stream/JsonReader;->peek$enumunboxing$()I\nHPLcom/google/gson/stream/JsonReader;->push(I)V\nHPLcom/google/gson/stream/JsonReader;->readEscapeCharacter()C\nHPLcom/google/gson/stream/JsonWriter;->beforeValue()V\nHPLcom/google/gson/stream/JsonWriter;->peek()I\nHPLcom/google/gson/stream/JsonWriter;->string(Ljava/lang/String;)V\nHPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCImpl;->getHiltInternalFactoryFactory()Lcom/google/firebase/iid/zzk;\nHPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$SwitchingProvider;->get()Ljava/lang/Object;\nHPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lio/grpc/Metadata$1;Landroidx/lifecycle/SavedStateHandle;Lcom/google/common/collect/Maps;)V\nHPLcom/google/samples/apps/iosched/DataBinderMapperImpl;->getDataBinder(Landroidx/databinding/DataBindingComponent;Landroid/view/View;I)Landroidx/databinding/ViewDataBinding;\nHPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;-><init>(Landroidx/databinding/DataBindingComponent;Landroid/view/View;)V\nHPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->executeBindings()V\nHPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->setTag(Lcom/google/samples/apps/iosched/model/Tag;)V\nHPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;-><init>(Landroidx/databinding/DataBindingComponent;Landroid/view/View;)V\nHPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->executeBindings()V\nHPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->hasPendingBindings()Z\nHPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setUserSession(Lcom/google/samples/apps/iosched/model/userdata/UserSession;)V\nHPLcom/google/samples/apps/iosched/model/ConferenceDay;->contains(Lcom/google/samples/apps/iosched/model/Session;)Z\nHPLcom/google/samples/apps/iosched/model/ConferenceDay;->equals(Ljava/lang/Object;)Z\nHPLcom/google/samples/apps/iosched/model/ConferenceDay;->getStart()Lorg/threeten/bp/ZonedDateTime;\nHPLcom/google/samples/apps/iosched/model/Room;->getId()Ljava/lang/String;\nHPLcom/google/samples/apps/iosched/model/Room;->getName()Ljava/lang/String;\nHPLcom/google/samples/apps/iosched/model/Session$isReservable$2;-><init>(Lcom/google/samples/apps/iosched/model/Session;)V\nHPLcom/google/samples/apps/iosched/model/Session$isReservable$2;->invoke()Ljava/lang/Object;\nHPLcom/google/samples/apps/iosched/model/Session$type$2;-><init>(Lcom/google/samples/apps/iosched/model/Session;)V\nHPLcom/google/samples/apps/iosched/model/Session;-><init>(Ljava/lang/String;Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZonedDateTime;Ljava/lang/String;Ljava/lang/String;Lcom/google/samples/apps/iosched/model/Room;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/lang/String;Ljava/util/Set;)V\nHPLcom/google/samples/apps/iosched/model/Session;->getDisplayTags()Ljava/util/List;\nHPLcom/google/samples/apps/iosched/model/Session;->getId()Ljava/lang/String;\nHPLcom/google/samples/apps/iosched/model/Session;->getRoom()Lcom/google/samples/apps/iosched/model/Room;\nHPLcom/google/samples/apps/iosched/model/Session;->getStartTime()Lorg/threeten/bp/ZonedDateTime;\nHPLcom/google/samples/apps/iosched/model/Session;->getTags()Ljava/util/List;\nHPLcom/google/samples/apps/iosched/model/Session;->getTitle()Ljava/lang/String;\nHPLcom/google/samples/apps/iosched/model/Session;->getType()Lcom/google/samples/apps/iosched/model/SessionType;\nHPLcom/google/samples/apps/iosched/model/Session;->isLivestream()Z\nHPLcom/google/samples/apps/iosched/model/Session;->isReservable()Z\nHPLcom/google/samples/apps/iosched/model/SessionType$Companion;->fromTags(Ljava/util/List;)Lcom/google/samples/apps/iosched/model/SessionType;\nHPLcom/google/samples/apps/iosched/model/Speaker;->hashCode()I\nHPLcom/google/samples/apps/iosched/model/Tag;->getCategory()Ljava/lang/String;\nHPLcom/google/samples/apps/iosched/model/Tag;->getTagName()Ljava/lang/String;\nHPLcom/google/samples/apps/iosched/model/schedule/PinnedSession;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;)V\nHPLcom/google/samples/apps/iosched/model/userdata/UserEvent;-><init>(Ljava/lang/String;ZZLcom/google/samples/apps/iosched/model/userdata/UserEvent$ReservationStatus;Lcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult;I)V\nHPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->equals(Ljava/lang/Object;)Z\nHPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->isReserved()Z\nHPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->isStarred()Z\nHPLcom/google/samples/apps/iosched/model/userdata/UserSession;-><init>(Lcom/google/samples/apps/iosched/model/Session;Lcom/google/samples/apps/iosched/model/userdata/UserEvent;)V\nHPLcom/google/samples/apps/iosched/model/userdata/UserSession;->getSession()Lcom/google/samples/apps/iosched/model/Session;\nHPLcom/google/samples/apps/iosched/model/userdata/UserSession;->getUserEvent()Lcom/google/samples/apps/iosched/model/userdata/UserEvent;\nHPLcom/google/samples/apps/iosched/shared/data/BootstrapConferenceDataSource;->getOfflineConferenceData()Lcom/google/samples/apps/iosched/model/ConferenceData;\nHPLcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;->populateSearchData(Lcom/google/samples/apps/iosched/model/ConferenceData;)V\nHPLcom/google/samples/apps/iosched/shared/data/FakeAppConfigDataSource;->initTimes(Lorg/threeten/bp/ZonedDateTime;Ljava/util/Map;)V\nHPLcom/google/samples/apps/iosched/shared/data/db/CodelabFtsDao_Impl$1;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V\nHPLcom/google/samples/apps/iosched/shared/data/db/SessionFtsEntity;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nHPLcom/google/samples/apps/iosched/shared/data/session/json/SessionTemp;-><init>(Ljava/lang/String;Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZonedDateTime;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Set;Ljava/lang/String;Ljava/util/Set;)V\nHPLcom/google/samples/apps/iosched/shared/data/session/json/TagDeserializer;->getUrlFromId(Ljava/lang/String;)Ljava/lang/String;\nHPLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;->createDefaultUserEvent(Lcom/google/samples/apps/iosched/model/Session;)Lcom/google/samples/apps/iosched/model/userdata/UserEvent;\nHPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;->buildConferenceDayIndexer(Ljava/util/List;)Landroidx/compose/runtime/SnapshotThreadLocal;\nHPLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLcom/google/samples/apps/iosched/shared/util/TimeUtils;->isConferenceTimeZone(Lorg/threeten/bp/ZoneId;)Z\nHPLcom/google/samples/apps/iosched/shared/util/TimeUtils;->zonedTime(Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZoneId;)Lorg/threeten/bp/ZonedDateTime;\nHPLcom/google/samples/apps/iosched/ui/reservation/ReservationTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nHPLcom/google/samples/apps/iosched/ui/reservation/ReservationTextView;->onCreateDrawableState(I)[I\nHPLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter;->getItemId(I)J\nHPLcom/google/samples/apps/iosched/ui/schedule/DaySeparatorItemDecoration;-><init>(Landroid/content/Context;Landroidx/compose/runtime/SnapshotThreadLocal;Lorg/threeten/bp/ZoneId;)V\nHPLcom/google/samples/apps/iosched/ui/schedule/DaySeparatorItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLcom/google/samples/apps/iosched/ui/schedule/DaySeparatorItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTimeHeadersDecoration;->drawHeader(Landroid/graphics/Canvas;Landroid/view/View;ILandroid/text/StaticLayout;FZ)V\nHPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTimeHeadersDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionDiff;->areItemsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z\nHPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionsAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V\nHPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionsAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder;\nHPLcom/google/samples/apps/iosched/ui/sessioncommon/TagAdapter;->getItemCount()I\nHPLcom/google/samples/apps/iosched/ui/sessioncommon/TagAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V\nHPLcom/google/samples/apps/iosched/ui/sessioncommon/TagAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder;\nHPLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z\nHPLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->onLayoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)Z\nHPLcom/google/samples/apps/iosched/widget/BubbleDecoration$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V\nHPLcom/google/samples/apps/iosched/widget/BubbleDecoration;->computeScalingRect(Landroid/graphics/RectF;F)V\nHPLcom/google/samples/apps/iosched/widget/BubbleDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V\nHPLcom/google/samples/apps/iosched/widget/CountdownView$1;->copyNodeInfoNoChildren(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nHPLcom/google/samples/apps/iosched/widget/CountdownView$1;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nHPLcom/google/samples/apps/iosched/widget/CountdownView$1;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z\nHPLcom/google/samples/apps/iosched/widget/IoSlidingPaneLayout;->onMeasure(II)V\nHPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$1;->create(Ljava/lang/String;Ljava/lang/Class;Landroidx/lifecycle/SavedStateHandle;)Landroidx/lifecycle/ViewModel;\nHPLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;\nHPLdagger/internal/DoubleCheck;->get()Ljava/lang/Object;\nHPLio/grpc/Status;->beforeCheckcastToFunctionOfArity(Ljava/lang/Object;I)Ljava/lang/Object;\nHPLio/grpc/Status;->goneUnless(Landroid/view/View;Z)V\nHPLkotlin/LazyKt__LazyKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow;\nHPLkotlin/LazyKt__LazyKt;->fold(Lkotlin/coroutines/CoroutineContext$Element;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\nHPLkotlin/LazyKt__LazyKt;->get(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;\nHPLkotlin/LazyKt__LazyKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job;\nHPLkotlin/LazyKt__LazyKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job;\nHPLkotlin/LazyKt__LazyKt;->lazy(ILkotlin/jvm/functions/Function0;)Lkotlin/Lazy;\nHPLkotlin/LazyKt__LazyKt;->minusKey(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;\nHPLkotlin/LazyKt__LazyKt;->startCoroutineCancellable$default(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;I)V\nHPLkotlin/LazyKt__LazyKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlin/Pair;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V\nHPLkotlin/Result$Failure;-><init>(Ljava/lang/Throwable;)V\nHPLkotlin/Result;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable;\nHPLkotlin/ResultKt;->compareValues(Ljava/lang/Comparable;Ljava/lang/Comparable;)I\nHPLkotlin/ResultKt;->createCoroutineUnintercepted(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nHPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Ljava/lang/Object;\nHPLkotlin/ResultKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlin/ResultKt;->getListFromJsonArray(Lcom/google/gson/JsonObject;Ljava/lang/String;)Ljava/util/List;\nHPLkotlin/ResultKt;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/DisposableHandle;\nHPLkotlin/ResultKt;->recoverResult(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V\nHPLkotlin/ResultKt;->toState(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;\nHPLkotlin/SafePublicationLazyImpl;-><init>(Lkotlin/jvm/functions/Function0;)V\nHPLkotlin/TuplesKt;-><init>()V\nHPLkotlin/TuplesKt;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V\nHPLkotlin/TuplesKt;->checkNotNull(Ljava/lang/Object;)V\nHPLkotlin/TuplesKt;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V\nHPLkotlin/TuplesKt;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V\nHPLkotlin/TuplesKt;->emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlin/TuplesKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V\nHPLkotlin/TuplesKt;->ensureActive(Lkotlinx/coroutines/Job;)V\nHPLkotlin/TuplesKt;->getLastIndex(Ljava/util/List;)I\nHPLkotlin/TuplesKt;->newCoroutineContext(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;\nHPLkotlin/TuplesKt;->produce(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel;\nHPLkotlin/TuplesKt;->resume(Lkotlinx/coroutines/DispatchedTask;Lkotlin/coroutines/Continuation;Z)V\nHPLkotlin/TuplesKt;->stringPlus(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;\nHPLkotlin/TuplesKt;->topicTags(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/List;)V\nHPLkotlin/collections/AbstractCollection;-><init>()V\nHPLkotlin/collections/AbstractCollection;->size()I\nHPLkotlin/collections/AbstractList;-><init>()V\nHPLkotlin/collections/AbstractList;->iterator()Ljava/util/Iterator;\nHPLkotlin/collections/ArrayDeque;->get(I)Ljava/lang/Object;\nHPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I\nHPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Appendable;\nHPLkotlin/collections/CollectionsKt___CollectionsKt;->joinToString$default(Ljava/lang/Iterable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;I)Ljava/lang/String;\nHPLkotlin/collections/CollectionsKt___CollectionsKt;->reversed(Ljava/lang/Iterable;)Ljava/util/List;\nHPLkotlin/collections/CollectionsKt___CollectionsKt;->toCollection(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection;\nHPLkotlin/collections/CollectionsKt___CollectionsKt;->toList(Ljava/lang/Iterable;)Ljava/util/List;\nHPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/lang/Iterable;)Ljava/util/List;\nHPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/util/Collection;)Ljava/util/List;\nHPLkotlin/collections/CollectionsKt___CollectionsKt;->toSet(Ljava/lang/Iterable;)Ljava/util/Set;\nHPLkotlin/collections/ReversedListReadOnly;-><init>(Ljava/util/List;)V\nHPLkotlin/collections/ReversedListReadOnly;->get(I)Ljava/lang/Object;\nHPLkotlin/collections/ReversedListReadOnly;->getSize()I\nHPLkotlin/coroutines/AbstractCoroutineContextElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\nHPLkotlin/coroutines/CombinedContext;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)V\nHPLkotlin/coroutines/CombinedContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\nHPLkotlin/coroutines/CombinedContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;\nHPLkotlin/coroutines/CombinedContext;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;\nHPLkotlin/coroutines/CombinedContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;\nHPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext;\nHPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;-><init>(Lkotlin/coroutines/Continuation;)V\nHPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->resumeWith(Ljava/lang/Object;)V\nHPLkotlin/coroutines/jvm/internal/ContinuationImpl;-><init>(Lkotlin/coroutines/Continuation;)V\nHPLkotlin/coroutines/jvm/internal/ContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext;\nHPLkotlin/coroutines/jvm/internal/ContinuationImpl;->releaseIntercepted()V\nHPLkotlin/coroutines/jvm/internal/SuspendLambda;-><init>(ILkotlin/coroutines/Continuation;)V\nHPLkotlin/coroutines/jvm/internal/SuspendLambda;->getArity()I\nHPLkotlin/jvm/internal/ArrayIterator;-><init>(Lkotlin/collections/AbstractList;)V\nHPLkotlin/jvm/internal/ArrayIterator;->hasNext()Z\nHPLkotlin/jvm/internal/ArrayIterator;->next()Ljava/lang/Object;\nHPLkotlin/jvm/internal/Lambda;-><init>(I)V\nHPLkotlin/ranges/IntProgression;-><init>(III)V\nHPLkotlin/ranges/IntRange;-><init>(II)V\nHPLkotlin/ranges/IntRange;->equals(Ljava/lang/Object;)Z\nHPLkotlin/ranges/IntRange;->isEmpty()Z\nHPLkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/AbstractCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;ZZ)V\nHPLkotlinx/coroutines/AbstractCoroutine;->afterResume(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/AbstractCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext;\nHPLkotlinx/coroutines/AbstractCoroutine;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext;\nHPLkotlinx/coroutines/AbstractCoroutine;->isActive()Z\nHPLkotlinx/coroutines/AbstractCoroutine;->onCompletionInternal(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/AbstractCoroutine;->resumeWith(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/AbstractCoroutine;->start$enumunboxing$(ILjava/lang/Object;Lkotlin/jvm/functions/Function2;)V\nHPLkotlinx/coroutines/BeforeResumeCancelHandler;-><init>()V\nHPLkotlinx/coroutines/CancelHandler;-><init>()V\nHPLkotlinx/coroutines/CancellableContinuationImpl;-><init>(Lkotlin/coroutines/Continuation;I)V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->cancel(Ljava/lang/Throwable;)Z\nHPLkotlinx/coroutines/CancellableContinuationImpl;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/lang/Object;Ljava/lang/Throwable;)V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->detachChild$kotlinx_coroutines_core()V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->detachChildIfNonResuable()V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->dispatchResume(I)V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->getContinuationCancellationCause(Lkotlinx/coroutines/Job;)Ljava/lang/Throwable;\nHPLkotlinx/coroutines/CancellableContinuationImpl;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation;\nHPLkotlinx/coroutines/CancellableContinuationImpl;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable;\nHPLkotlinx/coroutines/CancellableContinuationImpl;->getResult()Ljava/lang/Object;\nHPLkotlinx/coroutines/CancellableContinuationImpl;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/CancellableContinuationImpl;->initCancellability()V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->installParentHandle()Lkotlinx/coroutines/DisposableHandle;\nHPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlin/jvm/functions/Function1;)V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->isReusable()Z\nHPLkotlinx/coroutines/CancellableContinuationImpl;->releaseClaimedReusableContinuation()V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl(Ljava/lang/Object;ILkotlin/jvm/functions/Function1;)V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->resumeWith(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/coroutines/NotCompleted;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object;\nHPLkotlinx/coroutines/CancellableContinuationImpl;->tryResumeImpl(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol;\nHPLkotlinx/coroutines/CancelledContinuation;-><init>(Lkotlin/coroutines/Continuation;Ljava/lang/Throwable;Z)V\nHPLkotlinx/coroutines/ChildContinuation;-><init>(Lkotlinx/coroutines/CancellableContinuationImpl;)V\nHPLkotlinx/coroutines/ChildContinuation;->invoke(Ljava/lang/Throwable;)V\nHPLkotlinx/coroutines/ChildHandleNode;-><init>(Lkotlinx/coroutines/ChildJob;)V\nHPLkotlinx/coroutines/ChildHandleNode;->invoke(Ljava/lang/Throwable;)V\nHPLkotlinx/coroutines/CompletedContinuation;-><init>(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;I)V\nHPLkotlinx/coroutines/CompletedExceptionally;-><init>(Ljava/lang/Throwable;Z)V\nHPLkotlinx/coroutines/CompletedExceptionally;-><init>(Ljava/lang/Throwable;ZI)V\nHPLkotlinx/coroutines/CompletedExceptionally;->getHandled()Z\nHPLkotlinx/coroutines/CoroutineDispatcher$Key$1;->invoke(Lcom/google/samples/apps/iosched/model/userdata/UserSession;)Ljava/lang/Comparable;\nHPLkotlinx/coroutines/CoroutineDispatcher;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;\nHPLkotlinx/coroutines/CoroutineDispatcher;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z\nHPLkotlinx/coroutines/CoroutineDispatcher;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;\nHPLkotlinx/coroutines/DispatchedCoroutine;->afterResume(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/DispatchedCoroutine;->getResult()Ljava/lang/Object;\nHPLkotlinx/coroutines/DispatchedTask;-><init>(I)V\nHPLkotlinx/coroutines/DispatchedTask;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable;\nHPLkotlinx/coroutines/Empty;->isActive()Z\nHPLkotlinx/coroutines/EventLoopImplPlatform;->decrementUseCount(Z)V\nHPLkotlinx/coroutines/EventLoopImplPlatform;->dispatchUnconfined(Lkotlinx/coroutines/DispatchedTask;)V\nHPLkotlinx/coroutines/EventLoopImplPlatform;->incrementUseCount(Z)V\nHPLkotlinx/coroutines/EventLoopImplPlatform;->isUnconfinedLoopActive()Z\nHPLkotlinx/coroutines/EventLoopImplPlatform;->processUnconfinedEvent()Z\nHPLkotlinx/coroutines/JobCancellingNode;-><init>()V\nHPLkotlinx/coroutines/JobNode;-><init>()V\nHPLkotlinx/coroutines/JobNode;->dispose()V\nHPLkotlinx/coroutines/JobNode;->getJob()Lkotlinx/coroutines/JobSupport;\nHPLkotlinx/coroutines/JobSupport$Finishing;-><init>(Lkotlinx/coroutines/NodeList;ZLjava/lang/Throwable;)V\nHPLkotlinx/coroutines/JobSupport$Finishing;->addExceptionLocked(Ljava/lang/Throwable;)V\nHPLkotlinx/coroutines/JobSupport$Finishing;->allocateList()Ljava/util/ArrayList;\nHPLkotlinx/coroutines/JobSupport$Finishing;->getList()Lkotlinx/coroutines/NodeList;\nHPLkotlinx/coroutines/JobSupport$Finishing;->getRootCause()Ljava/lang/Throwable;\nHPLkotlinx/coroutines/JobSupport$Finishing;->isCancelling()Z\nHPLkotlinx/coroutines/JobSupport$Finishing;->isCompleting()Z\nHPLkotlinx/coroutines/JobSupport$Finishing;->sealLocked(Ljava/lang/Throwable;)Ljava/util/List;\nHPLkotlinx/coroutines/JobSupport$Finishing;->setCompleting(Z)V\nHPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/JobSupport;Ljava/lang/Object;)V\nHPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->prepare(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/JobSupport;-><init>(Z)V\nHPLkotlinx/coroutines/JobSupport;->addLastAtomic(Ljava/lang/Object;Lkotlinx/coroutines/NodeList;Lkotlinx/coroutines/JobNode;)Z\nHPLkotlinx/coroutines/JobSupport;->cancel(Ljava/util/concurrent/CancellationException;)V\nHPLkotlinx/coroutines/JobSupport;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z\nHPLkotlinx/coroutines/JobSupport;->cancelParent(Ljava/lang/Throwable;)Z\nHPLkotlinx/coroutines/JobSupport;->completeStateFinalization(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)V\nHPLkotlinx/coroutines/JobSupport;->createCauseException(Ljava/lang/Object;)Ljava/lang/Throwable;\nHPLkotlinx/coroutines/JobSupport;->finalizeFinishingState(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/JobSupport;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\nHPLkotlinx/coroutines/JobSupport;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;\nHPLkotlinx/coroutines/JobSupport;->getCancellationException()Ljava/util/concurrent/CancellationException;\nHPLkotlinx/coroutines/JobSupport;->getFinalRootCause(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/util/List;)Ljava/lang/Throwable;\nHPLkotlinx/coroutines/JobSupport;->getKey()Lkotlin/coroutines/CoroutineContext$Key;\nHPLkotlinx/coroutines/JobSupport;->getOnCancelComplete$kotlinx_coroutines_core()Z\nHPLkotlinx/coroutines/JobSupport;->getOrPromoteCancellingList(Lkotlinx/coroutines/Incomplete;)Lkotlinx/coroutines/NodeList;\nHPLkotlinx/coroutines/JobSupport;->getState$kotlinx_coroutines_core()Ljava/lang/Object;\nHPLkotlinx/coroutines/JobSupport;->initParentJob(Lkotlinx/coroutines/Job;)V\nHPLkotlinx/coroutines/JobSupport;->isActive()Z\nHPLkotlinx/coroutines/JobSupport;->isScopedCoroutine()Z\nHPLkotlinx/coroutines/JobSupport;->join(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/JobSupport;->makeCompletingOnce$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/JobSupport;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;\nHPLkotlinx/coroutines/JobSupport;->nextChild(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/ChildHandleNode;\nHPLkotlinx/coroutines/JobSupport;->notifyCancelling(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V\nHPLkotlinx/coroutines/JobSupport;->promoteSingleToNodeList(Lkotlinx/coroutines/JobNode;)V\nHPLkotlinx/coroutines/JobSupport;->startInternal(Ljava/lang/Object;)I\nHPLkotlinx/coroutines/JobSupport;->toCancellationException(Ljava/lang/Throwable;Ljava/lang/String;)Ljava/util/concurrent/CancellationException;\nHPLkotlinx/coroutines/JobSupport;->tryMakeCompleting(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/NodeList;-><init>()V\nHPLkotlinx/coroutines/StandaloneCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Z)V\nHPLkotlinx/coroutines/ThreadLocalEventLoop;->getEventLoop$kotlinx_coroutines_core()Lkotlinx/coroutines/EventLoopImplPlatform;\nHPLkotlinx/coroutines/UndispatchedCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/UndispatchedCoroutine;->afterResume(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/android/HandlerContext;->equals(Ljava/lang/Object;)Z\nHPLkotlinx/coroutines/android/HandlerContext;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z\nHPLkotlinx/coroutines/android/HandlerContext;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuation;)V\nHPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;-><init>(Lkotlinx/coroutines/CancellableContinuation;I)V\nHPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->completeResumeReceive(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->resumeReceiveClosed(Lkotlinx/coroutines/channels/Closed;)V\nHPLkotlinx/coroutines/channels/AbstractChannel$ReceiveElement;->tryResumeReceive(Ljava/lang/Object;Lkotlinx/coroutines/internal/LockFreeLinkedListNode$PrepareOp;)Lkotlinx/coroutines/internal/Symbol;\nHPLkotlinx/coroutines/channels/AbstractChannel$RemoveReceiveOnCancel;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;Lkotlinx/coroutines/channels/Receive;)V\nHPLkotlinx/coroutines/channels/AbstractChannel$receiveCatching$1;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/channels/AbstractChannel$receiveCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/AbstractChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z\nHPLkotlinx/coroutines/channels/AbstractChannel;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/AbstractChannel;->receiveSuspend(ILkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/AbstractChannel;->takeFirstReceiveOrPeekClosed()Lkotlinx/coroutines/channels/ReceiveOrClosed;\nHPLkotlinx/coroutines/channels/AbstractSendChannel$enqueueSend$$inlined$addLastIfPrevAndIf$1;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/channels/AbstractSendChannel;I)V\nHPLkotlinx/coroutines/channels/AbstractSendChannel$enqueueSend$$inlined$addLastIfPrevAndIf$1;->prepare()Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/AbstractSendChannel$enqueueSend$$inlined$addLastIfPrevAndIf$1;->prepare(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/AbstractSendChannel;-><init>(Lkotlin/jvm/functions/Function1;)V\nHPLkotlinx/coroutines/channels/AbstractSendChannel;->close(Ljava/lang/Throwable;)Z\nHPLkotlinx/coroutines/channels/AbstractSendChannel;->getClosedForSend()Lkotlinx/coroutines/channels/Closed;\nHPLkotlinx/coroutines/channels/AbstractSendChannel;->helpClose(Lkotlinx/coroutines/channels/Closed;)V\nHPLkotlinx/coroutines/channels/AbstractSendChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/AbstractSendChannel;->takeFirstReceiveOrPeekClosed()Lkotlinx/coroutines/channels/ReceiveOrClosed;\nHPLkotlinx/coroutines/channels/ArrayChannel;-><init>(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)V\nHPLkotlinx/coroutines/channels/ArrayChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z\nHPLkotlinx/coroutines/channels/ArrayChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/ArrayChannel;->pollInternal()Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/ChannelResult;-><init>(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/channels/ProducerCoroutine;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/channels/ProducerCoroutine;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/DistinctFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/ReadonlyStateFlow;->getValue()Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/SafeFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->awaitValue(Lkotlinx/coroutines/flow/SharedFlowSlot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->cleanupTailLocked()V\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->collect$suspendImpl(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->dropOldestLocked()V\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->enqueueLocked(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->findSlotsToResumeLocked([Lkotlin/coroutines/Continuation;)[Lkotlin/coroutines/Continuation;\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->getBufferEndIndex()J\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->getHead()J\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->getLastReplayedLocked()Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->getTotalSize()I\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmit(Ljava/lang/Object;)Z\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmitLocked(Ljava/lang/Object;)Z\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->tryPeekLocked(Lkotlinx/coroutines/flow/SharedFlowSlot;)J\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->tryTakeValue(Lkotlinx/coroutines/flow/SharedFlowSlot;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->updateBufferLocked(JJJJ)V\nHPLkotlinx/coroutines/flow/SharedFlowImpl;->updateCollectorIndexLocked$kotlinx_coroutines_core(J)[Lkotlin/coroutines/Continuation;\nHPLkotlinx/coroutines/flow/StartedLazily$command$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;-><init>(Lkotlinx/coroutines/flow/StartedWhileSubscribed;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;-><init>(Lkotlinx/coroutines/flow/StateFlowImpl;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/StateFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/StateFlowImpl;->getValue()Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/StateFlowImpl;->updateState(Ljava/lang/Object;Ljava/lang/Object;)Z\nHPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Ljava/lang/Object;)Z\nHPLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation;\nHPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->allocateSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;\nHPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->freeSlot(Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;)V\nHPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nHPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlow;-><init>(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V\nHPLkotlinx/coroutines/flow/internal/ChannelFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlow;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel;\nHPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;)V\nHPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/ChildCancelledException;-><init>()V\nHPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/SafeCollector;-><init>(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;)V\nHPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/SendingCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nHPLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;->increment(I)Z\nHPLkotlinx/coroutines/internal/AtomicOp;-><init>()V\nHPLkotlinx/coroutines/internal/AtomicOp;->perform(Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/internal/DispatchedContinuation;-><init>(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/internal/DispatchedContinuation;->claimReusableCancellableContinuation()Lkotlinx/coroutines/CancellableContinuationImpl;\nHPLkotlinx/coroutines/internal/DispatchedContinuation;->getContext()Lkotlin/coroutines/CoroutineContext;\nHPLkotlinx/coroutines/internal/DispatchedContinuation;->isReusable()Z\nHPLkotlinx/coroutines/internal/DispatchedContinuation;->release()V\nHPLkotlinx/coroutines/internal/DispatchedContinuation;->resumeWith(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/internal/DispatchedContinuation;->takeState$kotlinx_coroutines_core()Ljava/lang/Object;\nHPLkotlinx/coroutines/internal/DispatchedContinuation;->tryReleaseClaimedContinuation(Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Throwable;\nHPLkotlinx/coroutines/internal/LockFreeLinkedListHead;-><init>()V\nHPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->isRemoved()Z\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->complete(Ljava/lang/Object;Ljava/lang/Object;)V\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;-><init>()V\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Z\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNext()Ljava/lang/Object;\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNextNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode;\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getPrevNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode;\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->isRemoved()Z\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->remove()Z\nHPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->tryCondAddNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;)I\nHPLkotlinx/coroutines/internal/LockFreeTaskQueue;->addLast(Ljava/lang/Object;)Z\nHPLkotlinx/coroutines/internal/LockFreeTaskQueue;->removeFirstOrNull()Ljava/lang/Object;\nHPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->addLast(Ljava/lang/Object;)I\nHPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->removeFirstOrNull()Ljava/lang/Object;\nHPLkotlinx/coroutines/internal/OpDescriptor;-><init>()V\nHPLkotlinx/coroutines/internal/Removed;-><init>(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V\nHPLkotlinx/coroutines/internal/ScopeCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V\nHPLkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V\nHPLkotlinx/coroutines/internal/ThreadContextKt;->threadContextElements(Lkotlin/coroutines/CoroutineContext;)Ljava/lang/Object;\nHPLkotlinx/coroutines/internal/ThreadContextKt;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object;\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findTask(Z)Lkotlinx/coroutines/scheduling/Task;\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getIndexInArray()I\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getNextParkedWorker()Ljava/lang/Object;\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->nextInt(I)I\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->pollGlobalQueues()Lkotlinx/coroutines/scheduling/Task;\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->run()V\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setNextParkedWorker(Ljava/lang/Object;)V\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->tryReleaseCpu$enumunboxing$(I)Z\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->trySteal(Z)Lkotlinx/coroutines/scheduling/Task;\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler;->currentWorker()Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch$default(Lkotlinx/coroutines/scheduling/CoroutineScheduler;Ljava/lang/Runnable;Lorg/threeten/bp/chrono/Chronology$1;ZI)V\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch(Ljava/lang/Runnable;Lorg/threeten/bp/chrono/Chronology$1;Z)V\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler;->isTerminated()Z\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackNextIndex(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)I\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackPush(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)Z\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalCpuWork()V\nHPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryUnpark()Z\nHPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V\nHPLkotlinx/coroutines/scheduling/Task;-><init>()V\nHPLkotlinx/coroutines/scheduling/WorkQueue;->add(Lkotlinx/coroutines/scheduling/Task;Z)Lkotlinx/coroutines/scheduling/Task;\nHPLkotlinx/coroutines/scheduling/WorkQueue;->poll()Lkotlinx/coroutines/scheduling/Task;\nHPLkotlinx/coroutines/scheduling/WorkQueue;->pollBuffer()Lkotlinx/coroutines/scheduling/Task;\nHPLkotlinx/coroutines/scheduling/WorkQueue;->tryStealLastScheduled(Lkotlinx/coroutines/scheduling/WorkQueue;Z)J\nHPLokhttp3/RequestBody;->zza(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)Ljava/util/Set;\nHPLokhttp3/RequestBody;->zza(Lcom/google/android/gms/measurement/internal/zzes;Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V\nHPLokhttp3/internal/connection/RouteSelector$Selection;->reset()V\nHPLokio/Base64;->methodFlagBitmapIndex(III)I\nHPLokio/Base64;->readUncompressedBody(Ljava/io/InputStream;Ljava/lang/String;I)[Landroidx/profileinstaller/DexProfileData;\nHPLokio/Base64;->setMethodBitmapBit([BIILandroidx/profileinstaller/DexProfileData;)V\nHPLokio/Base64;->transcodeAndWriteBody(Ljava/io/OutputStream;[B[Landroidx/profileinstaller/DexProfileData;)Z\nHPLokio/Base64;->writeMethodBitmap(Ljava/io/OutputStream;Landroidx/profileinstaller/DexProfileData;)V\nHPLokio/Base64;->writeMethodsWithInlineCaches(Ljava/io/OutputStream;Landroidx/profileinstaller/DexProfileData;)V\nHPLokio/SegmentPool;->compareInts(II)I\nHPLokio/SegmentPool;->compareLongs(JJ)I\nHPLokio/SegmentPool;->floorDiv(JJ)J\nHPLokio/SegmentPool;->floorMod(JI)I\nHPLokio/SegmentPool;->floorMod(JJ)J\nHPLokio/SegmentPool;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;\nHPLokio/SegmentPool;->safeAdd(JJ)J\nHPLokio/SegmentPool;->safeMultiply(JI)J\nHPLokio/SegmentPool;->valueIterator(Landroidx/collection/SparseArrayCompat;)Ljava/util/Iterator;\nHPLokio/SegmentPool;->wrap(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroid/content/Context;\nHPLorg/threeten/bp/Instant;-><init>(JI)V\nHPLorg/threeten/bp/Instant;->create(JI)Lorg/threeten/bp/Instant;\nHPLorg/threeten/bp/Instant;->ofEpochMilli(J)Lorg/threeten/bp/Instant;\nHPLorg/threeten/bp/Instant;->ofEpochSecond(JJ)Lorg/threeten/bp/Instant;\nHPLorg/threeten/bp/Instant;->toEpochMilli()J\nHPLorg/threeten/bp/LocalDate;-><init>(III)V\nHPLorg/threeten/bp/LocalDate;->compareTo0(Lorg/threeten/bp/LocalDate;)I\nHPLorg/threeten/bp/LocalDate;->equals(Ljava/lang/Object;)Z\nHPLorg/threeten/bp/LocalDate;->get0(Lorg/threeten/bp/temporal/TemporalField;)I\nHPLorg/threeten/bp/LocalDate;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J\nHPLorg/threeten/bp/LocalDate;->hashCode()I\nHPLorg/threeten/bp/LocalDate;->plusDays(J)Lorg/threeten/bp/LocalDate;\nHPLorg/threeten/bp/LocalDateTime;-><init>(Lorg/threeten/bp/LocalDate;Lorg/threeten/bp/LocalTime;)V\nHPLorg/threeten/bp/LocalDateTime;->compareTo(Lorg/threeten/bp/chrono/ChronoLocalDateTime;)I\nHPLorg/threeten/bp/LocalDateTime;->equals(Ljava/lang/Object;)Z\nHPLorg/threeten/bp/LocalDateTime;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J\nHPLorg/threeten/bp/LocalDateTime;->hashCode()I\nHPLorg/threeten/bp/LocalDateTime;->plusWithOverflow(Lorg/threeten/bp/LocalDate;JJJJI)Lorg/threeten/bp/LocalDateTime;\nHPLorg/threeten/bp/LocalDateTime;->with(Lorg/threeten/bp/LocalDate;Lorg/threeten/bp/LocalTime;)Lorg/threeten/bp/LocalDateTime;\nHPLorg/threeten/bp/LocalTime;-><init>(IIII)V\nHPLorg/threeten/bp/LocalTime;->compareTo(Lorg/threeten/bp/LocalTime;)I\nHPLorg/threeten/bp/LocalTime;->create(IIII)Lorg/threeten/bp/LocalTime;\nHPLorg/threeten/bp/LocalTime;->equals(Ljava/lang/Object;)Z\nHPLorg/threeten/bp/LocalTime;->get0(Lorg/threeten/bp/temporal/TemporalField;)I\nHPLorg/threeten/bp/LocalTime;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J\nHPLorg/threeten/bp/LocalTime;->hashCode()I\nHPLorg/threeten/bp/LocalTime;->ofNanoOfDay(J)Lorg/threeten/bp/LocalTime;\nHPLorg/threeten/bp/LocalTime;->toNanoOfDay()J\nHPLorg/threeten/bp/LocalTime;->toSecondOfDay()I\nHPLorg/threeten/bp/ZoneId;->equals(Ljava/lang/Object;)Z\nHPLorg/threeten/bp/ZoneId;->hashCode()I\nHPLorg/threeten/bp/ZoneOffset;->equals(Ljava/lang/Object;)Z\nHPLorg/threeten/bp/ZoneOffset;->getId()Ljava/lang/String;\nHPLorg/threeten/bp/ZoneOffset;->getRules()Lorg/threeten/bp/zone/ZoneRules;\nHPLorg/threeten/bp/ZoneRegion;->getId()Ljava/lang/String;\nHPLorg/threeten/bp/ZoneRegion;->getRules()Lorg/threeten/bp/zone/ZoneRules;\nHPLorg/threeten/bp/ZonedDateTime;-><init>(Lorg/threeten/bp/LocalDateTime;Lorg/threeten/bp/ZoneOffset;Lorg/threeten/bp/ZoneId;)V\nHPLorg/threeten/bp/ZonedDateTime;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J\nHPLorg/threeten/bp/ZonedDateTime;->hashCode()I\nHPLorg/threeten/bp/ZonedDateTime;->ofInstant(Lorg/threeten/bp/Instant;Lorg/threeten/bp/ZoneId;)Lorg/threeten/bp/ZonedDateTime;\nHPLorg/threeten/bp/ZonedDateTime;->ofLocal(Lorg/threeten/bp/LocalDateTime;Lorg/threeten/bp/ZoneId;Lorg/threeten/bp/ZoneOffset;)Lorg/threeten/bp/ZonedDateTime;\nHPLorg/threeten/bp/chrono/ChronoLocalDate;-><init>()V\nHPLorg/threeten/bp/chrono/ChronoLocalDateTime;-><init>()V\nHPLorg/threeten/bp/chrono/ChronoLocalDateTime;->toEpochSecond(Lorg/threeten/bp/ZoneOffset;)J\nHPLorg/threeten/bp/chrono/ChronoZonedDateTime;-><init>()V\nHPLorg/threeten/bp/chrono/ChronoZonedDateTime;->compareTo(Ljava/lang/Object;)I\nHPLorg/threeten/bp/chrono/ChronoZonedDateTime;->toEpochSecond()J\nHPLorg/threeten/bp/chrono/ChronoZonedDateTime;->toInstant()Lorg/threeten/bp/Instant;\nHPLorg/threeten/bp/chrono/IsoChronology;->isLeapYear(J)Z\nHPLorg/threeten/bp/format/DateTimeBuilder;->resolve(Lorg/threeten/bp/format/ResolverStyle;Ljava/util/Set;)Lorg/threeten/bp/format/DateTimeBuilder;\nHPLorg/threeten/bp/format/DateTimeFormatter;-><init>(Lorg/threeten/bp/format/DateTimeFormatterBuilder$CompositePrinterParser;Ljava/util/Locale;Lorg/threeten/bp/format/DecimalStyle;Lorg/threeten/bp/format/ResolverStyle;Ljava/util/Set;Lorg/threeten/bp/chrono/Chronology;Lorg/threeten/bp/ZoneId;)V\nHPLorg/threeten/bp/format/DateTimeFormatter;->format(Lorg/threeten/bp/temporal/TemporalAccessor;)Ljava/lang/String;\nHPLorg/threeten/bp/format/DateTimeFormatter;->ofPattern(Ljava/lang/String;)Lorg/threeten/bp/format/DateTimeFormatter;\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;-><init>(C)V\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$CompositePrinterParser;-><init>(Ljava/util/List;Z)V\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$CompositePrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$FractionPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;-><init>(Lorg/threeten/bp/temporal/TemporalField;III)V\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$TextPrinterParser;-><init>(Lorg/threeten/bp/temporal/TemporalField;Lorg/threeten/bp/format/TextStyle;Lorg/threeten/bp/format/DateTimeTextProvider;)V\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder$TextPrinterParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder;-><init>()V\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendInternal(Lorg/threeten/bp/format/DateTimeFormatterBuilder$DateTimePrinterParser;)I\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendLiteral(C)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendText(Lorg/threeten/bp/temporal/TemporalField;Lorg/threeten/bp/format/TextStyle;)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendValue(Lorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendValue(Lorg/threeten/bp/temporal/TemporalField;)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendValue(Lorg/threeten/bp/temporal/TemporalField;I)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nHPLorg/threeten/bp/format/DateTimeFormatterBuilder;->toFormatter()Lorg/threeten/bp/format/DateTimeFormatter;\nHPLorg/threeten/bp/format/SimpleDateTimeTextProvider$LocaleStore;->getText(JLorg/threeten/bp/format/TextStyle;)Ljava/lang/String;\nHPLorg/threeten/bp/format/SimpleDateTimeTextProvider;->findStore(Lorg/threeten/bp/temporal/TemporalField;Ljava/util/Locale;)Ljava/lang/Object;\nHPLorg/threeten/bp/format/SimpleDateTimeTextProvider;->getText(Lorg/threeten/bp/temporal/TemporalField;JLorg/threeten/bp/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;\nHPLorg/threeten/bp/jdk8/DefaultInterfaceTemporal;-><init>()V\nHPLorg/threeten/bp/temporal/ChronoField;->checkValidIntValue(J)I\nHPLorg/threeten/bp/temporal/ChronoField;->isTimeBased()Z\nHPLorg/threeten/bp/temporal/ValueRange;->checkValidValue(JLorg/threeten/bp/temporal/TemporalField;)J\nHPLorg/threeten/bp/temporal/ValueRange;->isValidValue(J)Z\nHPLorg/threeten/bp/zone/StandardZoneRules;->findTransitionArray(I)[Lorg/threeten/bp/zone/ZoneOffsetTransition;\nHPLorg/threeten/bp/zone/StandardZoneRules;->getOffset(Lorg/threeten/bp/Instant;)Lorg/threeten/bp/ZoneOffset;\nHPLorg/threeten/bp/zone/StandardZoneRules;->getOffsetInfo(Lorg/threeten/bp/LocalDateTime;)Ljava/lang/Object;\nHPLorg/threeten/bp/zone/ZoneOffsetTransition;->getDateTimeAfter()Lorg/threeten/bp/LocalDateTime;\nHPLorg/threeten/bp/zone/ZoneOffsetTransition;->isGap()Z\nHPLorg/threeten/bp/zone/ZoneRules$Fixed;-><init>(Lorg/threeten/bp/ZoneOffset;)V\nHPLorg/threeten/bp/zone/ZoneRules$Fixed;->getOffset(Lorg/threeten/bp/Instant;)Lorg/threeten/bp/ZoneOffset;\nHPLorg/threeten/bp/zone/ZoneRules;-><init>()V\nPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;-><init>(Landroidx/activity/ComponentActivity;I)V\nPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->onContextAvailable(Landroid/content/Context;)V\nPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->saveState()Landroid/os/Bundle;\nPLandroidx/activity/ComponentActivity$2;-><init>(Landroidx/activity/ComponentActivity;)V\nPLandroidx/activity/ComponentActivity$3;-><init>(Landroidx/activity/ComponentActivity;)V\nPLandroidx/activity/ComponentActivity$3;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/activity/ComponentActivity$4;-><init>(Landroidx/activity/ComponentActivity;)V\nPLandroidx/activity/ComponentActivity$4;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/activity/ComponentActivity$5;-><init>(Landroidx/activity/ComponentActivity;)V\nPLandroidx/activity/ComponentActivity$5;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/activity/ComponentActivity;->$r8$lambda$Mg7-hF6_XzI8jXHyb9wZTvbC5nA(Landroidx/activity/ComponentActivity;Landroid/content/Context;)V\nPLandroidx/activity/ComponentActivity;->$r8$lambda$uMG6y9sMaPUFZmnRrSgWpORKiAI(Landroidx/activity/ComponentActivity;)Landroid/os/Bundle;\nPLandroidx/activity/ComponentActivity;-><init>()V\nPLandroidx/activity/ComponentActivity;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V\nPLandroidx/activity/ComponentActivity;->ensureViewModelStore()V\nPLandroidx/activity/ComponentActivity;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry;\nPLandroidx/activity/ComponentActivity;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory;\nPLandroidx/activity/ComponentActivity;->getLifecycle()Landroidx/lifecycle/Lifecycle;\nPLandroidx/activity/ComponentActivity;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher;\nPLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry;\nPLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore;\nPLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V\nPLandroidx/activity/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V\nPLandroidx/activity/OnBackPressedCallback;-><init>(Z)V\nPLandroidx/activity/OnBackPressedCallback;->remove()V\nPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;-><init>(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/Lifecycle;Landroidx/activity/OnBackPressedCallback;)V\nPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->cancel()V\nPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;-><init>(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/OnBackPressedCallback;)V\nPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->cancel()V\nPLandroidx/activity/OnBackPressedDispatcher;-><init>(Ljava/lang/Runnable;)V\nPLandroidx/activity/OnBackPressedDispatcher;->addCallback(Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/OnBackPressedCallback;)V\nPLandroidx/activity/contextaware/ContextAwareHelper;-><init>()V\nPLandroidx/activity/result/ActivityResultLauncher;-><init>()V\nPLandroidx/activity/result/ActivityResultRegistry$2;-><init>(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;ILandroidx/activity/result/contract/ActivityResultContract;I)V\nPLandroidx/activity/result/ActivityResultRegistry$2;->unregister()V\nPLandroidx/activity/result/ActivityResultRegistry$CallbackAndContract;-><init>(Landroidx/activity/result/ActivityResultCallback;Landroidx/activity/result/contract/ActivityResultContract;)V\nPLandroidx/activity/result/ActivityResultRegistry;-><init>()V\nPLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher;\nPLandroidx/activity/result/ActivityResultRegistry;->unregister(Ljava/lang/String;)V\nPLandroidx/activity/result/contract/ActivityResultContract;-><init>()V\nPLandroidx/appcompat/R$bool;-><clinit>()V\nPLandroidx/appcompat/R$bool;->getDrawable(Landroid/content/Context;Landroid/content/Context;ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;\nPLandroidx/appcompat/R$bool;->zzb(II)I\nPLandroidx/appcompat/R$id$$IA$1;->_applyState(ILandroid/view/View;)V\nPLandroidx/appcompat/R$id$$IA$1;->_from(I)I\nPLandroidx/appcompat/R$id$$IA$1;->m(FFFF)F\nPLandroidx/appcompat/R$id$$IA$1;->m(Landroid/view/View;Ljava/lang/String;Landroidx/core/view/WindowInsetsCompat;Ljava/lang/String;Lcom/google/samples/apps/iosched/util/ViewPaddingState;Ljava/lang/String;ILjava/lang/String;)Landroidx/core/graphics/Insets;\nPLandroidx/appcompat/R$id$$IA$1;->m(Landroidx/fragment/app/Fragment;Ljava/lang/String;)Landroidx/lifecycle/ViewModelStore;\nPLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;)Ljava/lang/StringBuilder;\nPLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;I)I\nPLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nPLandroidx/appcompat/R$id$$IA$1;->m(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nPLandroidx/appcompat/app/ActionBar$LayoutParams;-><init>(II)V\nPLandroidx/appcompat/app/ActionBar$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/app/AlertDialog$Builder;-><init>(Ljava/lang/Object;I)V\nPLandroidx/appcompat/app/AppCompatActivity$1;-><init>(Landroidx/appcompat/app/AppCompatActivity;)V\nPLandroidx/appcompat/app/AppCompatActivity$1;-><init>(Landroidx/savedstate/SavedStateRegistry;)V\nPLandroidx/appcompat/app/AppCompatActivity$1;->saveState()Landroid/os/Bundle;\nPLandroidx/appcompat/app/AppCompatActivity$2;-><init>(Landroidx/appcompat/app/AppCompatActivity;I)V\nPLandroidx/appcompat/app/AppCompatActivity$2;->onContextAvailable(Landroid/content/Context;)V\nPLandroidx/appcompat/app/AppCompatActivity;-><init>()V\nPLandroidx/appcompat/app/AppCompatActivity;->attachBaseContext(Landroid/content/Context;)V\nPLandroidx/appcompat/app/AppCompatActivity;->getDelegate()Landroidx/appcompat/app/AppCompatDelegate;\nPLandroidx/appcompat/app/AppCompatActivity;->initViewTreeOwners()V\nPLandroidx/appcompat/app/AppCompatActivity;->onContentChanged()V\nPLandroidx/appcompat/app/AppCompatActivity;->onDestroy()V\nPLandroidx/appcompat/app/AppCompatActivity;->onPostCreate(Landroid/os/Bundle;)V\nPLandroidx/appcompat/app/AppCompatActivity;->onPostResume()V\nPLandroidx/appcompat/app/AppCompatActivity;->onStart()V\nPLandroidx/appcompat/app/AppCompatActivity;->onStop()V\nPLandroidx/appcompat/app/AppCompatActivity;->onSupportContentChanged()V\nPLandroidx/appcompat/app/AppCompatActivity;->onTitleChanged(Ljava/lang/CharSequence;I)V\nPLandroidx/appcompat/app/AppCompatActivity;->setContentView(Landroid/view/View;)V\nPLandroidx/appcompat/app/AppCompatActivity;->setTheme(I)V\nPLandroidx/appcompat/app/AppCompatDelegate;-><clinit>()V\nPLandroidx/appcompat/app/AppCompatDelegate;-><init>()V\nPLandroidx/appcompat/app/AppCompatDelegate;->removeDelegateFromActives(Landroidx/appcompat/app/AppCompatDelegate;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl$2;-><init>(Landroidx/appcompat/app/AppCompatDelegateImpl;I)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->run()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl$3;-><init>(Landroidx/appcompat/app/AppCompatDelegateImpl;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/appcompat/app/AppCompatDelegateImpl$5;-><init>(Landroidx/appcompat/app/AppCompatDelegateImpl;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;-><init>(Landroidx/appcompat/app/AppCompatDelegateImpl;Landroid/view/Window$Callback;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onContentChanged()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;-><init>(I)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;-><clinit>()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;-><init>(Landroid/content/Context;Landroid/view/Window;Landroidx/appcompat/app/AppCompatCallback;Ljava/lang/Object;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->applyDayNight()Z\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->applyDayNight(Z)Z\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->attachToWindow(Landroid/view/Window;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->createOverrideConfigurationForDayNight(Landroid/content/Context;ILandroid/content/res/Configuration;)Landroid/content/res/Configuration;\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->doInvalidatePanelMenu(I)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->endOnGoingFadeAnimation()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureWindow()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->getPanelState(I)Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->initWindowDecorActionBar()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->installViewFactory()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->invalidatePanelMenu(I)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->mapNightMode(Landroid/content/Context;I)I\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreate(Landroid/os/Bundle;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->onDestroy()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->requestWindowFeature(I)Z\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->setContentView(Landroid/view/View;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->setLocalNightMode(I)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V\nPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateStatusGuard(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I\nPLandroidx/appcompat/app/AppCompatViewInflater;-><clinit>()V\nPLandroidx/appcompat/app/AppCompatViewInflater;-><init>()V\nPLandroidx/appcompat/app/AppCompatViewInflater;->verifyNotNull(Landroid/view/View;Ljava/lang/String;)V\nPLandroidx/appcompat/content/res/AppCompatResources;-><clinit>()V\nPLandroidx/appcompat/content/res/AppCompatResources;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;\nPLandroidx/appcompat/view/ActionBarPolicy;-><init>(Landroid/content/Context;)V\nPLandroidx/appcompat/view/ActionBarPolicy;-><init>(Landroid/content/Context;I)V\nPLandroidx/appcompat/view/ActionBarPolicy;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLandroidx/appcompat/view/ActionBarPolicy;->getSettingsFile()Ljava/io/File;\nPLandroidx/appcompat/view/ActionBarPolicy;->readCachedSettings()Lorg/json/JSONObject;\nPLandroidx/appcompat/view/ActionBarPolicy;->zzb(Landroid/content/Intent;)Z\nPLandroidx/appcompat/view/ActionBarPolicy;->zzc()Lcom/google/android/gms/measurement/internal/zzes;\nPLandroidx/appcompat/view/ContextThemeWrapper;-><init>(Landroid/content/Context;I)V\nPLandroidx/appcompat/view/ContextThemeWrapper;->applyOverrideConfiguration(Landroid/content/res/Configuration;)V\nPLandroidx/appcompat/view/ContextThemeWrapper;->getResources()Landroid/content/res/Resources;\nPLandroidx/appcompat/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme;\nPLandroidx/appcompat/view/ContextThemeWrapper;->initializeTheme()V\nPLandroidx/appcompat/view/SupportMenuInflater$MenuState;-><init>(Landroidx/appcompat/view/SupportMenuInflater;Landroid/view/Menu;)V\nPLandroidx/appcompat/view/SupportMenuInflater;-><clinit>()V\nPLandroidx/appcompat/view/SupportMenuInflater;-><init>(Landroid/content/Context;)V\nPLandroidx/appcompat/view/SupportMenuInflater;->inflate(ILandroid/view/Menu;)V\nPLandroidx/appcompat/view/WindowCallbackWrapper;-><init>(Landroid/view/Window$Callback;)V\nPLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z\nPLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z\nPLandroidx/appcompat/view/WindowCallbackWrapper;->onAttachedToWindow()V\nPLandroidx/appcompat/view/WindowCallbackWrapper;->onDetachedFromWindow()V\nPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V\nPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowFocusChanged(Z)V\nPLandroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;-><init>()V\nPLandroidx/appcompat/view/menu/ActionMenuItemView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/view/menu/ActionMenuItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl;\nPLandroidx/appcompat/view/menu/ActionMenuItemView;->hasText()Z\nPLandroidx/appcompat/view/menu/ActionMenuItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/view/menu/ActionMenuItemView;->setItemInvoker(Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker;)V\nPLandroidx/appcompat/view/menu/ActionMenuItemView;->setPopupCallback(Landroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;)V\nPLandroidx/appcompat/view/menu/ActionMenuItemView;->setTitle(Ljava/lang/CharSequence;)V\nPLandroidx/appcompat/view/menu/ActionMenuItemView;->shouldAllowTextWithIcon()Z\nPLandroidx/appcompat/view/menu/MenuBuilder;-><clinit>()V\nPLandroidx/appcompat/view/menu/MenuBuilder;-><init>(Landroid/content/Context;)V\nPLandroidx/appcompat/view/menu/MenuBuilder;->add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuBuilder;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuBuilder;->addMenuPresenter(Landroidx/appcompat/view/menu/MenuPresenter;Landroid/content/Context;)V\nPLandroidx/appcompat/view/menu/MenuBuilder;->findItem(I)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuBuilder;->flagActionItems()V\nPLandroidx/appcompat/view/menu/MenuBuilder;->getItem(I)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuBuilder;->startDispatchingItemsChanged()V\nPLandroidx/appcompat/view/menu/MenuItemImpl;-><init>(Landroidx/appcompat/view/menu/MenuBuilder;IIIILjava/lang/CharSequence;I)V\nPLandroidx/appcompat/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->getActionView()Landroid/view/View;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->getGroupId()I\nPLandroidx/appcompat/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->getItemId()I\nPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleCondensed()Ljava/lang/CharSequence;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->hasSubMenu()Z\nPLandroidx/appcompat/view/menu/MenuItemImpl;->isActionButton()Z\nPLandroidx/appcompat/view/menu/MenuItemImpl;->isCheckable()Z\nPLandroidx/appcompat/view/menu/MenuItemImpl;->isChecked()Z\nPLandroidx/appcompat/view/menu/MenuItemImpl;->isEnabled()Z\nPLandroidx/appcompat/view/menu/MenuItemImpl;->isExclusiveCheckable()Z\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setAlphabeticShortcut(CI)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckable(Z)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setChecked(Z)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckedInt(Z)V\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setContentDescription(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setEnabled(Z)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setExclusiveCheckable(Z)V\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setIcon(I)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setIsActionButton(Z)V\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setNumericShortcut(CI)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setOnMenuItemClickListener(Landroid/view/MenuItem$OnMenuItemClickListener;)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setShowAsAction(I)V\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setTitleCondensed(Ljava/lang/CharSequence;)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setTooltipText(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setVisible(Z)Landroid/view/MenuItem;\nPLandroidx/appcompat/view/menu/MenuItemImpl;->setVisibleInt(Z)Z\nPLandroidx/appcompat/widget/ActionMenuPresenter$ActionMenuPopupCallback;-><init>(Landroidx/appcompat/widget/ActionMenuPresenter;)V\nPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;-><init>(Landroidx/appcompat/widget/ActionMenuPresenter;Landroid/content/Context;)V\nPLandroidx/appcompat/widget/ActionMenuPresenter;-><init>(Landroid/content/Context;)V\nPLandroidx/appcompat/widget/ActionMenuPresenter;->dismissPopupMenus()Z\nPLandroidx/appcompat/widget/ActionMenuPresenter;->flagActionItems()Z\nPLandroidx/appcompat/widget/ActionMenuPresenter;->hideOverflowMenu()Z\nPLandroidx/appcompat/widget/ActionMenuPresenter;->hideSubMenus()Z\nPLandroidx/appcompat/widget/ActionMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V\nPLandroidx/appcompat/widget/ActionMenuPresenter;->isOverflowMenuShowing()Z\nPLandroidx/appcompat/widget/ActionMenuView$LayoutParams;-><init>(II)V\nPLandroidx/appcompat/widget/ActionMenuView$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/ActionMenuView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/ActionMenuView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z\nPLandroidx/appcompat/widget/ActionMenuView;->generateDefaultLayoutParams()Landroidx/appcompat/widget/ActionMenuView$LayoutParams;\nPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;\nPLandroidx/appcompat/widget/ActionMenuView;->getMenu()Landroid/view/Menu;\nPLandroidx/appcompat/widget/ActionMenuView;->onDetachedFromWindow()V\nPLandroidx/appcompat/widget/ActionMenuView;->onLayout(ZIIII)V\nPLandroidx/appcompat/widget/ActionMenuView;->setExpandedActionViewsExclusive(Z)V\nPLandroidx/appcompat/widget/ActionMenuView;->setOnMenuItemClickListener(Landroidx/appcompat/widget/ActionMenuView$OnMenuItemClickListener;)V\nPLandroidx/appcompat/widget/ActionMenuView;->setOverflowReserved(Z)V\nPLandroidx/appcompat/widget/ActionMenuView;->setPopupTheme(I)V\nPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundDrawable()V\nPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setInternalBackgroundTint(Landroid/content/res/ColorStateList;)V\nPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V\nPLandroidx/appcompat/widget/AppCompatButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\nPLandroidx/appcompat/widget/AppCompatButton;->drawableStateChanged()V\nPLandroidx/appcompat/widget/AppCompatButton;->onTextChanged(Ljava/lang/CharSequence;III)V\nPLandroidx/appcompat/widget/AppCompatButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/AppCompatButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V\nPLandroidx/appcompat/widget/AppCompatCheckedTextView;-><clinit>()V\nPLandroidx/appcompat/widget/AppCompatCheckedTextView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/AppCompatCheckedTextView;->drawableStateChanged()V\nPLandroidx/appcompat/widget/AppCompatDrawableManager;-><clinit>()V\nPLandroidx/appcompat/widget/AppCompatDrawableManager;-><init>()V\nPLandroidx/appcompat/widget/AppCompatDrawableManager;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList;\nPLandroidx/appcompat/widget/AppCompatDrawableManager;->preload()V\nPLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/AppCompatImageButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/AppCompatImageView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/AppCompatImageView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/AppCompatSpinner$1;-><init>(Landroid/view/View;Landroid/view/View;Ljava/lang/Object;I)V\nPLandroidx/appcompat/widget/AppCompatTextHelper$1;->onFontRetrievalFailed(I)V\nPLandroidx/appcompat/widget/AppCompatTextHelper;->createTintInfo(Landroid/content/Context;Landroidx/appcompat/widget/AppCompatDrawableManager;I)Lokhttp3/ConnectionSpec$Builder;\nPLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/AppCompatTextView;->setTextAppearance(Landroid/content/Context;I)V\nPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl23;-><init>()V\nPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl29;-><init>()V\nPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper$Impl;-><init>()V\nPLandroidx/appcompat/widget/AppCompatTextViewAutoSizeHelper;-><clinit>()V\nPLandroidx/appcompat/widget/ContentFrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMajor()Landroid/util/TypedValue;\nPLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMinor()Landroid/util/TypedValue;\nPLandroidx/appcompat/widget/ContentFrameLayout;->onAttachedToWindow()V\nPLandroidx/appcompat/widget/ContentFrameLayout;->onDetachedFromWindow()V\nPLandroidx/appcompat/widget/ContentFrameLayout;->setAttachListener(Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener;)V\nPLandroidx/appcompat/widget/DrawableUtils;-><clinit>()V\nPLandroidx/appcompat/widget/DrawableUtils;->canSafelyMutateDrawable(Landroid/graphics/drawable/Drawable;)Z\nPLandroidx/appcompat/widget/FitWindowsLinearLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/FitWindowsLinearLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z\nPLandroidx/appcompat/widget/ForwardingListener;-><init>(Landroid/view/View;)V\nPLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;-><init>(II)V\nPLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/LinearLayoutCompat;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\nPLandroidx/appcompat/widget/LinearLayoutCompat;->getVirtualChildCount()I\nPLandroidx/appcompat/widget/LinearLayoutCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V\nPLandroidx/appcompat/widget/LinearLayoutCompat;->setBaselineAligned(Z)V\nPLandroidx/appcompat/widget/LinearLayoutCompat;->setDividerDrawable(Landroid/graphics/drawable/Drawable;)V\nPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;-><init>(I)V\nPLandroidx/appcompat/widget/ResourceManagerInternal;-><clinit>()V\nPLandroidx/appcompat/widget/ResourceManagerInternal;-><init>()V\nPLandroidx/appcompat/widget/ResourceManagerInternal;->get()Landroidx/appcompat/widget/ResourceManagerInternal;\nPLandroidx/appcompat/widget/ResourceManagerInternal;->getCachedDrawable(Landroid/content/Context;J)Landroid/graphics/drawable/Drawable;\nPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;\nPLandroidx/appcompat/widget/ResourceManagerInternal;->getPorterDuffColorFilter(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter;\nPLandroidx/appcompat/widget/ResourceManagerInternal;->loadDrawableFromDelegates(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;\nPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawable(Landroid/content/Context;IZLandroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;\nPLandroidx/appcompat/widget/RtlSpacingHelper;-><init>()V\nPLandroidx/appcompat/widget/RtlSpacingHelper;->setRelative(II)V\nPLandroidx/appcompat/widget/SearchView$4;-><init>(Ljava/lang/Object;I)V\nPLandroidx/appcompat/widget/SearchView$4;->onLayoutChange(Landroid/view/View;IIIIIIII)V\nPLandroidx/appcompat/widget/ThemeUtils;-><clinit>()V\nPLandroidx/appcompat/widget/TintContextWrapper;-><clinit>()V\nPLandroidx/appcompat/widget/Toolbar$3;-><init>(Ljava/lang/Object;I)V\nPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;-><init>(Landroidx/appcompat/widget/Toolbar;)V\nPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->flagActionItems()Z\nPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V\nPLandroidx/appcompat/widget/Toolbar$ExpandedActionViewMenuPresenter;->updateMenuView(Z)V\nPLandroidx/appcompat/widget/Toolbar$LayoutParams;-><init>(II)V\nPLandroidx/appcompat/widget/Toolbar$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/Toolbar$SavedState;-><clinit>()V\nPLandroidx/appcompat/widget/Toolbar$SavedState;-><init>(Landroid/os/Parcelable;)V\nPLandroidx/appcompat/widget/Toolbar$SavedState;->writeToParcel(Landroid/os/Parcel;I)V\nPLandroidx/appcompat/widget/Toolbar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/Toolbar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\nPLandroidx/appcompat/widget/Toolbar;->addSystemView(Landroid/view/View;Z)V\nPLandroidx/appcompat/widget/Toolbar;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z\nPLandroidx/appcompat/widget/Toolbar;->ensureContentInsets()V\nPLandroidx/appcompat/widget/Toolbar;->ensureMenu()V\nPLandroidx/appcompat/widget/Toolbar;->ensureMenuView()V\nPLandroidx/appcompat/widget/Toolbar;->generateDefaultLayoutParams()Landroidx/appcompat/widget/Toolbar$LayoutParams;\nPLandroidx/appcompat/widget/Toolbar;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;\nPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetLeft()I\nPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetRight()I\nPLandroidx/appcompat/widget/Toolbar;->getMenu()Landroid/view/Menu;\nPLandroidx/appcompat/widget/Toolbar;->getMenuInflater()Landroid/view/MenuInflater;\nPLandroidx/appcompat/widget/Toolbar;->inflateMenu(I)V\nPLandroidx/appcompat/widget/Toolbar;->isOverflowMenuShowing()Z\nPLandroidx/appcompat/widget/Toolbar;->onDetachedFromWindow()V\nPLandroidx/appcompat/widget/Toolbar;->onRtlPropertiesChanged(I)V\nPLandroidx/appcompat/widget/Toolbar;->onSaveInstanceState()Landroid/os/Parcelable;\nPLandroidx/appcompat/widget/Toolbar;->setOnMenuItemClickListener(Landroidx/appcompat/widget/Toolbar$OnMenuItemClickListener;)V\nPLandroidx/appcompat/widget/Toolbar;->setPopupTheme(I)V\nPLandroidx/appcompat/widget/Toolbar;->setSubtitleTextColor(Landroid/content/res/ColorStateList;)V\nPLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(Landroid/content/res/ColorStateList;)V\nPLandroidx/appcompat/widget/ViewStubCompat;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/appcompat/widget/ViewStubCompat;->setVisibility(I)V\nPLandroidx/appcompat/widget/ViewUtils;-><clinit>()V\nPLandroidx/arch/core/executor/ArchTaskExecutor;-><clinit>()V\nPLandroidx/arch/core/executor/ArchTaskExecutor;-><init>()V\nPLandroidx/arch/core/executor/DefaultTaskExecutor$1;-><init>(Landroidx/arch/core/executor/DefaultTaskExecutor;)V\nPLandroidx/arch/core/executor/DefaultTaskExecutor$1;-><init>(Ljava/lang/String;Ljava/util/concurrent/atomic/AtomicLong;)V\nPLandroidx/arch/core/executor/DefaultTaskExecutor$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;\nPLandroidx/arch/core/executor/DefaultTaskExecutor;-><init>()V\nPLandroidx/arch/core/executor/DefaultTaskExecutor;->executeOnDiskIO(Ljava/lang/Runnable;)V\nPLandroidx/arch/core/internal/FastSafeIterableMap;-><init>()V\nPLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;-><init>(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;I)V\nPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getKey()Ljava/lang/Object;\nPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V\nPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;-><init>(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V\nPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->hasNext()Z\nPLandroidx/arch/core/internal/SafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry;\nPLandroidx/arch/core/internal/SafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/collection/ArrayMap$1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/collection/ArrayMap$1;->colGetEntry(II)Ljava/lang/Object;\nPLandroidx/collection/ArrayMap$1;->colGetSize()I\nPLandroidx/collection/ArrayMap$1;->colRemoveAt(I)V\nPLandroidx/collection/ArrayMap;-><init>()V\nPLandroidx/collection/ArrayMap;->entrySet()Ljava/util/Set;\nPLandroidx/collection/ArrayMap;->getCollection()Landroidx/collection/MapCollections;\nPLandroidx/collection/ArrayMap;->keySet()Ljava/util/Set;\nPLandroidx/collection/ArrayMap;->putAll(Ljava/util/Map;)V\nPLandroidx/collection/ArrayMap;->values()Ljava/util/Collection;\nPLandroidx/collection/ArraySet;-><clinit>()V\nPLandroidx/collection/ArraySet;-><init>(I)V\nPLandroidx/collection/ArraySet;->add(Ljava/lang/Object;)Z\nPLandroidx/collection/ArraySet;->addAll(Ljava/util/Collection;)Z\nPLandroidx/collection/ArraySet;->allocArrays(I)V\nPLandroidx/collection/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V\nPLandroidx/collection/ArraySet;->indexOf(Ljava/lang/Object;I)I\nPLandroidx/collection/ArraySet;->iterator()Ljava/util/Iterator;\nPLandroidx/collection/ArraySet;->removeAt(I)Ljava/lang/Object;\nPLandroidx/collection/ArraySet;->size()I\nPLandroidx/collection/LongSparseArray;-><clinit>()V\nPLandroidx/collection/LongSparseArray;->get(JLjava/lang/Object;)Ljava/lang/Object;\nPLandroidx/collection/LongSparseArray;->put(JLjava/lang/Object;)V\nPLandroidx/collection/LruCache;-><init>(I)V\nPLandroidx/collection/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/collection/LruCache;->trimToSize(I)V\nPLandroidx/collection/MapCollections$ArrayIterator;-><init>(Landroidx/collection/MapCollections;I)V\nPLandroidx/collection/MapCollections$ArrayIterator;->hasNext()Z\nPLandroidx/collection/MapCollections$ArrayIterator;->next()Ljava/lang/Object;\nPLandroidx/collection/MapCollections$ArrayIterator;->remove()V\nPLandroidx/collection/MapCollections$KeySet;-><init>(Landroidx/collection/MapCollections;I)V\nPLandroidx/collection/MapCollections$KeySet;->iterator()Ljava/util/Iterator;\nPLandroidx/collection/MapCollections$MapIterator;-><init>(Landroidx/collection/MapCollections;)V\nPLandroidx/collection/MapCollections$MapIterator;->getKey()Ljava/lang/Object;\nPLandroidx/collection/MapCollections$MapIterator;->getValue()Ljava/lang/Object;\nPLandroidx/collection/MapCollections$MapIterator;->hasNext()Z\nPLandroidx/collection/MapCollections$MapIterator;->next()Ljava/lang/Object;\nPLandroidx/collection/MapCollections$ValuesCollection;-><init>(Landroidx/collection/MapCollections;)V\nPLandroidx/collection/MapCollections$ValuesCollection;->iterator()Ljava/util/Iterator;\nPLandroidx/collection/MapCollections$ValuesCollection;->toArray()[Ljava/lang/Object;\nPLandroidx/collection/MapCollections;-><init>()V\nPLandroidx/collection/MapCollections;->toArrayHelper(I)[Ljava/lang/Object;\nPLandroidx/collection/SimpleArrayMap;->ensureCapacity(I)V\nPLandroidx/collection/SimpleArrayMap;->equals(Ljava/lang/Object;)Z\nPLandroidx/collection/SimpleArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/collection/SimpleArrayMap;->hashCode()I\nPLandroidx/collection/SimpleArrayMap;->isEmpty()Z\nPLandroidx/collection/SimpleArrayMap;->putAll(Landroidx/collection/SimpleArrayMap;)V\nPLandroidx/collection/SimpleArrayMap;->size()I\nPLandroidx/collection/SparseArrayCompat;-><clinit>()V\nPLandroidx/collection/SparseArrayCompat;-><init>()V\nPLandroidx/collection/SparseArrayCompat;->get(I)Ljava/lang/Object;\nPLandroidx/collection/SparseArrayCompat;->get(ILjava/lang/Object;)Ljava/lang/Object;\nPLandroidx/collection/SparseArrayCompat;->indexOfValue(Ljava/lang/Object;)I\nPLandroidx/collection/SparseArrayCompat;->keyAt(I)I\nPLandroidx/collection/SparseArrayCompat;->put(ILjava/lang/Object;)V\nPLandroidx/collection/SparseArrayCompat;->size()I\nPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;-><clinit>()V\nPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->checkNotZero(ILjava/lang/String;)V\nPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->equals(II)Z\nPLandroidx/compose/animation/core/AnimationEndReason$EnumUnboxingSharedUtility;->values(I)[I\nPLandroidx/compose/animation/core/CubicBezierEasing;-><init>(FFFF)V\nPLandroidx/compose/material/DrawerKt$Scrim$dismissDrawer$2$1$1;-><init>(Lkotlin/jvm/functions/Function0;I)V\nPLandroidx/compose/material/DrawerKt$Scrim$dismissDrawer$2$1$1;->invoke()Landroidx/lifecycle/ViewModelStore;\nPLandroidx/compose/material/DrawerKt$Scrim$dismissDrawer$2$1$1;->invoke()Ljava/lang/Object;\nPLandroidx/compose/material/FabPlacement;-><init>()V\nPLandroidx/compose/material/FabPlacement;-><init>(II)V\nPLandroidx/compose/material/FabPlacement;-><init>(ILorg/threeten/bp/DayOfWeek;Landroidx/room/Room;)V\nPLandroidx/compose/material/FabPlacement;->adjustInto(Lorg/threeten/bp/temporal/Temporal;)Lorg/threeten/bp/temporal/Temporal;\nPLandroidx/compose/material/FabPlacement;->onStopNestedScroll(I)V\nPLandroidx/compose/material/ScaffoldKt$Scaffold$1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/compose/material/Strings$Companion;-><init>(I)V\nPLandroidx/compose/material/Strings$Companion;->getEdgePath(FFFLcom/google/android/material/shape/ShapePath;)V\nPLandroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;-><init>(Lkotlinx/coroutines/flow/FlowCollector;I)V\nPLandroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;->emit(Lcom/google/samples/apps/iosched/shared/result/Result;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/compose/material/SwipeableState$special$$inlined$filter$1;-><init>(Lkotlinx/coroutines/flow/Flow;I)V\nPLandroidx/compose/material/SwipeableState$special$$inlined$filter$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/compose/material/ripple/StateLayer;-><init>(Lcom/google/android/gms/measurement/internal/zzfe;Ljava/lang/String;I)V\nPLandroidx/compose/material/ripple/StateLayer;->zza()Ljava/lang/String;\nPLandroidx/compose/material/ripple/StateLayer;->zza(Ljava/lang/String;)V\nPLandroidx/compose/runtime/ComposerImpl$doCompose$2$5;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLandroidx/compose/runtime/ComposerImpl$doCompose$2$5;->invoke()Ljava/lang/Object;\nPLandroidx/compose/runtime/ComposerKt$startRootGroup$1;-><clinit>()V\nPLandroidx/compose/runtime/ComposerKt$startRootGroup$1;-><init>(I)V\nPLandroidx/compose/runtime/ComposerKt$startRootGroup$1;->invoke(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;Lcom/google/samples/apps/iosched/util/ViewPaddingState;)V\nPLandroidx/compose/runtime/ComposerKt$startRootGroup$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/compose/runtime/DisposableEffectScope;-><init>()V\nPLandroidx/compose/runtime/Latch$await$2$2;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLandroidx/compose/runtime/Latch$await$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/compose/runtime/Latch;-><init>(I)V\nPLandroidx/compose/runtime/Latch;-><init>(Lcom/bumptech/glide/disklrucache/DiskLruCache;Lcom/bumptech/glide/disklrucache/DiskLruCache$Entry;)V\nPLandroidx/compose/runtime/Latch;-><init>(Lcom/bumptech/glide/disklrucache/DiskLruCache;Lcom/bumptech/glide/disklrucache/DiskLruCache$Entry;Lcom/google/firebase/iid/zzy;)V\nPLandroidx/compose/runtime/Latch;->getTablesToSync()[I\nPLandroidx/compose/runtime/OpaqueKey;-><init>(Ljava/lang/String;)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;-><init>(I)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;-><init>(Landroidx/core/util/Pools$Pool;)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;-><init>(Landroidx/room/RoomDatabase;)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;-><init>(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;-><init>(Lcom/google/firebase/FirebaseApp;)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;-><init>(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;-><init>(Ljava/util/Map;I)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;->get(Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable;)Ljava/lang/Object;\nPLandroidx/compose/runtime/SnapshotThreadLocal;->get(Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/internal/ObjectConstructor;\nPLandroidx/compose/runtime/SnapshotThreadLocal;->getModelLoadersForClass(Ljava/lang/Class;)Ljava/util/List;\nPLandroidx/compose/runtime/SnapshotThreadLocal;->makeHead(Lcom/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap$LinkedEntry;)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;->newDefaultConstructor(Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor;\nPLandroidx/compose/runtime/SnapshotThreadLocal;->newDefaultImplementationConstructor(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor;\nPLandroidx/compose/runtime/SnapshotThreadLocal;->positionForDay(Lcom/google/samples/apps/iosched/model/ConferenceDay;)I\nPLandroidx/compose/runtime/SnapshotThreadLocal;->put(Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable;Ljava/lang/Object;)V\nPLandroidx/compose/runtime/SnapshotThreadLocal;->then(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object;\nPLandroidx/compose/runtime/Stack;-><init>(J)V\nPLandroidx/compose/runtime/Stack;-><init>(Lcom/google/android/gms/internal/measurement/zzel$zza;)V\nPLandroidx/compose/runtime/Stack;-><init>(Ljava/lang/Object;I)V\nPLandroidx/compose/runtime/Stack;->build(Landroid/net/Uri;)Lcom/bumptech/glide/load/data/DataFetcher;\nPLandroidx/compose/runtime/Stack;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLandroidx/compose/runtime/Stack;->create()Ljava/lang/Object;\nPLandroidx/compose/runtime/Stack;->getUInt16()I\nPLandroidx/compose/runtime/Stack;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/compose/runtime/Stack;->zza(IJ)V\nPLandroidx/compose/runtime/Stack;->zzc(II)V\nPLandroidx/compose/runtime/internal/ThreadMap;-><init>(I[J[Ljava/lang/Object;)V\nPLandroidx/compose/ui/BiasAlignment$Horizontal;-><init>(F)V\nPLandroidx/compose/ui/BiasAlignment$Vertical;-><init>(F)V\nPLandroidx/compose/ui/BiasAlignment;-><init>(FF)V\nPLandroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;-><init>()V\nPLandroidx/compose/ui/graphics/colorspace/WhitePoint;-><init>(FF)V\nPLandroidx/compose/ui/layout/SubcomposeLayoutState$subcompose$2;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLandroidx/compose/ui/layout/SubcomposeLayoutState$subcompose$2;->invoke()Ljava/lang/Object;\nPLandroidx/compose/ui/unit/DensityImpl;-><init>(FF)V\nPLandroidx/constraintlayout/solver/PriorityGoalRow$GoalVariableAccessor;-><init>(Landroidx/constraintlayout/solver/PriorityGoalRow;Landroidx/constraintlayout/solver/PriorityGoalRow;)V\nPLandroidx/constraintlayout/solver/widgets/Barrier;-><init>()V\nPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;-><clinit>()V\nPLandroidx/constraintlayout/solver/widgets/ConstraintAnchor$Type;-><init>(Ljava/lang/String;I)V\nPLandroidx/constraintlayout/solver/widgets/ConstraintWidget;->getBottom()I\nPLandroidx/constraintlayout/solver/widgets/HelperWidget;-><init>()V\nPLandroidx/constraintlayout/solver/widgets/analyzer/BasicMeasure$Measure;-><init>()V\nPLandroidx/constraintlayout/solver/widgets/analyzer/HorizontalWidgetRun;-><clinit>()V\nPLandroidx/constraintlayout/widget/Barrier;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/constraintlayout/widget/Barrier;->setType(I)V\nPLandroidx/constraintlayout/widget/ConstraintLayout$LayoutParams$Table;-><clinit>()V\nPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;-><init>(Landroidx/constraintlayout/widget/ConstraintLayout;Landroidx/constraintlayout/widget/ConstraintLayout;)V\nPLandroidx/constraintlayout/widget/ConstraintLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V\nPLandroidx/constraintlayout/widget/ConstraintLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z\nPLandroidx/constraintlayout/widget/Guideline;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;-><init>()V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->blocksInteractionBelow(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->getScrimOpacity(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)F\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->layoutDependsOn(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onAttachedToLayoutParams(Landroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onMeasureChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;IIII)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onSaveInstanceState(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Landroid/os/Parcelable;\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;I)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;-><init>(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$HierarchyChangeListener;->onChildViewAdded(Landroid/view/View;Landroid/view/View;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->setBehavior(Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$LayoutParams;->setNestedScrollAccepted(IZ)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;-><clinit>()V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;-><init>(Landroid/os/Parcelable;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->writeToParcel(Landroid/os/Parcel;I)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;-><clinit>()V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->drawableStateChanged()V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->isPointInChildBounds(Landroid/view/View;II)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onAttachedToWindow()V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onDetachedFromWindow()V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onDraw(Landroid/graphics/Canvas;)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onSaveInstanceState()Landroid/os/Parcelable;\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;II)Z\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->requestDisallowInterceptTouchEvent(Z)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->resetTouchBehaviors(Z)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->setVisibility(I)V\nPLandroidx/coordinatorlayout/widget/CoordinatorLayout;->setupForInsets()V\nPLandroidx/coordinatorlayout/widget/ViewGroupUtils;-><clinit>()V\nPLandroidx/core/R$dimen;-><clinit>()V\nPLandroidx/core/R$dimen;-><init>()V\nPLandroidx/core/R$dimen;->binarySearch([JIJ)I\nPLandroidx/core/R$dimen;->buildSingleThreadExecutorService(Ljava/lang/String;)Ljava/util/concurrent/ExecutorService;\nPLandroidx/core/R$dimen;->checkArgument(Z)V\nPLandroidx/core/R$dimen;->checkEntryNotNull(Ljava/lang/Object;Ljava/lang/Object;)V\nPLandroidx/core/R$dimen;->checkNonnegative(ILjava/lang/String;)I\nPLandroidx/core/R$dimen;->getControlPoint([Ljava/lang/String;I)F\nPLandroidx/core/R$dimen;->getFont(Landroid/content/Context;I)Landroid/graphics/Typeface;\nPLandroidx/core/R$dimen;->idealByteArraySize(I)I\nPLandroidx/core/R$dimen;->idealIntArraySize(I)I\nPLandroidx/core/R$dimen;->idealLongArraySize(I)I\nPLandroidx/core/R$dimen;->isEasingType(Ljava/lang/String;Ljava/lang/String;)Z\nPLandroidx/core/R$dimen;->isInstantApp(Landroid/content/Context;)Z\nPLandroidx/core/R$dimen;->resolveThemeDuration(Landroid/content/Context;II)I\nPLandroidx/core/R$dimen;->resolveThemeInterpolator(Landroid/content/Context;ILandroid/animation/TimeInterpolator;)Landroid/animation/TimeInterpolator;\nPLandroidx/core/R$dimen;->setTooltipText(Landroid/view/View;Ljava/lang/CharSequence;)V\nPLandroidx/core/R$dimen;->zza(Ljava/lang/String;)Ljava/util/concurrent/Executor;\nPLandroidx/core/R$id;-><clinit>()V\nPLandroidx/core/R$id;->CoroutineScope(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/CoroutineScope;\nPLandroidx/core/R$id;->checkAttribute(Landroid/content/res/TypedArray;I)V\nPLandroidx/core/R$id;->close$default(Lkotlinx/coroutines/channels/SendChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z\nPLandroidx/core/R$id;->createBundle(Landroid/os/Parcel;I)Landroid/os/Bundle;\nPLandroidx/core/R$id;->createParcelable(Landroid/os/Parcel;ILandroid/os/Parcelable$Creator;)Landroid/os/Parcelable;\nPLandroidx/core/R$id;->createString(Landroid/os/Parcel;I)Ljava/lang/String;\nPLandroidx/core/R$id;->createViewModelLazy(Landroidx/fragment/app/Fragment;Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;\nPLandroidx/core/R$id;->disposeOnCancellation(Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/DisposableHandle;)V\nPLandroidx/core/R$id;->doOnApplyWindowInsets(Landroid/view/View;Lkotlin/jvm/functions/Function3;)V\nPLandroidx/core/R$id;->ensureAtEnd(Landroid/os/Parcel;I)V\nPLandroidx/core/R$id;->findNavController(Landroid/view/View;)Landroidx/navigation/NavHostController;\nPLandroidx/core/R$id;->getActivityFactory(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory;\nPLandroidx/core/R$id;->getFragmentFactory(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory;\nPLandroidx/core/R$id;->launchSharing$FlowKt__ShareKt(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/Job;\nPLandroidx/core/R$id;->lerp(FFF)F\nPLandroidx/core/R$id;->nextOrSame(Lorg/threeten/bp/DayOfWeek;)Lorg/threeten/bp/temporal/TemporalAdjuster;\nPLandroidx/core/R$id;->readInt(Landroid/os/Parcel;I)I\nPLandroidx/core/R$id;->readLong(Landroid/os/Parcel;I)J\nPLandroidx/core/R$id;->readSize(Landroid/os/Parcel;I)I\nPLandroidx/core/R$id;->requestApplyInsetsWhenAttached(Landroid/view/View;)V\nPLandroidx/core/R$id;->setOf(Ljava/lang/Object;)Ljava/util/Set;\nPLandroidx/core/R$id;->setViewNavController(Landroid/view/View;Landroidx/navigation/NavHostController;)V\nPLandroidx/core/R$id;->updateForTheme(Landroidx/appcompat/app/AppCompatActivity;Lcom/google/samples/apps/iosched/model/Theme;)V\nPLandroidx/core/R$id;->validateObjectHeader(Landroid/os/Parcel;)I\nPLandroidx/core/R$id;->zza(Landroid/os/Parcel;II)V\nPLandroidx/core/app/ActivityCompat;-><clinit>()V\nPLandroidx/core/app/ActivityCompat;->checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I\nPLandroidx/core/app/ComponentActivity;-><init>()V\nPLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V\nPLandroidx/core/app/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V\nPLandroidx/core/app/CoreComponentFactory;-><init>()V\nPLandroidx/core/app/CoreComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;\nPLandroidx/core/app/CoreComponentFactory;->instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application;\nPLandroidx/core/app/CoreComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider;\nPLandroidx/core/app/CoreComponentFactory;->instantiateService(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Service;\nPLandroidx/core/content/res/FontResourcesParserCompat$ProviderResourceEntry;-><init>(Landroidx/core/provider/FontRequest;IILjava/lang/String;)V\nPLandroidx/core/graphics/ColorUtils;-><clinit>()V\nPLandroidx/core/graphics/ColorUtils;->setAlphaComponent(II)I\nPLandroidx/core/graphics/Insets;-><clinit>()V\nPLandroidx/core/graphics/Insets;->toPlatformInsets()Landroid/graphics/Insets;\nPLandroidx/core/graphics/TypefaceCompat;-><clinit>()V\nPLandroidx/core/graphics/TypefaceCompatApi29Impl;-><init>()V\nPLandroidx/core/graphics/TypefaceCompatBaseImpl$1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/core/graphics/TypefaceCompatBaseImpl$1;->construct()Ljava/lang/Object;\nPLandroidx/core/os/CancellationSignal;-><init>()V\nPLandroidx/core/os/CancellationSignal;->setOnCancelListener(Landroidx/core/os/CancellationSignal$OnCancelListener;)V\nPLandroidx/core/os/TraceCompat;-><clinit>()V\nPLandroidx/core/provider/FontRequest;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V\nPLandroidx/core/provider/FontRequest;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V\nPLandroidx/core/provider/FontRequestWorker$1;-><init>(Ljava/lang/String;Landroid/content/Context;Landroidx/core/provider/FontRequest;II)V\nPLandroidx/core/provider/FontRequestWorker$1;->call()Landroidx/core/provider/FontRequestWorker$TypefaceResult;\nPLandroidx/core/provider/FontRequestWorker$1;->call()Ljava/lang/Object;\nPLandroidx/core/provider/FontRequestWorker$2;-><init>(Ljava/lang/Object;I)V\nPLandroidx/core/provider/FontRequestWorker$2;->accept(Ljava/lang/Object;)V\nPLandroidx/core/provider/FontRequestWorker$TypefaceResult;-><init>(I)V\nPLandroidx/core/provider/FontRequestWorker;-><clinit>()V\nPLandroidx/core/provider/FontRequestWorker;->getFontSync(Ljava/lang/String;Landroid/content/Context;Landroidx/core/provider/FontRequest;I)Landroidx/core/provider/FontRequestWorker$TypefaceResult;\nPLandroidx/core/provider/RequestExecutor$DefaultThreadFactory$ProcessPriorityThread;-><init>(Ljava/lang/Runnable;Ljava/lang/String;I)V\nPLandroidx/core/provider/RequestExecutor$DefaultThreadFactory$ProcessPriorityThread;->run()V\nPLandroidx/core/provider/RequestExecutor$DefaultThreadFactory;-><init>(Ljava/lang/String;I)V\nPLandroidx/core/provider/RequestExecutor$DefaultThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;\nPLandroidx/core/util/Pools$SynchronizedPool;-><init>(I)V\nPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEvent(Landroid/view/View;I)V\nPLandroidx/core/view/AccessibilityDelegateCompat;-><clinit>()V\nPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V\nPLandroidx/core/view/AccessibilityDelegateCompat;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z\nPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEvent(Landroid/view/View;I)V\nPLandroidx/core/view/NestedScrollingChildHelper;-><init>(Landroid/view/View;)V\nPLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedFling(FFZ)Z\nPLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedPreFling(FF)Z\nPLandroidx/core/view/NestedScrollingChildHelper;->dispatchNestedScroll(IIII[I)Z\nPLandroidx/core/view/NestedScrollingChildHelper;->startNestedScroll(II)Z\nPLandroidx/core/view/PointerIconCompat;-><init>(Ljava/lang/Object;I)V\nPLandroidx/core/view/PointerIconCompat;->cleanup()V\nPLandroidx/core/view/PointerIconCompat;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLandroidx/core/view/PointerIconCompat;->rewindAndGet()Ljava/lang/Object;\nPLandroidx/core/view/ViewCompat$1;-><init>()V\nPLandroidx/core/view/ViewCompat$Api21Impl$1;-><init>(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V\nPLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\nPLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V\nPLandroidx/core/view/ViewCompat;-><clinit>()V\nPLandroidx/core/view/ViewCompat;->dispatchApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/core/view/ViewCompat;->getActionList(Landroid/view/View;)Ljava/util/List;\nPLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/core/view/ViewCompat;->removeActionWithId(ILandroid/view/View;)V\nPLandroidx/core/view/ViewConfigurationCompat;-><clinit>()V\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;-><init>()V\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;-><init>(Landroidx/core/view/WindowInsetsCompat;)V\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;-><init>()V\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;-><init>(Landroidx/core/view/WindowInsetsCompat;)V\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->setInsets(ILandroidx/core/graphics/Insets;)V\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;-><init>()V\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;-><init>(Landroidx/core/view/WindowInsetsCompat;)V\nPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V\nPLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V\nPLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V\nPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/core/view/WindowInsetsCompat$Impl21;->isConsumed()Z\nPLandroidx/core/view/WindowInsetsCompat$Impl28;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V\nPLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/core/view/WindowInsetsCompat$Impl28;->equals(Ljava/lang/Object;)Z\nPLandroidx/core/view/WindowInsetsCompat$Impl30;-><clinit>()V\nPLandroidx/core/view/WindowInsetsCompat$Impl30;-><init>(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V\nPLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V\nPLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsets(I)Landroidx/core/graphics/Insets;\nPLandroidx/core/view/WindowInsetsCompat$Impl30;->isVisible(I)Z\nPLandroidx/core/view/WindowInsetsCompat$Impl;-><clinit>()V\nPLandroidx/core/view/WindowInsetsCompat$TypeImpl30;->toPlatformType(I)I\nPLandroidx/core/view/WindowInsetsCompat;-><clinit>()V\nPLandroidx/core/view/WindowInsetsCompat;-><init>(Landroidx/core/view/WindowInsetsCompat;)V\nPLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/core/view/WindowInsetsCompat;->equals(Ljava/lang/Object;)Z\nPLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets;\nPLandroidx/core/view/WindowInsetsCompat;->isConsumed()Z\nPLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets;\nPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;-><clinit>()V\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;-><init>(ILjava/lang/CharSequence;)V\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;-><init>(ILjava/lang/CharSequence;Ljava/lang/Class;)V\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;-><init>(Ljava/lang/Object;ILjava/lang/CharSequence;Landroidx/core/view/accessibility/AccessibilityViewCommand;Ljava/lang/Class;)V\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->getId()I\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;-><init>(Ljava/lang/Object;)V\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;->obtain(IIZI)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionInfoCompat;\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;-><init>(Ljava/lang/Object;)V\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getActions()I\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getClassName()Ljava/lang/CharSequence;\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getContentDescription()Ljava/lang/CharSequence;\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isEnabled()Z\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocusable()Z\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocused()Z\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Ljava/lang/Object;)V\nPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;)V\nPLandroidx/core/widget/AutoSizeableTextView;-><clinit>()V\nPLandroidx/customview/view/AbsSavedState$1;-><init>()V\nPLandroidx/customview/view/AbsSavedState$2;-><init>(I)V\nPLandroidx/customview/view/AbsSavedState;-><clinit>()V\nPLandroidx/customview/view/AbsSavedState;-><init>(Landroid/os/Parcelable;)V\nPLandroidx/customview/view/AbsSavedState;-><init>(Landroidx/customview/view/AbsSavedState$1;)V\nPLandroidx/customview/widget/ViewDragHelper;-><clinit>()V\nPLandroidx/customview/widget/ViewDragHelper;-><init>(Landroid/content/Context;Landroid/view/ViewGroup;Lkotlin/TuplesKt;)V\nPLandroidx/customview/widget/ViewDragHelper;->cancel()V\nPLandroidx/customview/widget/ViewDragHelper;->checkNewEdgeDrag(FFII)Z\nPLandroidx/customview/widget/ViewDragHelper;->checkTouchSlop(Landroid/view/View;FF)Z\nPLandroidx/customview/widget/ViewDragHelper;->continueSettling(Z)Z\nPLandroidx/customview/widget/ViewDragHelper;->create(Landroid/view/ViewGroup;FLkotlin/TuplesKt;)Landroidx/customview/widget/ViewDragHelper;\nPLandroidx/customview/widget/ViewDragHelper;->findTopChildUnder(II)Landroid/view/View;\nPLandroidx/customview/widget/ViewDragHelper;->isValidPointerForActionMove(I)Z\nPLandroidx/customview/widget/ViewDragHelper;->isViewUnder(Landroid/view/View;II)Z\nPLandroidx/customview/widget/ViewDragHelper;->reportNewEdgeDrags(FFI)V\nPLandroidx/customview/widget/ViewDragHelper;->saveInitialMotion(FFI)V\nPLandroidx/customview/widget/ViewDragHelper;->saveLastMotion(Landroid/view/MotionEvent;)V\nPLandroidx/databinding/BaseObservable;-><init>()V\nPLandroidx/databinding/DataBinderMapper;-><init>()V\nPLandroidx/databinding/DataBinderMapperImpl;-><init>()V\nPLandroidx/databinding/DataBindingUtil;-><clinit>()V\nPLandroidx/databinding/DataBindingUtil;->bind(Landroidx/databinding/DataBindingComponent;Landroid/view/View;I)Landroidx/databinding/ViewDataBinding;\nPLandroidx/databinding/DataBindingUtil;->inflate(Landroid/view/LayoutInflater;ILandroid/view/ViewGroup;ZLandroidx/databinding/DataBindingComponent;)Landroidx/databinding/ViewDataBinding;\nPLandroidx/databinding/MergedDataBinderMapper;-><init>()V\nPLandroidx/databinding/MergedDataBinderMapper;->addMapper(Landroidx/databinding/DataBinderMapper;)V\nPLandroidx/databinding/ViewDataBinding$1;-><clinit>()V\nPLandroidx/databinding/ViewDataBinding$1;-><init>(I)V\nPLandroidx/databinding/ViewDataBinding$6;-><init>(I)V\nPLandroidx/databinding/ViewDataBinding$6;->onViewDetachedFromWindow(Landroid/view/View;)V\nPLandroidx/databinding/ViewDataBinding$7;-><init>(Landroidx/databinding/ViewDataBinding;)V\nPLandroidx/databinding/ViewDataBinding$8;-><init>(Landroidx/databinding/ViewDataBinding;)V\nPLandroidx/databinding/ViewDataBinding$OnStartListener;-><init>(Landroidx/databinding/ViewDataBinding;Landroidx/databinding/ViewDataBinding$1;)V\nPLandroidx/databinding/ViewDataBinding$OnStartListener;->onStart()V\nPLandroidx/databinding/ViewDataBinding;-><clinit>()V\nPLandroidx/databinding/ViewDataBinding;->checkAndCastToBindingComponent(Ljava/lang/Object;)Landroidx/databinding/DataBindingComponent;\nPLandroidx/databinding/ViewDataBinding;->inflateInternal(Landroid/view/LayoutInflater;ILandroid/view/ViewGroup;ZLjava/lang/Object;)Landroidx/databinding/ViewDataBinding;\nPLandroidx/databinding/ViewDataBinding;->mapBindings(Landroidx/databinding/DataBindingComponent;Landroid/view/View;ILcom/google/firebase/iid/zzk;Landroid/util/SparseIntArray;)[Ljava/lang/Object;\nPLandroidx/databinding/ViewDataBinding;->parseTagInt(Ljava/lang/String;I)I\nPLandroidx/databinding/ViewDataBinding;->updateRegistration(ILjava/lang/Object;Landroidx/databinding/CreateWeakListener;)Z\nPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1$invokeSuspend$$inlined$collect$1;-><init>(Landroidx/databinding/ViewDataBindingKtx$StateFlowListener$startCollection$1;)V\nPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener;-><init>(Landroidx/databinding/ViewDataBinding;ILjava/lang/ref/ReferenceQueue;)V\nPLandroidx/databinding/ViewDataBindingKtx$StateFlowListener;->addListener(Ljava/lang/Object;)V\nPLandroidx/databinding/ViewDataBindingKtx;-><clinit>()V\nPLandroidx/databinding/ViewDataBindingKtx;->updateStateFlowRegistration(Landroidx/databinding/ViewDataBinding;ILkotlinx/coroutines/flow/Flow;)Z\nPLandroidx/databinding/ViewStubProxy;-><init>()V\nPLandroidx/databinding/ViewStubProxy;-><init>(Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/EngineJobListener;)V\nPLandroidx/databinding/ViewStubProxy;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nPLandroidx/databinding/ViewStubProxy;->build(Lcom/bumptech/glide/load/Key;ZZZZ)Lcom/bumptech/glide/load/engine/EngineJob;\nPLandroidx/databinding/WeakListener;-><init>(Landroidx/databinding/ViewDataBinding;ILandroidx/databinding/ObservableReference;Ljava/lang/ref/ReferenceQueue;)V\nPLandroidx/databinding/WeakListener;->getBinder()Landroidx/databinding/ViewDataBinding;\nPLandroidx/databinding/WeakListener;->unregister()Z\nPLandroidx/databinding/library/baseAdapters/DataBinderMapperImpl;-><clinit>()V\nPLandroidx/databinding/library/baseAdapters/DataBinderMapperImpl;-><init>()V\nPLandroidx/databinding/library/baseAdapters/DataBinderMapperImpl;->collectDependencies()Ljava/util/List;\nPLandroidx/datastore/core/Data;-><init>(Ljava/lang/Object;I)V\nPLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;-><init>(Ljava/util/List;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$1;-><init>(Lcom/bumptech/glide/load/Option$1;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;-><init>(Ljava/util/List;Ljava/util/List;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/SimpleActor$1;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLandroidx/datastore/core/SimpleActor$offer$1;-><init>(Lcom/google/firebase/iid/zzaw;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SimpleActor$offer$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLandroidx/datastore/core/SimpleActor$offer$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore$Message$Read;-><init>(Landroidx/datastore/core/State;)V\nPLandroidx/datastore/core/SingleProcessDataStore$Message;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLandroidx/datastore/core/SingleProcessDataStore$actor$3;-><init>(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$actor$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore$actor$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore$data$1$1;-><init>(Landroidx/datastore/core/State;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2$1;-><init>(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$data$1;-><init>(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$data$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore$handleRead$1;-><init>(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$readAndInit$1;-><init>(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1$updateData$1;-><init>(Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;-><init>(Landroidx/datastore/core/SingleProcessDataStore;Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/jvm/internal/Ref$ObjectRef;)V\nPLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;->updateData(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore$readAndInitOrPropagateFailure$1;-><init>(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$readData$1;-><init>(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore$readDataOrHandleCorruption$1;-><init>(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/core/SingleProcessDataStore;-><clinit>()V\nPLandroidx/datastore/core/SingleProcessDataStore;-><init>(Lkotlin/jvm/functions/Function0;Landroidx/datastore/core/Serializer;Ljava/util/List;Landroidx/datastore/core/CorruptionHandler;Lkotlinx/coroutines/CoroutineScope;)V\nPLandroidx/datastore/core/SingleProcessDataStore;->getData()Lkotlinx/coroutines/flow/Flow;\nPLandroidx/datastore/core/SingleProcessDataStore;->getFile()Ljava/io/File;\nPLandroidx/datastore/core/SingleProcessDataStore;->handleRead(Landroidx/datastore/core/SingleProcessDataStore$Message$Read;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore;->readAndInit(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore;->readAndInitOrPropagateFailure(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore;->readData(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/datastore/core/SingleProcessDataStore;->readDataOrHandleCorruption(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/datastore/core/State;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLandroidx/datastore/core/UnInitialized;-><clinit>()V\nPLandroidx/datastore/core/UnInitialized;-><init>()V\nPLandroidx/datastore/migrations/SharedPreferencesMigration$shouldMigrate$1;-><init>(Landroidx/datastore/migrations/SharedPreferencesMigration;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/migrations/SharedPreferencesMigration;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/util/Set;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V\nPLandroidx/datastore/migrations/SharedPreferencesMigration;->getKeySet()Ljava/util/Set;\nPLandroidx/datastore/migrations/SharedPreferencesMigration;->getSharedPrefs()Landroid/content/SharedPreferences;\nPLandroidx/datastore/migrations/SharedPreferencesMigration;->shouldMigrate(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/datastore/migrations/SharedPreferencesMigrationKt;-><clinit>()V\nPLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;-><init>(Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/CoroutineScope;)V\nPLandroidx/datastore/preferences/PreferencesMapCompat;-><clinit>()V\nPLandroidx/datastore/preferences/PreferencesProto$PreferenceMap$PreferencesDefaultEntryHolder;-><clinit>()V\nPLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;-><clinit>()V\nPLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;-><init>()V\nPLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->dynamicMethod(Landroidx/datastore/preferences/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->getPreferencesMap()Ljava/util/Map;\nPLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->parseFrom(Ljava/io/InputStream;)Landroidx/datastore/preferences/PreferencesProto$PreferenceMap;\nPLandroidx/datastore/preferences/PreferencesProto$Value;-><clinit>()V\nPLandroidx/datastore/preferences/PreferencesProto$Value;-><init>()V\nPLandroidx/datastore/preferences/PreferencesProto$Value;->dynamicMethod(Landroidx/datastore/preferences/protobuf/GeneratedMessageLite$MethodToInvoke;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/PreferencesProto$Value;->getBoolean()Z\nPLandroidx/datastore/preferences/PreferencesProto$Value;->getDefaultInstance()Landroidx/datastore/preferences/PreferencesProto$Value;\nPLandroidx/datastore/preferences/PreferencesProto$Value;->getValueCase$enumunboxing$()I\nPLandroidx/datastore/preferences/SharedPreferencesMigrationKt$getMigrationFunction$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/preferences/SharedPreferencesMigrationKt$getShouldRunMigration$1;-><init>(Ljava/util/Set;Lkotlin/coroutines/Continuation;)V\nPLandroidx/datastore/preferences/SharedPreferencesMigrationKt$getShouldRunMigration$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/SharedPreferencesMigrationKt$getShouldRunMigration$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/SharedPreferencesMigrationKt;-><clinit>()V\nPLandroidx/datastore/preferences/core/MutablePreferences;-><init>(Ljava/util/Map;Z)V\nPLandroidx/datastore/preferences/core/MutablePreferences;->asMap()Ljava/util/Map;\nPLandroidx/datastore/preferences/core/MutablePreferences;->checkNotFrozen$datastore_preferences_core()V\nPLandroidx/datastore/preferences/core/MutablePreferences;->equals(Ljava/lang/Object;)Z\nPLandroidx/datastore/preferences/core/MutablePreferences;->get(Landroidx/datastore/preferences/core/Preferences$Key;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/core/MutablePreferences;->hashCode()I\nPLandroidx/datastore/preferences/core/MutablePreferences;->set(Landroidx/datastore/preferences/core/Preferences$Key;Ljava/lang/Object;)V\nPLandroidx/datastore/preferences/core/MutablePreferences;->setUnchecked$datastore_preferences_core(Landroidx/datastore/preferences/core/Preferences$Key;Ljava/lang/Object;)V\nPLandroidx/datastore/preferences/core/PreferenceDataStore;-><init>(Landroidx/datastore/core/DataStore;)V\nPLandroidx/datastore/preferences/core/PreferenceDataStore;->getData()Lkotlinx/coroutines/flow/Flow;\nPLandroidx/datastore/preferences/core/Preferences$Key;-><init>(Ljava/lang/String;)V\nPLandroidx/datastore/preferences/core/Preferences$Key;->equals(Ljava/lang/Object;)Z\nPLandroidx/datastore/preferences/core/Preferences$Key;->hashCode()I\nPLandroidx/datastore/preferences/protobuf/AbstractMessageLite;-><init>()V\nPLandroidx/datastore/preferences/protobuf/Android;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/Android;->isOnAndroidDevice()Z\nPLandroidx/datastore/preferences/protobuf/ByteString$LeafByteString;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/ByteString$LeafByteString;-><init>()V\nPLandroidx/datastore/preferences/protobuf/ByteString$LiteralByteString;-><init>([B)V\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;-><init>([BIIZLandroidx/datastore/preferences/protobuf/OneofInfo;)V\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->getTotalBytesRead()I\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->pushLimit(I)I\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->recomputeBufferSizeAfterLimit()V\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;-><init>(Ljava/io/InputStream;ILandroidx/datastore/preferences/protobuf/OneofInfo;)V\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->checkLastTagWas(I)V\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->isAtEnd()Z\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->popLimit(I)V\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->pushLimit(I)I\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readBool()Z\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readRawVarint32()I\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readRawVarint64()J\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readStringRequireUtf8()Ljava/lang/String;\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readTag()I\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->readUInt32()I\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->recomputeBufferSizeAfterLimit()V\nPLandroidx/datastore/preferences/protobuf/CodedInputStream$StreamDecoder;->tryRefillBuffer(I)Z\nPLandroidx/datastore/preferences/protobuf/CodedInputStream;-><init>(Landroidx/datastore/preferences/protobuf/OneofInfo;)V\nPLandroidx/datastore/preferences/protobuf/CodedInputStream;->newInstance([B)Landroidx/datastore/preferences/protobuf/CodedInputStream;\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;-><init>(Landroidx/datastore/preferences/protobuf/CodedInputStream;)V\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->getFieldNumber()I\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readBool()Z\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readField(Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Ljava/lang/Class;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readMap(Ljava/util/Map;Lcom/google/firebase/iid/zzaw;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)V\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readMessage(Landroidx/datastore/preferences/protobuf/Schema;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readMessage(Ljava/lang/Class;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->readStringRequireUtf8()Ljava/lang/String;\nPLandroidx/datastore/preferences/protobuf/CodedInputStreamReader;->requireWireType(I)V\nPLandroidx/datastore/preferences/protobuf/ExtensionRegistryFactory;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/ExtensionRegistryLite;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/ExtensionRegistryLite;-><init>()V\nPLandroidx/datastore/preferences/protobuf/ExtensionRegistryLite;->getEmptyRegistry()Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;\nPLandroidx/datastore/preferences/protobuf/ExtensionSchemaLite;-><init>()V\nPLandroidx/datastore/preferences/protobuf/ExtensionSchemas;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageInfoFactory;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageInfoFactory;-><init>()V\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageInfoFactory;->isSupported(Ljava/lang/Class;)Z\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/MessageInfo;\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageLite$MethodToInvoke;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageLite$MethodToInvoke;-><init>(Ljava/lang/String;I)V\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;-><init>()V\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->getDefaultInstance(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/GeneratedMessageLite;\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->isInitialized()Z\nPLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->registerDefaultInstance(Ljava/lang/Class;Landroidx/datastore/preferences/protobuf/GeneratedMessageLite;)V\nPLandroidx/datastore/preferences/protobuf/Internal;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/ListFieldSchema$ListFieldSchemaFull;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/ListFieldSchema$ListFieldSchemaFull;-><init>(Landroidx/datastore/preferences/protobuf/OneofInfo;)V\nPLandroidx/datastore/preferences/protobuf/ListFieldSchema$ListFieldSchemaLite;-><init>(Landroidx/datastore/preferences/protobuf/OneofInfo;)V\nPLandroidx/datastore/preferences/protobuf/ListFieldSchema;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/ListFieldSchema;-><init>(Landroidx/datastore/preferences/protobuf/OneofInfo;)V\nPLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$1;-><init>()V\nPLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;-><init>([Landroidx/datastore/preferences/protobuf/MessageInfoFactory;)V\nPLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/MessageInfo;\nPLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;-><init>()V\nPLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;->isProto2(Landroidx/datastore/preferences/protobuf/MessageInfo;)Z\nPLandroidx/datastore/preferences/protobuf/MapEntryLite;-><init>(Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Ljava/lang/Object;Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Ljava/lang/Object;)V\nPLandroidx/datastore/preferences/protobuf/MapFieldLite;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/MapFieldLite;-><init>()V\nPLandroidx/datastore/preferences/protobuf/MapFieldLite;->ensureMutable()V\nPLandroidx/datastore/preferences/protobuf/MapFieldLite;->entrySet()Ljava/util/Set;\nPLandroidx/datastore/preferences/protobuf/MapFieldLite;->mutableCopy()Landroidx/datastore/preferences/protobuf/MapFieldLite;\nPLandroidx/datastore/preferences/protobuf/MapFieldLite;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/MapFieldSchemaLite;-><init>()V\nPLandroidx/datastore/preferences/protobuf/MapFieldSchemaLite;->mergeFrom(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/MapFieldSchemas;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/MessageSchema;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/MessageSchema;-><init>([I[Ljava/lang/Object;IILandroidx/datastore/preferences/protobuf/AbstractMessageLite;ZZ[IIILandroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;Landroidx/datastore/preferences/protobuf/ListFieldSchema;Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;Landroidx/datastore/preferences/protobuf/ExtensionSchemaLite;Landroidx/datastore/preferences/protobuf/MapFieldSchemaLite;)V\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->filterMapUnknownEnumValues(Ljava/lang/Object;ILjava/lang/Object;Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;)Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->getMapFieldDefaultEntry(I)Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->makeImmutable(Ljava/lang/Object;)V\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->mergeFrom(Ljava/lang/Object;Landroidx/datastore/preferences/protobuf/Reader;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;)V\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->mergeMap(Ljava/lang/Object;ILjava/lang/Object;Landroidx/datastore/preferences/protobuf/ExtensionRegistryLite;Landroidx/datastore/preferences/protobuf/Reader;)V\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->newInstance()Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->newSchema(Landroidx/datastore/preferences/protobuf/MessageInfo;Landroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;Landroidx/datastore/preferences/protobuf/ListFieldSchema;Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;Landroidx/datastore/preferences/protobuf/ExtensionSchemaLite;Landroidx/datastore/preferences/protobuf/MapFieldSchemaLite;)Landroidx/datastore/preferences/protobuf/MessageSchema;\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->newSchemaForRawMessageInfo(Landroidx/datastore/preferences/protobuf/RawMessageInfo;Landroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;Landroidx/datastore/preferences/protobuf/ListFieldSchema;Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;Landroidx/datastore/preferences/protobuf/ExtensionSchemaLite;Landroidx/datastore/preferences/protobuf/MapFieldSchemaLite;)Landroidx/datastore/preferences/protobuf/MessageSchema;\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->offset(I)J\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->positionForFieldNumber(I)I\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->reflectField(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->setOneofPresent(Ljava/lang/Object;II)V\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->type(I)I\nPLandroidx/datastore/preferences/protobuf/MessageSchema;->typeAndOffsetAt(I)I\nPLandroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;-><init>()V\nPLandroidx/datastore/preferences/protobuf/NewInstanceSchemas;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/OneofInfo;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/OneofInfo;-><init>()V\nPLandroidx/datastore/preferences/protobuf/OneofInfo;->access$400(B)Z\nPLandroidx/datastore/preferences/protobuf/Protobuf;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/Protobuf;-><init>()V\nPLandroidx/datastore/preferences/protobuf/Protobuf;->schemaFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/Schema;\nPLandroidx/datastore/preferences/protobuf/Protobuf;->schemaFor(Ljava/lang/Object;)Landroidx/datastore/preferences/protobuf/Schema;\nPLandroidx/datastore/preferences/protobuf/RawMessageInfo;-><init>(Landroidx/datastore/preferences/protobuf/AbstractMessageLite;Ljava/lang/String;[Ljava/lang/Object;)V\nPLandroidx/datastore/preferences/protobuf/SchemaUtil;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/SchemaUtil;->getUnknownFieldSetSchema(Z)Landroidx/datastore/preferences/protobuf/UnknownFieldSchema;\nPLandroidx/datastore/preferences/protobuf/SmallSortedMap$EmptySet$1;-><init>()V\nPLandroidx/datastore/preferences/protobuf/SmallSortedMap$EmptySet$2;-><init>()V\nPLandroidx/datastore/preferences/protobuf/UnknownFieldSchema;-><init>()V\nPLandroidx/datastore/preferences/protobuf/UnknownFieldSetLite;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/UnknownFieldSetLite;-><init>(I[I[Ljava/lang/Object;Z)V\nPLandroidx/datastore/preferences/protobuf/UnknownFieldSetLiteSchema;-><init>()V\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil$1;-><init>()V\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil$1;->run()Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil$1;->run()Lsun/misc/Unsafe;\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil$JvmMemoryAccessor;-><init>(Lsun/misc/Unsafe;I)V\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil;->arrayBaseOffset(Ljava/lang/Class;)I\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil;->arrayIndexScale(Ljava/lang/Class;)I\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil;->bufferAddressField()Ljava/lang/reflect/Field;\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil;->determineAndroidSupportByAddressSize(Ljava/lang/Class;)Z\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil;->getObject(Ljava/lang/Object;J)Ljava/lang/Object;\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil;->getUnsafe()Lsun/misc/Unsafe;\nPLandroidx/datastore/preferences/protobuf/UnsafeUtil;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V\nPLandroidx/datastore/preferences/protobuf/Utf8$SafeProcessor;-><init>(I)V\nPLandroidx/datastore/preferences/protobuf/Utf8$SafeProcessor;->decodeUtf8([BII)Ljava/lang/String;\nPLandroidx/datastore/preferences/protobuf/Utf8;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/WireFormat$FieldType$1;-><init>(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V\nPLandroidx/datastore/preferences/protobuf/WireFormat$FieldType$2;-><init>(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V\nPLandroidx/datastore/preferences/protobuf/WireFormat$FieldType$3;-><init>(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V\nPLandroidx/datastore/preferences/protobuf/WireFormat$FieldType$4;-><init>(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V\nPLandroidx/datastore/preferences/protobuf/WireFormat$FieldType;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/WireFormat$FieldType;-><init>(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V\nPLandroidx/datastore/preferences/protobuf/WireFormat$FieldType;-><init>(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;ILandroidx/datastore/preferences/protobuf/OneofInfo;)V\nPLandroidx/datastore/preferences/protobuf/WireFormat$JavaType;-><clinit>()V\nPLandroidx/datastore/preferences/protobuf/WireFormat$JavaType;-><init>(Ljava/lang/String;ILjava/lang/Object;)V\nPLandroidx/fragment/app/BackStackRecord;-><init>(Landroidx/fragment/app/FragmentManager;)V\nPLandroidx/fragment/app/BackStackRecord;->bumpBackStackNesting(I)V\nPLandroidx/fragment/app/BackStackRecord;->commit()I\nPLandroidx/fragment/app/BackStackRecord;->commitAllowingStateLoss()I\nPLandroidx/fragment/app/BackStackRecord;->commitInternal(Z)I\nPLandroidx/fragment/app/BackStackRecord;->doAddOp(ILandroidx/fragment/app/Fragment;Ljava/lang/String;I)V\nPLandroidx/fragment/app/BackStackRecord;->generateOps(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z\nPLandroidx/fragment/app/BackStackRecord;->setPrimaryNavigationFragment(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentTransaction;\nPLandroidx/fragment/app/DefaultSpecialEffectsController;-><init>(Landroid/view/ViewGroup;)V\nPLandroidx/fragment/app/DialogFragment$1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/fragment/app/Fragment$1;-><init>(Landroidx/fragment/app/Fragment;I)V\nPLandroidx/fragment/app/Fragment$4;-><init>(Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/Fragment$4;->onFindViewById(I)Landroid/view/View;\nPLandroidx/fragment/app/Fragment$4;->onHasView()Z\nPLandroidx/fragment/app/Fragment$5;-><init>(Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/Fragment$5;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/fragment/app/Fragment$6;-><init>()V\nPLandroidx/fragment/app/Fragment$6;-><init>(Ljava/lang/Object;)V\nPLandroidx/fragment/app/Fragment$7;-><init>(Landroidx/fragment/app/FragmentManager;)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentActivityCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentAttached(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentDestroyed(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentDetached(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentPaused(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentPreAttached(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentPreCreated(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentResumed(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentSaveInstanceState(Landroidx/fragment/app/Fragment;Landroid/os/Bundle;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentStarted(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentStopped(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentViewCreated(Landroidx/fragment/app/Fragment;Landroid/view/View;Landroid/os/Bundle;Z)V\nPLandroidx/fragment/app/Fragment$7;->dispatchOnFragmentViewDestroyed(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/Fragment$AnimationInfo;-><init>()V\nPLandroidx/fragment/app/Fragment;-><clinit>()V\nPLandroidx/fragment/app/Fragment;->createFragmentContainer()Landroidx/fragment/app/FragmentContainer;\nPLandroidx/fragment/app/Fragment;->ensureAnimationInfo()Landroidx/fragment/app/Fragment$AnimationInfo;\nPLandroidx/fragment/app/Fragment;->equals(Ljava/lang/Object;)Z\nPLandroidx/fragment/app/Fragment;->getActivity()Landroidx/fragment/app/FragmentActivity;\nPLandroidx/fragment/app/Fragment;->getArguments()Landroid/os/Bundle;\nPLandroidx/fragment/app/Fragment;->getChildFragmentManager()Landroidx/fragment/app/FragmentManager;\nPLandroidx/fragment/app/Fragment;->getContext()Landroid/content/Context;\nPLandroidx/fragment/app/Fragment;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory;\nPLandroidx/fragment/app/Fragment;->getFocusedView()Landroid/view/View;\nPLandroidx/fragment/app/Fragment;->getHost()Ljava/lang/Object;\nPLandroidx/fragment/app/Fragment;->getId()I\nPLandroidx/fragment/app/Fragment;->getLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;\nPLandroidx/fragment/app/Fragment;->getLifecycle()Landroidx/lifecycle/Lifecycle;\nPLandroidx/fragment/app/Fragment;->getMinimumMaxLifecycleState()I\nPLandroidx/fragment/app/Fragment;->getPostOnViewCreatedAlpha()F\nPLandroidx/fragment/app/Fragment;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry;\nPLandroidx/fragment/app/Fragment;->getTag()Ljava/lang/String;\nPLandroidx/fragment/app/Fragment;->getView()Landroid/view/View;\nPLandroidx/fragment/app/Fragment;->getViewLifecycleOwner()Landroidx/lifecycle/LifecycleOwner;\nPLandroidx/fragment/app/Fragment;->hashCode()I\nPLandroidx/fragment/app/Fragment;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/fragment/app/Fragment;\nPLandroidx/fragment/app/Fragment;->noteStateNotSaved()V\nPLandroidx/fragment/app/Fragment;->onActivityCreated(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->onAttach(Landroid/app/Activity;)V\nPLandroidx/fragment/app/Fragment;->onAttach(Landroid/content/Context;)V\nPLandroidx/fragment/app/Fragment;->onAttachFragment(Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/Fragment;->onCreate(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;\nPLandroidx/fragment/app/Fragment;->onDestroy()V\nPLandroidx/fragment/app/Fragment;->onDestroyView()V\nPLandroidx/fragment/app/Fragment;->onDetach()V\nPLandroidx/fragment/app/Fragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;\nPLandroidx/fragment/app/Fragment;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->onPause()V\nPLandroidx/fragment/app/Fragment;->onPrimaryNavigationFragmentChanged(Z)V\nPLandroidx/fragment/app/Fragment;->onResume()V\nPLandroidx/fragment/app/Fragment;->onSaveInstanceState(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->onStart()V\nPLandroidx/fragment/app/Fragment;->onStop()V\nPLandroidx/fragment/app/Fragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->onViewStateRestored(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->performActivityCreated(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->performCreate(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->performDestroy()V\nPLandroidx/fragment/app/Fragment;->performDestroyView()V\nPLandroidx/fragment/app/Fragment;->performDetach()V\nPLandroidx/fragment/app/Fragment;->performGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;\nPLandroidx/fragment/app/Fragment;->performPause()V\nPLandroidx/fragment/app/Fragment;->performPrimaryNavigationFragmentChanged()V\nPLandroidx/fragment/app/Fragment;->performResume()V\nPLandroidx/fragment/app/Fragment;->performSaveInstanceState(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->performStop()V\nPLandroidx/fragment/app/Fragment;->performViewCreated()V\nPLandroidx/fragment/app/Fragment;->requireActivity()Landroidx/fragment/app/FragmentActivity;\nPLandroidx/fragment/app/Fragment;->requireContext()Landroid/content/Context;\nPLandroidx/fragment/app/Fragment;->requireView()Landroid/view/View;\nPLandroidx/fragment/app/Fragment;->restoreChildFragmentState(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->restoreViewState(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->setAnimations(IIII)V\nPLandroidx/fragment/app/Fragment;->setArguments(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/Fragment;->setFocusedView(Landroid/view/View;)V\nPLandroidx/fragment/app/Fragment;->setNextTransition(I)V\nPLandroidx/fragment/app/Fragment;->setPopDirection(Z)V\nPLandroidx/fragment/app/Fragment;->setPostOnViewCreatedAlpha(F)V\nPLandroidx/fragment/app/Fragment;->setSharedElementNames(Ljava/util/ArrayList;Ljava/util/ArrayList;)V\nPLandroidx/fragment/app/FragmentActivity$HostCallbacks;-><init>(Landroidx/fragment/app/FragmentActivity;)V\nPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry;\nPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getLifecycle()Landroidx/lifecycle/Lifecycle;\nPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher;\nPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry;\nPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getViewModelStore()Landroidx/lifecycle/ViewModelStore;\nPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentActivity;-><init>()V\nPLandroidx/fragment/app/FragmentActivity;->getSupportFragmentManager()Landroidx/fragment/app/FragmentManager;\nPLandroidx/fragment/app/FragmentActivity;->markFragmentsCreated()V\nPLandroidx/fragment/app/FragmentActivity;->markState(Landroidx/fragment/app/FragmentManager;Landroidx/lifecycle/Lifecycle$State;)Z\nPLandroidx/fragment/app/FragmentActivity;->onAttachFragment(Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V\nPLandroidx/fragment/app/FragmentActivity;->onDestroy()V\nPLandroidx/fragment/app/FragmentActivity;->onPause()V\nPLandroidx/fragment/app/FragmentActivity;->onPostResume()V\nPLandroidx/fragment/app/FragmentActivity;->onResume()V\nPLandroidx/fragment/app/FragmentActivity;->onResumeFragments()V\nPLandroidx/fragment/app/FragmentActivity;->onStart()V\nPLandroidx/fragment/app/FragmentActivity;->onStateNotSaved()V\nPLandroidx/fragment/app/FragmentActivity;->onStop()V\nPLandroidx/fragment/app/FragmentContainer;-><init>()V\nPLandroidx/fragment/app/FragmentContainerView;-><init>(Landroid/content/Context;)V\nPLandroidx/fragment/app/FragmentContainerView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V\nPLandroidx/fragment/app/FragmentContainerView;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\nPLandroidx/fragment/app/FragmentContainerView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\nPLandroidx/fragment/app/FragmentContainerView;->removeView(Landroid/view/View;)V\nPLandroidx/fragment/app/FragmentContainerView;->setDrawDisappearingViewsLast(Z)V\nPLandroidx/fragment/app/FragmentContainerView;->setOnApplyWindowInsetsListener(Landroid/view/View$OnApplyWindowInsetsListener;)V\nPLandroidx/fragment/app/FragmentController;-><init>(Landroidx/fragment/app/FragmentHostCallback;)V\nPLandroidx/fragment/app/FragmentController;->noteStateNotSaved()V\nPLandroidx/fragment/app/FragmentFactory;-><clinit>()V\nPLandroidx/fragment/app/FragmentFactory;-><init>()V\nPLandroidx/fragment/app/FragmentFactory;->loadClass(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;\nPLandroidx/fragment/app/FragmentFactory;->loadFragmentClass(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;\nPLandroidx/fragment/app/FragmentHostCallback;-><init>(Landroidx/fragment/app/FragmentActivity;)V\nPLandroidx/fragment/app/FragmentLayoutInflaterFactory;-><init>(Landroidx/fragment/app/FragmentManager;)V\nPLandroidx/fragment/app/FragmentManager$1;-><init>(Landroidx/fragment/app/FragmentManager;Z)V\nPLandroidx/fragment/app/FragmentManager$1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/fragment/app/FragmentManager$2;-><init>(Landroidx/fragment/app/FragmentManager;)V\nPLandroidx/fragment/app/FragmentManager$2;->instantiate(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroidx/fragment/app/Fragment;\nPLandroidx/fragment/app/FragmentManager$3;-><init>(Landroidx/fragment/app/FragmentManager;I)V\nPLandroidx/fragment/app/FragmentManager$6;-><init>(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentManager$6;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;-><init>(I)V\nPLandroidx/fragment/app/FragmentManager;->addFragment(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentStateManager;\nPLandroidx/fragment/app/FragmentManager;->cleanupExec()V\nPLandroidx/fragment/app/FragmentManager;->createOrGetFragmentStateManager(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentStateManager;\nPLandroidx/fragment/app/FragmentManager;->dispatchCreate()V\nPLandroidx/fragment/app/FragmentManager;->dispatchParentPrimaryNavigationFragmentChanged(Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentManager;->doPendingDeferredStart()V\nPLandroidx/fragment/app/FragmentManager;->endAnimatingAwayFragments()V\nPLandroidx/fragment/app/FragmentManager;->enqueueAction(Landroidx/fragment/app/FragmentManager$OpGenerator;Z)V\nPLandroidx/fragment/app/FragmentManager;->execSingleAction(Landroidx/fragment/app/FragmentManager$OpGenerator;Z)V\nPLandroidx/fragment/app/FragmentManager;->findActiveFragment(Ljava/lang/String;)Landroidx/fragment/app/Fragment;\nPLandroidx/fragment/app/FragmentManager;->findFragmentById(I)Landroidx/fragment/app/Fragment;\nPLandroidx/fragment/app/FragmentManager;->findFragmentByTag(Ljava/lang/String;)Landroidx/fragment/app/Fragment;\nPLandroidx/fragment/app/FragmentManager;->getBackStackEntryCount()I\nPLandroidx/fragment/app/FragmentManager;->getFragmentContainer(Landroidx/fragment/app/Fragment;)Landroid/view/ViewGroup;\nPLandroidx/fragment/app/FragmentManager;->getFragmentFactory()Landroidx/fragment/app/FragmentFactory;\nPLandroidx/fragment/app/FragmentManager;->getFragments()Ljava/util/List;\nPLandroidx/fragment/app/FragmentManager;->isMenuAvailable(Landroidx/fragment/app/Fragment;)Z\nPLandroidx/fragment/app/FragmentManager;->isPrimaryNavigation(Landroidx/fragment/app/Fragment;)Z\nPLandroidx/fragment/app/FragmentManager;->isStateSaved()Z\nPLandroidx/fragment/app/FragmentManager;->performPendingDeferredStart(Landroidx/fragment/app/FragmentStateManager;)V\nPLandroidx/fragment/app/FragmentManager;->removeRedundantOperationsAndExecute(Ljava/util/ArrayList;Ljava/util/ArrayList;)V\nPLandroidx/fragment/app/FragmentManager;->scheduleCommit()V\nPLandroidx/fragment/app/FragmentManager;->setExitAnimationOrder(Landroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/FragmentManager;->setPrimaryNavigationFragment(Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentManagerImpl;-><init>()V\nPLandroidx/fragment/app/FragmentManagerState;-><clinit>()V\nPLandroidx/fragment/app/FragmentManagerState;-><init>()V\nPLandroidx/fragment/app/FragmentManagerState;->writeToParcel(Landroid/os/Parcel;I)V\nPLandroidx/fragment/app/FragmentManagerViewModel$1;-><init>(I)V\nPLandroidx/fragment/app/FragmentManagerViewModel$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;\nPLandroidx/fragment/app/FragmentManagerViewModel;-><clinit>()V\nPLandroidx/fragment/app/FragmentManagerViewModel;-><init>(Z)V\nPLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigState(Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigStateInternal(Ljava/lang/String;)V\nPLandroidx/fragment/app/FragmentManagerViewModel;->onCleared()V\nPLandroidx/fragment/app/FragmentManagerViewModel;->shouldDestroy(Landroidx/fragment/app/Fragment;)Z\nPLandroidx/fragment/app/FragmentState$1;-><init>(I)V\nPLandroidx/fragment/app/FragmentState;-><clinit>()V\nPLandroidx/fragment/app/FragmentState;-><init>(Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentState;->writeToParcel(Landroid/os/Parcel;I)V\nPLandroidx/fragment/app/FragmentStateManager$1;-><init>(Landroidx/fragment/app/FragmentStateManager;Landroid/view/View;)V\nPLandroidx/fragment/app/FragmentStateManager$1;->onViewAttachedToWindow(Landroid/view/View;)V\nPLandroidx/fragment/app/FragmentStateManager;-><init>(Landroidx/fragment/app/Fragment$7;Lcom/google/firebase/iid/zzaw;Landroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentStateManager;->activityCreated()V\nPLandroidx/fragment/app/FragmentStateManager;->addViewToContainer()V\nPLandroidx/fragment/app/FragmentStateManager;->create()V\nPLandroidx/fragment/app/FragmentStateManager;->destroyFragmentView()V\nPLandroidx/fragment/app/FragmentStateManager;->detach()V\nPLandroidx/fragment/app/FragmentStateManager;->ensureInflatedView()V\nPLandroidx/fragment/app/FragmentStateManager;->pause()V\nPLandroidx/fragment/app/FragmentStateManager;->restoreState(Ljava/lang/ClassLoader;)V\nPLandroidx/fragment/app/FragmentStateManager;->resume()V\nPLandroidx/fragment/app/FragmentStateManager;->saveBasicState()Landroid/os/Bundle;\nPLandroidx/fragment/app/FragmentStateManager;->saveState()V\nPLandroidx/fragment/app/FragmentStateManager;->saveViewState()V\nPLandroidx/fragment/app/FragmentStateManager;->start()V\nPLandroidx/fragment/app/FragmentStateManager;->stop()V\nPLandroidx/fragment/app/FragmentTransaction$Op;-><init>(ILandroidx/fragment/app/Fragment;)V\nPLandroidx/fragment/app/FragmentTransaction$Op;-><init>(ILandroidx/fragment/app/Fragment;Z)V\nPLandroidx/fragment/app/FragmentTransaction;-><init>(Landroidx/fragment/app/FragmentFactory;Ljava/lang/ClassLoader;)V\nPLandroidx/fragment/app/FragmentTransaction;->addOp(Landroidx/fragment/app/FragmentTransaction$Op;)V\nPLandroidx/fragment/app/FragmentTransaction;->disallowAddToBackStack()Landroidx/fragment/app/FragmentTransaction;\nPLandroidx/fragment/app/FragmentTransaction;->replace(ILandroidx/fragment/app/Fragment;Ljava/lang/String;)Landroidx/fragment/app/FragmentTransaction;\nPLandroidx/fragment/app/FragmentTransitionImpl$1;-><init>(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLandroidx/fragment/app/FragmentTransitionImpl$1;->run()V\nPLandroidx/fragment/app/FragmentViewLifecycleOwner;-><init>(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/ViewModelStore;)V\nPLandroidx/fragment/app/FragmentViewLifecycleOwner;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry;\nPLandroidx/fragment/app/FragmentViewLifecycleOwner;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/fragment/app/FragmentViewModelLazyKt$createViewModelLazy$factoryPromise$1;-><init>(Landroidx/fragment/app/Fragment;I)V\nPLandroidx/fragment/app/FragmentViewModelLazyKt$createViewModelLazy$factoryPromise$1;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory;\nPLandroidx/fragment/app/FragmentViewModelLazyKt$createViewModelLazy$factoryPromise$1;->invoke()Landroidx/lifecycle/ViewModelStore;\nPLandroidx/fragment/app/FragmentViewModelLazyKt$createViewModelLazy$factoryPromise$1;->invoke()Ljava/lang/Object;\nPLandroidx/fragment/app/SpecialEffectsController$1;-><init>(Landroidx/fragment/app/SpecialEffectsController;Landroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;I)V\nPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->cancel()V\nPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->complete()V\nPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->mergeWith$enumunboxing$(II)V\nPLandroidx/fragment/app/SpecialEffectsController$FragmentStateManagerOperation;->onStart()V\nPLandroidx/fragment/app/SpecialEffectsController;-><init>(Landroid/view/ViewGroup;)V\nPLandroidx/fragment/app/SpecialEffectsController;->enqueue$enumunboxing$(IILandroidx/fragment/app/FragmentStateManager;)V\nPLandroidx/fragment/app/SpecialEffectsController;->executePendingOperations()V\nPLandroidx/fragment/app/SpecialEffectsController;->getOrCreateController(Landroid/view/ViewGroup;Landroidx/fragment/app/FragmentManager;)Landroidx/fragment/app/SpecialEffectsController;\nPLandroidx/fragment/app/SpecialEffectsController;->markPostponedState()V\nPLandroidx/interpolator/view/animation/FastOutLinearInInterpolator;-><clinit>()V\nPLandroidx/interpolator/view/animation/FastOutLinearInInterpolator;-><init>()V\nPLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;-><clinit>()V\nPLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;-><init>()V\nPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;-><clinit>()V\nPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;-><init>()V\nPLandroidx/interpolator/view/animation/LookupTableInterpolator;-><init>([F)V\nPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;-><init>(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;\nPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/String;Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;\nPLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;-><init>(Ljava/util/Map;)V\nPLandroidx/lifecycle/ClassesInfoCache$MethodReference;-><init>(ILjava/lang/reflect/Method;)V\nPLandroidx/lifecycle/ClassesInfoCache$MethodReference;->hashCode()I\nPLandroidx/lifecycle/ClassesInfoCache;-><clinit>()V\nPLandroidx/lifecycle/ClassesInfoCache;-><init>()V\nPLandroidx/lifecycle/ClassesInfoCache;->createInfo(Ljava/lang/Class;[Ljava/lang/reflect/Method;)Landroidx/lifecycle/ClassesInfoCache$CallbackInfo;\nPLandroidx/lifecycle/ClassesInfoCache;->getInfo(Ljava/lang/Class;)Landroidx/lifecycle/ClassesInfoCache$CallbackInfo;\nPLandroidx/lifecycle/ClassesInfoCache;->verifyAndPutHandler(Ljava/util/Map;Landroidx/lifecycle/ClassesInfoCache$MethodReference;Landroidx/lifecycle/Lifecycle$Event;Ljava/lang/Class;)V\nPLandroidx/lifecycle/CloseableCoroutineScope;-><init>(Lkotlin/coroutines/CoroutineContext;)V\nPLandroidx/lifecycle/CloseableCoroutineScope;->close()V\nPLandroidx/lifecycle/CloseableCoroutineScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext;\nPLandroidx/lifecycle/CoroutineLiveData$1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/lifecycle/CoroutineLiveData$1;->invoke()Ljava/lang/Object;\nPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;-><init>()V\nPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V\nPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V\nPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V\nPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V\nPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V\nPLandroidx/lifecycle/Lifecycle$1;-><clinit>()V\nPLandroidx/lifecycle/Lifecycle$Event;-><clinit>()V\nPLandroidx/lifecycle/Lifecycle$Event;-><init>(Ljava/lang/String;I)V\nPLandroidx/lifecycle/Lifecycle$Event;->upTo(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event;\nPLandroidx/lifecycle/Lifecycle$Event;->values()[Landroidx/lifecycle/Lifecycle$Event;\nPLandroidx/lifecycle/Lifecycle$State;-><clinit>()V\nPLandroidx/lifecycle/Lifecycle$State;-><init>(Ljava/lang/String;I)V\nPLandroidx/lifecycle/Lifecycle$State;->values()[Landroidx/lifecycle/Lifecycle$State;\nPLandroidx/lifecycle/Lifecycle;-><init>()V\nPLandroidx/lifecycle/LifecycleController$observer$1;-><init>(Landroidx/lifecycle/LifecycleController;Lkotlinx/coroutines/Job;)V\nPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;-><init>(Landroidx/lifecycle/LifecycleCoroutineScopeImpl;Lkotlin/coroutines/Continuation;)V\nPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;-><init>(Landroidx/lifecycle/Lifecycle;Lkotlin/coroutines/CoroutineContext;)V\nPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext;\nPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;-><init>()V\nPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityStopped(Landroid/app/Activity;)V\nPLandroidx/lifecycle/LifecycleDispatcher;-><clinit>()V\nPLandroidx/lifecycle/LifecycleRegistry;->setCurrentState(Landroidx/lifecycle/Lifecycle$State;)V\nPLandroidx/lifecycle/Lifecycling;-><clinit>()V\nPLandroidx/lifecycle/Lifecycling;->getAdapterName(Ljava/lang/String;)Ljava/lang/String;\nPLandroidx/lifecycle/Lifecycling;->getObserverConstructorType(Ljava/lang/Class;)I\nPLandroidx/lifecycle/LiveData$1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/lifecycle/LiveData$1;->run()V\nPLandroidx/lifecycle/LiveData;-><clinit>()V\nPLandroidx/lifecycle/LiveData;-><init>()V\nPLandroidx/lifecycle/LiveData;->assertMainThread(Ljava/lang/String;)V\nPLandroidx/lifecycle/LiveData;->dispatchingValue(Landroidx/lifecycle/LiveData$ObserverWrapper;)V\nPLandroidx/lifecycle/MethodCallsLogger;-><init>(Landroidx/lifecycle/ProcessLifecycleOwner;)V\nPLandroidx/lifecycle/MutableLiveData;-><init>()V\nPLandroidx/lifecycle/MutableLiveData;->setValue(Ljava/lang/Object;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner$3$1;-><init>(Landroidx/lifecycle/ProcessLifecycleOwner$3;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner$3$1;->onActivityPostResumed(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner$3$1;->onActivityPostStarted(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner$3;-><init>(Landroidx/lifecycle/ProcessLifecycleOwner;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityPaused(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner$3;->onActivityStopped(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ProcessLifecycleOwner;-><clinit>()V\nPLandroidx/lifecycle/ProcessLifecycleOwner;-><init>()V\nPLandroidx/lifecycle/ProcessLifecycleOwner;->activityResumed()V\nPLandroidx/lifecycle/ProcessLifecycleOwner;->activityStarted()V\nPLandroidx/lifecycle/ProcessLifecycleOwnerInitializer;-><init>()V\nPLandroidx/lifecycle/ProcessLifecycleOwnerInitializer;->onCreate()Z\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;-><init>(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;-><init>(Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1;-><init>(Landroidx/lifecycle/Lifecycle$Event;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Landroidx/lifecycle/Lifecycle$Event;Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/functions/Function2;)V\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;-><init>(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;-><init>(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/lifecycle/RepeatOnLifecycleKt$repeatOnLifecycle$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;-><init>()V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreDestroyed(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPrePaused(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreStopped(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->registerIn(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment;-><init>()V\nPLandroidx/lifecycle/ReportFragment;->dispatch(Landroid/app/Activity;Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/lifecycle/ReportFragment;->dispatch(Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/lifecycle/ReportFragment;->injectIfNeededIn(Landroid/app/Activity;)V\nPLandroidx/lifecycle/ReportFragment;->onActivityCreated(Landroid/os/Bundle;)V\nPLandroidx/lifecycle/ReportFragment;->onDestroy()V\nPLandroidx/lifecycle/ReportFragment;->onPause()V\nPLandroidx/lifecycle/ReportFragment;->onResume()V\nPLandroidx/lifecycle/ReportFragment;->onStart()V\nPLandroidx/lifecycle/ReportFragment;->onStop()V\nPLandroidx/lifecycle/SavedStateHandle$1;-><init>(Landroidx/lifecycle/SavedStateHandle;)V\nPLandroidx/lifecycle/SavedStateHandle$1;->saveState()Landroid/os/Bundle;\nPLandroidx/lifecycle/SavedStateHandle;-><clinit>()V\nPLandroidx/lifecycle/SavedStateHandle;-><init>()V\nPLandroidx/lifecycle/SavedStateHandleController$1;-><init>(Landroidx/lifecycle/Lifecycle;Landroidx/savedstate/SavedStateRegistry;)V\nPLandroidx/lifecycle/SavedStateHandleController$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/lifecycle/SavedStateHandleController;-><init>(Ljava/lang/String;Landroidx/lifecycle/SavedStateHandle;)V\nPLandroidx/lifecycle/SavedStateHandleController;->attachToLifecycle(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V\nPLandroidx/lifecycle/SavedStateHandleController;->create(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandleController;\nPLandroidx/lifecycle/SavedStateHandleController;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nPLandroidx/lifecycle/SavedStateHandleController;->tryToAddRecreator(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V\nPLandroidx/lifecycle/SavedStateViewModelFactory;-><clinit>()V\nPLandroidx/lifecycle/SavedStateViewModelFactory;-><init>(Landroid/app/Application;Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V\nPLandroidx/lifecycle/ViewModel;-><init>()V\nPLandroidx/lifecycle/ViewModel;->clear()V\nPLandroidx/lifecycle/ViewModel;->getTag(Ljava/lang/String;)Ljava/lang/Object;\nPLandroidx/lifecycle/ViewModel;->onCleared()V\nPLandroidx/lifecycle/ViewModel;->setTagIfAbsent(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/lifecycle/ViewModelLazy;-><init>(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V\nPLandroidx/lifecycle/ViewModelLazy;->getValue()Ljava/lang/Object;\nPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;-><clinit>()V\nPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;-><init>(Landroid/app/Application;)V\nPLandroidx/lifecycle/ViewModelProvider$KeyedFactory;-><init>()V\nPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;-><clinit>()V\nPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;-><init>()V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(I)V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;)V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/lifecycle/ViewModelProvider$Factory;)V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(Landroidx/room/RoomDatabase;)V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(Lcom/google/android/gms/common/GoogleApiAvailabilityLight;)V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(Lcom/google/android/gms/measurement/internal/zzjm;)V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V\nPLandroidx/lifecycle/ViewModelProvider;-><init>(Ljava/lang/String;)V\nPLandroidx/lifecycle/ViewModelProvider;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V\nPLandroidx/lifecycle/ViewModelProvider;->calculateHexStringDigest(Lcom/bumptech/glide/load/Key;)Ljava/lang/String;\nPLandroidx/lifecycle/ViewModelProvider;->create()Z\nPLandroidx/lifecycle/ViewModelProvider;->getClientAvailability(Landroid/content/Context;Lcom/google/android/gms/common/api/Api$Client;)I\nPLandroidx/lifecycle/ViewModelProvider;->getMarkerFile()Ljava/io/File;\nPLandroidx/lifecycle/ViewModelProvider;->getSafeKey(Lcom/bumptech/glide/load/Key;)Ljava/lang/String;\nPLandroidx/lifecycle/ViewModelProvider;->getSql()Ljava/lang/String;\nPLandroidx/lifecycle/ViewModelProvider;->releaseAndClose()V\nPLandroidx/lifecycle/ViewModelStore;-><init>()V\nPLandroidx/lifecycle/ViewModelStore;->clear()V\nPLandroidx/loader/app/LoaderManager;-><init>()V\nPLandroidx/loader/app/LoaderManager;->getInstance(Landroidx/lifecycle/LifecycleOwner;)Landroidx/loader/app/LoaderManager;\nPLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;-><clinit>()V\nPLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;-><init>()V\nPLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;->onCleared()V\nPLandroidx/loader/app/LoaderManagerImpl;-><init>(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/ViewModelStore;)V\nPLandroidx/loader/content/ModernAsyncTask$1;-><init>(I)V\nPLandroidx/loader/content/ModernAsyncTask$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;\nPLandroidx/navigation/ActivityNavigator;-><init>(Landroid/content/Context;)V\nPLandroidx/navigation/NavAction;-><init>(ILandroidx/navigation/NavOptions;Landroid/os/Bundle;I)V\nPLandroidx/navigation/NavArgument;-><init>(Landroidx/navigation/NavType;ZLjava/lang/Object;Z)V\nPLandroidx/navigation/NavArgument;->equals(Ljava/lang/Object;)Z\nPLandroidx/navigation/NavArgument;->hashCode()I\nPLandroidx/navigation/NavBackStackEntry$defaultFactory$2;-><init>(Landroidx/navigation/NavBackStackEntry;I)V\nPLandroidx/navigation/NavBackStackEntry;-><clinit>()V\nPLandroidx/navigation/NavBackStackEntry;->getLifecycle()Landroidx/lifecycle/Lifecycle;\nPLandroidx/navigation/NavBackStackEntry;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry;\nPLandroidx/navigation/NavBackStackEntry;->setMaxLifecycle(Landroidx/lifecycle/Lifecycle$State;)V\nPLandroidx/navigation/NavBackStackEntryState;-><clinit>()V\nPLandroidx/navigation/NavBackStackEntryState;-><init>(Landroidx/navigation/NavBackStackEntry;)V\nPLandroidx/navigation/NavBackStackEntryState;->writeToParcel(Landroid/os/Parcel;I)V\nPLandroidx/navigation/NavController$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Object;I)V\nPLandroidx/navigation/NavController$NavControllerNavigatorState;-><init>(Landroidx/navigation/NavHostController;Landroidx/navigation/Navigator;)V\nPLandroidx/navigation/NavController$NavControllerNavigatorState;->addInternal(Landroidx/navigation/NavBackStackEntry;)V\nPLandroidx/navigation/NavController$NavControllerNavigatorState;->createBackStackEntry(Landroidx/navigation/NavDestination;Landroid/os/Bundle;)Landroidx/navigation/NavBackStackEntry;\nPLandroidx/navigation/NavController$NavControllerNavigatorState;->push(Landroidx/navigation/NavBackStackEntry;)V\nPLandroidx/navigation/NavController$activity$1;-><clinit>()V\nPLandroidx/navigation/NavController$activity$1;-><init>(I)V\nPLandroidx/navigation/NavController$activity$1;->invoke(Landroidx/navigation/NavDestination;)Landroidx/navigation/NavDestination;\nPLandroidx/navigation/NavController$activity$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/navigation/NavController$navigate$4;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLandroidx/navigation/NavController$navigate$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/navigation/NavControllerViewModel;-><clinit>()V\nPLandroidx/navigation/NavControllerViewModel;-><init>()V\nPLandroidx/navigation/NavControllerViewModel;->onCleared()V\nPLandroidx/navigation/NavDestination;-><clinit>()V\nPLandroidx/navigation/NavDestination;->addInDefaultArgs(Landroid/os/Bundle;)Landroid/os/Bundle;\nPLandroidx/navigation/NavDestination;->getArguments()Ljava/util/Map;\nPLandroidx/navigation/NavDestination;->matchDeepLink(Lcom/google/firebase/iid/zzk;)Landroidx/navigation/NavDestination$DeepLinkMatch;\nPLandroidx/navigation/NavDestination;->setId(I)V\nPLandroidx/navigation/NavGraph$iterator$1;-><init>(Landroidx/navigation/NavGraph;)V\nPLandroidx/navigation/NavGraph$iterator$1;->hasNext()Z\nPLandroidx/navigation/NavGraph$iterator$1;->next()Ljava/lang/Object;\nPLandroidx/navigation/NavGraph;-><clinit>()V\nPLandroidx/navigation/NavGraph;-><init>(Landroidx/navigation/Navigator;)V\nPLandroidx/navigation/NavGraph;->addDestination(Landroidx/navigation/NavDestination;)V\nPLandroidx/navigation/NavGraph;->equals(Ljava/lang/Object;)Z\nPLandroidx/navigation/NavGraph;->findNode(IZ)Landroidx/navigation/NavDestination;\nPLandroidx/navigation/NavGraph;->hashCode()I\nPLandroidx/navigation/NavGraph;->matchDeepLink(Lcom/google/firebase/iid/zzk;)Landroidx/navigation/NavDestination$DeepLinkMatch;\nPLandroidx/navigation/NavGraph;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/navigation/NavGraphNavigator;-><init>(Landroidx/navigation/NavigatorProvider;)V\nPLandroidx/navigation/NavGraphNavigator;->createDestination()Landroidx/navigation/NavDestination;\nPLandroidx/navigation/NavGraphNavigator;->navigate(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V\nPLandroidx/navigation/NavGraphNavigator;->navigate(Ljava/util/List;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V\nPLandroidx/navigation/NavHostController;->addOnDestinationChangedListener(Landroidx/navigation/NavController$OnDestinationChangedListener;)V\nPLandroidx/navigation/NavHostController;->dispatchOnDestinationChanged()Z\nPLandroidx/navigation/NavHostController;->findDestination(I)Landroidx/navigation/NavDestination;\nPLandroidx/navigation/NavHostController;->getBackStackEntry(I)Landroidx/navigation/NavBackStackEntry;\nPLandroidx/navigation/NavHostController;->getCurrentDestination()Landroidx/navigation/NavDestination;\nPLandroidx/navigation/NavHostController;->getDestinationCountOnBackStack()I\nPLandroidx/navigation/NavHostController;->getGraph()Landroidx/navigation/NavGraph;\nPLandroidx/navigation/NavHostController;->getHostLifecycleState$navigation_runtime_release()Landroidx/lifecycle/Lifecycle$State;\nPLandroidx/navigation/NavHostController;->linkChildToParent(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavBackStackEntry;)V\nPLandroidx/navigation/NavHostController;->navigate(Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V\nPLandroidx/navigation/NavHostController;->populateVisibleEntries$navigation_runtime_release()Ljava/util/List;\nPLandroidx/navigation/NavHostController;->setGraph(Landroidx/navigation/NavGraph;Landroid/os/Bundle;)V\nPLandroidx/navigation/NavHostController;->updateOnBackPressedCallbackEnabled()V\nPLandroidx/navigation/NavInflater;-><clinit>()V\nPLandroidx/navigation/NavInflater;-><init>(Landroid/content/Context;Landroidx/navigation/NavigatorProvider;)V\nPLandroidx/navigation/NavInflater;->inflate(I)Landroidx/navigation/NavGraph;\nPLandroidx/navigation/NavOptions;-><init>(ZZIZZIIII)V\nPLandroidx/navigation/NavOptions;->hashCode()I\nPLandroidx/navigation/NavType$Companion$IntType$1;-><init>(I)V\nPLandroidx/navigation/NavType$Companion$IntType$1;-><init>(ILandroidx/appcompat/R$id$$IA$1;)V\nPLandroidx/navigation/NavType$Companion$IntType$1;->getName()Ljava/lang/String;\nPLandroidx/navigation/NavType$Companion$IntType$1;->parseValue(Ljava/lang/String;)Ljava/lang/Object;\nPLandroidx/navigation/NavType$Companion$IntType$1;->put(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Object;)V\nPLandroidx/navigation/NavType$Companion;-><init>(I)V\nPLandroidx/navigation/NavType$Companion;-><init>(Lkotlin/LazyKt__LazyKt;I)V\nPLandroidx/navigation/NavType$Companion;->create$default(Landroidx/navigation/NavType$Companion;Landroid/content/Context;Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/lifecycle/Lifecycle$State;Landroidx/navigation/NavViewModelStoreProvider;Ljava/lang/String;Landroid/os/Bundle;I)Landroidx/navigation/NavBackStackEntry;\nPLandroidx/navigation/NavType$Companion;->create(Landroid/content/Context;Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/lifecycle/Lifecycle$State;Landroidx/navigation/NavViewModelStoreProvider;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/navigation/NavBackStackEntry;\nPLandroidx/navigation/NavType$Companion;->create(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper;\nPLandroidx/navigation/NavType$Companion;->getDisplayName(Landroid/content/Context;I)Ljava/lang/String;\nPLandroidx/navigation/NavType$Companion;->getHierarchy(Landroidx/navigation/NavDestination;)Lkotlin/sequences/Sequence;\nPLandroidx/navigation/NavType$Companion;->getInstance(Landroidx/lifecycle/ViewModelStore;)Landroidx/navigation/NavControllerViewModel;\nPLandroidx/navigation/NavType$Companion;->getNameForNavigator$navigation_common_release(Ljava/lang/Class;)Ljava/lang/String;\nPLandroidx/navigation/NavType$Companion;->onResultReceived(ILjava/lang/Object;)V\nPLandroidx/navigation/NavType$Companion;->parse(Ljava/lang/String;)Landroidx/window/core/Version;\nPLandroidx/navigation/NavType$Companion;->validateName$navigation_common_release(Ljava/lang/String;)Z\nPLandroidx/navigation/NavType;-><clinit>()V\nPLandroidx/navigation/NavType;-><init>(Z)V\nPLandroidx/navigation/Navigator;-><init>()V\nPLandroidx/navigation/Navigator;->getState()Landroidx/navigation/NavController$NavControllerNavigatorState;\nPLandroidx/navigation/Navigator;->onAttach(Landroidx/navigation/NavController$NavControllerNavigatorState;)V\nPLandroidx/navigation/Navigator;->onSaveState()Landroid/os/Bundle;\nPLandroidx/navigation/NavigatorProvider;-><clinit>()V\nPLandroidx/navigation/NavigatorProvider;-><init>()V\nPLandroidx/navigation/NavigatorProvider;->addNavigator(Landroidx/navigation/Navigator;)Landroidx/navigation/Navigator;\nPLandroidx/navigation/R$id;-><clinit>()V\nPLandroidx/navigation/R$id;->checkArgument(Z)V\nPLandroidx/navigation/R$id;->checkArgument(ZLjava/lang/Object;)V\nPLandroidx/navigation/R$id;->checkArgument(ZLjava/lang/String;[Ljava/lang/Object;)V\nPLandroidx/navigation/R$id;->checkHandlerThread(Landroid/os/Handler;Ljava/lang/String;)V\nPLandroidx/navigation/R$id;->checkMainThread(Ljava/lang/String;)V\nPLandroidx/navigation/R$id;->checkNotEmpty(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;\nPLandroidx/navigation/R$id;->checkNotMainThread(Ljava/lang/String;)V\nPLandroidx/navigation/R$id;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/navigation/R$id;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/navigation/R$id;->checkState(Z)V\nPLandroidx/navigation/R$id;->checkState(ZLjava/lang/Object;)V\nPLandroidx/navigation/R$id;->compress([B)[B\nPLandroidx/navigation/R$id;->findChildViewById(Landroid/view/View;I)Landroid/view/View;\nPLandroidx/navigation/R$id;->getOrientation(Ljava/util/List;Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)I\nPLandroidx/navigation/R$id;->getType(Ljava/util/List;Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)Lcom/bumptech/glide/load/ImageHeaderParser$ImageType;\nPLandroidx/navigation/R$id;->isMediaStoreUri(Landroid/net/Uri;)Z\nPLandroidx/navigation/R$id;->isWearable(Landroid/content/Context;)Z\nPLandroidx/navigation/R$id;->isWearableWithoutPlayStore(Landroid/content/Context;)Z\nPLandroidx/navigation/R$id;->readCompressed(Ljava/io/InputStream;II)[B\nPLandroidx/navigation/R$id;->readString(Ljava/io/InputStream;I)Ljava/lang/String;\nPLandroidx/navigation/R$id;->readUInt32(Ljava/io/InputStream;)J\nPLandroidx/navigation/R$id;->readUInt8(Ljava/io/InputStream;)I\nPLandroidx/navigation/R$id;->resumeCancellableWith$default(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;I)V\nPLandroidx/navigation/R$id;->uidHasPackageName(Landroid/content/Context;ILjava/lang/String;)Z\nPLandroidx/navigation/R$id;->utf8Length(Ljava/lang/String;)I\nPLandroidx/navigation/R$id;->writeString(Ljava/io/OutputStream;Ljava/lang/String;)V\nPLandroidx/navigation/R$id;->zza(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nPLandroidx/navigation/R$id;->zza(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;\nPLandroidx/navigation/fragment/DialogFragmentNavigator$$ExternalSyntheticLambda0;-><init>(Landroidx/navigation/fragment/DialogFragmentNavigator;)V\nPLandroidx/navigation/fragment/DialogFragmentNavigator$$ExternalSyntheticLambda0;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V\nPLandroidx/navigation/fragment/DialogFragmentNavigator;-><init>(Landroid/content/Context;Landroidx/fragment/app/FragmentManager;)V\nPLandroidx/navigation/fragment/DialogFragmentNavigator;->onAttach(Landroidx/navigation/NavController$NavControllerNavigatorState;)V\nPLandroidx/navigation/fragment/FragmentNavigator$Destination;-><init>(Landroidx/navigation/Navigator;)V\nPLandroidx/navigation/fragment/FragmentNavigator$Destination;->equals(Ljava/lang/Object;)Z\nPLandroidx/navigation/fragment/FragmentNavigator$Destination;->hashCode()I\nPLandroidx/navigation/fragment/FragmentNavigator;-><init>(Landroid/content/Context;Landroidx/fragment/app/FragmentManager;I)V\nPLandroidx/navigation/fragment/FragmentNavigator;->createDestination()Landroidx/navigation/NavDestination;\nPLandroidx/navigation/fragment/FragmentNavigator;->onSaveState()Landroid/os/Bundle;\nPLandroidx/navigation/fragment/NavHostFragment;-><clinit>()V\nPLandroidx/navigation/fragment/NavHostFragment;-><init>()V\nPLandroidx/navigation/fragment/NavHostFragment;->getNavController()Landroidx/navigation/NavHostController;\nPLandroidx/navigation/fragment/NavHostFragment;->onAttach(Landroid/content/Context;)V\nPLandroidx/navigation/fragment/NavHostFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;\nPLandroidx/navigation/fragment/NavHostFragment;->onDestroyView()V\nPLandroidx/navigation/fragment/NavHostFragment;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V\nPLandroidx/navigation/fragment/NavHostFragment;->onPrimaryNavigationFragmentChanged(Z)V\nPLandroidx/navigation/fragment/NavHostFragment;->onSaveInstanceState(Landroid/os/Bundle;)V\nPLandroidx/navigation/fragment/NavHostFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V\nPLandroidx/navigation/ui/NavigationUI$$ExternalSyntheticLambda1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/navigation/ui/NavigationUI$$ExternalSyntheticLambda1;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;\nPLandroidx/navigation/ui/NavigationUI$setupWithNavController$9;-><init>(Ljava/lang/ref/WeakReference;Landroidx/navigation/NavHostController;)V\nPLandroidx/navigation/ui/NavigationUI$setupWithNavController$9;->onDestinationChanged(Landroidx/navigation/NavHostController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V\nPLandroidx/profileinstaller/DeviceProfileWriter;-><init>(Landroid/content/res/AssetManager;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)V\nPLandroidx/profileinstaller/DeviceProfileWriter;->assertDeviceAllowsProfileInstallerAotWritesCalled()V\nPLandroidx/profileinstaller/DeviceProfileWriter;->result(ILjava/lang/Object;)V\nPLandroidx/profileinstaller/DexProfileData;-><init>(Ljava/lang/String;Ljava/lang/String;JJIII[ILjava/util/TreeMap;)V\nPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Object;ILjava/lang/Object;I)V\nPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0;->run()V\nPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;-><clinit>()V\nPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;-><init>(I)V\nPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;->execute(Ljava/lang/Runnable;)V\nPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;-><init>(Landroid/content/Context;I)V\nPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->run()V\nPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Runnable;)V\nPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->doFrame(J)V\nPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;->postFrameCallback(Ljava/lang/Runnable;)V\nPLandroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler;\nPLandroidx/profileinstaller/ProfileInstallerInitializer;-><init>()V\nPLandroidx/profileinstaller/ProfileInstallerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object;\nPLandroidx/profileinstaller/ProfileInstallerInitializer;->dependencies()Ljava/util/List;\nPLandroidx/profileinstaller/WritableFileSection;-><init>(II[BZ)V\nPLandroidx/recyclerview/widget/AdapterHelper$UpdateOp;-><init>(IIILjava/lang/Object;)V\nPLandroidx/recyclerview/widget/AdapterHelper;->canFindInPreLayout(I)Z\nPLandroidx/recyclerview/widget/AdapterHelper;->dispatchFirstPassAndUpdateViewHolders(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;I)V\nPLandroidx/recyclerview/widget/AdapterHelper;->postponeAndUpdateViewHolders(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V\nPLandroidx/recyclerview/widget/AdapterHelper;->recycleUpdateOp(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V\nPLandroidx/recyclerview/widget/AdapterHelper;->updatePositionWithPostponed(II)I\nPLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;-><clinit>()V\nPLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;-><init>(Lokio/SegmentPool;)V\nPLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->build()Landroidx/recyclerview/widget/ChildHelper;\nPLandroidx/recyclerview/widget/AsyncListDiffer$1$2;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLandroidx/recyclerview/widget/AsyncListDiffer$1;-><init>(Landroidx/recyclerview/widget/AsyncListDiffer;Ljava/util/List;Ljava/util/List;ILjava/lang/Runnable;)V\nPLandroidx/recyclerview/widget/AsyncListDiffer$MainThreadExecutor;-><init>()V\nPLandroidx/recyclerview/widget/AsyncListDiffer$MainThreadExecutor;->execute(Ljava/lang/Runnable;)V\nPLandroidx/recyclerview/widget/AsyncListDiffer;-><clinit>()V\nPLandroidx/recyclerview/widget/AsyncListDiffer;-><init>(Landroidx/recyclerview/widget/ListUpdateCallback;Landroidx/recyclerview/widget/ChildHelper;)V\nPLandroidx/recyclerview/widget/AsyncListDiffer;->onCurrentListChanged(Ljava/util/List;Ljava/lang/Runnable;)V\nPLandroidx/recyclerview/widget/AsyncListDiffer;->submitList(Ljava/util/List;)V\nPLandroidx/recyclerview/widget/BatchingListUpdateCallback;-><init>(Landroidx/recyclerview/widget/ListUpdateCallback;)V\nPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->dispatchLastEvent()V\nPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onChanged(IILjava/lang/Object;)V\nPLandroidx/recyclerview/widget/ChildHelper$Bucket;-><init>()V\nPLandroidx/recyclerview/widget/ChildHelper$Bucket;-><init>(Lcom/google/android/gms/common/util/Clock;)V\nPLandroidx/recyclerview/widget/ChildHelper$Bucket;->set(I)V\nPLandroidx/recyclerview/widget/ChildHelper;-><init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Lokio/SegmentPool;)V\nPLandroidx/recyclerview/widget/ChildHelper;->hideViewInternal(Landroid/view/View;)V\nPLandroidx/recyclerview/widget/ChildHelper;->unhideViewInternal(Landroid/view/View;)Z\nPLandroidx/recyclerview/widget/DefaultItemAnimator$4;-><init>(Landroidx/recyclerview/widget/DefaultItemAnimator;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroid/view/View;Landroid/view/ViewPropertyAnimator;)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator$4;->onAnimationEnd(Landroid/animation/Animator;)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator$4;->onAnimationStart(Landroid/animation/Animator;)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator$7;-><init>(Landroidx/recyclerview/widget/DefaultItemAnimator;Landroidx/recyclerview/widget/DefaultItemAnimator$ChangeInfo;Landroid/view/ViewPropertyAnimator;Landroid/view/View;I)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator$7;->onAnimationEnd(Landroid/animation/Animator;)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator$7;->onAnimationStart(Landroid/animation/Animator;)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator$ChangeInfo;-><init>(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;IIII)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator;->animateChange(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Lcom/google/android/material/internal/ViewUtils$RelativePadding;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)Z\nPLandroidx/recyclerview/widget/DefaultItemAnimator;->dispatchFinishedWhenDone()V\nPLandroidx/recyclerview/widget/DefaultItemAnimator;->endAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator;->endChangeAnimation(Ljava/util/List;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nPLandroidx/recyclerview/widget/DefaultItemAnimator;->resetAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nPLandroidx/recyclerview/widget/DiffUtil$Range;-><init>()V\nPLandroidx/recyclerview/widget/DiffUtil$Range;-><init>(IIII)V\nPLandroidx/recyclerview/widget/DiffUtil$Snake;-><init>()V\nPLandroidx/recyclerview/widget/FastScroller$2;-><init>(Ljava/lang/Object;I)V\nPLandroidx/recyclerview/widget/FastScroller$2;->onScrollStateChanged(Landroidx/recyclerview/widget/RecyclerView;I)V\nPLandroidx/recyclerview/widget/GapWorker$Task;-><init>()V\nPLandroidx/recyclerview/widget/GapWorker;-><clinit>()V\nPLandroidx/recyclerview/widget/GapWorker;-><init>()V\nPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;-><init>()V\nPLandroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;->assignCoordinateFromPadding()V\nPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;-><init>()V\nPLandroidx/recyclerview/widget/LinearLayoutManager$LayoutState;-><init>()V\nPLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;-><clinit>()V\nPLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;-><init>()V\nPLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->writeToParcel(Landroid/os/Parcel;I)V\nPLandroidx/recyclerview/widget/LinearLayoutManager;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\nPLandroidx/recyclerview/widget/LinearLayoutManager;->assertNotInLayoutOrScroll(Ljava/lang/String;)V\nPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I\nPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I\nPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I\nPLandroidx/recyclerview/widget/LinearLayoutManager;->findFirstReferenceChild(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)Landroid/view/View;\nPLandroidx/recyclerview/widget/LinearLayoutManager;->isAutoMeasureEnabled()Z\nPLandroidx/recyclerview/widget/LinearLayoutManager;->onAnchorReady(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;I)V\nPLandroidx/recyclerview/widget/LinearLayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V\nPLandroidx/recyclerview/widget/LinearLayoutManager;->onSaveInstanceState()Landroid/os/Parcelable;\nPLandroidx/recyclerview/widget/LinearLayoutManager;->setOrientation(I)V\nPLandroidx/recyclerview/widget/LinearLayoutManager;->setStackFromEnd(Z)V\nPLandroidx/recyclerview/widget/LinearSmoothScroller;-><init>(Landroid/content/Context;)V\nPLandroidx/recyclerview/widget/ListAdapter$1;-><init>(Landroidx/recyclerview/widget/ListAdapter;)V\nPLandroidx/recyclerview/widget/ListAdapter;-><init>(Lokio/SegmentPool;)V\nPLandroidx/recyclerview/widget/OpReorderer;-><init>(Landroidx/recyclerview/widget/AsyncListDiffer$1;)V\nPLandroidx/recyclerview/widget/OpReorderer;-><init>(Ljava/lang/Object;)V\nPLandroidx/recyclerview/widget/OpReorderer;->onChanged(IILjava/lang/Object;)V\nPLandroidx/recyclerview/widget/OpReorderer;->onInserted(II)V\nPLandroidx/recyclerview/widget/OrientationHelper$1;-><init>(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)V\nPLandroidx/recyclerview/widget/OrientationHelper;-><init>(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;Landroidx/recyclerview/widget/OrientationHelper$1;)V\nPLandroidx/recyclerview/widget/OrientationHelper;->createHorizontalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper;\nPLandroidx/recyclerview/widget/OrientationHelper;->createOrientationHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)Landroidx/recyclerview/widget/OrientationHelper;\nPLandroidx/recyclerview/widget/OrientationHelper;->createVerticalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper;\nPLandroidx/recyclerview/widget/RecyclerView$1;-><init>(Landroidx/recyclerview/widget/RecyclerView;I)V\nPLandroidx/recyclerview/widget/RecyclerView$1;->run()V\nPLandroidx/recyclerview/widget/RecyclerView$4;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V\nPLandroidx/recyclerview/widget/RecyclerView$4;->dispatchUpdate(Landroidx/recyclerview/widget/AdapterHelper$UpdateOp;)V\nPLandroidx/recyclerview/widget/RecyclerView$4;->offsetPositionsForAdd(II)V\nPLandroidx/recyclerview/widget/RecyclerView$4;->processAppeared(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Lcom/google/android/material/internal/ViewUtils$RelativePadding;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V\nPLandroidx/recyclerview/widget/RecyclerView$Adapter;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$Adapter;->getItemViewType(I)I\nPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V\nPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V\nPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nPLandroidx/recyclerview/widget/RecyclerView$Adapter;->setHasStableIds(Z)V\nPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->hasObservers()Z\nPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeChanged(IILjava/lang/Object;)V\nPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeInserted(II)V\nPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$EdgeEffectFactory;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->buildAdapterChangeFlagsForAnimations(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I\nPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->dispatchAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->dispatchAnimationsFinished()V\nPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->recordPreLayoutInformation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Lcom/google/android/material/internal/ViewUtils$RelativePadding;\nPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V\nPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;-><init>(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$Properties;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->checkLayoutParams(Landroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->collectAdjacentPrefetchPositions(IILandroidx/recyclerview/widget/RecyclerView$State;Lcom/google/android/gms/internal/vision/zzfc;)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->collectInitialPrefetchPositions(ILcom/google/android/gms/internal/vision/zzfc;)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams;\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getProperties(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroidx/recyclerview/widget/RecyclerView$LayoutManager$Properties;\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isAutoMeasureEnabled()Z\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsAdded(Landroidx/recyclerview/widget/RecyclerView;II)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;II)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;IILjava/lang/Object;)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onScrollStateChanged(I)V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAllViews()V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->requestLayout()V\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->shouldMeasureTwice()Z\nPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->supportsPredictiveItemAnimations()Z\nPLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;-><init>()V\nPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->runningAverage(JJ)J\nPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;-><init>(Ljava/lang/Object;I)V\nPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeInserted(II)V\nPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->triggerUpdateProcessor()V\nPLandroidx/recyclerview/widget/RecyclerView$SavedState;-><clinit>()V\nPLandroidx/recyclerview/widget/RecyclerView$SavedState;-><init>(Landroid/os/Parcelable;)V\nPLandroidx/recyclerview/widget/RecyclerView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V\nPLandroidx/recyclerview/widget/RecyclerView$SmoothScroller$Action;-><init>(II)V\nPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;-><clinit>()V\nPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addChangePayload(Ljava/lang/Object;)V\nPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearOldPosition()V\nPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->setIsRecyclable(Z)V\nPLandroidx/recyclerview/widget/RecyclerView;-><clinit>()V\nPLandroidx/recyclerview/widget/RecyclerView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/recyclerview/widget/RecyclerView;->addAnimatingView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V\nPLandroidx/recyclerview/widget/RecyclerView;->addItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;)V\nPLandroidx/recyclerview/widget/RecyclerView;->addOnScrollListener(Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;)V\nPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollExtent()I\nPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollOffset()I\nPLandroidx/recyclerview/widget/RecyclerView;->computeHorizontalScrollRange()I\nPLandroidx/recyclerview/widget/RecyclerView;->dispatchNestedFling(FFZ)Z\nPLandroidx/recyclerview/widget/RecyclerView;->dispatchNestedPreFling(FF)Z\nPLandroidx/recyclerview/widget/RecyclerView;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V\nPLandroidx/recyclerview/widget/RecyclerView;->findInterceptingOnItemTouchListener(Landroid/view/MotionEvent;)Z\nPLandroidx/recyclerview/widget/RecyclerView;->getAdapter()Landroidx/recyclerview/widget/RecyclerView$Adapter;\nPLandroidx/recyclerview/widget/RecyclerView;->getChangedHolderKey(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)J\nPLandroidx/recyclerview/widget/RecyclerView;->getItemAnimator()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator;\nPLandroidx/recyclerview/widget/RecyclerView;->getItemDecorationCount()I\nPLandroidx/recyclerview/widget/RecyclerView;->invalidateGlows()V\nPLandroidx/recyclerview/widget/RecyclerView;->isLayoutSuppressed()Z\nPLandroidx/recyclerview/widget/RecyclerView;->isNestedScrollingEnabled()Z\nPLandroidx/recyclerview/widget/RecyclerView;->onSaveInstanceState()Landroid/os/Parcelable;\nPLandroidx/recyclerview/widget/RecyclerView;->onSizeChanged(IIII)V\nPLandroidx/recyclerview/widget/RecyclerView;->postAnimationRunner()V\nPLandroidx/recyclerview/widget/RecyclerView;->removeItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;)V\nPLandroidx/recyclerview/widget/RecyclerView;->resetScroll()V\nPLandroidx/recyclerview/widget/RecyclerView;->scrollByInternal(IILandroid/view/MotionEvent;)Z\nPLandroidx/recyclerview/widget/RecyclerView;->setAccessibilityDelegateCompat(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V\nPLandroidx/recyclerview/widget/RecyclerView;->setChildImportantForAccessibilityInternal(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Z\nPLandroidx/recyclerview/widget/RecyclerView;->setClipToPadding(Z)V\nPLandroidx/recyclerview/widget/RecyclerView;->setLayoutFrozen(Z)V\nPLandroidx/recyclerview/widget/RecyclerView;->setNestedScrollingEnabled(Z)V\nPLandroidx/recyclerview/widget/RecyclerView;->setRecycledViewPool(Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool;)V\nPLandroidx/recyclerview/widget/RecyclerView;->startNestedScroll(II)Z\nPLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll(I)V\nPLandroidx/recyclerview/widget/RecyclerView;->suppressLayout(Z)V\nPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;-><init>(Landroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;)V\nPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z\nPLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate;-><init>(Landroidx/recyclerview/widget/RecyclerView;)V\nPLandroidx/recyclerview/widget/ViewBoundsCheck$BoundFlags;-><init>()V\nPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;-><clinit>()V\nPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;-><init>()V\nPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->obtain()Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord;\nPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->recycle(Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord;)V\nPLandroidx/recyclerview/widget/ViewInfoStore;-><init>(Landroidx/recyclerview/widget/ViewBoundsCheck$Callback;)V\nPLandroidx/recyclerview/widget/ViewInfoStore;->addToPostLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V\nPLandroidx/recyclerview/widget/ViewInfoStore;->addToPreLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V\nPLandroidx/recyclerview/widget/ViewInfoStore;->isDisappearing(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z\nPLandroidx/recyclerview/widget/ViewInfoStore;->popFromLayoutStep(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Lcom/google/android/material/internal/ViewUtils$RelativePadding;\nPLandroidx/room/DatabaseConfiguration;-><init>(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/transition/ViewUtilsBase;Ljava/util/List;ZILjava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Landroid/content/Intent;ZZLjava/util/Set;Ljava/lang/String;Ljava/io/File;Ljava/util/concurrent/Callable;Ljava/util/List;Ljava/util/List;)V\nPLandroidx/room/EntityInsertionAdapter;-><init>(Landroidx/room/RoomDatabase;)V\nPLandroidx/room/EntityInsertionAdapter;->createNewStatement()Landroidx/sqlite/db/SupportSQLiteStatement;\nPLandroidx/room/EntityInsertionAdapter;->getStmt(Z)Landroidx/sqlite/db/SupportSQLiteStatement;\nPLandroidx/room/EntityInsertionAdapter;->insert(Ljava/lang/Iterable;)V\nPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Object;I)V\nPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;->run()V\nPLandroidx/room/InvalidationTracker;-><clinit>()V\nPLandroidx/room/InvalidationTracker;-><init>(Landroidx/room/RoomDatabase;Ljava/util/Map;Ljava/util/Map;[Ljava/lang/String;)V\nPLandroidx/room/InvalidationTracker;->ensureInitialization()Z\nPLandroidx/room/InvalidationTracker;->syncTriggers(Landroidx/sqlite/db/SupportSQLiteDatabase;)V\nPLandroidx/room/QueryInterceptorProgram;-><init>(Landroid/database/sqlite/SQLiteProgram;)V\nPLandroidx/room/Room$$ExternalSyntheticOutline0;->getMValue(I)J\nPLandroidx/room/Room$$ExternalSyntheticOutline0;->m(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/StringBuilder;\nPLandroidx/room/Room$$ExternalSyntheticOutline0;->m(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nPLandroidx/room/Room;-><clinit>()V\nPLandroidx/room/Room;->booleanKey(Ljava/lang/String;)Landroidx/datastore/preferences/core/Preferences$Key;\nPLandroidx/room/Room;->checkArgument(ZLjava/lang/String;)V\nPLandroidx/room/Room;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/room/Room;->checkPermission(Landroid/content/Context;Ljava/lang/String;IILjava/lang/String;)I\nPLandroidx/room/Room;->checkPositionIndex(II)I\nPLandroidx/room/Room;->checkSelfPermission(Landroid/content/Context;Ljava/lang/String;)I\nPLandroidx/room/Room;->clamp(III)I\nPLandroidx/room/Room;->fromApplication(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object;\nPLandroidx/room/Room;->getParentActivityName(Landroid/content/Context;Landroid/content/ComponentName;)Ljava/lang/String;\nPLandroidx/room/Room;->isAtLeastO()Z\nPLandroidx/room/Room;->isEnabled()Z\nPLandroidx/room/Room;->repeatOnLifecycle(Landroidx/lifecycle/Lifecycle;Landroidx/lifecycle/Lifecycle$State;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLandroidx/room/Room;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V\nPLandroidx/room/Room;->setupWithNavController(Lcom/google/android/material/navigation/NavigationBarView;Landroidx/navigation/NavHostController;)V\nPLandroidx/room/Room;->stringKey(Ljava/lang/String;)Landroidx/datastore/preferences/core/Preferences$Key;\nPLandroidx/room/Room;->threadSafe(ILcom/bumptech/glide/util/pool/FactoryPools$Factory;)Landroidx/core/util/Pools$Pool;\nPLandroidx/room/Room;->toByteArrayList([Ljava/lang/String;)Ljava/util/List;\nPLandroidx/room/Room;->writeBundle(Landroid/os/Parcel;ILandroid/os/Bundle;Z)V\nPLandroidx/room/Room;->writeLongObject(Landroid/os/Parcel;ILjava/lang/Long;Z)V\nPLandroidx/room/Room;->writeParcelable(Landroid/os/Parcel;ILandroid/os/Parcelable;IZ)V\nPLandroidx/room/Room;->writeString(Landroid/os/Parcel;ILjava/lang/String;Z)V\nPLandroidx/room/Room;->zza(Landroid/os/Parcel;I)I\nPLandroidx/room/Room;->zzb(Landroid/os/Parcel;I)V\nPLandroidx/room/Room;->zzb(Landroid/os/Parcel;II)V\nPLandroidx/room/RoomDatabase;-><init>()V\nPLandroidx/room/RoomDatabase;->assertNotMainThread()V\nPLandroidx/room/RoomDatabase;->assertNotSuspendingTransaction()V\nPLandroidx/room/RoomDatabase;->inTransaction()Z\nPLandroidx/room/RoomDatabase;->internalBeginTransaction()V\nPLandroidx/room/RoomDatabase;->internalEndTransaction()V\nPLandroidx/room/RoomDatabase;->isOpen()Z\nPLandroidx/room/RoomDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;Landroid/os/CancellationSignal;)Landroid/database/Cursor;\nPLandroidx/room/RoomDatabase;->setTransactionSuccessful()V\nPLandroidx/room/RoomDatabase;->unwrapOpenHelper(Ljava/lang/Class;Landroidx/sqlite/db/SupportSQLiteOpenHelper;)Ljava/lang/Object;\nPLandroidx/room/RoomOpenHelper;-><init>(Landroidx/room/DatabaseConfiguration;Lcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl$1;Ljava/lang/String;Ljava/lang/String;)V\nPLandroidx/room/RoomOpenHelper;->onConfigure(Landroidx/sqlite/db/SupportSQLiteDatabase;)V\nPLandroidx/room/RoomOpenHelper;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V\nPLandroidx/savedstate/Recreator;-><init>(Landroidx/savedstate/SavedStateRegistryOwner;)V\nPLandroidx/savedstate/SavedStateRegistry$1;-><init>(Landroidx/savedstate/SavedStateRegistry;)V\nPLandroidx/savedstate/SavedStateRegistry;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle;\nPLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V\nPLandroidx/savedstate/SavedStateRegistry;->runOnNextRecreation(Ljava/lang/Class;)V\nPLandroidx/savedstate/SavedStateRegistryController;-><init>(Landroidx/savedstate/SavedStateRegistryOwner;)V\nPLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V\nPLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1$invokeSuspend$$inlined$collect$1;-><init>(Landroidx/slidingpanelayout/widget/FoldingFeatureObserver;)V\nPLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1$invokeSuspend$$inlined$mapNotNull$1$2$1;-><init>(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V\nPLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1;-><init>(Landroidx/slidingpanelayout/widget/FoldingFeatureObserver;Landroid/app/Activity;Lkotlin/coroutines/Continuation;)V\nPLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLandroidx/slidingpanelayout/widget/FoldingFeatureObserver$registerLayoutStateChangeCallback$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/slidingpanelayout/widget/FoldingFeatureObserver;-><init>(Landroidx/window/layout/WindowInfoTracker;Ljava/util/concurrent/Executor;)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$1;-><init>(Landroidx/slidingpanelayout/widget/SlidingPaneLayout;)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$DragHelperCallback;-><init>(Ljava/lang/Object;I)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$DragHelperCallback;->getViewHorizontalDragRange(Landroid/view/View;)I\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$DragHelperCallback;->getViewVerticalDragRange(Landroid/view/View;)I\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$LayoutParams;-><clinit>()V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$SavedState;-><clinit>()V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$SavedState;-><init>(Landroid/os/Parcelable;)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$SavedState;->writeToParcel(Landroid/os/Parcel;I)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout$TouchBlocker;-><init>(Landroid/view/View;)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;-><clinit>()V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->computeScroll()V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->isOpen()Z\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onAttachedToWindow()V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onDetachedFromWindow()V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onSaveInstanceState()Landroid/os/Parcelable;\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->onSizeChanged(IIII)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->setFoldingFeatureObserver(Landroidx/slidingpanelayout/widget/FoldingFeatureObserver;)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->setLockMode(I)V\nPLandroidx/slidingpanelayout/widget/SlidingPaneLayout;->updateObscuredViewsVisibility(Landroid/view/View;)V\nPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;-><init>(I)V\nPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;-><init>(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Z)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$1;-><init>(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;Landroidx/sqlite/db/SupportSQLiteQuery;I)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$1;->newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;-><clinit>()V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;-><init>(Landroid/database/sqlite/SQLiteDatabase;)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionNonExclusive()V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteStatement;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->endTransaction()V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->inTransaction()Z\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isOpen()Z\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isWriteAheadLoggingEnabled()Z\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;)Landroid/database/Cursor;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Ljava/lang/String;)Landroid/database/Cursor;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->setTransactionSuccessful()V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$1;-><init>(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;[Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;-><init>(Landroid/content/Context;Ljava/lang/String;[Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWrappedDb(Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWrappedDb([Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWritableSupportDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;-><init>(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Z)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getDelegate()Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getWritableDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase;\nPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->setWriteAheadLoggingEnabled(Z)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;-><init>(Landroid/database/sqlite/SQLiteStatement;)V\nPLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->executeInsert()J\nPLandroidx/startup/AppInitializer;-><clinit>()V\nPLandroidx/startup/AppInitializer;-><init>(Landroid/content/Context;)V\nPLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/Set;)Ljava/lang/Object;\nPLandroidx/startup/InitializationProvider;-><init>()V\nPLandroidx/startup/InitializationProvider;->onCreate()Z\nPLandroidx/swiperefreshlayout/widget/CircleImageView;-><init>(Landroid/content/Context;I)V\nPLandroidx/swiperefreshlayout/widget/CircleImageView;->onMeasure(II)V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$2;-><init>(Landroidx/swiperefreshlayout/widget/CircularProgressDrawable;Landroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;)V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;-><init>()V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setColorIndex(I)V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable$Ring;->setShowArrow(Z)V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;-><clinit>()V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;-><init>(Landroid/content/Context;)V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->getOpacity()I\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setSizeParameters(FFFF)V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->setStyle(I)V\nPLandroidx/swiperefreshlayout/widget/CircularProgressDrawable;->stop()V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$1;-><init>(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;I)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout$2;-><init>(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout;I)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;-><clinit>()V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->canChildScrollUp()Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->dispatchNestedFling(FFZ)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->dispatchNestedPreFling(FF)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->dispatchNestedPreScroll(II[I[I)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->dispatchNestedScroll(IIII[I)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->ensureTarget()V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->getChildDrawingOrder(II)I\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->moveToStart(F)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onDetachedFromWindow()V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onLayout(ZIIII)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedFling(Landroid/view/View;FFZ)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedPreFling(Landroid/view/View;FF)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedPreScroll(Landroid/view/View;II[I)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedScroll(Landroid/view/View;IIII)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;I)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->onStopNestedScroll(Landroid/view/View;)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->requestDisallowInterceptTouchEvent(Z)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->reset()V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setColorSchemeColors([I)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setColorViewAlpha(I)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setEnabled(Z)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setNestedScrollingEnabled(Z)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setOnRefreshListener(Landroidx/swiperefreshlayout/widget/SwipeRefreshLayout$OnRefreshListener;)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setRefreshing(Z)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setRefreshing(ZZ)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->setTargetOffsetTopAndBottom(I)V\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->startNestedScroll(I)Z\nPLandroidx/swiperefreshlayout/widget/SwipeRefreshLayout;->stopNestedScroll()V\nPLandroidx/transition/AutoTransition;-><init>()V\nPLandroidx/transition/AutoTransition;->init()V\nPLandroidx/transition/ChangeBounds$1;-><init>(Ljava/lang/Class;Ljava/lang/String;)V\nPLandroidx/transition/ChangeBounds;-><clinit>()V\nPLandroidx/transition/ChangeBounds;-><init>()V\nPLandroidx/transition/Fade;-><init>(I)V\nPLandroidx/transition/GhostViewPort$1;-><init>(Ljava/lang/Object;I)V\nPLandroidx/transition/PathMotion;-><init>()V\nPLandroidx/transition/RectEvaluator;-><init>(I)V\nPLandroidx/transition/Styleable;-><clinit>()V\nPLandroidx/transition/Styleable;->Mutex$default(ZI)Lkotlinx/coroutines/sync/Mutex;\nPLandroidx/transition/Styleable;->getPackageCertificateHashBytes(Landroid/content/Context;Ljava/lang/String;)[B\nPLandroidx/transition/Styleable;->toArray(Ljava/util/Collection;)[Ljava/lang/Object;\nPLandroidx/transition/Styleable;->zzj(Ljava/lang/String;)Ljava/security/MessageDigest;\nPLandroidx/transition/Transition$1;-><init>()V\nPLandroidx/transition/Transition;-><clinit>()V\nPLandroidx/transition/Transition;->setDuration(J)Landroidx/transition/Transition;\nPLandroidx/transition/Transition;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroidx/transition/Transition;\nPLandroidx/transition/TransitionManager;-><clinit>()V\nPLandroidx/transition/TransitionManager;->beginDelayedTransition(Landroid/view/ViewGroup;Landroidx/transition/Transition;)V\nPLandroidx/transition/TransitionSet;-><init>()V\nPLandroidx/transition/TransitionSet;->addTransition(Landroidx/transition/Transition;)Landroidx/transition/TransitionSet;\nPLandroidx/transition/TransitionSet;->setDuration(J)Landroidx/transition/TransitionSet;\nPLandroidx/transition/TransitionSet;->setInterpolator(Landroid/animation/TimeInterpolator;)Landroidx/transition/TransitionSet;\nPLandroidx/transition/TransitionSet;->setOrdering(I)Landroidx/transition/TransitionSet;\nPLandroidx/transition/ViewOverlayApi14;-><init>()V\nPLandroidx/transition/ViewOverlayApi14;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLandroidx/transition/ViewOverlayApi14;-><init>(Ljava/lang/Object;I)V\nPLandroidx/transition/ViewOverlayApi14;->get()Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable;\nPLandroidx/transition/ViewOverlayApi14;->offer(Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable;)V\nPLandroidx/transition/ViewOverlayApi14;->zzb()V\nPLandroidx/transition/ViewOverlayApi14;->zzl()Lcom/google/android/gms/measurement/internal/zzai;\nPLandroidx/transition/ViewOverlayApi14;->zzm()Lcom/google/android/gms/common/util/Clock;\nPLandroidx/transition/ViewOverlayApi14;->zzp()Lcom/google/android/gms/measurement/internal/zzkm;\nPLandroidx/transition/ViewOverlayApi14;->zzq()Lcom/google/android/gms/measurement/internal/zzft;\nPLandroidx/transition/ViewOverlayApi14;->zzs()Lcom/google/android/gms/measurement/internal/zzfe;\nPLandroidx/transition/ViewOverlayApi18;-><init>(I)V\nPLandroidx/transition/ViewOverlayApi18;-><init>(Landroid/content/Context;)V\nPLandroidx/transition/ViewOverlayApi18;-><init>(Ljava/lang/Object;I)V\nPLandroidx/transition/ViewOverlayApi18;->build(Landroid/net/Uri;)Lcom/bumptech/glide/load/data/DataFetcher;\nPLandroidx/transition/ViewOverlayApi18;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLandroidx/transition/ViewOverlayApi18;->create()Ljava/lang/Object;\nPLandroidx/transition/ViewOverlayApi18;->getBoolean(Ljava/lang/String;)Z\nPLandroidx/transition/ViewOverlayApi18;->put(Ljava/lang/Class;Ljava/util/List;)V\nPLandroidx/transition/ViewOverlayApi18;->zza()V\nPLandroidx/transition/ViewOverlayApi18;->zza(JZ)V\nPLandroidx/transition/ViewOverlayApi18;->zza(Landroid/content/Context;)Z\nPLandroidx/transition/ViewOverlayApi18;->zzd()Z\nPLandroidx/transition/ViewUtils$1;-><init>(Ljava/lang/Class;Ljava/lang/String;I)V\nPLandroidx/transition/ViewUtilsBase;-><init>(I)V\nPLandroidx/transition/ViewUtilsBase;-><init>(Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V\nPLandroidx/transition/ViewUtilsBase;-><init>(Ljava/lang/Object;I)V\nPLandroidx/transition/ViewUtilsBase;->build(Landroid/net/Uri;)Lcom/bumptech/glide/load/data/DataFetcher;\nPLandroidx/transition/ViewUtilsBase;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLandroidx/transition/ViewUtilsBase;->cleanup()V\nPLandroidx/transition/ViewUtilsBase;->execute()Ljava/lang/Object;\nPLandroidx/transition/ViewUtilsBase;->rewindAndGet()Ljava/lang/Object;\nPLandroidx/transition/Visibility;-><clinit>()V\nPLandroidx/transition/Visibility;-><init>()V\nPLandroidx/transition/Visibility;->setMode(I)V\nPLandroidx/viewpager/widget/ViewPager$2;-><init>(I)V\nPLandroidx/viewpager/widget/ViewPager$MyAccessibilityDelegate;-><init>(Landroid/view/View;I)V\nPLandroidx/window/core/Version;-><clinit>()V\nPLandroidx/window/core/Version;-><init>(IIILjava/lang/String;)V\nPLandroidx/window/core/Version;->compareTo(Landroidx/window/core/Version;)I\nPLandroidx/window/layout/SafeWindowLayoutComponentProvider$isFoldingFeatureValid$1;-><init>(Ljava/lang/ClassLoader;I)V\nPLandroidx/window/layout/SafeWindowLayoutComponentProvider$isFoldingFeatureValid$1;->invoke()Ljava/lang/Boolean;\nPLandroidx/window/layout/SafeWindowLayoutComponentProvider$isFoldingFeatureValid$1;->invoke()Ljava/lang/Object;\nPLandroidx/window/layout/SafeWindowLayoutComponentProvider;-><clinit>()V\nPLandroidx/window/layout/SafeWindowLayoutComponentProvider;-><init>()V\nPLandroidx/window/layout/SafeWindowLayoutComponentProvider;->getWindowLayoutComponent()Landroidx/window/extensions/layout/WindowLayoutComponent;\nPLandroidx/window/layout/SafeWindowLayoutComponentProvider;->validate(Lkotlin/jvm/functions/Function0;)Z\nPLandroidx/window/layout/SidecarAdapter;-><clinit>()V\nPLandroidx/window/layout/SidecarAdapter;-><init>(II)V\nPLandroidx/window/layout/SidecarAdapter;->translate(Landroidx/window/sidecar/SidecarWindowLayoutInfo;Landroidx/window/sidecar/SidecarDeviceState;)Landroidx/window/layout/WindowLayoutInfo;\nPLandroidx/window/layout/SidecarAdapter;->translate(Ljava/util/List;Landroidx/window/sidecar/SidecarDeviceState;)Ljava/util/List;\nPLandroidx/window/layout/SidecarCompat$Companion;-><init>(I)V\nPLandroidx/window/layout/SidecarCompat$Companion;-><init>(Lkotlin/LazyKt__LazyKt;I)V\nPLandroidx/window/layout/SidecarCompat$Companion;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLandroidx/window/layout/SidecarCompat$Companion;->create()Ljava/lang/Object;\nPLandroidx/window/layout/SidecarCompat$Companion;->getActivityWindowToken$window_release(Landroid/app/Activity;)Landroid/os/IBinder;\nPLandroidx/window/layout/SidecarCompat$Companion;->getRawSidecarDevicePosture(Landroidx/window/sidecar/SidecarDeviceState;)I\nPLandroidx/window/layout/SidecarCompat$Companion;->getSidecarCompat$window_release(Landroid/content/Context;)Landroidx/window/sidecar/SidecarInterface;\nPLandroidx/window/layout/SidecarCompat$Companion;->getSidecarDisplayFeatures(Landroidx/window/sidecar/SidecarWindowLayoutInfo;)Ljava/util/List;\nPLandroidx/window/layout/SidecarCompat$Companion;->getSidecarVersion()Landroidx/window/core/Version;\nPLandroidx/window/layout/SidecarCompat$Companion;->setSidecarDevicePosture(Landroidx/window/sidecar/SidecarDeviceState;I)V\nPLandroidx/window/layout/SidecarCompat$DistinctElementCallback;-><init>(Landroidx/window/layout/ExtensionInterfaceCompat$ExtensionCallbackInterface;)V\nPLandroidx/window/layout/SidecarCompat$DistinctElementCallback;->onWindowLayoutChanged(Landroid/app/Activity;Landroidx/window/layout/WindowLayoutInfo;)V\nPLandroidx/window/layout/SidecarCompat$DistinctSidecarElementCallback;-><init>(Landroidx/window/layout/SidecarAdapter;Landroidx/window/sidecar/SidecarInterface$SidecarCallback;)V\nPLandroidx/window/layout/SidecarCompat$TranslatingCallback;-><init>(Landroidx/window/layout/SidecarCompat;)V\nPLandroidx/window/layout/SidecarCompat$registerConfigurationChangeListener$configChangeObserver$1;-><init>(Landroidx/window/layout/SidecarCompat;Landroid/app/Activity;)V\nPLandroidx/window/layout/SidecarCompat;-><clinit>()V\nPLandroidx/window/layout/SidecarCompat;-><init>(Landroid/content/Context;)V\nPLandroidx/window/layout/SidecarCompat;->getWindowLayoutInfo(Landroid/app/Activity;)Landroidx/window/layout/WindowLayoutInfo;\nPLandroidx/window/layout/SidecarCompat;->onWindowLayoutChangeListenerRemoved(Landroid/app/Activity;)V\nPLandroidx/window/layout/SidecarCompat;->register(Landroid/os/IBinder;Landroid/app/Activity;)V\nPLandroidx/window/layout/SidecarCompat;->setExtensionCallback(Landroidx/window/layout/ExtensionInterfaceCompat$ExtensionCallbackInterface;)V\nPLandroidx/window/layout/SidecarCompat;->validateExtensionInterface()Z\nPLandroidx/window/layout/SidecarWindowBackend$ExtensionListenerImpl;-><init>(Landroidx/window/layout/SidecarWindowBackend;)V\nPLandroidx/window/layout/SidecarWindowBackend$ExtensionListenerImpl;->onWindowLayoutChanged(Landroid/app/Activity;Landroidx/window/layout/WindowLayoutInfo;)V\nPLandroidx/window/layout/SidecarWindowBackend$WindowLayoutChangeCallbackWrapper;-><init>(Landroid/app/Activity;Ljava/util/concurrent/Executor;Landroidx/core/util/Consumer;)V\nPLandroidx/window/layout/SidecarWindowBackend;-><clinit>()V\nPLandroidx/window/layout/SidecarWindowBackend;-><init>(Landroidx/window/layout/ExtensionInterfaceCompat;)V\nPLandroidx/window/layout/SidecarWindowBackend;->registerLayoutChangeCallback(Landroid/app/Activity;Ljava/util/concurrent/Executor;Landroidx/core/util/Consumer;)V\nPLandroidx/window/layout/SidecarWindowBackend;->unregisterLayoutChangeCallback(Landroidx/core/util/Consumer;)V\nPLandroidx/window/layout/WindowInfoTracker$Companion;-><clinit>()V\nPLandroidx/window/layout/WindowInfoTracker$Companion;-><init>()V\nPLandroidx/window/layout/WindowInfoTracker;-><clinit>()V\nPLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1$$ExternalSyntheticLambda0;-><init>(Lkotlinx/coroutines/channels/Channel;)V\nPLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V\nPLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1;-><init>(Landroidx/window/layout/WindowInfoTrackerImpl;Landroid/app/Activity;Lkotlin/coroutines/Continuation;)V\nPLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/window/layout/WindowInfoTrackerImpl$windowLayoutInfo$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLandroidx/window/layout/WindowInfoTrackerImpl;-><init>(Landroidx/window/layout/WindowMetricsCalculator;Landroidx/window/layout/WindowBackend;)V\nPLandroidx/window/layout/WindowLayoutInfo;-><init>(Ljava/util/List;)V\nPLandroidx/window/layout/WindowLayoutInfo;->equals(Ljava/lang/Object;)Z\nPLcom/airbnb/lottie/LottieCompositionFactory$7;-><init>(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V\nPLcom/airbnb/lottie/LottieCompositionFactory$7;->call()Lcom/google/android/gms/tasks/Task;\nPLcom/airbnb/lottie/LottieCompositionFactory$7;->call()Ljava/lang/Object;\nPLcom/airbnb/lottie/LottieCompositionFactory$7;->call()Ljava/lang/Void;\nPLcom/airbnb/lottie/model/animatable/AnimatableTextFrame;-><init>(I)V\nPLcom/airbnb/lottie/model/animatable/AnimatableTextFrame;->create()Lcom/bumptech/glide/load/engine/bitmap_recycle/Poolable;\nPLcom/airbnb/lottie/model/animatable/AnimatableTextFrame;->get(ILjava/lang/Class;)Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;\nPLcom/airbnb/lottie/parser/GradientColorParser;-><init>(II)V\nPLcom/airbnb/lottie/parser/IntegerParser;-><clinit>()V\nPLcom/airbnb/lottie/parser/IntegerParser;-><init>()V\nPLcom/airbnb/lottie/parser/IntegerParser;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/airbnb/lottie/parser/PathParser;-><clinit>()V\nPLcom/airbnb/lottie/parser/PathParser;-><init>()V\nPLcom/airbnb/lottie/parser/PointFParser;-><clinit>()V\nPLcom/airbnb/lottie/parser/PointFParser;-><init>()V\nPLcom/airbnb/lottie/parser/ScaleXYParser;-><clinit>()V\nPLcom/airbnb/lottie/parser/ScaleXYParser;-><init>()V\nPLcom/airbnb/lottie/parser/ShapeDataParser;-><clinit>()V\nPLcom/airbnb/lottie/parser/ShapeDataParser;-><init>()V\nPLcom/airbnb/lottie/parser/ShapeDataParser;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/bumptech/glide/GenericTransitionOptions;-><init>()V\nPLcom/bumptech/glide/Glide;-><init>(Landroid/content/Context;Lcom/bumptech/glide/load/engine/Engine;Lcom/bumptech/glide/load/model/ModelCache$1;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;Lcom/bumptech/glide/manager/RequestManagerRetriever;Lcom/google/android/gms/dynamite/zza;ILcom/bumptech/glide/request/RequestOptions;Ljava/util/Map;Ljava/util/List;Z)V\nPLcom/bumptech/glide/Glide;->checkAndInitializeGlide(Landroid/content/Context;)V\nPLcom/bumptech/glide/Glide;->get(Landroid/content/Context;)Lcom/bumptech/glide/Glide;\nPLcom/bumptech/glide/Glide;->onTrimMemory(I)V\nPLcom/bumptech/glide/Glide;->with(Landroid/content/Context;)Lcom/bumptech/glide/RequestManager;\nPLcom/bumptech/glide/GlideBuilder;-><init>()V\nPLcom/bumptech/glide/GlideContext;-><clinit>()V\nPLcom/bumptech/glide/GlideContext;-><init>(Landroid/content/Context;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;Lcom/bumptech/glide/Registry;Lcom/google/android/gms/dynamite/zza;Lcom/bumptech/glide/request/RequestOptions;Ljava/util/Map;Ljava/util/List;Lcom/bumptech/glide/load/engine/Engine;ZI)V\nPLcom/bumptech/glide/Priority;-><clinit>()V\nPLcom/bumptech/glide/Priority;-><init>(Ljava/lang/String;I)V\nPLcom/bumptech/glide/Registry;-><init>()V\nPLcom/bumptech/glide/Registry;->append(Ljava/lang/Class;Lcom/bumptech/glide/load/Encoder;)Lcom/bumptech/glide/Registry;\nPLcom/bumptech/glide/Registry;->append(Ljava/lang/Class;Lcom/bumptech/glide/load/ResourceEncoder;)Lcom/bumptech/glide/Registry;\nPLcom/bumptech/glide/Registry;->append(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/model/ModelLoaderFactory;)Lcom/bumptech/glide/Registry;\nPLcom/bumptech/glide/Registry;->append(Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/ResourceDecoder;)Lcom/bumptech/glide/Registry;\nPLcom/bumptech/glide/Registry;->getImageHeaderParsers()Ljava/util/List;\nPLcom/bumptech/glide/Registry;->getModelLoaders(Ljava/lang/Object;)Ljava/util/List;\nPLcom/bumptech/glide/Registry;->register(Lcom/bumptech/glide/load/data/DataRewinder$Factory;)Lcom/bumptech/glide/Registry;\nPLcom/bumptech/glide/Registry;->register(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/resource/transcode/ResourceTranscoder;)Lcom/bumptech/glide/Registry;\nPLcom/bumptech/glide/RequestBuilder;-><clinit>()V\nPLcom/bumptech/glide/RequestBuilder;-><init>(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/RequestManager;Ljava/lang/Class;Landroid/content/Context;)V\nPLcom/bumptech/glide/RequestBuilder;->apply(Lcom/bumptech/glide/request/BaseRequestOptions;)Lcom/bumptech/glide/RequestBuilder;\nPLcom/bumptech/glide/RequestBuilder;->buildRequestRecursive(Lcom/bumptech/glide/request/target/BaseTarget;Lcom/google/samples/apps/iosched/ui/speaker/SpeakerBindingAdaptersKt$speakerImage$1;Lcom/bumptech/glide/request/RequestCoordinator;Lcom/bumptech/glide/GenericTransitionOptions;Lcom/bumptech/glide/Priority;IILcom/bumptech/glide/request/BaseRequestOptions;Ljava/util/concurrent/Executor;)Lcom/bumptech/glide/request/Request;\nPLcom/bumptech/glide/RequestBuilder;->into(Lcom/bumptech/glide/request/target/BaseTarget;)Lcom/bumptech/glide/request/target/BaseTarget;\nPLcom/bumptech/glide/RequestBuilder;->into(Lcom/bumptech/glide/request/target/BaseTarget;Lcom/google/samples/apps/iosched/ui/speaker/SpeakerBindingAdaptersKt$speakerImage$1;Lcom/bumptech/glide/request/BaseRequestOptions;Ljava/util/concurrent/Executor;)Lcom/bumptech/glide/request/target/BaseTarget;\nPLcom/bumptech/glide/RequestBuilder;->obtainRequest(Lcom/bumptech/glide/request/target/BaseTarget;Lcom/google/samples/apps/iosched/ui/speaker/SpeakerBindingAdaptersKt$speakerImage$1;Lcom/bumptech/glide/request/BaseRequestOptions;Lcom/bumptech/glide/request/RequestCoordinator;Lcom/bumptech/glide/GenericTransitionOptions;Lcom/bumptech/glide/Priority;IILjava/util/concurrent/Executor;)Lcom/bumptech/glide/request/Request;\nPLcom/bumptech/glide/RequestManager;-><clinit>()V\nPLcom/bumptech/glide/RequestManager;-><init>(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/manager/Lifecycle;Lcom/bumptech/glide/manager/RequestManagerTreeNode;Landroid/content/Context;)V\nPLcom/bumptech/glide/RequestManager;->asDrawable()Lcom/bumptech/glide/RequestBuilder;\nPLcom/bumptech/glide/RequestManager;->clear(Lcom/bumptech/glide/request/target/BaseTarget;)V\nPLcom/bumptech/glide/RequestManager;->load(Landroid/graphics/drawable/Drawable;)Lcom/bumptech/glide/RequestBuilder;\nPLcom/bumptech/glide/RequestManager;->onDestroy()V\nPLcom/bumptech/glide/RequestManager;->onStart()V\nPLcom/bumptech/glide/RequestManager;->onStop()V\nPLcom/bumptech/glide/RequestManager;->untrack(Lcom/bumptech/glide/request/target/BaseTarget;)Z\nPLcom/bumptech/glide/RequestManager;->untrackOrDelegate(Lcom/bumptech/glide/request/target/BaseTarget;)V\nPLcom/bumptech/glide/disklrucache/DiskLruCache$DiskLruCacheThreadFactory;-><init>(Lcom/google/firebase/iid/zzy;)V\nPLcom/bumptech/glide/disklrucache/DiskLruCache$Entry;-><init>(Lcom/bumptech/glide/disklrucache/DiskLruCache;Ljava/lang/String;Lcom/google/firebase/iid/zzy;)V\nPLcom/bumptech/glide/disklrucache/DiskLruCache;-><init>(Ljava/io/File;IIJ)V\nPLcom/bumptech/glide/disklrucache/DiskLruCache;->checkNotClosed()V\nPLcom/bumptech/glide/disklrucache/DiskLruCache;->deleteIfExists(Ljava/io/File;)V\nPLcom/bumptech/glide/disklrucache/DiskLruCache;->get(Ljava/lang/String;)Lcom/google/android/gms/measurement/internal/zzfl;\nPLcom/bumptech/glide/disklrucache/DiskLruCache;->journalRebuildRequired()Z\nPLcom/bumptech/glide/disklrucache/DiskLruCache;->open(Ljava/io/File;IIJ)Lcom/bumptech/glide/disklrucache/DiskLruCache;\nPLcom/bumptech/glide/disklrucache/DiskLruCache;->processJournal()V\nPLcom/bumptech/glide/disklrucache/DiskLruCache;->readJournal()V\nPLcom/bumptech/glide/disklrucache/DiskLruCache;->readJournalLine(Ljava/lang/String;)V\nPLcom/bumptech/glide/disklrucache/StrictLineReader;-><init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V\nPLcom/bumptech/glide/disklrucache/StrictLineReader;->close()V\nPLcom/bumptech/glide/disklrucache/StrictLineReader;->fillBuf()V\nPLcom/bumptech/glide/disklrucache/StrictLineReader;->readLine()Ljava/lang/String;\nPLcom/bumptech/glide/disklrucache/Util;-><clinit>()V\nPLcom/bumptech/glide/load/DataSource;-><clinit>()V\nPLcom/bumptech/glide/load/DataSource;-><init>(Ljava/lang/String;I)V\nPLcom/bumptech/glide/load/DecodeFormat;-><clinit>()V\nPLcom/bumptech/glide/load/DecodeFormat;-><init>(Ljava/lang/String;I)V\nPLcom/bumptech/glide/load/ImageHeaderParser$ImageType;-><clinit>()V\nPLcom/bumptech/glide/load/ImageHeaderParser$ImageType;-><init>(Ljava/lang/String;IZ)V\nPLcom/bumptech/glide/load/ImageHeaderParser$ImageType;->values()[Lcom/bumptech/glide/load/ImageHeaderParser$ImageType;\nPLcom/bumptech/glide/load/Key;-><clinit>()V\nPLcom/bumptech/glide/load/Option$1;-><clinit>()V\nPLcom/bumptech/glide/load/Option$1;-><init>()V\nPLcom/bumptech/glide/load/Option$1;->readFrom(Ljava/io/InputStream;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/bumptech/glide/load/Option$1;->runMigrations(Ljava/util/List;Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/bumptech/glide/load/Option$1;->update([BLjava/lang/Object;Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/load/Option;-><clinit>()V\nPLcom/bumptech/glide/load/Option;-><init>(Ljava/lang/String;Ljava/lang/Object;Lcom/bumptech/glide/load/Option$CacheKeyUpdater;)V\nPLcom/bumptech/glide/load/Option;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/Option;->hashCode()I\nPLcom/bumptech/glide/load/Option;->memory(Ljava/lang/String;Ljava/lang/Object;)Lcom/bumptech/glide/load/Option;\nPLcom/bumptech/glide/load/Options;-><init>()V\nPLcom/bumptech/glide/load/Options;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/Options;->get(Lcom/bumptech/glide/load/Option;)Ljava/lang/Object;\nPLcom/bumptech/glide/load/Options;->hashCode()I\nPLcom/bumptech/glide/load/Options;->putAll(Lcom/bumptech/glide/load/Options;)V\nPLcom/bumptech/glide/load/Options;->updateDiskCacheKey(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/load/data/DataRewinderRegistry$1;-><init>(I)V\nPLcom/bumptech/glide/load/data/DataRewinderRegistry$1;->build(Ljava/lang/Object;)Lcom/bumptech/glide/load/data/DataRewinder;\nPLcom/bumptech/glide/load/data/DataRewinderRegistry$1;->getDataClass()Ljava/lang/Class;\nPLcom/bumptech/glide/load/data/DataRewinderRegistry;-><clinit>()V\nPLcom/bumptech/glide/load/data/DataRewinderRegistry;-><init>()V\nPLcom/bumptech/glide/load/data/FileDescriptorLocalUriFetcher;-><init>(Landroid/content/ContentResolver;Landroid/net/Uri;I)V\nPLcom/bumptech/glide/load/data/FileDescriptorLocalUriFetcher;->getDataClass()Ljava/lang/Class;\nPLcom/bumptech/glide/load/data/FileDescriptorLocalUriFetcher;->loadResource(Landroid/net/Uri;Landroid/content/ContentResolver;)Ljava/lang/Object;\nPLcom/bumptech/glide/load/data/InputStreamRewinder$Factory;-><init>(Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V\nPLcom/bumptech/glide/load/data/InputStreamRewinder$Factory;->build(Ljava/lang/Object;)Lcom/bumptech/glide/load/data/DataRewinder;\nPLcom/bumptech/glide/load/data/InputStreamRewinder$Factory;->getDataClass()Ljava/lang/Class;\nPLcom/bumptech/glide/load/data/LocalUriFetcher;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/bumptech/glide/load/data/LocalUriFetcher;->cleanup()V\nPLcom/bumptech/glide/load/data/LocalUriFetcher;->getDataSource()Lcom/bumptech/glide/load/DataSource;\nPLcom/bumptech/glide/load/data/LocalUriFetcher;->loadData(Lcom/bumptech/glide/Priority;Lcom/bumptech/glide/load/data/DataFetcher$DataCallback;)V\nPLcom/bumptech/glide/load/data/StreamLocalUriFetcher;-><clinit>()V\nPLcom/bumptech/glide/load/data/StreamLocalUriFetcher;-><init>(Landroid/content/ContentResolver;Landroid/net/Uri;)V\nPLcom/bumptech/glide/load/data/StreamLocalUriFetcher;->close(Ljava/lang/Object;)V\nPLcom/bumptech/glide/load/data/StreamLocalUriFetcher;->getDataClass()Ljava/lang/Class;\nPLcom/bumptech/glide/load/data/StreamLocalUriFetcher;->loadResource(Landroid/net/Uri;Landroid/content/ContentResolver;)Ljava/lang/Object;\nPLcom/bumptech/glide/load/engine/ActiveResources$1;-><init>()V\nPLcom/bumptech/glide/load/engine/ActiveResources$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;\nPLcom/bumptech/glide/load/engine/ActiveResources$ResourceWeakReference;-><init>(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/EngineResource;Ljava/lang/ref/ReferenceQueue;Z)V\nPLcom/bumptech/glide/load/engine/ActiveResources;-><init>(Z)V\nPLcom/bumptech/glide/load/engine/ActiveResources;->activate(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/EngineResource;)V\nPLcom/bumptech/glide/load/engine/DataCacheGenerator;-><init>(Lcom/bumptech/glide/load/engine/DecodeHelper;Lcom/bumptech/glide/load/engine/DataFetcherGenerator$FetcherReadyCallback;)V\nPLcom/bumptech/glide/load/engine/DataCacheGenerator;->startNext()Z\nPLcom/bumptech/glide/load/engine/DataCacheKey;-><init>(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/Key;)V\nPLcom/bumptech/glide/load/engine/DataCacheKey;->hashCode()I\nPLcom/bumptech/glide/load/engine/DataCacheKey;->updateDiskCacheKey(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/load/engine/DataCacheWriter;-><init>()V\nPLcom/bumptech/glide/load/engine/DataCacheWriter;-><init>(Lcom/bumptech/glide/load/Encoder;Ljava/lang/Object;Lcom/bumptech/glide/load/Options;)V\nPLcom/bumptech/glide/load/engine/DataCacheWriter;-><init>(Lcom/bumptech/glide/load/engine/Engine;Lcom/bumptech/glide/request/ResourceCallback;Lcom/bumptech/glide/load/engine/EngineJob;)V\nPLcom/bumptech/glide/load/engine/DataCacheWriter;->encode(Lcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;Lcom/bumptech/glide/load/Options;)V\nPLcom/bumptech/glide/load/engine/DecodeHelper;-><init>()V\nPLcom/bumptech/glide/load/engine/DecodeHelper;->getCacheKeys()Ljava/util/List;\nPLcom/bumptech/glide/load/engine/DecodeHelper;->getDiskCache()Lcom/bumptech/glide/load/engine/cache/DiskCache;\nPLcom/bumptech/glide/load/engine/DecodeHelper;->getLoadData()Ljava/util/List;\nPLcom/bumptech/glide/load/engine/DecodeHelper;->getTransformation(Ljava/lang/Class;)Lcom/bumptech/glide/load/Transformation;\nPLcom/bumptech/glide/load/engine/DecodeHelper;->hasLoadPath(Ljava/lang/Class;)Z\nPLcom/bumptech/glide/load/engine/DecodeJob$ReleaseManager;-><init>()V\nPLcom/bumptech/glide/load/engine/DecodeJob$ReleaseManager;->isComplete(Z)Z\nPLcom/bumptech/glide/load/engine/DecodeJob;-><init>(Lcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;Landroidx/core/util/Pools$Pool;)V\nPLcom/bumptech/glide/load/engine/DecodeJob;->decodeFromData(Lcom/bumptech/glide/load/data/DataFetcher;Ljava/lang/Object;Lcom/bumptech/glide/load/DataSource;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/engine/DecodeJob;->decodeFromFetcher(Ljava/lang/Object;Lcom/bumptech/glide/load/DataSource;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/engine/DecodeJob;->decodeFromRetrievedData()V\nPLcom/bumptech/glide/load/engine/DecodeJob;->getNextGenerator()Lcom/bumptech/glide/load/engine/DataFetcherGenerator;\nPLcom/bumptech/glide/load/engine/DecodeJob;->getNextStage$enumunboxing$(I)I\nPLcom/bumptech/glide/load/engine/DecodeJob;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;\nPLcom/bumptech/glide/load/engine/DecodeJob;->notifyFailed()V\nPLcom/bumptech/glide/load/engine/DecodeJob;->onDataFetcherFailed(Lcom/bumptech/glide/load/Key;Ljava/lang/Exception;Lcom/bumptech/glide/load/data/DataFetcher;Lcom/bumptech/glide/load/DataSource;)V\nPLcom/bumptech/glide/load/engine/DecodeJob;->onDataFetcherReady(Lcom/bumptech/glide/load/Key;Ljava/lang/Object;Lcom/bumptech/glide/load/data/DataFetcher;Lcom/bumptech/glide/load/DataSource;Lcom/bumptech/glide/load/Key;)V\nPLcom/bumptech/glide/load/engine/DecodeJob;->releaseInternal()V\nPLcom/bumptech/glide/load/engine/DecodeJob;->run()V\nPLcom/bumptech/glide/load/engine/DecodeJob;->runGenerators()V\nPLcom/bumptech/glide/load/engine/DecodeJob;->runWrapped()V\nPLcom/bumptech/glide/load/engine/DecodeJob;->setNotifiedOrThrow()V\nPLcom/bumptech/glide/load/engine/DecodePath;-><init>(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;Ljava/util/List;Lcom/bumptech/glide/load/resource/transcode/ResourceTranscoder;Landroidx/core/util/Pools$Pool;)V\nPLcom/bumptech/glide/load/engine/DecodePath;->decode(Lcom/bumptech/glide/load/data/DataRewinder;IILcom/bumptech/glide/load/Options;Lcom/google/firebase/messaging/zzj;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/engine/DecodePath;->decodeResourceWithList(Lcom/bumptech/glide/load/data/DataRewinder;IILcom/bumptech/glide/load/Options;Ljava/util/List;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/engine/DiskCacheStrategy$1;-><init>(I)V\nPLcom/bumptech/glide/load/engine/DiskCacheStrategy$1;->isDataCacheable(Lcom/bumptech/glide/load/DataSource;)Z\nPLcom/bumptech/glide/load/engine/DiskCacheStrategy;-><clinit>()V\nPLcom/bumptech/glide/load/engine/DiskCacheStrategy;-><init>()V\nPLcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;-><init>(Lcom/bumptech/glide/load/engine/cache/DiskLruCacheFactory;)V\nPLcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;->getDiskCache()Lcom/bumptech/glide/load/engine/cache/DiskCache;\nPLcom/bumptech/glide/load/engine/Engine;-><clinit>()V\nPLcom/bumptech/glide/load/engine/Engine;-><init>(Lcom/bumptech/glide/load/model/ModelCache$1;Lcom/bumptech/glide/load/engine/cache/DiskLruCacheFactory;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Z)V\nPLcom/bumptech/glide/load/engine/Engine;->load(Lcom/bumptech/glide/GlideContext;Ljava/lang/Object;Lcom/bumptech/glide/load/Key;IILjava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/Priority;Lcom/bumptech/glide/load/engine/DiskCacheStrategy;Ljava/util/Map;ZZLcom/bumptech/glide/load/Options;ZZZZLcom/bumptech/glide/request/ResourceCallback;Ljava/util/concurrent/Executor;)Lcom/bumptech/glide/load/engine/DataCacheWriter;\nPLcom/bumptech/glide/load/engine/Engine;->loadFromCache(Lcom/bumptech/glide/load/Key;Z)Lcom/bumptech/glide/load/engine/EngineResource;\nPLcom/bumptech/glide/load/engine/Engine;->onEngineJobComplete(Lcom/bumptech/glide/load/engine/EngineJob;Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/EngineResource;)V\nPLcom/bumptech/glide/load/engine/Engine;->onResourceReleased(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/EngineResource;)V\nPLcom/bumptech/glide/load/engine/EngineJob$CallLoadFailed;-><init>(Lcom/bumptech/glide/load/engine/EngineJob;Lcom/bumptech/glide/request/ResourceCallback;I)V\nPLcom/bumptech/glide/load/engine/EngineJob$CallLoadFailed;->run()V\nPLcom/bumptech/glide/load/engine/EngineJob$ResourceCallbackAndExecutor;-><init>(Lcom/bumptech/glide/request/ResourceCallback;Ljava/util/concurrent/Executor;)V\nPLcom/bumptech/glide/load/engine/EngineJob$ResourceCallbackAndExecutor;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/engine/EngineJob$ResourceCallbacksAndExecutors;-><init>()V\nPLcom/bumptech/glide/load/engine/EngineJob$ResourceCallbacksAndExecutors;->isEmpty()Z\nPLcom/bumptech/glide/load/engine/EngineJob;-><clinit>()V\nPLcom/bumptech/glide/load/engine/EngineJob;-><init>(Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/executor/GlideExecutor;Lcom/bumptech/glide/load/engine/EngineJobListener;Landroidx/core/util/Pools$Pool;)V\nPLcom/bumptech/glide/load/engine/EngineJob;->addCallback(Lcom/bumptech/glide/request/ResourceCallback;Ljava/util/concurrent/Executor;)V\nPLcom/bumptech/glide/load/engine/EngineJob;->cancel()V\nPLcom/bumptech/glide/load/engine/EngineJob;->decrementPendingCallbacks()V\nPLcom/bumptech/glide/load/engine/EngineJob;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;\nPLcom/bumptech/glide/load/engine/EngineJob;->incrementPendingCallbacks(I)V\nPLcom/bumptech/glide/load/engine/EngineJob;->isDone()Z\nPLcom/bumptech/glide/load/engine/EngineJob;->release()V\nPLcom/bumptech/glide/load/engine/EngineJob;->removeCallback(Lcom/bumptech/glide/request/ResourceCallback;)V\nPLcom/bumptech/glide/load/engine/EngineJob;->reschedule(Lcom/bumptech/glide/load/engine/DecodeJob;)V\nPLcom/bumptech/glide/load/engine/EngineJob;->start(Lcom/bumptech/glide/load/engine/DecodeJob;)V\nPLcom/bumptech/glide/load/engine/EngineKey;-><init>(Ljava/lang/Object;Lcom/bumptech/glide/load/Key;IILjava/util/Map;Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/Options;)V\nPLcom/bumptech/glide/load/engine/EngineKey;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/engine/EngineKey;->hashCode()I\nPLcom/bumptech/glide/load/engine/EngineResource;-><init>(Lcom/bumptech/glide/load/engine/Resource;ZZ)V\nPLcom/bumptech/glide/load/engine/EngineResource;->acquire()V\nPLcom/bumptech/glide/load/engine/EngineResource;->get()Ljava/lang/Object;\nPLcom/bumptech/glide/load/engine/EngineResource;->getSize()I\nPLcom/bumptech/glide/load/engine/EngineResource;->release()V\nPLcom/bumptech/glide/load/engine/GlideException;-><clinit>()V\nPLcom/bumptech/glide/load/engine/GlideException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V\nPLcom/bumptech/glide/load/engine/GlideException;-><init>(Ljava/lang/String;Ljava/util/List;)V\nPLcom/bumptech/glide/load/engine/GlideException;->fillInStackTrace()Ljava/lang/Throwable;\nPLcom/bumptech/glide/load/engine/Jobs;-><init>(I)V\nPLcom/bumptech/glide/load/engine/Jobs;->getJobMap(Z)Ljava/util/Map;\nPLcom/bumptech/glide/load/engine/LoadPath;-><init>(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;Ljava/util/List;Landroidx/core/util/Pools$Pool;)V\nPLcom/bumptech/glide/load/engine/LoadPath;->load(Lcom/bumptech/glide/load/data/DataRewinder;Lcom/bumptech/glide/load/Options;IILcom/google/firebase/messaging/zzj;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/engine/LockedResource;-><clinit>()V\nPLcom/bumptech/glide/load/engine/LockedResource;-><init>()V\nPLcom/bumptech/glide/load/engine/LockedResource;->get()Ljava/lang/Object;\nPLcom/bumptech/glide/load/engine/LockedResource;->getSize()I\nPLcom/bumptech/glide/load/engine/LockedResource;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;\nPLcom/bumptech/glide/load/engine/LockedResource;->obtain(Lcom/bumptech/glide/load/engine/Resource;)Lcom/bumptech/glide/load/engine/LockedResource;\nPLcom/bumptech/glide/load/engine/LockedResource;->unlock()V\nPLcom/bumptech/glide/load/engine/ResourceCacheGenerator;-><init>(Lcom/bumptech/glide/load/engine/DecodeHelper;Lcom/bumptech/glide/load/engine/DataFetcherGenerator$FetcherReadyCallback;)V\nPLcom/bumptech/glide/load/engine/ResourceCacheGenerator;->startNext()Z\nPLcom/bumptech/glide/load/engine/ResourceCacheKey;-><clinit>()V\nPLcom/bumptech/glide/load/engine/ResourceCacheKey;-><init>(Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/Key;IILcom/bumptech/glide/load/Transformation;Ljava/lang/Class;Lcom/bumptech/glide/load/Options;)V\nPLcom/bumptech/glide/load/engine/ResourceCacheKey;->hashCode()I\nPLcom/bumptech/glide/load/engine/ResourceCacheKey;->updateDiskCacheKey(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/load/engine/ResourceRecycler$ResourceRecyclerCallback;-><init>()V\nPLcom/bumptech/glide/load/engine/SourceGenerator;-><init>(Lcom/bumptech/glide/load/engine/DecodeHelper;Lcom/bumptech/glide/load/engine/DataFetcherGenerator$FetcherReadyCallback;)V\nPLcom/bumptech/glide/load/engine/SourceGenerator;->onDataReady(Ljava/lang/Object;)V\nPLcom/bumptech/glide/load/engine/SourceGenerator;->onLoadFailed(Ljava/lang/Exception;)V\nPLcom/bumptech/glide/load/engine/SourceGenerator;->startNext()Z\nPLcom/bumptech/glide/load/engine/bitmap_recycle/ByteArrayAdapter;-><init>(I)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/ByteArrayAdapter;->getArrayLength(Ljava/lang/Object;)I\nPLcom/bumptech/glide/load/engine/bitmap_recycle/ByteArrayAdapter;->getElementSizeInBytes()I\nPLcom/bumptech/glide/load/engine/bitmap_recycle/ByteArrayAdapter;->getTag()Ljava/lang/String;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap$LinkedEntry;-><init>(Ljava/lang/Object;)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/GroupedLinkedMap$LinkedEntry;->removeLast()Ljava/lang/Object;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;-><init>(Lcom/airbnb/lottie/model/animatable/AnimatableTextFrame;)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;->hashCode()I\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;->offer()V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;-><init>(I)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->decrementArrayOfSize(ILjava/lang/Class;)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->evictToSize(I)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->get(ILjava/lang/Class;)Ljava/lang/Object;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->getAdapterFromType(Ljava/lang/Class;)Lcom/bumptech/glide/load/engine/bitmap_recycle/ArrayAdapterInterface;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->getForKey(Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool$Key;Ljava/lang/Class;)Ljava/lang/Object;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->getSizesForAdapter(Ljava/lang/Class;)Ljava/util/NavigableMap;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;->put(Ljava/lang/Object;)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;-><clinit>()V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;-><init>(J)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->dump()V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->get(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->getDirtyOrNull(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->trimMemory(I)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/LruBitmapPool;->trimToSize(J)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy$1;-><clinit>()V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy$Key;-><init>(Lcom/airbnb/lottie/model/animatable/AnimatableTextFrame;)V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy$Key;->hashCode()I\nPLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy;-><clinit>()V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy;-><init>()V\nPLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy;->get(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;\nPLcom/bumptech/glide/load/engine/bitmap_recycle/SizeConfigStrategy;->getSizesForConfig(Landroid/graphics/Bitmap$Config;)Ljava/util/NavigableMap;\nPLcom/bumptech/glide/load/engine/cache/DiskCacheWriteLocker$WriteLock;-><init>()V\nPLcom/bumptech/glide/load/engine/cache/DiskCacheWriteLocker$WriteLockPool;-><init>(I)V\nPLcom/bumptech/glide/load/engine/cache/DiskLruCacheFactory;-><init>(Lio/grpc/CallOptions$Key;J)V\nPLcom/bumptech/glide/load/engine/cache/DiskLruCacheFactory;->build()Lcom/bumptech/glide/load/engine/cache/DiskCache;\nPLcom/bumptech/glide/load/engine/cache/InternalCacheDiskCacheFactory;-><init>(Landroid/content/Context;)V\nPLcom/bumptech/glide/load/engine/cache/MemorySizeCalculator$Builder;-><clinit>()V\nPLcom/bumptech/glide/load/engine/cache/MemorySizeCalculator$Builder;-><init>(Landroid/content/Context;)V\nPLcom/bumptech/glide/load/engine/cache/MemorySizeCalculator;-><init>(Lcom/bumptech/glide/load/engine/cache/MemorySizeCalculator$Builder;)V\nPLcom/bumptech/glide/load/engine/cache/SafeKeyGenerator$PoolableDigestContainer;-><init>(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/load/engine/cache/SafeKeyGenerator$PoolableDigestContainer;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;\nPLcom/bumptech/glide/load/engine/executor/GlideExecutor$DefaultThreadFactory;-><init>(Ljava/lang/String;Lcom/bumptech/glide/load/engine/executor/GlideExecutor$UncaughtThrowableStrategy;Z)V\nPLcom/bumptech/glide/load/engine/executor/GlideExecutor$DefaultThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;\nPLcom/bumptech/glide/load/engine/executor/GlideExecutor$UncaughtThrowableStrategy;-><clinit>()V\nPLcom/bumptech/glide/load/engine/executor/GlideExecutor;-><clinit>()V\nPLcom/bumptech/glide/load/engine/executor/GlideExecutor;-><init>(Ljava/util/concurrent/ExecutorService;)V\nPLcom/bumptech/glide/load/engine/executor/GlideExecutor;->calculateBestThreadCount()I\nPLcom/bumptech/glide/load/engine/executor/GlideExecutor;->newAnimationExecutor()Lcom/bumptech/glide/load/engine/executor/GlideExecutor;\nPLcom/bumptech/glide/load/engine/executor/RuntimeCompat$1;-><init>(Ljava/lang/Object;I)V\nPLcom/bumptech/glide/load/engine/executor/RuntimeCompat$1;->accept(Ljava/io/File;Ljava/lang/String;)Z\nPLcom/bumptech/glide/load/model/AssetUriLoader;-><init>(Landroid/content/res/AssetManager;Lcom/bumptech/glide/load/model/AssetUriLoader$AssetFetcherFactory;)V\nPLcom/bumptech/glide/load/model/AssetUriLoader;->handles(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/model/ByteBufferFileLoader;-><init>(I)V\nPLcom/bumptech/glide/load/model/FileLoader$StreamFactory;-><init>(I)V\nPLcom/bumptech/glide/load/model/FileLoader;-><init>(Ljava/lang/Object;I)V\nPLcom/bumptech/glide/load/model/FileLoader;->handles(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;-><init>(Landroid/content/Context;I)V\nPLcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;\nPLcom/bumptech/glide/load/model/MediaStoreFileLoader$Factory;->isCallerInstantApp()Z\nPLcom/bumptech/glide/load/model/MediaStoreFileLoader;-><init>(Landroid/content/Context;I)V\nPLcom/bumptech/glide/load/model/MediaStoreFileLoader;->handles(Landroid/net/Uri;)Z\nPLcom/bumptech/glide/load/model/MediaStoreFileLoader;->handles(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/model/ModelCache$1;-><init>(J)V\nPLcom/bumptech/glide/load/model/ModelCache$1;-><init>(Landroidx/compose/runtime/Stack;J)V\nPLcom/bumptech/glide/load/model/ModelCache$1;->getSize(Ljava/lang/Object;)I\nPLcom/bumptech/glide/load/model/ModelLoader$LoadData;-><init>(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/data/DataFetcher;)V\nPLcom/bumptech/glide/load/model/ModelLoaderRegistry$ModelLoaderCache$Entry;-><init>(Ljava/util/List;)V\nPLcom/bumptech/glide/load/model/MultiModelLoaderFactory$Entry;-><init>(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/model/ModelLoaderFactory;)V\nPLcom/bumptech/glide/load/model/MultiModelLoaderFactory;-><clinit>()V\nPLcom/bumptech/glide/load/model/MultiModelLoaderFactory;-><init>(Landroidx/core/util/Pools$Pool;)V\nPLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory$Entry;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->build(Ljava/lang/Class;)Ljava/util/List;\nPLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->build(Ljava/lang/Class;Ljava/lang/Class;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLcom/bumptech/glide/load/model/MultiModelLoaderFactory;->getDataClasses(Ljava/lang/Class;)Ljava/util/List;\nPLcom/bumptech/glide/load/model/ResourceLoader$FileDescriptorFactory;-><init>(Landroid/content/res/Resources;I)V\nPLcom/bumptech/glide/load/model/ResourceLoader$UriFactory;-><init>(Landroid/content/res/Resources;I)V\nPLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;-><init>(Ljava/lang/Object;I)V\nPLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->cleanup()V\nPLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->getDataClass()Ljava/lang/Class;\nPLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->getDataSource()Lcom/bumptech/glide/load/DataSource;\nPLcom/bumptech/glide/load/model/UnitModelLoader$UnitFetcher;->loadData(Lcom/bumptech/glide/Priority;Lcom/bumptech/glide/load/data/DataFetcher$DataCallback;)V\nPLcom/bumptech/glide/load/model/UnitModelLoader;-><clinit>()V\nPLcom/bumptech/glide/load/model/UnitModelLoader;-><init>()V\nPLcom/bumptech/glide/load/model/UnitModelLoader;->buildLoadData(Ljava/lang/Object;IILcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/model/ModelLoader$LoadData;\nPLcom/bumptech/glide/load/model/UnitModelLoader;->handles(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/model/UriLoader;-><clinit>()V\nPLcom/bumptech/glide/load/model/UriLoader;-><init>(Lcom/bumptech/glide/load/model/UriLoader$LocalUriFetcherFactory;)V\nPLcom/bumptech/glide/load/model/UriLoader;->buildLoadData(Ljava/lang/Object;IILcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/model/ModelLoader$LoadData;\nPLcom/bumptech/glide/load/model/UriLoader;->handles(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/model/UrlUriLoader;-><clinit>()V\nPLcom/bumptech/glide/load/model/UrlUriLoader;-><init>(Lcom/bumptech/glide/load/model/ModelLoader;)V\nPLcom/bumptech/glide/load/model/UrlUriLoader;->handles(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/model/stream/HttpGlideUrlLoader;-><clinit>()V\nPLcom/bumptech/glide/load/model/stream/HttpGlideUrlLoader;-><init>(Landroidx/compose/runtime/Stack;)V\nPLcom/bumptech/glide/load/model/stream/HttpUriLoader;-><clinit>()V\nPLcom/bumptech/glide/load/model/stream/HttpUriLoader;-><init>(Lcom/bumptech/glide/load/model/ModelLoader;)V\nPLcom/bumptech/glide/load/model/stream/HttpUriLoader;->handles(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/resource/bitmap/BitmapEncoder;-><clinit>()V\nPLcom/bumptech/glide/load/resource/bitmap/BitmapEncoder;-><init>(Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V\nPLcom/bumptech/glide/load/resource/bitmap/BitmapEncoder;->getEncodeStrategy$enumunboxing$(Lcom/bumptech/glide/load/Options;)I\nPLcom/bumptech/glide/load/resource/bitmap/BitmapResource;-><init>(Landroid/content/res/Resources;Lcom/bumptech/glide/load/engine/Resource;)V\nPLcom/bumptech/glide/load/resource/bitmap/BitmapResource;-><init>(Landroid/graphics/Bitmap;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)V\nPLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->get()Ljava/lang/Object;\nPLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->getResourceClass()Ljava/lang/Class;\nPLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->getSize()I\nPLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->obtain(Landroid/content/res/Resources;Lcom/bumptech/glide/load/engine/Resource;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/resource/bitmap/BitmapResource;->obtain(Landroid/graphics/Bitmap;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)Lcom/bumptech/glide/load/resource/bitmap/BitmapResource;\nPLcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;-><init>()V\nPLcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;->transform(Landroid/content/Context;Lcom/bumptech/glide/load/engine/Resource;II)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/resource/bitmap/CircleCrop;-><clinit>()V\nPLcom/bumptech/glide/load/resource/bitmap/CircleCrop;-><init>()V\nPLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->hashCode()I\nPLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->transform(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Landroid/graphics/Bitmap;II)Landroid/graphics/Bitmap;\nPLcom/bumptech/glide/load/resource/bitmap/CircleCrop;->updateDiskCacheKey(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;-><clinit>()V\nPLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;-><init>()V\nPLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;->getOrientation(Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)I\nPLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;->getType(Lcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser$Reader;)Lcom/bumptech/glide/load/ImageHeaderParser$ImageType;\nPLcom/bumptech/glide/load/resource/bitmap/DefaultImageHeaderParser;->getType(Ljava/io/InputStream;)Lcom/bumptech/glide/load/ImageHeaderParser$ImageType;\nPLcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy$None;-><init>(I)V\nPLcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy;-><clinit>()V\nPLcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy;-><init>()V\nPLcom/bumptech/glide/load/resource/bitmap/Downsampler;-><clinit>()V\nPLcom/bumptech/glide/load/resource/bitmap/Downsampler;-><init>(Ljava/util/List;Landroid/util/DisplayMetrics;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V\nPLcom/bumptech/glide/load/resource/bitmap/Downsampler;->decode(Ljava/io/InputStream;IILcom/bumptech/glide/load/Options;Lcom/bumptech/glide/load/resource/bitmap/Downsampler$DecodeCallbacks;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/resource/bitmap/Downsampler;->decodeFromWrappedStreams(Ljava/io/InputStream;Landroid/graphics/BitmapFactory$Options;Lcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy;Lcom/bumptech/glide/load/DecodeFormat;ZIIZLcom/bumptech/glide/load/resource/bitmap/Downsampler$DecodeCallbacks;)Landroid/graphics/Bitmap;\nPLcom/bumptech/glide/load/resource/bitmap/Downsampler;->decodeStream(Ljava/io/InputStream;Landroid/graphics/BitmapFactory$Options;Lcom/bumptech/glide/load/resource/bitmap/Downsampler$DecodeCallbacks;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)Landroid/graphics/Bitmap;\nPLcom/bumptech/glide/load/resource/bitmap/Downsampler;->getDimensions(Ljava/io/InputStream;Landroid/graphics/BitmapFactory$Options;Lcom/bumptech/glide/load/resource/bitmap/Downsampler$DecodeCallbacks;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;)[I\nPLcom/bumptech/glide/load/resource/bitmap/Downsampler;->releaseOptions(Landroid/graphics/BitmapFactory$Options;)V\nPLcom/bumptech/glide/load/resource/bitmap/Downsampler;->resetOptions(Landroid/graphics/BitmapFactory$Options;)V\nPLcom/bumptech/glide/load/resource/bitmap/DrawableToBitmapConverter$1;-><init>()V\nPLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;-><init>(Lcom/bumptech/glide/load/Transformation;Z)V\nPLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->hashCode()I\nPLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->transform(Landroid/content/Context;Lcom/bumptech/glide/load/engine/Resource;II)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->updateDiskCacheKey(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/load/resource/bitmap/ExifInterfaceImageHeaderParser;-><init>()V\nPLcom/bumptech/glide/load/resource/bitmap/ExifInterfaceImageHeaderParser;->getOrientation(Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)I\nPLcom/bumptech/glide/load/resource/bitmap/ExifInterfaceImageHeaderParser;->getType(Ljava/io/InputStream;)Lcom/bumptech/glide/load/ImageHeaderParser$ImageType;\nPLcom/bumptech/glide/load/resource/bitmap/HardwareConfigState;-><clinit>()V\nPLcom/bumptech/glide/load/resource/bitmap/HardwareConfigState;-><init>()V\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;-><init>(Ljava/io/InputStream;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->available()I\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->fillbuf(Ljava/io/InputStream;[B)I\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->mark(I)V\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->markSupported()Z\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->read()I\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->read([BII)I\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->release()V\nPLcom/bumptech/glide/load/resource/bitmap/RecyclableBufferedInputStream;->reset()V\nPLcom/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder;-><init>(Landroid/content/res/Resources;Lcom/bumptech/glide/load/ResourceDecoder;)V\nPLcom/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder;->decode(Ljava/lang/Object;IILcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder;->handles(Ljava/lang/Object;Lcom/bumptech/glide/load/Options;)Z\nPLcom/bumptech/glide/load/resource/bitmap/TransformationUtils$NoLock;-><init>()V\nPLcom/bumptech/glide/load/resource/bitmap/TransformationUtils$NoLock;->lock()V\nPLcom/bumptech/glide/load/resource/bitmap/TransformationUtils$NoLock;->unlock()V\nPLcom/bumptech/glide/load/resource/bitmap/TransformationUtils;-><clinit>()V\nPLcom/bumptech/glide/load/resource/bitmap/TransformationUtils;->getAlphaSafeConfig(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap$Config;\nPLcom/bumptech/glide/load/resource/bitmap/VideoDecoder$1;-><init>(I)V\nPLcom/bumptech/glide/load/resource/bitmap/VideoDecoder;-><clinit>()V\nPLcom/bumptech/glide/load/resource/bitmap/VideoDecoder;-><init>(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/resource/bitmap/VideoDecoder$MediaMetadataRetrieverInitializer;)V\nPLcom/bumptech/glide/load/resource/drawable/DrawableResource;-><init>(Landroid/graphics/drawable/Drawable;)V\nPLcom/bumptech/glide/load/resource/drawable/DrawableResource;->get()Ljava/lang/Object;\nPLcom/bumptech/glide/load/resource/file/FileDecoder;-><init>(I)V\nPLcom/bumptech/glide/load/resource/gif/ByteBufferGifDecoder;-><clinit>()V\nPLcom/bumptech/glide/load/resource/gif/ByteBufferGifDecoder;-><init>(Landroid/content/Context;Ljava/util/List;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V\nPLcom/bumptech/glide/load/resource/gif/GifDrawableResource;-><init>(Landroid/graphics/drawable/Drawable;I)V\nPLcom/bumptech/glide/load/resource/gif/GifDrawableResource;->recycle()V\nPLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;-><init>(Lcom/bumptech/glide/load/Transformation;)V\nPLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->hashCode()I\nPLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->updateDiskCacheKey(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;-><init>(Landroid/content/Context;)V\nPLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;-><init>(Ljava/lang/Object;I)V\nPLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->decode(Landroid/net/Uri;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->decode(Ljava/lang/Object;IILcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/engine/Resource;\nPLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->findContextForPackage(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Context;\nPLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->findResourceIdFromTypeAndNameResourceUri(Landroid/content/Context;Landroid/net/Uri;)I\nPLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->findResourceIdFromUri(Landroid/content/Context;Landroid/net/Uri;)I\nPLcom/bumptech/glide/load/resource/gif/GifFrameResourceDecoder;->handles(Ljava/lang/Object;Lcom/bumptech/glide/load/Options;)Z\nPLcom/bumptech/glide/load/resource/gif/GifOptions;-><clinit>()V\nPLcom/bumptech/glide/load/resource/gif/StreamGifDecoder;-><init>(Ljava/util/List;Lcom/bumptech/glide/load/ResourceDecoder;Lcom/bumptech/glide/load/engine/bitmap_recycle/LruArrayPool;)V\nPLcom/bumptech/glide/load/resource/gif/StreamGifDecoder;->handles(Ljava/lang/Object;Lcom/bumptech/glide/load/Options;)Z\nPLcom/bumptech/glide/load/resource/transcode/TranscoderRegistry$Entry;-><init>(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/resource/transcode/ResourceTranscoder;)V\nPLcom/bumptech/glide/load/resource/transcode/TranscoderRegistry$Entry;->handles(Ljava/lang/Class;Ljava/lang/Class;)Z\nPLcom/bumptech/glide/manager/ActivityFragmentLifecycle;-><init>()V\nPLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->addListener(Lcom/bumptech/glide/manager/LifecycleListener;)V\nPLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->onDestroy()V\nPLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->onStart()V\nPLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->onStop()V\nPLcom/bumptech/glide/manager/ActivityFragmentLifecycle;->removeListener(Lcom/bumptech/glide/manager/LifecycleListener;)V\nPLcom/bumptech/glide/manager/DefaultConnectivityMonitor;-><init>(Landroid/content/Context;Landroidx/compose/runtime/SnapshotThreadLocal;)V\nPLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->isConnected(Landroid/content/Context;)Z\nPLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->onDestroy()V\nPLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->onStart()V\nPLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->onStop()V\nPLcom/bumptech/glide/manager/RequestManagerRetriever;-><clinit>()V\nPLcom/bumptech/glide/manager/RequestManagerRetriever;-><init>(Lcom/google/android/gms/dynamite/zza;)V\nPLcom/bumptech/glide/manager/RequestManagerRetriever;->get(Landroid/content/Context;)Lcom/bumptech/glide/RequestManager;\nPLcom/bumptech/glide/manager/RequestManagerRetriever;->getSupportRequestManagerFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Z)Lcom/bumptech/glide/manager/SupportRequestManagerFragment;\nPLcom/bumptech/glide/manager/RequestManagerRetriever;->handleMessage(Landroid/os/Message;)Z\nPLcom/bumptech/glide/manager/RequestManagerRetriever;->supportFragmentGet(Landroid/content/Context;Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;Z)Lcom/bumptech/glide/RequestManager;\nPLcom/bumptech/glide/manager/SupportRequestManagerFragment;-><init>()V\nPLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onAttach(Landroid/content/Context;)V\nPLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onDestroy()V\nPLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onDetach()V\nPLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onStart()V\nPLcom/bumptech/glide/manager/SupportRequestManagerFragment;->onStop()V\nPLcom/bumptech/glide/manager/SupportRequestManagerFragment;->registerFragmentWithRoot(Landroidx/fragment/app/FragmentActivity;)V\nPLcom/bumptech/glide/manager/SupportRequestManagerFragment;->unregisterFragmentWithRoot()V\nPLcom/bumptech/glide/manager/TargetTracker;-><init>()V\nPLcom/bumptech/glide/manager/TargetTracker;->onDestroy()V\nPLcom/bumptech/glide/manager/TargetTracker;->onStart()V\nPLcom/bumptech/glide/manager/TargetTracker;->onStop()V\nPLcom/bumptech/glide/module/ManifestParser;-><init>(Landroid/content/Context;Landroidx/appcompat/R$id$$IA$1;)V\nPLcom/bumptech/glide/module/ManifestParser;->getFilesDir()Ljava/io/File;\nPLcom/bumptech/glide/provider/EncoderRegistry$Entry;-><init>(Ljava/lang/Class;Lcom/bumptech/glide/load/Encoder;)V\nPLcom/bumptech/glide/provider/LoadPathCache;-><clinit>()V\nPLcom/bumptech/glide/provider/LoadPathCache;-><init>()V\nPLcom/bumptech/glide/provider/ResourceDecoderRegistry$Entry;-><init>(Ljava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/load/ResourceDecoder;)V\nPLcom/bumptech/glide/provider/ResourceDecoderRegistry$Entry;->handles(Ljava/lang/Class;Ljava/lang/Class;)Z\nPLcom/bumptech/glide/provider/ResourceEncoderRegistry$Entry;-><init>(Ljava/lang/Class;Lcom/bumptech/glide/load/ResourceEncoder;)V\nPLcom/bumptech/glide/provider/ResourceEncoderRegistry;-><init>(I)V\nPLcom/bumptech/glide/provider/ResourceEncoderRegistry;->get(Ljava/lang/Class;)Lcom/bumptech/glide/load/ResourceEncoder;\nPLcom/bumptech/glide/provider/ResourceEncoderRegistry;->getTranscodeClasses(Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/List;\nPLcom/bumptech/glide/request/BaseRequestOptions;-><init>()V\nPLcom/bumptech/glide/request/BaseRequestOptions;->autoClone()Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->circleCrop()Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->clone()Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->decode(Ljava/lang/Class;)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->diskCacheStrategy(Lcom/bumptech/glide/load/engine/DiskCacheStrategy;)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->isSet(II)Z\nPLcom/bumptech/glide/request/BaseRequestOptions;->placeholder(Landroid/graphics/drawable/Drawable;)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->priority(Lcom/bumptech/glide/Priority;)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->selfOrThrowIfLocked()Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->set(Lcom/bumptech/glide/load/Option;Ljava/lang/Object;)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->skipMemoryCache(Z)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->transform(Lcom/bumptech/glide/load/Transformation;Z)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->transform(Lcom/bumptech/glide/load/resource/bitmap/DownsampleStrategy;Lcom/bumptech/glide/load/Transformation;)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/BaseRequestOptions;->transform(Ljava/lang/Class;Lcom/bumptech/glide/load/Transformation;Z)Lcom/bumptech/glide/request/BaseRequestOptions;\nPLcom/bumptech/glide/request/RequestOptions;-><init>()V\nPLcom/bumptech/glide/request/RequestOptions;->diskCacheStrategyOf(Lcom/bumptech/glide/load/engine/DiskCacheStrategy;)Lcom/bumptech/glide/request/RequestOptions;\nPLcom/bumptech/glide/request/SingleRequest;-><clinit>()V\nPLcom/bumptech/glide/request/SingleRequest;-><init>()V\nPLcom/bumptech/glide/request/SingleRequest;->assertNotCallingCallbacks()V\nPLcom/bumptech/glide/request/SingleRequest;->begin()V\nPLcom/bumptech/glide/request/SingleRequest;->cancel()V\nPLcom/bumptech/glide/request/SingleRequest;->clear()V\nPLcom/bumptech/glide/request/SingleRequest;->getPlaceholderDrawable()Landroid/graphics/drawable/Drawable;\nPLcom/bumptech/glide/request/SingleRequest;->getVerifier()Lcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;\nPLcom/bumptech/glide/request/SingleRequest;->isComplete()Z\nPLcom/bumptech/glide/request/SingleRequest;->isEquivalentTo(Lcom/bumptech/glide/request/Request;)Z\nPLcom/bumptech/glide/request/SingleRequest;->isFirstReadyResource()Z\nPLcom/bumptech/glide/request/SingleRequest;->isRunning()Z\nPLcom/bumptech/glide/request/SingleRequest;->onResourceReady(Lcom/bumptech/glide/load/engine/Resource;Lcom/bumptech/glide/load/DataSource;)V\nPLcom/bumptech/glide/request/SingleRequest;->onResourceReady(Lcom/bumptech/glide/load/engine/Resource;Ljava/lang/Object;Lcom/bumptech/glide/load/DataSource;)V\nPLcom/bumptech/glide/request/SingleRequest;->onSizeReady(II)V\nPLcom/bumptech/glide/request/SingleRequest;->recycle()V\nPLcom/bumptech/glide/request/SingleRequest;->releaseResource(Lcom/bumptech/glide/load/engine/Resource;)V\nPLcom/bumptech/glide/request/target/BaseTarget;-><init>()V\nPLcom/bumptech/glide/request/target/BaseTarget;->getRequest()Lcom/bumptech/glide/request/Request;\nPLcom/bumptech/glide/request/target/BaseTarget;->onStart()V\nPLcom/bumptech/glide/request/target/BaseTarget;->onStop()V\nPLcom/bumptech/glide/request/target/BaseTarget;->setRequest(Lcom/bumptech/glide/request/Request;)V\nPLcom/bumptech/glide/signature/EmptySignature;-><clinit>()V\nPLcom/bumptech/glide/signature/EmptySignature;-><init>()V\nPLcom/bumptech/glide/signature/EmptySignature;->updateDiskCacheKey(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/signature/ObjectKey;-><init>(Ljava/lang/Object;)V\nPLcom/bumptech/glide/signature/ObjectKey;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/signature/ObjectKey;->hashCode()I\nPLcom/bumptech/glide/signature/ObjectKey;->updateDiskCacheKey(Ljava/security/MessageDigest;)V\nPLcom/bumptech/glide/util/CachedHashCodeArrayMap;-><init>()V\nPLcom/bumptech/glide/util/CachedHashCodeArrayMap;->hashCode()I\nPLcom/bumptech/glide/util/CachedHashCodeArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/bumptech/glide/util/CachedHashCodeArrayMap;->putAll(Landroidx/collection/SimpleArrayMap;)V\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;-><clinit>()V\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;-><init>()V\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;->available()I\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;->mark(I)V\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;->markSupported()Z\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;->read()I\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;->read([BII)I\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;->release()V\nPLcom/bumptech/glide/util/ExceptionCatchingInputStream;->reset()V\nPLcom/bumptech/glide/util/Executors$1;-><init>(I)V\nPLcom/bumptech/glide/util/Executors$1;-><init>(Ljava/lang/Object;I)V\nPLcom/bumptech/glide/util/Executors$1;->execute(Ljava/lang/Runnable;)V\nPLcom/bumptech/glide/util/Executors;-><clinit>()V\nPLcom/bumptech/glide/util/LogTime;-><clinit>()V\nPLcom/bumptech/glide/util/LruCache;-><init>(J)V\nPLcom/bumptech/glide/util/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/bumptech/glide/util/LruCache;->getSize(Ljava/lang/Object;)I\nPLcom/bumptech/glide/util/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/bumptech/glide/util/LruCache;->trimToSize(J)V\nPLcom/bumptech/glide/util/MarkEnforcingInputStream;-><init>(Ljava/io/InputStream;)V\nPLcom/bumptech/glide/util/MarkEnforcingInputStream;->available()I\nPLcom/bumptech/glide/util/MarkEnforcingInputStream;->getBytesToRead(J)J\nPLcom/bumptech/glide/util/MarkEnforcingInputStream;->mark(I)V\nPLcom/bumptech/glide/util/MarkEnforcingInputStream;->read()I\nPLcom/bumptech/glide/util/MarkEnforcingInputStream;->read([BII)I\nPLcom/bumptech/glide/util/MarkEnforcingInputStream;->reset()V\nPLcom/bumptech/glide/util/MarkEnforcingInputStream;->updateAvailableBytesAfterRead(J)V\nPLcom/bumptech/glide/util/MultiClassKey;-><init>()V\nPLcom/bumptech/glide/util/MultiClassKey;-><init>(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)V\nPLcom/bumptech/glide/util/MultiClassKey;->equals(Ljava/lang/Object;)Z\nPLcom/bumptech/glide/util/MultiClassKey;->hashCode()I\nPLcom/bumptech/glide/util/Util$1;-><clinit>()V\nPLcom/bumptech/glide/util/Util;-><clinit>()V\nPLcom/bumptech/glide/util/Util;->assertMainThread()V\nPLcom/bumptech/glide/util/Util;->bothNullOrEqual(Ljava/lang/Object;Ljava/lang/Object;)Z\nPLcom/bumptech/glide/util/Util;->getBitmapByteSize(IILandroid/graphics/Bitmap$Config;)I\nPLcom/bumptech/glide/util/Util;->getBitmapByteSize(Landroid/graphics/Bitmap;)I\nPLcom/bumptech/glide/util/Util;->getSnapshot(Ljava/util/Collection;)Ljava/util/List;\nPLcom/bumptech/glide/util/Util;->isOnBackgroundThread()Z\nPLcom/bumptech/glide/util/Util;->isOnMainThread()Z\nPLcom/bumptech/glide/util/Util;->isValidDimensions(II)Z\nPLcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;-><init>()V\nPLcom/bumptech/glide/util/pool/StateVerifier$DefaultStateVerifier;->throwIfRecycled()V\nPLcom/firebase/ui/auth/AuthUI;-><clinit>()V\nPLcom/firebase/ui/auth/AuthUI;->setApplicationContext(Landroid/content/Context;)V\nPLcom/firebase/ui/auth/data/client/AuthUiInitProvider;-><init>()V\nPLcom/firebase/ui/auth/data/client/AuthUiInitProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V\nPLcom/firebase/ui/auth/data/client/AuthUiInitProvider;->onCreate()Z\nPLcom/firebase/ui/auth/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/datatransport/Encoding;-><init>(Ljava/lang/String;)V\nPLcom/google/android/datatransport/Encoding;->equals(Ljava/lang/Object;)Z\nPLcom/google/android/datatransport/Encoding;->hashCode()I\nPLcom/google/android/datatransport/Priority;-><clinit>()V\nPLcom/google/android/datatransport/Priority;-><init>(Ljava/lang/String;I)V\nPLcom/google/android/datatransport/Priority;->values()[Lcom/google/android/datatransport/Priority;\nPLcom/google/android/datatransport/cct/CCTDestination;-><clinit>()V\nPLcom/google/android/datatransport/cct/CCTDestination;-><init>(Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;-><init>()V\nPLcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;->build()Lcom/google/android/datatransport/runtime/AutoValue_TransportContext;\nPLcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;->setBackendName(Ljava/lang/String;)Lcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;\nPLcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;->setPriority(Lcom/google/android/datatransport/Priority;)Lcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;\nPLcom/google/android/datatransport/runtime/AutoValue_TransportContext;-><init>(Ljava/lang/String;[BLcom/google/android/datatransport/Priority;Landroidx/navigation/R$id;)V\nPLcom/google/android/datatransport/runtime/AutoValue_TransportContext;->builder()Lcom/google/android/datatransport/runtime/AutoValue_TransportContext$Builder;\nPLcom/google/android/datatransport/runtime/DaggerTransportRuntimeComponent;-><init>(Landroid/content/Context;Landroidx/navigation/R$id;)V\nPLcom/google/android/datatransport/runtime/ExecutionModule_ExecutorFactory;-><clinit>()V\nPLcom/google/android/datatransport/runtime/ExecutionModule_ExecutorFactory;-><init>()V\nPLcom/google/android/datatransport/runtime/ExecutionModule_ExecutorFactory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/TransportFactoryImpl;-><init>(Ljava/util/Set;Lcom/google/android/datatransport/runtime/AutoValue_TransportContext;Lcom/google/android/datatransport/runtime/TransportInternal;)V\nPLcom/google/android/datatransport/runtime/TransportFactoryImpl;->getTransport(Ljava/lang/String;Ljava/lang/Class;Lcom/google/android/datatransport/Encoding;Lcom/google/android/datatransport/Transformer;)Lcom/google/android/datatransport/Transport;\nPLcom/google/android/datatransport/runtime/TransportImpl;-><init>(Lcom/google/android/datatransport/runtime/AutoValue_TransportContext;Ljava/lang/String;Lcom/google/android/datatransport/Encoding;Lcom/google/android/datatransport/Transformer;Lcom/google/android/datatransport/runtime/TransportInternal;)V\nPLcom/google/android/datatransport/runtime/TransportRuntime;-><init>(Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/scheduling/Scheduler;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkInitializer;)V\nPLcom/google/android/datatransport/runtime/TransportRuntime;->getInstance()Lcom/google/android/datatransport/runtime/TransportRuntime;\nPLcom/google/android/datatransport/runtime/TransportRuntime;->initialize(Landroid/content/Context;)V\nPLcom/google/android/datatransport/runtime/TransportRuntime;->newFactory(Lcom/google/android/datatransport/runtime/EncodedDestination;)Lcom/google/android/datatransport/TransportFactory;\nPLcom/google/android/datatransport/runtime/TransportRuntime_Factory;-><init>(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V\nPLcom/google/android/datatransport/runtime/TransportRuntime_Factory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/backends/AutoValue_BackendRequest$Builder;-><init>(Landroid/content/Context;)V\nPLcom/google/android/datatransport/runtime/backends/CreationContextFactory;-><init>(Landroid/content/Context;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;)V\nPLcom/google/android/datatransport/runtime/backends/CreationContextFactory_Factory;-><init>(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;I)V\nPLcom/google/android/datatransport/runtime/backends/CreationContextFactory_Factory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry;-><init>(Landroid/content/Context;Lcom/google/android/datatransport/runtime/backends/CreationContextFactory;)V\nPLcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry_Factory;-><init>(Ljavax/inject/Provider;Ljavax/inject/Provider;)V\nPLcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry_Factory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/DefaultScheduler;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/DefaultScheduler;-><init>(Ljava/util/concurrent/Executor;Lcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard;)V\nPLcom/google/android/datatransport/runtime/scheduling/DefaultScheduler_Factory;-><init>(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V\nPLcom/google/android/datatransport/runtime/scheduling/DefaultScheduler_Factory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/SchedulingConfigModule_ConfigFactory;-><init>(Ljavax/inject/Provider;)V\nPLcom/google/android/datatransport/runtime/scheduling/SchedulingConfigModule_ConfigFactory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig;-><init>(Lcom/google/android/datatransport/runtime/time/Clock;Ljava/util/Map;)V\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;-><init>()V\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;->build()Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue;\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;->setDelta(J)Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;->setMaxAllowedDelay(J)Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue;-><init>(JJLjava/util/Set;Landroidx/core/R$id;)V\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue;->builder()Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig_ConfigValue$Builder;\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/JobInfoScheduler;-><init>(Landroid/content/Context;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/AutoValue_SchedulerConfig;)V\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig$Flag;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/SchedulerConfig$Flag;-><init>(Ljava/lang/String;I)V\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader;-><init>(Landroid/content/Context;Lcom/google/android/datatransport/runtime/backends/MetadataBackendRegistry;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler;Ljava/util/concurrent/Executor;Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard;Lcom/google/android/datatransport/runtime/time/Clock;)V\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader_Factory;-><init>(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/Uploader_Factory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkInitializer;-><init>(Ljava/util/concurrent/Executor;Lcom/google/android/datatransport/runtime/scheduling/persistence/EventStore;Lcom/google/android/datatransport/runtime/scheduling/jobscheduling/WorkScheduler;Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard;)V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;-><init>(JIIJILandroidx/room/Room;)V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_DbNameFactory;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_DbNameFactory;-><init>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_DbNameFactory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_SchemaVersionFactory;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_SchemaVersionFactory;-><init>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_SchemaVersionFactory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_StoreConfigFactory;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_StoreConfigFactory;-><init>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/EventStoreModule_StoreConfigFactory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;-><init>(Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/time/Clock;Lcom/google/android/datatransport/runtime/scheduling/persistence/AutoValue_EventStoreConfig;Lcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;)V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->getDb()Landroid/database/sqlite/SQLiteDatabase;\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore;->runCriticalSection(Lcom/google/android/datatransport/runtime/synchronization/SynchronizationGuard$CriticalSection;)Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore_Factory;-><init>(Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;I)V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SQLiteEventStore_Factory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$1;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$1;-><init>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$2;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$2;-><init>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$3;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$3;-><init>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$4;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager$$Lambda$4;-><init>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;-><clinit>()V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;-><init>(Landroid/content/Context;Ljava/lang/String;I)V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V\nPLcom/google/android/datatransport/runtime/scheduling/persistence/SchemaManager;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V\nPLcom/google/android/datatransport/runtime/time/TimeModule_EventClockFactory;-><clinit>()V\nPLcom/google/android/datatransport/runtime/time/TimeModule_EventClockFactory;-><init>()V\nPLcom/google/android/datatransport/runtime/time/TimeModule_EventClockFactory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/time/TimeModule_UptimeClockFactory;-><clinit>()V\nPLcom/google/android/datatransport/runtime/time/TimeModule_UptimeClockFactory;-><init>()V\nPLcom/google/android/datatransport/runtime/time/TimeModule_UptimeClockFactory;->get()Ljava/lang/Object;\nPLcom/google/android/datatransport/runtime/time/UptimeClock;-><init>(I)V\nPLcom/google/android/datatransport/runtime/time/UptimeClock;->getTime()J\nPLcom/google/android/flexbox/FlexboxHelper;-><init>(Lcom/google/android/flexbox/FlexContainer;)V\nPLcom/google/android/flexbox/FlexboxHelper;->expandFlexItems(IILcom/google/android/flexbox/FlexLine;IIZ)V\nPLcom/google/android/flexbox/FlexboxHelper;->extractHigherInt(J)I\nPLcom/google/android/flexbox/FlexboxHelper;->getFlexItemMarginStartCross(Lcom/google/android/flexbox/FlexItem;Z)I\nPLcom/google/android/flexbox/FlexboxHelper;->isLastFlexItem(IILcom/google/android/flexbox/FlexLine;)Z\nPLcom/google/android/flexbox/FlexboxLayoutManager$AnchorInfo;-><init>(Lcom/google/android/flexbox/FlexboxLayoutManager;Landroidx/room/Room;)V\nPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutParams;-><clinit>()V\nPLcom/google/android/flexbox/FlexboxLayoutManager$LayoutState;-><init>(Landroidx/room/Room;)V\nPLcom/google/android/flexbox/FlexboxLayoutManager;-><clinit>()V\nPLcom/google/android/flexbox/FlexboxLayoutManager;->clearFlexLines()V\nPLcom/google/android/flexbox/FlexboxLayoutManager;->computeVerticalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I\nPLcom/google/android/flexbox/FlexboxLayoutManager;->computeVerticalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I\nPLcom/google/android/flexbox/FlexboxLayoutManager;->computeVerticalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I\nPLcom/google/android/flexbox/FlexboxLayoutManager;->findLastReferenceChild(I)Landroid/view/View;\nPLcom/google/android/flexbox/FlexboxLayoutManager;->findLastVisibleItemPosition()I\nPLcom/google/android/flexbox/FlexboxLayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams;\nPLcom/google/android/flexbox/FlexboxLayoutManager;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;)V\nPLcom/google/android/flexbox/FlexboxLayoutManager;->onNewFlexLineAdded(Lcom/google/android/flexbox/FlexLine;)V\nPLcom/google/android/flexbox/FlexboxLayoutManager;->setFlexDirection(I)V\nPLcom/google/android/flexbox/FlexboxLayoutManager;->setFlexWrap(I)V\nPLcom/google/android/gms/ads/identifier/AdvertisingIdClient;-><init>(Landroid/content/Context;JZZ)V\nPLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->finalize()V\nPLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->finish()V\nPLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->getAdvertisingIdInfo(Landroid/content/Context;)Landroidx/room/RoomOpenHelper$ValidationResult;\nPLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->zza(Landroid/content/Context;Z)Lcom/google/android/gms/common/BlockingServiceConnection;\nPLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->zza(Landroidx/room/RoomOpenHelper$ValidationResult;ZFJLjava/lang/String;Ljava/lang/Throwable;)Z\nPLcom/google/android/gms/ads/identifier/AdvertisingIdClient;->zza(Z)V\nPLcom/google/android/gms/ads/identifier/zza;-><init>(Lcom/bumptech/glide/load/engine/executor/GlideExecutor$DefaultThreadFactory;Ljava/lang/Runnable;Ljava/lang/String;)V\nPLcom/google/android/gms/ads/identifier/zza;->run()V\nPLcom/google/android/gms/common/ConnectionResult;-><clinit>()V\nPLcom/google/android/gms/common/ConnectionResult;-><init>(I)V\nPLcom/google/android/gms/common/ConnectionResult;-><init>(ILandroid/app/PendingIntent;)V\nPLcom/google/android/gms/common/Feature;-><clinit>()V\nPLcom/google/android/gms/common/Feature;-><init>(Ljava/lang/String;J)V\nPLcom/google/android/gms/common/GoogleApiAvailability;-><clinit>()V\nPLcom/google/android/gms/common/GoogleApiAvailability;-><init>()V\nPLcom/google/android/gms/common/GoogleApiAvailability;->isGooglePlayServicesAvailable(Landroid/content/Context;I)I\nPLcom/google/android/gms/common/GoogleApiAvailabilityLight;-><clinit>()V\nPLcom/google/android/gms/common/GoogleApiAvailabilityLight;-><init>()V\nPLcom/google/android/gms/common/GoogleApiAvailabilityLight;->isGooglePlayServicesAvailable(Landroid/content/Context;I)I\nPLcom/google/android/gms/common/GooglePlayServicesNotAvailableException;-><init>(I)V\nPLcom/google/android/gms/common/GooglePlayServicesUtilLight;-><clinit>()V\nPLcom/google/android/gms/common/GooglePlayServicesUtilLight;->isGooglePlayServicesAvailable(Landroid/content/Context;I)I\nPLcom/google/android/gms/common/GooglePlayServicesUtilLight;->isPlayServicesPossiblyUpdating(Landroid/content/Context;I)Z\nPLcom/google/android/gms/common/api/Api$AbstractClientBuilder;-><init>()V\nPLcom/google/android/gms/common/api/Api$AnyClientKey;-><init>()V\nPLcom/google/android/gms/common/api/Api$ClientKey;-><init>()V\nPLcom/google/android/gms/common/api/Api;-><init>(Ljava/lang/String;Lcom/google/android/gms/common/api/Api$AbstractClientBuilder;Lcom/google/android/gms/common/api/Api$ClientKey;)V\nPLcom/google/android/gms/common/api/GoogleApi$Settings;-><clinit>()V\nPLcom/google/android/gms/common/api/GoogleApi;-><init>(Landroid/content/Context;Lcom/google/android/gms/common/api/Api;Lcom/google/android/gms/common/api/Api$ApiOptions;Lcom/google/android/gms/common/api/internal/StatusExceptionMapper;)V\nPLcom/google/android/gms/common/api/GoogleApi;->createClientSettingsBuilder()Lcom/google/android/gms/common/internal/ClientSettings$Builder;\nPLcom/google/android/gms/common/api/GoogleApi;->zaa(Landroid/os/Looper;Lcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;)Lcom/google/android/gms/common/api/Api$Client;\nPLcom/google/android/gms/common/api/GoogleApiClient;-><clinit>()V\nPLcom/google/android/gms/common/api/GoogleApiClient;-><init>()V\nPLcom/google/android/gms/common/api/Status;-><clinit>()V\nPLcom/google/android/gms/common/api/Status;-><init>(I)V\nPLcom/google/android/gms/common/api/Status;-><init>(IILjava/lang/String;Landroid/app/PendingIntent;)V\nPLcom/google/android/gms/common/api/Status;-><init>(ILjava/lang/String;)V\nPLcom/google/android/gms/common/api/Status;->isSuccess()Z\nPLcom/google/android/gms/common/api/internal/ApiKey;-><init>(Lcom/google/android/gms/common/api/Api;Lcom/google/android/gms/common/api/Api$ApiOptions;)V\nPLcom/google/android/gms/common/api/internal/ApiKey;->hashCode()I\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;-><clinit>()V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;-><init>()V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->addListener(Lcom/google/android/gms/common/api/internal/BackgroundDetector$BackgroundStateChangeListener;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->initialize(Landroid/app/Application;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityDestroyed(Landroid/app/Activity;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityPaused(Landroid/app/Activity;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityResumed(Landroid/app/Activity;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityStarted(Landroid/app/Activity;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onActivityStopped(Landroid/app/Activity;)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onBackgroundStateChanged(Z)V\nPLcom/google/android/gms/common/api/internal/BackgroundDetector;->onTrimMemory(I)V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;-><init>(Lcom/google/android/gms/common/api/internal/GoogleApiManager;Lcom/google/android/gms/common/api/GoogleApi;)V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->connect()V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->onConnectionFailed(Lcom/google/android/gms/common/ConnectionResult;)V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->requiresSignIn()Z\nPLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->zabj()V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager$zaa;->zai(Lcom/google/android/gms/common/ConnectionResult;)V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager;-><clinit>()V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/GoogleApiAvailability;)V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager;->handleMessage(Landroid/os/Message;)Z\nPLcom/google/android/gms/common/api/internal/GoogleApiManager;->zab(Landroid/content/Context;)Lcom/google/android/gms/common/api/internal/GoogleApiManager;\nPLcom/google/android/gms/common/api/internal/GoogleApiManager;->zab(Lcom/google/android/gms/common/api/GoogleApi;)V\nPLcom/google/android/gms/common/api/internal/GoogleApiManager;->zabb()I\nPLcom/google/android/gms/common/api/internal/GoogleServices;-><clinit>()V\nPLcom/google/android/gms/common/api/internal/GoogleServices;-><init>(Landroid/content/Context;)V\nPLcom/google/android/gms/common/api/internal/zabn;-><init>(Lcom/google/android/gms/common/api/GoogleApi;)V\nPLcom/google/android/gms/common/internal/BaseGmsClient$zzb;-><init>(Lcom/google/android/gms/common/internal/BaseGmsClient;Landroid/os/Looper;)V\nPLcom/google/android/gms/common/internal/BaseGmsClient;-><clinit>()V\nPLcom/google/android/gms/common/internal/BaseGmsClient;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/internal/zze;Lcom/google/android/gms/common/GoogleApiAvailabilityLight;ILcom/google/android/gms/common/internal/BaseGmsClient$BaseConnectionCallbacks;Lcom/google/android/gms/common/internal/BaseGmsClient$BaseOnConnectionFailedListener;Ljava/lang/String;)V\nPLcom/google/android/gms/common/internal/BaseGmsClient;->isConnected()Z\nPLcom/google/android/gms/common/internal/BaseGmsClient;->isConnecting()Z\nPLcom/google/android/gms/common/internal/BaseGmsClient;->requiresSignIn()Z\nPLcom/google/android/gms/common/internal/ClientSettings$Builder;-><init>()V\nPLcom/google/android/gms/common/internal/ClientSettings$Builder;->build()Lcom/google/android/gms/common/internal/ClientSettings;\nPLcom/google/android/gms/common/internal/ClientSettings;-><init>(Landroid/accounts/Account;Ljava/util/Set;Ljava/util/Map;ILandroid/view/View;Ljava/lang/String;Ljava/lang/String;Lcom/google/android/gms/signin/SignInOptions;Z)V\nPLcom/google/android/gms/common/internal/GmsClient;-><init>(Landroid/content/Context;Landroid/os/Looper;ILcom/google/android/gms/common/internal/ClientSettings;Lcom/google/android/gms/common/api/internal/ConnectionCallbacks;Lcom/google/android/gms/common/api/internal/OnConnectionFailedListener;)V\nPLcom/google/android/gms/common/internal/GmsLogger;-><init>(Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable;-><init>()V\nPLcom/google/android/gms/common/internal/zaf;-><init>(Lcom/google/android/gms/common/api/internal/ConnectionCallbacks;)V\nPLcom/google/android/gms/common/internal/zag;-><init>(Lcom/google/android/gms/common/api/internal/OnConnectionFailedListener;)V\nPLcom/google/android/gms/common/internal/zze;-><clinit>()V\nPLcom/google/android/gms/common/internal/zze;-><init>(Landroid/content/Context;)V\nPLcom/google/android/gms/common/internal/zze;->getInstance(Landroid/content/Context;)Lcom/google/android/gms/common/internal/zze;\nPLcom/google/android/gms/common/internal/zzp;-><clinit>()V\nPLcom/google/android/gms/common/internal/zzp;->zze(Landroid/content/Context;)V\nPLcom/google/android/gms/common/logging/Logger;-><init>(Ljava/lang/String;[Ljava/lang/String;)V\nPLcom/google/android/gms/common/stats/ConnectionTracker;-><clinit>()V\nPLcom/google/android/gms/common/stats/ConnectionTracker;-><init>()V\nPLcom/google/android/gms/common/stats/ConnectionTracker;->getInstance()Lcom/google/android/gms/common/stats/ConnectionTracker;\nPLcom/google/android/gms/common/stats/ConnectionTracker;->zza(Landroid/content/Context;Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z\nPLcom/google/android/gms/common/util/Strings;-><clinit>()V\nPLcom/google/android/gms/common/util/Strings;->isEmptyOrWhitespace(Ljava/lang/String;)Z\nPLcom/google/android/gms/common/util/concurrent/NamedThreadFactory;-><init>(Ljava/lang/String;)V\nPLcom/google/android/gms/common/util/concurrent/NamedThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;\nPLcom/google/android/gms/common/wrappers/Wrappers;-><clinit>()V\nPLcom/google/android/gms/common/wrappers/Wrappers;-><init>()V\nPLcom/google/android/gms/common/zza;-><init>(I)V\nPLcom/google/android/gms/dynamic/ObjectWrapper;-><init>(Ljava/lang/Object;)V\nPLcom/google/android/gms/dynamic/ObjectWrapper;->unwrap(Lcom/google/android/gms/dynamic/IObjectWrapper;)Ljava/lang/Object;\nPLcom/google/android/gms/dynamite/DynamiteModule$LoadingException;-><init>(Ljava/lang/String;Lcom/google/android/gms/dynamite/zza;)V\nPLcom/google/android/gms/dynamite/DynamiteModule$VersionPolicy$zzb;-><init>()V\nPLcom/google/android/gms/dynamite/DynamiteModule$zza;-><init>(Lcom/google/android/gms/dynamite/zza;)V\nPLcom/google/android/gms/dynamite/DynamiteModule;-><clinit>()V\nPLcom/google/android/gms/dynamite/DynamiteModule;-><init>(Landroid/content/Context;)V\nPLcom/google/android/gms/dynamite/DynamiteModule;->getLocalVersion(Landroid/content/Context;Ljava/lang/String;)I\nPLcom/google/android/gms/dynamite/DynamiteModule;->instantiate(Ljava/lang/String;)Landroid/os/IBinder;\nPLcom/google/android/gms/dynamite/DynamiteModule;->load(Landroid/content/Context;Lcom/google/android/gms/dynamite/DynamiteModule$VersionPolicy;Ljava/lang/String;)Lcom/google/android/gms/dynamite/DynamiteModule;\nPLcom/google/android/gms/dynamite/DynamiteModule;->zza(Landroid/content/Context;Ljava/lang/String;Z)I\nPLcom/google/android/gms/dynamite/DynamiteModule;->zzb(Landroid/content/Context;Ljava/lang/String;Z)I\nPLcom/google/android/gms/dynamite/DynamiteModule;->zzc(Landroid/content/Context;Ljava/lang/String;Z)I\nPLcom/google/android/gms/dynamite/DynamiteModule;->zze(Landroid/content/Context;Ljava/lang/String;)Lcom/google/android/gms/dynamite/DynamiteModule;\nPLcom/google/android/gms/dynamite/DynamiteModule;->zzj(Landroid/content/Context;)Lcom/google/android/gms/dynamite/zzj;\nPLcom/google/android/gms/dynamite/zza;-><init>(I)V\nPLcom/google/android/gms/dynamite/zza;-><init>(Lcom/bumptech/glide/load/resource/bitmap/VideoDecoder$1;)V\nPLcom/google/android/gms/dynamite/zza;-><init>(Lcom/google/android/gms/auth/api/signin/zzd;)V\nPLcom/google/android/gms/dynamite/zza;->create()Ljava/lang/Object;\nPLcom/google/android/gms/dynamite/zza;->getLocalVersion(Landroid/content/Context;Ljava/lang/String;)I\nPLcom/google/android/gms/dynamite/zza;->zza(Landroid/content/Context;Ljava/lang/String;Lcom/google/android/gms/dynamite/DynamiteModule$VersionPolicy$zza;)Lcom/google/android/gms/dynamite/DynamiteModule$VersionPolicy$zzb;\nPLcom/google/android/gms/internal/base/zar;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V\nPLcom/google/android/gms/internal/base/zar;->dispatchMessage(Landroid/os/Message;)V\nPLcom/google/android/gms/internal/clearcut/zzac;-><init>(Ljava/lang/Object;I)V\nPLcom/google/android/gms/internal/clearcut/zzao;-><init>(Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/events/Subscriber;)V\nPLcom/google/android/gms/internal/clearcut/zzao;->zza()Z\nPLcom/google/android/gms/internal/clearcut/zzao;->zzb()V\nPLcom/google/android/gms/internal/clearcut/zzao;->zzc()Ljava/lang/Boolean;\nPLcom/google/android/gms/internal/clearcut/zzao;->zzd()Z\nPLcom/google/android/gms/internal/clearcut/zzay;-><init>(Lcom/google/android/gms/internal/measurement/zzer;)V\nPLcom/google/android/gms/internal/common/zzb;-><init>(Ljava/lang/String;)V\nPLcom/google/android/gms/internal/common/zze;-><init>(Landroid/os/Looper;)V\nPLcom/google/android/gms/internal/common/zze;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V\nPLcom/google/android/gms/internal/firebase_auth/zzbg;-><clinit>()V\nPLcom/google/android/gms/internal/firebase_auth/zzbg;-><init>()V\nPLcom/google/android/gms/internal/firebase_auth/zzbh;-><clinit>()V\nPLcom/google/android/gms/internal/firebase_auth/zzbh;-><init>()V\nPLcom/google/android/gms/internal/firebase_auth/zzbj;-><init>(Lcom/google/android/gms/internal/firebase_auth/zzbg;I)V\nPLcom/google/android/gms/internal/firebase_auth/zzbm;-><clinit>()V\nPLcom/google/android/gms/internal/firebase_auth/zzbm;-><init>([Ljava/lang/Object;I)V\nPLcom/google/android/gms/internal/firebase_auth/zzbm;->size()I\nPLcom/google/android/gms/internal/firebase_auth/zzbu;-><init>()V\nPLcom/google/android/gms/internal/firebase_auth/zzj;-><init>(Landroid/os/Looper;)V\nPLcom/google/android/gms/internal/firebase_messaging/zze;-><init>(Landroid/os/Looper;)V\nPLcom/google/android/gms/internal/measurement/zzaa;-><init>(Lcom/google/android/gms/internal/measurement/zzz;Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzaa;->zza()V\nPLcom/google/android/gms/internal/measurement/zzaf;-><init>(Lcom/google/android/gms/internal/measurement/zzz;ZI)V\nPLcom/google/android/gms/internal/measurement/zzaf;->zza()V\nPLcom/google/android/gms/internal/measurement/zzar;-><init>(Lcom/google/android/gms/internal/measurement/zzz;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Z)V\nPLcom/google/android/gms/internal/measurement/zzar;->zza()V\nPLcom/google/android/gms/internal/measurement/zzas;-><init>(Lcom/google/android/gms/measurement/internal/zzhw;Landroid/app/Activity;Landroid/os/Bundle;)V\nPLcom/google/android/gms/internal/measurement/zzas;-><init>(Lcom/google/android/gms/measurement/internal/zzhw;Landroid/app/Activity;Lcom/google/android/gms/internal/measurement/zzl;)V\nPLcom/google/android/gms/internal/measurement/zzas;->zza()V\nPLcom/google/android/gms/internal/measurement/zzau;-><init>(Lcom/google/android/gms/internal/measurement/zzz;Ljava/lang/Object;I)V\nPLcom/google/android/gms/internal/measurement/zzau;->zza()V\nPLcom/google/android/gms/internal/measurement/zzay;-><init>(Lcom/google/android/gms/internal/measurement/zzz;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ZZ)V\nPLcom/google/android/gms/internal/measurement/zzay;->zza()V\nPLcom/google/android/gms/internal/measurement/zzbc;-><init>(Lcom/google/android/gms/measurement/internal/zzhw;Landroid/app/Activity;I)V\nPLcom/google/android/gms/internal/measurement/zzbc;->zza()V\nPLcom/google/android/gms/internal/measurement/zzbp;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbq$zza$zza;-><init>(Lcom/google/android/gms/internal/measurement/zzbp;)V\nPLcom/google/android/gms/internal/measurement/zzbq$zza$zza;->zza()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbq$zza;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbq$zza;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzbq$zza;->zza()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbq$zza;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzbq$zza;->zzb()Z\nPLcom/google/android/gms/internal/measurement/zzbq$zza;->zzc()Z\nPLcom/google/android/gms/internal/measurement/zzbq$zza;->zzd()Z\nPLcom/google/android/gms/internal/measurement/zzbq$zza;->zzf()Lcom/google/android/gms/internal/measurement/zzbq$zza;\nPLcom/google/android/gms/internal/measurement/zzbq$zzb$zza;-><init>(Lcom/google/android/gms/internal/measurement/zzbp;)V\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zza()Z\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zza(I)Lcom/google/android/gms/internal/measurement/zzbq$zza;\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzb()J\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzc()Z\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzd()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zze()Ljava/util/List;\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzf()I\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzi()Lcom/google/android/gms/internal/measurement/zzbq$zzb$zza;\nPLcom/google/android/gms/internal/measurement/zzbq$zzb;->zzk()Lcom/google/android/gms/internal/measurement/zzbq$zzb;\nPLcom/google/android/gms/internal/measurement/zzbq$zzc;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbq$zzc;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzbq$zzc;->zza()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbq$zzc;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzbq$zzc;->zzb()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbr;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zza;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zza;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zza;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzbs$zzc$zza;-><init>(Lcom/google/android/gms/internal/measurement/zzbr;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzc$zza;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze$zza;)Lcom/google/android/gms/internal/measurement/zzbs$zzc$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzc;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zzc;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zzc;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzbs$zzc;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzc;Lcom/google/android/gms/internal/measurement/zzbs$zze;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzc;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzc;J)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzc;->zzj()Lcom/google/android/gms/internal/measurement/zzbs$zzc$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzc;->zzk()Lcom/google/android/gms/internal/measurement/zzbs$zzc;\nPLcom/google/android/gms/internal/measurement/zzbs$zzc;->zzl()V\nPLcom/google/android/gms/internal/measurement/zzbs$zze$zza;-><init>(Lcom/google/android/gms/internal/measurement/zzbr;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zze$zza;->zza(J)Lcom/google/android/gms/internal/measurement/zzbs$zze$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zze$zza;->zza(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zze$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zze$zza;->zzb(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zze$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zze;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze;J)V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zze;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zze;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zze;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zzc(Lcom/google/android/gms/internal/measurement/zzbs$zze;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zzd(Lcom/google/android/gms/internal/measurement/zzbs$zze;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zzk()Lcom/google/android/gms/internal/measurement/zzbs$zze$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zze;->zzl()Lcom/google/android/gms/internal/measurement/zzbs$zze;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;-><init>(Lcom/google/android/gms/internal/measurement/zzbr;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zza()Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zza(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzb(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzc(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzd(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zze(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzf(I)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzf(J)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzf(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzg(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzh(I)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzi(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzj()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzk(J)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzk(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzl()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzl(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg$zza;->zzm(Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zza(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzaa(Lcom/google/android/gms/internal/measurement/zzbs$zzg;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzam()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzbf()Lcom/google/android/gms/internal/measurement/zzbs$zzg$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzbg()Lcom/google/android/gms/internal/measurement/zzbs$zzg;\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzc(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzd(Lcom/google/android/gms/internal/measurement/zzbs$zzg;I)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzd(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zze(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzf(Lcom/google/android/gms/internal/measurement/zzbs$zzg;I)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzf(Lcom/google/android/gms/internal/measurement/zzbs$zzg;J)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzf(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzg(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzi(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzk(Lcom/google/android/gms/internal/measurement/zzbs$zzg;J)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzk(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzl(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzm(Lcom/google/android/gms/internal/measurement/zzbs$zzg;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzg;->zzx()Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzbs$zzk$zza;-><init>(Lcom/google/android/gms/internal/measurement/zzbr;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk$zza;->zza(J)Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzk$zza;->zzb(J)Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk;J)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzk;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzk;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzk;J)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzb(Lcom/google/android/gms/internal/measurement/zzbs$zzk;Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzc(Lcom/google/android/gms/internal/measurement/zzbs$zzk;)V\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzj()Lcom/google/android/gms/internal/measurement/zzbs$zzk$zza;\nPLcom/google/android/gms/internal/measurement/zzbs$zzk;->zzk()Lcom/google/android/gms/internal/measurement/zzbs$zzk;\nPLcom/google/android/gms/internal/measurement/zzbz;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzbz;-><init>(Landroid/content/ContentResolver;Landroid/net/Uri;)V\nPLcom/google/android/gms/internal/measurement/zzbz;->zza(Landroid/content/ContentResolver;Landroid/net/Uri;)Lcom/google/android/gms/internal/measurement/zzbz;\nPLcom/google/android/gms/internal/measurement/zzbz;->zzc()V\nPLcom/google/android/gms/internal/measurement/zzc;-><init>(Ljava/lang/String;)V\nPLcom/google/android/gms/internal/measurement/zzck;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzck;->zza(Ljava/lang/String;)Landroid/net/Uri;\nPLcom/google/android/gms/internal/measurement/zzcl;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzcl;->zza(Landroid/content/Context;Landroid/net/Uri;)Z\nPLcom/google/android/gms/internal/measurement/zzcn;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzcn;-><init>(Lcom/google/android/gms/internal/measurement/zzct;Ljava/lang/String;Ljava/lang/Object;Lcom/google/android/gms/internal/measurement/zzco;)V\nPLcom/google/android/gms/internal/measurement/zzcn;->zza(Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/android/gms/internal/measurement/zzco;-><init>(Lcom/google/android/gms/internal/measurement/zzct;Ljava/lang/String;Ljava/lang/Object;I)V\nPLcom/google/android/gms/internal/measurement/zzcs;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzcs;->zza()V\nPLcom/google/android/gms/internal/measurement/zzct;-><init>(Landroid/net/Uri;)V\nPLcom/google/android/gms/internal/measurement/zzct;->zza(Ljava/lang/String;J)Lcom/google/android/gms/internal/measurement/zzcn;\nPLcom/google/android/gms/internal/measurement/zzct;->zza(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/gms/internal/measurement/zzcn;\nPLcom/google/android/gms/internal/measurement/zzct;->zza(Ljava/lang/String;Z)Lcom/google/android/gms/internal/measurement/zzcn;\nPLcom/google/android/gms/internal/measurement/zzcu;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzcu;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzcu;->zza()Z\nPLcom/google/android/gms/internal/measurement/zzcw;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzcw;->zza(Ljava/lang/Object;)Lcom/google/android/gms/internal/measurement/zzcw;\nPLcom/google/android/gms/internal/measurement/zzcy;-><init>(Ljava/lang/Object;)V\nPLcom/google/android/gms/internal/measurement/zzcy;->zza()Z\nPLcom/google/android/gms/internal/measurement/zzcy;->zzb()Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzdc;-><init>(Lcom/google/android/gms/internal/measurement/zzdb;)V\nPLcom/google/android/gms/internal/measurement/zzdc;->zza()Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzdd;-><init>(Lcom/google/android/gms/internal/measurement/zzdb;)V\nPLcom/google/android/gms/internal/measurement/zzdf;-><init>(Ljava/lang/Object;)V\nPLcom/google/android/gms/internal/measurement/zzdf;->zza()Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzdl;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzdm;->zzbi()[B\nPLcom/google/android/gms/internal/measurement/zzdp;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzdq;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzdq;->zzc()V\nPLcom/google/android/gms/internal/measurement/zzel$zza;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzel$zza;-><init>([BI)V\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zza()I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zza(Lcom/google/android/gms/internal/measurement/zzgm;Lcom/google/android/gms/internal/measurement/zzhf;)I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zzb(II)V\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zzb(ILjava/lang/String;)I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zzb(Ljava/lang/String;)I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zzd(IJ)I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zze(I)I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zze(J)I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zzf(I)I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zzf(II)I\nPLcom/google/android/gms/internal/measurement/zzel$zza;->zzg(I)I\nPLcom/google/android/gms/internal/measurement/zzer;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzer;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzer;->zza()Lcom/google/android/gms/internal/measurement/zzer;\nPLcom/google/android/gms/internal/measurement/zzes;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzev;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzfc;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzfc;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzfc;->zza(Ljava/lang/Class;)Z\nPLcom/google/android/gms/internal/measurement/zzfc;->zzb(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzgk;\nPLcom/google/android/gms/internal/measurement/zzfd;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzfd;->zza(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzer;\nPLcom/google/android/gms/internal/measurement/zzfe$zza;->zza(Lcom/google/android/gms/internal/measurement/zzfe;)Lcom/google/android/gms/internal/measurement/zzfe$zza;\nPLcom/google/android/gms/internal/measurement/zzfe$zza;->zzb([BIILcom/google/android/gms/internal/measurement/zzer;)Lcom/google/android/gms/internal/measurement/zzfe$zza;\nPLcom/google/android/gms/internal/measurement/zzfe;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzfe;->g_()Z\nPLcom/google/android/gms/internal/measurement/zzfe;->zza(Lcom/google/android/gms/internal/measurement/zzel$zza;)V\nPLcom/google/android/gms/internal/measurement/zzfe;->zza(Lcom/google/android/gms/internal/measurement/zzfn;)Lcom/google/android/gms/internal/measurement/zzfn;\nPLcom/google/android/gms/internal/measurement/zzfe;->zza(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzfe;\nPLcom/google/android/gms/internal/measurement/zzfe;->zza(Ljava/lang/Class;Lcom/google/android/gms/internal/measurement/zzfe;)V\nPLcom/google/android/gms/internal/measurement/zzfe;->zzbj()I\nPLcom/google/android/gms/internal/measurement/zzfe;->zzbk()Lcom/google/android/gms/internal/measurement/zzfe$zza;\nPLcom/google/android/gms/internal/measurement/zzfe;->zzbl()Lcom/google/android/gms/internal/measurement/zzfe$zza;\nPLcom/google/android/gms/internal/measurement/zzfe;->zzbm()I\nPLcom/google/android/gms/internal/measurement/zzfe;->zzc(I)V\nPLcom/google/android/gms/internal/measurement/zzff;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzff;-><init>([II)V\nPLcom/google/android/gms/internal/measurement/zzff;->size()I\nPLcom/google/android/gms/internal/measurement/zzfh;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzfw;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzfw;-><init>(Lcom/google/android/gms/internal/measurement/zzgr;)V\nPLcom/google/android/gms/internal/measurement/zzfy;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzfy;-><init>(Lcom/google/android/gms/internal/measurement/zzgr;)V\nPLcom/google/android/gms/internal/measurement/zzgb;-><init>(Lcom/google/android/gms/internal/measurement/zzgr;)V\nPLcom/google/android/gms/internal/measurement/zzgb;->zza(Ljava/lang/Object;Ljava/lang/Object;J)V\nPLcom/google/android/gms/internal/measurement/zzgb;->zzb(Ljava/lang/Object;J)V\nPLcom/google/android/gms/internal/measurement/zzgb;->zzc(Ljava/lang/Object;J)Lcom/google/android/gms/internal/measurement/zzfn;\nPLcom/google/android/gms/internal/measurement/zzgc;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzgd;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzgd;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzgd;->zza(Lcom/google/android/gms/internal/measurement/zzgk;)Z\nPLcom/google/android/gms/internal/measurement/zzgf;-><init>([Lcom/google/android/gms/internal/measurement/zzgn;)V\nPLcom/google/android/gms/internal/measurement/zzgf;->zzb(Ljava/lang/Class;)Lcom/google/android/gms/internal/measurement/zzgk;\nPLcom/google/android/gms/internal/measurement/zzgi;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzgl;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzgq;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzgq;-><init>([I[Ljava/lang/Object;IILcom/google/android/gms/internal/measurement/zzgm;Z[IIILcom/google/android/gms/internal/measurement/zzgx;Lcom/google/android/gms/internal/measurement/zzfw;Lcom/google/android/gms/internal/measurement/zzhz;Lcom/google/android/gms/internal/measurement/zzes;Lcom/google/android/gms/internal/measurement/zzgi;)V\nPLcom/google/android/gms/internal/measurement/zzgq;->zza$4(Ljava/lang/Object;[BIILcom/google/android/gms/internal/clearcut/zzay;)V\nPLcom/google/android/gms/internal/measurement/zzgq;->zza()Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzgq;->zza(I)Lcom/google/android/gms/internal/measurement/zzhf;\nPLcom/google/android/gms/internal/measurement/zzgq;->zza(Lcom/google/android/gms/internal/measurement/zzgk;Lcom/google/android/gms/internal/measurement/zzgx;Lcom/google/android/gms/internal/measurement/zzfw;Lcom/google/android/gms/internal/measurement/zzhz;Lcom/google/android/gms/internal/measurement/zzes;Lcom/google/android/gms/internal/measurement/zzgi;)Lcom/google/android/gms/internal/measurement/zzgq;\nPLcom/google/android/gms/internal/measurement/zzgq;->zza(Lcom/google/android/gms/internal/measurement/zzhz;Ljava/lang/Object;Landroidx/compose/runtime/Stack;)V\nPLcom/google/android/gms/internal/measurement/zzgq;->zza(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;\nPLcom/google/android/gms/internal/measurement/zzgq;->zza(Ljava/lang/Object;I)Z\nPLcom/google/android/gms/internal/measurement/zzgq;->zza(Ljava/lang/Object;Landroidx/compose/runtime/Stack;)V\nPLcom/google/android/gms/internal/measurement/zzgq;->zza(Ljava/lang/Object;[BIIILcom/google/android/gms/internal/clearcut/zzay;)I\nPLcom/google/android/gms/internal/measurement/zzgq;->zzb(II)I\nPLcom/google/android/gms/internal/measurement/zzgq;->zzb(Ljava/lang/Object;I)V\nPLcom/google/android/gms/internal/measurement/zzgq;->zzb(Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/android/gms/internal/measurement/zzgq;->zzd(I)I\nPLcom/google/android/gms/internal/measurement/zzgr;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzgr;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzgr;->zza()[I\nPLcom/google/android/gms/internal/measurement/zzgr;->zza(Lcom/google/android/gms/internal/measurement/zzdb;)Lcom/google/android/gms/internal/measurement/zzdb;\nPLcom/google/android/gms/internal/measurement/zzgr;->zza(Lcom/google/android/gms/internal/measurement/zzhf;I[BIILcom/google/android/gms/internal/measurement/zzfn;Lcom/google/android/gms/internal/clearcut/zzay;)I\nPLcom/google/android/gms/internal/measurement/zzgr;->zza(Lcom/google/android/gms/internal/measurement/zzhf;[BIILcom/google/android/gms/internal/clearcut/zzay;)I\nPLcom/google/android/gms/internal/measurement/zzgr;->zza([BILcom/google/android/gms/internal/clearcut/zzay;)I\nPLcom/google/android/gms/internal/measurement/zzgr;->zzb([BILcom/google/android/gms/internal/clearcut/zzay;)I\nPLcom/google/android/gms/internal/measurement/zzgr;->zzc([BILcom/google/android/gms/internal/clearcut/zzay;)I\nPLcom/google/android/gms/internal/measurement/zzgw;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzgx;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzh;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzha;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzha;-><init>([Ljava/lang/Object;I)V\nPLcom/google/android/gms/internal/measurement/zzha;->get(I)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzha;->size()I\nPLcom/google/android/gms/internal/measurement/zzha;->zza(I)Lcom/google/android/gms/internal/measurement/zzfn;\nPLcom/google/android/gms/internal/measurement/zzha;->zzb(I)V\nPLcom/google/android/gms/internal/measurement/zzhb;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzhb;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzhb;->zza(Ljava/lang/Object;)Lcom/google/android/gms/internal/measurement/zzhf;\nPLcom/google/android/gms/internal/measurement/zzhd;-><init>(Lcom/google/android/gms/internal/measurement/zzgm;Ljava/lang/String;[Ljava/lang/Object;)V\nPLcom/google/android/gms/internal/measurement/zzhh;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzhh;->zza(ILjava/util/List;Landroidx/compose/runtime/Stack;Lcom/google/android/gms/internal/measurement/zzhf;)V\nPLcom/google/android/gms/internal/measurement/zzhh;->zza(ILjava/util/List;Lcom/google/android/gms/internal/measurement/zzhf;)I\nPLcom/google/android/gms/internal/measurement/zzhh;->zza(Lcom/google/android/gms/internal/measurement/zzhz;Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/android/gms/internal/measurement/zzhh;->zza(Z)Lcom/google/android/gms/internal/measurement/zzhz;\nPLcom/google/android/gms/internal/measurement/zzhh;->zzf(ILjava/util/List;)I\nPLcom/google/android/gms/internal/measurement/zzhh;->zzi(ILjava/util/List;Landroidx/compose/runtime/Stack;Z)V\nPLcom/google/android/gms/internal/measurement/zzhw;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzhw;-><init>(I[I[Ljava/lang/Object;Z)V\nPLcom/google/android/gms/internal/measurement/zzhw;->equals(Ljava/lang/Object;)Z\nPLcom/google/android/gms/internal/measurement/zzhw;->zzb(Landroidx/compose/runtime/Stack;)V\nPLcom/google/android/gms/internal/measurement/zzhw;->zze()I\nPLcom/google/android/gms/internal/measurement/zzhz;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzic;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzic;->run()Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzid$zza;-><init>(Lsun/misc/Unsafe;I)V\nPLcom/google/android/gms/internal/measurement/zzid$zza;->zza(Ljava/lang/Object;JB)V\nPLcom/google/android/gms/internal/measurement/zzid$zza;->zza(Ljava/lang/Object;JZ)V\nPLcom/google/android/gms/internal/measurement/zzid$zza;->zzb(Ljava/lang/Object;J)Z\nPLcom/google/android/gms/internal/measurement/zzid;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzid;->zza(Ljava/lang/Object;J)I\nPLcom/google/android/gms/internal/measurement/zzid;->zza(Ljava/lang/Object;JJ)V\nPLcom/google/android/gms/internal/measurement/zzid;->zza(Ljava/lang/Object;JLjava/lang/Object;)V\nPLcom/google/android/gms/internal/measurement/zzid;->zza([BJB)V\nPLcom/google/android/gms/internal/measurement/zzid;->zzb(Ljava/lang/Class;)I\nPLcom/google/android/gms/internal/measurement/zzid;->zzb(Ljava/lang/Object;J)J\nPLcom/google/android/gms/internal/measurement/zzid;->zzc()Lsun/misc/Unsafe;\nPLcom/google/android/gms/internal/measurement/zzid;->zzc(Ljava/lang/Class;)I\nPLcom/google/android/gms/internal/measurement/zzid;->zzc(Ljava/lang/Object;J)Z\nPLcom/google/android/gms/internal/measurement/zzid;->zzd(Ljava/lang/Class;)Z\nPLcom/google/android/gms/internal/measurement/zzid;->zzd(Ljava/lang/Object;JB)V\nPLcom/google/android/gms/internal/measurement/zzid;->zzf()Ljava/lang/reflect/Field;\nPLcom/google/android/gms/internal/measurement/zzid;->zzf(Ljava/lang/Object;J)Ljava/lang/Object;\nPLcom/google/android/gms/internal/measurement/zzid;->zzl(Ljava/lang/Object;J)B\nPLcom/google/android/gms/internal/measurement/zzif;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzig;-><init>(I)V\nPLcom/google/android/gms/internal/measurement/zzit;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzit;-><init>()V\nPLcom/google/android/gms/internal/measurement/zziu;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zziu;-><init>()V\nPLcom/google/android/gms/internal/measurement/zziv;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zziv;-><init>()V\nPLcom/google/android/gms/internal/measurement/zziw;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zziw;-><init>()V\nPLcom/google/android/gms/internal/measurement/zziz;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zziz;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzj;-><init>(Landroid/os/Looper;)V\nPLcom/google/android/gms/internal/measurement/zzj;->dispatchMessage(Landroid/os/Message;)V\nPLcom/google/android/gms/internal/measurement/zzja;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzja;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjb;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjb;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjc;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjc;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjf;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjf;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjg;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjg;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjg;->zzb()Z\nPLcom/google/android/gms/internal/measurement/zzjh;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjh;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzji;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzji;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjl;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjl;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjm;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjm;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjn;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjn;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjo;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjo;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjr;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjr;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjs;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjs;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjt;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjt;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzju;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzju;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjx;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjx;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjx;->zzb()Z\nPLcom/google/android/gms/internal/measurement/zzjy;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjy;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzjz;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzjz;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzka;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzka;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkd;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkd;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzke;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzke;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkf;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkf;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkg;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkg;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkj;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkj;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkj;->zzb()Z\nPLcom/google/android/gms/internal/measurement/zzkk;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkk;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkl;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkl;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkm;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkm;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkp;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkp;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkp;->zzb()Z\nPLcom/google/android/gms/internal/measurement/zzkq;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkq;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkr;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkr;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzks;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzks;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkv;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkv;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkw;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkw;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzkx;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzkx;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzky;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzky;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzl;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzl;->zza(Landroid/os/Bundle;)V\nPLcom/google/android/gms/internal/measurement/zzl;->zzb(J)Landroid/os/Bundle;\nPLcom/google/android/gms/internal/measurement/zzlb;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlb;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlc;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlc;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzld;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzld;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzle;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzle;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlh;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlh;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzli;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzli;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlj;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlj;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlk;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlk;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzln;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzln;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlo;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlo;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlp;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlp;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlq;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlq;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlt;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlt;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlu;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlu;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlv;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlv;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlw;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlw;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzlz;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzlz;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzma;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzma;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmb;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmb;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmc;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmc;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmf;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmf;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmg;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmg;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmh;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmh;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmi;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmi;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzml;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzml;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmm;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmm;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmn;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmn;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmo;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmo;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmr;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmr;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzms;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzms;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmt;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmt;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmu;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmu;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmx;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmx;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmy;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmy;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzmz;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzmz;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzn;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzn;->asInterface(Landroid/os/IBinder;)Lcom/google/android/gms/internal/measurement/zzk;\nPLcom/google/android/gms/internal/measurement/zzna;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzna;-><init>()V\nPLcom/google/android/gms/internal/measurement/zznd;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zznd;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzne;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzne;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzw;-><init>()V\nPLcom/google/android/gms/internal/measurement/zzx;-><clinit>()V\nPLcom/google/android/gms/internal/measurement/zzx;-><init>(JJZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)V\nPLcom/google/android/gms/internal/measurement/zzy;-><init>(Lcom/google/android/gms/internal/measurement/zzz;Ljava/lang/String;Ljava/lang/String;Landroid/content/Context;Landroid/os/Bundle;)V\nPLcom/google/android/gms/internal/measurement/zzy;->zza()V\nPLcom/google/android/gms/internal/measurement/zzz$zzb;-><init>(Lcom/google/android/gms/internal/measurement/zzz;Z)V\nPLcom/google/android/gms/internal/measurement/zzz$zzb;->run()V\nPLcom/google/android/gms/internal/measurement/zzz$zzd;-><init>(Lcom/google/android/gms/measurement/internal/zzgz;)V\nPLcom/google/android/gms/internal/measurement/zzz$zzd;->zza()I\nPLcom/google/android/gms/internal/measurement/zzz$zzd;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;J)V\nPLcom/google/android/gms/internal/measurement/zzz;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)V\nPLcom/google/android/gms/internal/measurement/zzz;->zza(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Lcom/google/android/gms/internal/measurement/zzz;\nPLcom/google/android/gms/internal/measurement/zzz;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ZZLjava/lang/Long;)V\nPLcom/google/android/gms/internal/measurement/zzz;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Z)V\nPLcom/google/android/gms/internal/measurement/zzz;->zzb(Landroid/content/Context;)Z\nPLcom/google/android/gms/internal/measurement/zzz;->zzi(Landroid/content/Context;)V\nPLcom/google/android/gms/internal/vision/zzfc;-><init>()V\nPLcom/google/android/gms/internal/vision/zzit;-><init>(Lcom/google/android/gms/measurement/internal/zzan;)V\nPLcom/google/android/gms/internal/vision/zzit;->hasNext()Z\nPLcom/google/android/gms/internal/vision/zzit;->next()Ljava/lang/Object;\nPLcom/google/android/gms/internal/vision/zziu$zzd;-><init>(Lsun/misc/Unsafe;I)V\nPLcom/google/android/gms/internal/vision/zziu$zzd;->arrayBaseOffset(Ljava/lang/Class;)I\nPLcom/google/android/gms/internal/vision/zziu$zzd;->arrayIndexScale(Ljava/lang/Class;)I\nPLcom/google/android/gms/internal/vision/zziu$zzd;->getObject(Ljava/lang/Object;J)Ljava/lang/Object;\nPLcom/google/android/gms/internal/vision/zziu$zzd;->objectFieldOffset(Ljava/lang/reflect/Field;)J\nPLcom/google/android/gms/internal/vision/zziu$zzd;->putInt(Ljava/lang/Object;JI)V\nPLcom/google/android/gms/internal/vision/zziu$zzd;->putObject(Ljava/lang/Object;JLjava/lang/Object;)V\nPLcom/google/android/gms/internal/vision/zziu$zzd;->zza$com$google$android$gms$internal$measurement$zzid$zzc(Ljava/lang/Object;JI)V\nPLcom/google/android/gms/internal/vision/zziu$zzd;->zza$com$google$android$gms$internal$measurement$zzid$zzc(Ljava/lang/Object;JJ)V\nPLcom/google/android/gms/internal/vision/zziu$zzd;->zza(Ljava/lang/Object;JJ)V\nPLcom/google/android/gms/internal/vision/zziu$zzd;->zze(Ljava/lang/Object;J)I\nPLcom/google/android/gms/internal/vision/zziu$zzd;->zzf(Ljava/lang/Object;J)J\nPLcom/google/android/gms/measurement/AppMeasurement;-><init>(Lcom/google/android/gms/measurement/internal/zzhy;)V\nPLcom/google/android/gms/measurement/AppMeasurement;->registerOnMeasurementEventListener(Lcom/google/android/gms/measurement/AppMeasurement$OnEventListener;)V\nPLcom/google/android/gms/measurement/AppMeasurement;->zza(Landroid/content/Context;Landroid/os/Bundle;)Lcom/google/android/gms/measurement/AppMeasurement;\nPLcom/google/android/gms/measurement/AppMeasurement;->zzb(Landroid/content/Context;Landroid/os/Bundle;)Lcom/google/android/gms/measurement/internal/zzhy;\nPLcom/google/android/gms/measurement/AppMeasurementService;-><init>()V\nPLcom/google/android/gms/measurement/AppMeasurementService;->onBind(Landroid/content/Intent;)Landroid/os/IBinder;\nPLcom/google/android/gms/measurement/AppMeasurementService;->onCreate()V\nPLcom/google/android/gms/measurement/AppMeasurementService;->onDestroy()V\nPLcom/google/android/gms/measurement/AppMeasurementService;->onUnbind(Landroid/content/Intent;)Z\nPLcom/google/android/gms/measurement/AppMeasurementService;->zza()Landroidx/appcompat/view/ActionBarPolicy;\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService$zza;-><init>(Lcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;Lcom/google/android/gms/internal/measurement/zzq;)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService$zza;->onEvent(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;-><init>()V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->initialize(Lcom/google/android/gms/dynamic/IObjectWrapper;Lcom/google/android/gms/internal/measurement/zzx;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->logEvent(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ZZJ)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityCreated(Lcom/google/android/gms/dynamic/IObjectWrapper;Landroid/os/Bundle;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityDestroyed(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityPaused(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityResumed(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivitySaveInstanceState(Lcom/google/android/gms/dynamic/IObjectWrapper;Lcom/google/android/gms/internal/measurement/zzp;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityStarted(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->onActivityStopped(Lcom/google/android/gms/dynamic/IObjectWrapper;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->registerOnMeasurementEventListener(Lcom/google/android/gms/internal/measurement/zzq;)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->setCurrentScreen(Lcom/google/android/gms/dynamic/IObjectWrapper;Ljava/lang/String;Ljava/lang/String;J)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->setMeasurementEnabled(ZJ)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->setUserProperty(Ljava/lang/String;Ljava/lang/String;Lcom/google/android/gms/dynamic/IObjectWrapper;ZJ)V\nPLcom/google/android/gms/measurement/internal/AppMeasurementDynamiteService;->zza()V\nPLcom/google/android/gms/measurement/internal/zza;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zza;->zza(J)V\nPLcom/google/android/gms/measurement/internal/zza;->zzb(J)V\nPLcom/google/android/gms/measurement/internal/zzac;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzad;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzad;-><init>(Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzad;->b_()V\nPLcom/google/android/gms/measurement/internal/zzad;->zza(JLjava/lang/String;ZZ)Lcom/google/android/gms/measurement/internal/zzac;\nPLcom/google/android/gms/measurement/internal/zzad;->zza(Landroid/content/ContentValues;Ljava/lang/String;Ljava/lang/Object;)V\nPLcom/google/android/gms/measurement/internal/zzad;->zza(Landroid/database/Cursor;I)Ljava/lang/Object;\nPLcom/google/android/gms/measurement/internal/zzad;->zza(Lcom/google/android/gms/internal/measurement/zzbs$zzg;)J\nPLcom/google/android/gms/measurement/internal/zzad;->zza(Lcom/google/android/gms/measurement/internal/zzkj;)Z\nPLcom/google/android/gms/measurement/internal/zzad;->zza(Ljava/lang/String;[Ljava/lang/String;J)J\nPLcom/google/android/gms/measurement/internal/zzad;->zzam()Z\nPLcom/google/android/gms/measurement/internal/zzad;->zzb(Ljava/lang/String;[Ljava/lang/String;)J\nPLcom/google/android/gms/measurement/internal/zzad;->zzc(Ljava/lang/String;)J\nPLcom/google/android/gms/measurement/internal/zzad;->zzc(Ljava/lang/String;Ljava/lang/String;)Lcom/google/android/gms/measurement/internal/zzkj;\nPLcom/google/android/gms/measurement/internal/zzad;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzad;->zzf()V\nPLcom/google/android/gms/measurement/internal/zzad;->zzh()V\nPLcom/google/android/gms/measurement/internal/zzad;->zzv()V\nPLcom/google/android/gms/measurement/internal/zzae;-><init>(Landroidx/transition/ViewOverlayApi14;Landroid/content/Context;Ljava/lang/String;I)V\nPLcom/google/android/gms/measurement/internal/zzag;-><init>(Lcom/google/android/gms/measurement/internal/zzgt;)V\nPLcom/google/android/gms/measurement/internal/zzag;->zzc()V\nPLcom/google/android/gms/measurement/internal/zzag;->zzd()Landroid/os/Handler;\nPLcom/google/android/gms/measurement/internal/zzai;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzai;->zza(Landroid/content/Context;)Z\nPLcom/google/android/gms/measurement/internal/zzai;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzai;->zzf()J\nPLcom/google/android/gms/measurement/internal/zzai;->zzg()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzak;-><init>(Ljava/lang/String;Ljava/lang/String;JJJJJLjava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;)V\nPLcom/google/android/gms/measurement/internal/zzak;->zza(J)Lcom/google/android/gms/measurement/internal/zzak;\nPLcom/google/android/gms/measurement/internal/zzal;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJLcom/google/android/gms/measurement/internal/zzan;)V\nPLcom/google/android/gms/measurement/internal/zzal;->zza(Lcom/google/android/gms/measurement/internal/zzfw;J)Lcom/google/android/gms/measurement/internal/zzal;\nPLcom/google/android/gms/measurement/internal/zzan;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzan;-><init>(Landroid/os/Bundle;)V\nPLcom/google/android/gms/measurement/internal/zzan;->iterator()Ljava/util/Iterator;\nPLcom/google/android/gms/measurement/internal/zzan;->writeToParcel(Landroid/os/Parcel;I)V\nPLcom/google/android/gms/measurement/internal/zzan;->zza(Ljava/lang/String;)Ljava/lang/Object;\nPLcom/google/android/gms/measurement/internal/zzan;->zzb()Landroid/os/Bundle;\nPLcom/google/android/gms/measurement/internal/zzao;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzao;-><init>(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzan;Ljava/lang/String;J)V\nPLcom/google/android/gms/measurement/internal/zzao;->writeToParcel(Landroid/os/Parcel;I)V\nPLcom/google/android/gms/measurement/internal/zzaq;->zza(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Lcom/google/android/gms/measurement/internal/zzej;)Lcom/google/android/gms/measurement/internal/zzel;\nPLcom/google/android/gms/measurement/internal/zzbb;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbb;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbb;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/google/android/gms/measurement/internal/zzbd;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbd;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbd;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/google/android/gms/measurement/internal/zzbe;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbe;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbe;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/google/android/gms/measurement/internal/zzbf;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbf;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbg;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbg;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbh;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbh;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbi;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbi;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbj;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbj;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbk;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbk;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbl;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbl;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbm;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbm;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbn;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbn;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbo;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbo;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbp;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbp;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbq;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbq;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbr;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbr;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbs;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbs;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbt;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbt;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbu;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbu;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbv;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbv;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbw;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbw;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbx;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbx;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzby;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzby;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzbz;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzbz;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzca;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzca;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcb;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcb;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcc;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcc;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcd;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcd;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzce;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzce;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcf;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcf;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcg;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcg;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzch;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzch;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzci;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzci;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcj;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcj;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzck;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzck;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcl;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcl;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcm;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcm;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcn;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcn;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzco;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzco;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcp;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcp;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcq;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcq;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcr;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcr;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcs;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcs;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzct;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzct;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcu;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcu;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcv;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcv;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcw;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcw;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcx;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcx;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcy;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcy;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzcz;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzcz;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzd;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzd;->zzb()V\nPLcom/google/android/gms/measurement/internal/zzd;->zze()Lcom/google/android/gms/measurement/internal/zza;\nPLcom/google/android/gms/measurement/internal/zzd;->zzf()Lcom/google/android/gms/measurement/internal/zzhb;\nPLcom/google/android/gms/measurement/internal/zzd;->zzg()Lcom/google/android/gms/measurement/internal/zzep;\nPLcom/google/android/gms/measurement/internal/zzd;->zzh()Lcom/google/android/gms/measurement/internal/zzil;\nPLcom/google/android/gms/measurement/internal/zzd;->zzi()Lcom/google/android/gms/measurement/internal/zzig;\nPLcom/google/android/gms/measurement/internal/zzd;->zzj()Lcom/google/android/gms/measurement/internal/zzeo;\nPLcom/google/android/gms/measurement/internal/zzd;->zzk()Lcom/google/android/gms/measurement/internal/zzjm;\nPLcom/google/android/gms/measurement/internal/zzda;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzda;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdb;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdb;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdc;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdc;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdd;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdd;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzde;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzde;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdf;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdf;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdg;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdg;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdh;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdh;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdi;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdi;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdj;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdj;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdk;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdk;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdl;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdl;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdm;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdm;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdn;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdn;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdo;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdo;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdp;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdp;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdq;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdq;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdr;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdr;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzds;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzds;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdt;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdt;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdu;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdu;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdv;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdv;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdw;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdw;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdx;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdx;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdy;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdy;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzdz;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzdz;-><init>()V\nPLcom/google/android/gms/measurement/internal/zze;-><init>(Lcom/google/android/gms/measurement/internal/zzd;JI)V\nPLcom/google/android/gms/measurement/internal/zze;->run()V\nPLcom/google/android/gms/measurement/internal/zzea;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzea;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzeb;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzeb;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzec;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzec;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzed;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzed;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzee;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzee;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzef;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzef;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzeh;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzeh;-><init>()V\nPLcom/google/android/gms/measurement/internal/zzel;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzel;-><init>(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Lcom/google/android/gms/measurement/internal/zzej;Landroidx/navigation/R$id;)V\nPLcom/google/android/gms/measurement/internal/zzeo;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzeo;->zza(Landroid/database/sqlite/SQLiteDatabase;)J\nPLcom/google/android/gms/measurement/internal/zzeo;->zzad()Z\nPLcom/google/android/gms/measurement/internal/zzeo;->zzae()Landroid/database/sqlite/SQLiteDatabase;\nPLcom/google/android/gms/measurement/internal/zzeo;->zzz()Z\nPLcom/google/android/gms/measurement/internal/zzep;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;J)V\nPLcom/google/android/gms/measurement/internal/zzep;->zzaa()V\nPLcom/google/android/gms/measurement/internal/zzep;->zzz()Z\nPLcom/google/android/gms/measurement/internal/zzeq;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzeq;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzeq;->zzc(Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzeq;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzeq;->zzg()Z\nPLcom/google/android/gms/measurement/internal/zzes;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzes;->zza(I)Z\nPLcom/google/android/gms/measurement/internal/zzes;->zza(IZZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/android/gms/measurement/internal/zzes;->zza(ZLjava/lang/Object;)Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzes;->zza(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzes;->zzad()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzes;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzes;->zzx()Lcom/google/android/gms/measurement/internal/zzeu;\nPLcom/google/android/gms/measurement/internal/zzeu;-><init>(Lcom/google/android/gms/measurement/internal/zzes;IZZ)V\nPLcom/google/android/gms/measurement/internal/zzeu;->zza(Ljava/lang/String;Ljava/lang/Object;)V\nPLcom/google/android/gms/measurement/internal/zzeu;->zza(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/android/gms/measurement/internal/zzez;-><init>(Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzez;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzez;->zzf()Z\nPLcom/google/android/gms/measurement/internal/zzf;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzf;->zza(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zza(Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzf;->zza(Z)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzaf()Z\nPLcom/google/android/gms/measurement/internal/zzf;->zzag()Z\nPLcom/google/android/gms/measurement/internal/zzf;->zzah()Ljava/lang/Boolean;\nPLcom/google/android/gms/measurement/internal/zzf;->zzb(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzb(Z)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzc()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzf;->zzc(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzc(Z)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzd()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzf;->zzd(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zze()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzf;->zze(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zze(Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzf()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzf;->zzf(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzf(Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzg(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzg(Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzh()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzf;->zzh(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzh(Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzi()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzf;->zzi(J)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzi(Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzf;->zzl()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzf;->zzm()J\nPLcom/google/android/gms/measurement/internal/zzf;->zzn()Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzf;->zzo()J\nPLcom/google/android/gms/measurement/internal/zzf;->zzp()J\nPLcom/google/android/gms/measurement/internal/zzf;->zzq()J\nPLcom/google/android/gms/measurement/internal/zzf;->zzr()Z\nPLcom/google/android/gms/measurement/internal/zzfc;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzfc;-><init>(Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzfc;->zzb()V\nPLcom/google/android/gms/measurement/internal/zzfe;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzfe;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzfe;->f_()V\nPLcom/google/android/gms/measurement/internal/zzfe;->zza(J)Z\nPLcom/google/android/gms/measurement/internal/zzfe;->zzb(Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzfe;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzfe;->zzg()Landroid/content/SharedPreferences;\nPLcom/google/android/gms/measurement/internal/zzfg;-><init>(Lcom/google/android/gms/measurement/internal/zzfe;Ljava/lang/String;Z)V\nPLcom/google/android/gms/measurement/internal/zzfg;->zza()Z\nPLcom/google/android/gms/measurement/internal/zzfg;->zza(Z)V\nPLcom/google/android/gms/measurement/internal/zzfi;-><init>(Lcom/google/android/gms/measurement/internal/zzfe;Ljava/lang/String;J)V\nPLcom/google/android/gms/measurement/internal/zzfi;->zza()J\nPLcom/google/android/gms/measurement/internal/zzfi;->zza(J)V\nPLcom/google/android/gms/measurement/internal/zzfl;-><init>(Lcom/bumptech/glide/disklrucache/DiskLruCache;Ljava/lang/String;J[Ljava/io/File;[JLcom/google/firebase/iid/zzy;)V\nPLcom/google/android/gms/measurement/internal/zzfl;-><init>(Lcom/google/android/gms/measurement/internal/zzfe;Ljava/lang/String;JLandroidx/core/R$id;)V\nPLcom/google/android/gms/measurement/internal/zzfl;-><init>(Ljava/io/File;J)V\nPLcom/google/android/gms/measurement/internal/zzfl;->get(Lcom/bumptech/glide/load/Key;)Ljava/io/File;\nPLcom/google/android/gms/measurement/internal/zzfl;->getDiskCache()Lcom/bumptech/glide/disklrucache/DiskLruCache;\nPLcom/google/android/gms/measurement/internal/zzfl;->put(Lcom/bumptech/glide/load/Key;Lcom/bumptech/glide/load/engine/DataCacheWriter;)V\nPLcom/google/android/gms/measurement/internal/zzfq;-><init>(Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzfq;->zza(Lcom/google/android/gms/internal/measurement/zzbq$zzb;)Ljava/util/Map;\nPLcom/google/android/gms/measurement/internal/zzfq;->zza(Ljava/lang/String;Lcom/google/android/gms/internal/measurement/zzbq$zzb$zza;)V\nPLcom/google/android/gms/measurement/internal/zzfq;->zza(Ljava/lang/String;[B)Lcom/google/android/gms/internal/measurement/zzbq$zzb;\nPLcom/google/android/gms/measurement/internal/zzfq;->zzb(Ljava/lang/String;Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzfq;->zzc(Ljava/lang/String;Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzfq;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzft;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzft;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzft;->zza(Lcom/google/android/gms/measurement/internal/zzfu;)V\nPLcom/google/android/gms/measurement/internal/zzft;->zza(Ljava/lang/Runnable;)V\nPLcom/google/android/gms/measurement/internal/zzft;->zza(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;\nPLcom/google/android/gms/measurement/internal/zzft;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzft;->zzg()Z\nPLcom/google/android/gms/measurement/internal/zzfu;-><init>(Lcom/google/android/gms/measurement/internal/zzft;Ljava/lang/Runnable;Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzfu;-><init>(Lcom/google/android/gms/measurement/internal/zzft;Ljava/util/concurrent/Callable;ZLjava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzfu;->compareTo(Ljava/lang/Object;)I\nPLcom/google/android/gms/measurement/internal/zzfv;-><init>(Lcom/google/android/gms/measurement/internal/zzft;Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzfw;-><init>(Lcom/google/android/gms/measurement/internal/zzgy;)V\nPLcom/google/android/gms/measurement/internal/zzfw;->zza(Landroid/content/Context;Lcom/google/android/gms/internal/measurement/zzx;Ljava/lang/Long;)Lcom/google/android/gms/measurement/internal/zzfw;\nPLcom/google/android/gms/measurement/internal/zzfw;->zza(Landroidx/transition/ViewOverlayApi14;)V\nPLcom/google/android/gms/measurement/internal/zzfw;->zzab()Z\nPLcom/google/android/gms/measurement/internal/zzfw;->zzag()Z\nPLcom/google/android/gms/measurement/internal/zzfw;->zzb()Lcom/google/android/gms/measurement/internal/zzy;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzb(Lcom/google/android/gms/measurement/internal/zzg;)V\nPLcom/google/android/gms/measurement/internal/zzfw;->zze()Lcom/google/android/gms/measurement/internal/zzjm;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzh()Lcom/google/android/gms/measurement/internal/zzhb;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzj()Lcom/google/android/gms/measurement/internal/zzeq;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzl()Z\nPLcom/google/android/gms/measurement/internal/zzfw;->zzm()Lcom/google/android/gms/common/util/Clock;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzn()Landroid/content/Context;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzu()Lcom/google/firebase/auth/internal/zzaf;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzv()Lcom/google/android/gms/measurement/internal/zzig;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzw()Lcom/google/android/gms/measurement/internal/zzil;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzx()Lcom/google/android/gms/measurement/internal/zzai;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzy()Lcom/google/android/gms/measurement/internal/zzep;\nPLcom/google/android/gms/measurement/internal/zzfw;->zzz()Lcom/google/android/gms/measurement/internal/zza;\nPLcom/google/android/gms/measurement/internal/zzfx;-><init>(Lcom/google/android/gms/measurement/internal/zzft;Ljava/lang/String;Ljava/util/concurrent/BlockingQueue;)V\nPLcom/google/android/gms/measurement/internal/zzfx;->run()V\nPLcom/google/android/gms/measurement/internal/zzg;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzg;->zzw()V\nPLcom/google/android/gms/measurement/internal/zzg;->zzx()V\nPLcom/google/android/gms/measurement/internal/zzga;-><init>(Lcom/google/android/gms/measurement/internal/zzgb;Lcom/google/android/gms/measurement/internal/zzn;I)V\nPLcom/google/android/gms/measurement/internal/zzga;->run()V\nPLcom/google/android/gms/measurement/internal/zzgb;-><init>(Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zza(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zza(Lcom/google/android/gms/measurement/internal/zzao;Lcom/google/android/gms/measurement/internal/zzn;)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zza(Lcom/google/android/gms/measurement/internal/zzkh;Lcom/google/android/gms/measurement/internal/zzn;)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zza(Lcom/google/android/gms/measurement/internal/zzn;)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zza(Ljava/lang/Runnable;)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zza(Ljava/lang/String;Z)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zzb(Lcom/google/android/gms/measurement/internal/zzn;)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zzb1(Lcom/google/android/gms/measurement/internal/zzn;)V\nPLcom/google/android/gms/measurement/internal/zzgb;->zzc(Lcom/google/android/gms/measurement/internal/zzn;)Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzgp;-><init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;JI)V\nPLcom/google/android/gms/measurement/internal/zzgp;->run()V\nPLcom/google/android/gms/measurement/internal/zzgq;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzgq;->zzaa()V\nPLcom/google/android/gms/measurement/internal/zzgq;->zzab()V\nPLcom/google/android/gms/measurement/internal/zzgq;->zzac()V\nPLcom/google/android/gms/measurement/internal/zzgy;-><init>(Landroid/content/Context;Lcom/google/android/gms/internal/measurement/zzx;Ljava/lang/Long;)V\nPLcom/google/android/gms/measurement/internal/zzhb;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzhb;->zza(Lcom/google/android/gms/measurement/internal/zzgz;)V\nPLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;JLandroid/os/Bundle;)V\nPLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;JLjava/lang/Object;)V\nPLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)V\nPLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ZZJ)V\nPLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;J)V\nPLcom/google/android/gms/measurement/internal/zzhb;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;ZJ)V\nPLcom/google/android/gms/measurement/internal/zzhb;->zzab()V\nPLcom/google/android/gms/measurement/internal/zzhb;->zzai()V\nPLcom/google/android/gms/measurement/internal/zzhb;->zzam()V\nPLcom/google/android/gms/measurement/internal/zzhb;->zzz()Z\nPLcom/google/android/gms/measurement/internal/zzhe;-><init>(Lcom/google/android/gms/measurement/internal/zzhb;Ljava/lang/String;Ljava/lang/String;JLandroid/os/Bundle;ZZZLjava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzhe;->run()V\nPLcom/google/android/gms/measurement/internal/zzhs;-><init>(Ljava/lang/Object;ZI)V\nPLcom/google/android/gms/measurement/internal/zzhs;->run()V\nPLcom/google/android/gms/measurement/internal/zzhw;-><init>(Lcom/google/android/gms/measurement/internal/zzhb;Lcom/google/android/gms/measurement/internal/zzhc;)V\nPLcom/google/android/gms/measurement/internal/zzhw;-><init>(Ljava/lang/Object;I)V\nPLcom/google/android/gms/measurement/internal/zzhw;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLcom/google/android/gms/measurement/internal/zzhw;->onActivityDestroyed(Landroid/app/Activity;)V\nPLcom/google/android/gms/measurement/internal/zzhw;->onActivityPaused(Landroid/app/Activity;)V\nPLcom/google/android/gms/measurement/internal/zzhw;->onActivityResumed(Landroid/app/Activity;)V\nPLcom/google/android/gms/measurement/internal/zzhw;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLcom/google/android/gms/measurement/internal/zzhw;->onActivityStarted(Landroid/app/Activity;)V\nPLcom/google/android/gms/measurement/internal/zzhw;->onActivityStopped(Landroid/app/Activity;)V\nPLcom/google/android/gms/measurement/internal/zzib;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzib;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzif;-><init>(Lcom/google/android/gms/measurement/internal/zzka;I)V\nPLcom/google/android/gms/measurement/internal/zzif;->zza(JJ)Z\nPLcom/google/android/gms/measurement/internal/zzif;->zza(Lcom/google/android/gms/internal/measurement/zzgp;[B)Lcom/google/android/gms/internal/measurement/zzgp;\nPLcom/google/android/gms/measurement/internal/zzif;->zza(Lcom/google/android/gms/measurement/internal/zzao;Lcom/google/android/gms/measurement/internal/zzn;)Z\nPLcom/google/android/gms/measurement/internal/zzif;->zza([B)J\nPLcom/google/android/gms/measurement/internal/zzif;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzif;->zzf()Ljava/util/List;\nPLcom/google/android/gms/measurement/internal/zzig;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzig;->zza(Landroid/app/Activity;Landroid/os/Bundle;)V\nPLcom/google/android/gms/measurement/internal/zzig;->zza(Landroid/app/Activity;Lcom/google/android/gms/measurement/internal/zzih;Z)V\nPLcom/google/android/gms/measurement/internal/zzig;->zza(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzig;->zza(Lcom/google/android/gms/measurement/internal/zzig;Lcom/google/android/gms/measurement/internal/zzih;ZJ)V\nPLcom/google/android/gms/measurement/internal/zzig;->zza(Lcom/google/android/gms/measurement/internal/zzih;Landroid/os/Bundle;Z)V\nPLcom/google/android/gms/measurement/internal/zzig;->zza(Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzig;->zza(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzih;)V\nPLcom/google/android/gms/measurement/internal/zzig;->zzab()Lcom/google/android/gms/measurement/internal/zzih;\nPLcom/google/android/gms/measurement/internal/zzig;->zzd(Landroid/app/Activity;)Lcom/google/android/gms/measurement/internal/zzih;\nPLcom/google/android/gms/measurement/internal/zzig;->zzz()Z\nPLcom/google/android/gms/measurement/internal/zzih;-><init>(Ljava/lang/String;Ljava/lang/String;J)V\nPLcom/google/android/gms/measurement/internal/zzij;-><init>(Lcom/google/android/gms/measurement/internal/zzig;ZJLcom/google/android/gms/measurement/internal/zzih;Lcom/google/android/gms/measurement/internal/zzih;)V\nPLcom/google/android/gms/measurement/internal/zzij;->run()V\nPLcom/google/android/gms/measurement/internal/zzik;-><init>(Ljava/lang/Object;Lcom/google/android/gms/measurement/internal/zzgt;I)V\nPLcom/google/android/gms/measurement/internal/zzik;->zza()V\nPLcom/google/android/gms/measurement/internal/zzil;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzil;->zza(Ljava/lang/Runnable;)V\nPLcom/google/android/gms/measurement/internal/zzil;->zzab()Z\nPLcom/google/android/gms/measurement/internal/zzil;->zzah()V\nPLcom/google/android/gms/measurement/internal/zzil;->zzak()V\nPLcom/google/android/gms/measurement/internal/zzil;->zzal()Z\nPLcom/google/android/gms/measurement/internal/zzil;->zzan()V\nPLcom/google/android/gms/measurement/internal/zzil;->zzz()Z\nPLcom/google/android/gms/measurement/internal/zzin;-><init>(Lcom/google/android/gms/measurement/internal/zzil;ZLcom/google/android/gms/measurement/internal/zzkh;Lcom/google/android/gms/measurement/internal/zzn;)V\nPLcom/google/android/gms/measurement/internal/zzin;->run()V\nPLcom/google/android/gms/measurement/internal/zzip;-><init>(Lcom/google/android/gms/measurement/internal/zzil;Lcom/google/android/gms/measurement/internal/zzn;I)V\nPLcom/google/android/gms/measurement/internal/zzip;->run()V\nPLcom/google/android/gms/measurement/internal/zziw;-><init>(Lcom/google/android/gms/measurement/internal/zzil;ZZLcom/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable;Lcom/google/android/gms/measurement/internal/zzn;Ljava/lang/Object;I)V\nPLcom/google/android/gms/measurement/internal/zziw;->run()V\nPLcom/google/android/gms/measurement/internal/zzjc;-><init>(Lcom/google/android/gms/measurement/internal/zzjd;Lcom/google/android/gms/measurement/internal/zzek;I)V\nPLcom/google/android/gms/measurement/internal/zzjc;->run()V\nPLcom/google/android/gms/measurement/internal/zzjd;-><init>(Lcom/google/android/gms/measurement/internal/zzil;)V\nPLcom/google/android/gms/measurement/internal/zzjd;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V\nPLcom/google/android/gms/measurement/internal/zzjm;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzjm;->zza(ZZJ)Z\nPLcom/google/android/gms/measurement/internal/zzjm;->zzab()V\nPLcom/google/android/gms/measurement/internal/zzjm;->zzz()Z\nPLcom/google/android/gms/measurement/internal/zzjq;-><init>(Landroidx/lifecycle/ViewModelProvider;JJ)V\nPLcom/google/android/gms/measurement/internal/zzjs;-><init>(Lcom/google/android/gms/measurement/internal/zzjm;)V\nPLcom/google/android/gms/measurement/internal/zzjs;->zza(ZZJ)Z\nPLcom/google/android/gms/measurement/internal/zzjw;-><init>(Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzjw;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzjw;->zzf()V\nPLcom/google/android/gms/measurement/internal/zzjw;->zzv()I\nPLcom/google/android/gms/measurement/internal/zzjw;->zzw()Landroid/app/PendingIntent;\nPLcom/google/android/gms/measurement/internal/zzjz;-><init>(Lcom/google/android/gms/measurement/internal/zzjw;Lcom/google/android/gms/measurement/internal/zzgt;Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzka;-><init>(Landroidx/appcompat/view/ActionBarPolicy;)V\nPLcom/google/android/gms/measurement/internal/zzka;->zza(Landroid/content/Context;)Lcom/google/android/gms/measurement/internal/zzka;\nPLcom/google/android/gms/measurement/internal/zzka;->zza(Lcom/google/android/gms/measurement/internal/zzkh;Lcom/google/android/gms/measurement/internal/zzn;)V\nPLcom/google/android/gms/measurement/internal/zzka;->zzb(Lcom/google/android/gms/measurement/internal/zzn;)V\nPLcom/google/android/gms/measurement/internal/zzka;->zzc()Lcom/google/android/gms/measurement/internal/zzfq;\nPLcom/google/android/gms/measurement/internal/zzka;->zzd()Lcom/google/android/gms/measurement/internal/zzez;\nPLcom/google/android/gms/measurement/internal/zzka;->zze(Lcom/google/android/gms/measurement/internal/zzn;)Z\nPLcom/google/android/gms/measurement/internal/zzka;->zzk()V\nPLcom/google/android/gms/measurement/internal/zzka;->zzo()V\nPLcom/google/android/gms/measurement/internal/zzka;->zzq()Lcom/google/android/gms/measurement/internal/zzft;\nPLcom/google/android/gms/measurement/internal/zzka;->zzt()Lcom/google/android/gms/measurement/internal/zzfc;\nPLcom/google/android/gms/measurement/internal/zzka;->zzv()Lcom/google/android/gms/measurement/internal/zzjw;\nPLcom/google/android/gms/measurement/internal/zzka;->zzw()V\nPLcom/google/android/gms/measurement/internal/zzka;->zzx()J\nPLcom/google/android/gms/measurement/internal/zzka;->zzy()Z\nPLcom/google/android/gms/measurement/internal/zzkb;-><init>(Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzkb;->zzak()V\nPLcom/google/android/gms/measurement/internal/zzkb;->zzal()V\nPLcom/google/android/gms/measurement/internal/zzkb;->zzg()Lcom/google/android/gms/measurement/internal/zzif;\nPLcom/google/android/gms/measurement/internal/zzkb;->zzi()Lcom/google/android/gms/measurement/internal/zzad;\nPLcom/google/android/gms/measurement/internal/zzkh;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzkh;-><init>(ILjava/lang/String;JLjava/lang/Long;Ljava/lang/Float;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;)V\nPLcom/google/android/gms/measurement/internal/zzkh;-><init>(Ljava/lang/String;JLjava/lang/Object;Ljava/lang/String;)V\nPLcom/google/android/gms/measurement/internal/zzkh;->writeToParcel(Landroid/os/Parcel;I)V\nPLcom/google/android/gms/measurement/internal/zzkh;->zza()Ljava/lang/Object;\nPLcom/google/android/gms/measurement/internal/zzkj;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/Object;)V\nPLcom/google/android/gms/measurement/internal/zzkm;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzkm;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzkm;->f_()V\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Landroid/content/Context;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Landroid/os/Bundle;)Landroid/os/Bundle;\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Landroid/os/Bundle;Ljava/lang/String;Ljava/lang/Object;)V\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/Object;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;ILjava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;IZ)Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;[Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zza([B)J\nPLcom/google/android/gms/measurement/internal/zzkm;->zzb(Landroid/content/Context;Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zzb(Ljava/lang/Object;)[Landroid/os/Bundle;\nPLcom/google/android/gms/measurement/internal/zzkm;->zzb(Ljava/lang/String;)I\nPLcom/google/android/gms/measurement/internal/zzkm;->zzb(Ljava/lang/String;Ljava/lang/Object;)I\nPLcom/google/android/gms/measurement/internal/zzkm;->zzc(Ljava/lang/String;)I\nPLcom/google/android/gms/measurement/internal/zzkm;->zzc(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/android/gms/measurement/internal/zzkm;->zzc(Ljava/lang/String;Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zzd(Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zze(Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zzf(Ljava/lang/String;)Z\nPLcom/google/android/gms/measurement/internal/zzkm;->zzg()J\nPLcom/google/android/gms/measurement/internal/zzkm;->zzh()Ljava/security/SecureRandom;\nPLcom/google/android/gms/measurement/internal/zzkm;->zzh(Ljava/lang/String;)I\nPLcom/google/android/gms/measurement/internal/zzkm;->zzi()Ljava/security/MessageDigest;\nPLcom/google/android/gms/measurement/internal/zzkm;->zzi(Ljava/lang/String;)I\nPLcom/google/android/gms/measurement/internal/zzkm;->zzk(Ljava/lang/String;)I\nPLcom/google/android/gms/measurement/internal/zzn;-><clinit>()V\nPLcom/google/android/gms/measurement/internal/zzo;-><init>(Lcom/google/android/gms/measurement/internal/zzka;)V\nPLcom/google/android/gms/measurement/internal/zzo;->zze()Z\nPLcom/google/android/gms/measurement/internal/zzt;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;Ljava/lang/String;Ljava/lang/String;J)V\nPLcom/google/android/gms/measurement/internal/zzt;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V\nPLcom/google/android/gms/measurement/internal/zzy;-><init>(Lcom/google/android/gms/measurement/internal/zzfw;)V\nPLcom/google/android/gms/measurement/internal/zzy;->zza(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzel;)J\nPLcom/google/android/gms/measurement/internal/zzy;->zza(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/android/gms/measurement/internal/zzy;->zzb(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzel;)I\nPLcom/google/android/gms/measurement/internal/zzy;->zze()I\nPLcom/google/android/gms/measurement/internal/zzy;->zze(Ljava/lang/String;Lcom/google/android/gms/measurement/internal/zzel;)Z\nPLcom/google/android/gms/measurement/internal/zzy;->zzh()Z\nPLcom/google/android/gms/measurement/internal/zzy;->zzi()Ljava/lang/Boolean;\nPLcom/google/android/gms/measurement/internal/zzy;->zzj()Ljava/lang/Boolean;\nPLcom/google/android/gms/measurement/internal/zzy;->zzy()Z\nPLcom/google/android/gms/signin/SignInOptions;-><clinit>()V\nPLcom/google/android/gms/signin/SignInOptions;-><init>()V\nPLcom/google/android/gms/signin/zaa;-><init>(I)V\nPLcom/google/android/gms/signin/zaa;->buildClient(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/internal/ClientSettings;Ljava/lang/Object;Lcom/google/android/gms/common/api/GoogleApiClient$ConnectionCallbacks;Lcom/google/android/gms/common/api/GoogleApiClient$OnConnectionFailedListener;)Lcom/google/android/gms/common/api/Api$Client;\nPLcom/google/android/gms/signin/zaa;->buildClient(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/internal/ClientSettings;Ljava/lang/Object;Lcom/google/android/gms/common/api/internal/ConnectionCallbacks;Lcom/google/android/gms/common/api/internal/OnConnectionFailedListener;)Lcom/google/android/gms/common/api/Api$Client;\nPLcom/google/android/gms/stats/zza;-><init>(I)V\nPLcom/google/android/gms/stats/zza;-><init>(Landroidx/appcompat/widget/SearchView$4;)V\nPLcom/google/android/gms/stats/zza;-><init>(Lkotlin/ResultKt;)V\nPLcom/google/android/gms/stats/zza;-><init>(Lokhttp3/RequestBody;)V\nPLcom/google/android/gms/stats/zza;->calculateScaleY(FF)F\nPLcom/google/android/gms/stats/zza;->closeLogFile()V\nPLcom/google/android/gms/stats/zza;->getExpiresAtFrom(Lcom/google/android/gms/stats/zza;JLorg/json/JSONObject;)J\nPLcom/google/android/gms/tasks/Task;-><init>()V\nPLcom/google/android/gms/tasks/TaskCompletionSource;-><init>()V\nPLcom/google/android/gms/tasks/TaskCompletionSource;->trySetResult(Ljava/lang/Object;)Z\nPLcom/google/android/gms/tasks/TaskExecutors;-><clinit>()V\nPLcom/google/android/gms/tasks/zzc;-><init>(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/Continuation;Lcom/google/android/gms/tasks/zzu;I)V\nPLcom/google/android/gms/tasks/zzc;->onComplete(Lcom/google/android/gms/tasks/Task;)V\nPLcom/google/android/gms/tasks/zzd;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/google/android/gms/tasks/zzd;-><init>(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V\nPLcom/google/android/gms/tasks/zzg;-><init>(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/OnCompleteListener;)V\nPLcom/google/android/gms/tasks/zzg;-><init>(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/SuccessContinuation;Lcom/google/android/gms/tasks/zzu;)V\nPLcom/google/android/gms/tasks/zzg;->onComplete(Lcom/google/android/gms/tasks/Task;)V\nPLcom/google/android/gms/tasks/zzr;-><init>(I)V\nPLcom/google/android/gms/tasks/zzr;-><init>(Landroid/content/Context;)V\nPLcom/google/android/gms/tasks/zzr;->clearRemoveAndMaybeRecycle(Lcom/bumptech/glide/request/Request;Z)Z\nPLcom/google/android/gms/tasks/zzr;->pauseRequests()V\nPLcom/google/android/gms/tasks/zzr;->resumeRequests()V\nPLcom/google/android/gms/tasks/zzr;->runRequest(Lcom/bumptech/glide/request/Request;)V\nPLcom/google/android/gms/tasks/zzt;-><init>(I)V\nPLcom/google/android/gms/tasks/zzt;->execute(Ljava/lang/Runnable;)V\nPLcom/google/android/gms/tasks/zzu;-><init>()V\nPLcom/google/android/gms/tasks/zzu;->continueWith(Lcom/google/android/gms/tasks/Continuation;)Lcom/google/android/gms/tasks/Task;\nPLcom/google/android/gms/tasks/zzu;->continueWith(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/Continuation;)Lcom/google/android/gms/tasks/Task;\nPLcom/google/android/gms/tasks/zzu;->getResult()Ljava/lang/Object;\nPLcom/google/android/gms/tasks/zzu;->isSuccessful()Z\nPLcom/google/android/gms/tasks/zzu;->onSuccessTask(Ljava/util/concurrent/Executor;Lcom/google/android/gms/tasks/SuccessContinuation;)Lcom/google/android/gms/tasks/Task;\nPLcom/google/android/gms/tasks/zzu;->setResult(Ljava/lang/Object;)V\nPLcom/google/android/gms/tasks/zzu;->zze()V\nPLcom/google/android/material/animation/AnimationUtils;-><clinit>()V\nPLcom/google/android/material/animation/AnimationUtils;->lerp(FFF)F\nPLcom/google/android/material/animation/AnimationUtils;->lerp(FFFFF)F\nPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;-><init>()V\nPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onSaveInstanceState(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;)Landroid/os/Parcelable;\nPLcom/google/android/material/appbar/AppBarLayout$BaseBehavior;->onStartNestedScroll(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;Landroid/view/View;II)Z\nPLcom/google/android/material/appbar/AppBarLayout$Behavior;-><init>()V\nPLcom/google/android/material/appbar/AppBarLayout$LayoutParams;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/android/material/appbar/AppBarLayout$ScrollingViewBehavior;->onDependentViewChanged(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z\nPLcom/google/android/material/appbar/AppBarLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/android/material/appbar/AppBarLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z\nPLcom/google/android/material/appbar/AppBarLayout;->draw(Landroid/graphics/Canvas;)V\nPLcom/google/android/material/appbar/AppBarLayout;->drawableStateChanged()V\nPLcom/google/android/material/appbar/AppBarLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;\nPLcom/google/android/material/appbar/AppBarLayout;->getBehavior()Landroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;\nPLcom/google/android/material/appbar/AppBarLayout;->getPendingAction()I\nPLcom/google/android/material/appbar/AppBarLayout;->onAttachedToWindow()V\nPLcom/google/android/material/appbar/AppBarLayout;->onCreateDrawableState(I)[I\nPLcom/google/android/material/appbar/AppBarLayout;->onDetachedFromWindow()V\nPLcom/google/android/material/appbar/AppBarLayout;->onOffsetChanged(I)V\nPLcom/google/android/material/appbar/AppBarLayout;->setElevation(F)V\nPLcom/google/android/material/appbar/AppBarLayout;->setLiftedState(Z)Z\nPLcom/google/android/material/appbar/AppBarLayout;->setOrientation(I)V\nPLcom/google/android/material/appbar/AppBarLayout;->setStatusBarForeground(Landroid/graphics/drawable/Drawable;)V\nPLcom/google/android/material/appbar/AppBarLayout;->updateWillNotDraw()V\nPLcom/google/android/material/appbar/AppBarLayout;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z\nPLcom/google/android/material/appbar/HeaderBehavior;-><init>()V\nPLcom/google/android/material/appbar/HeaderBehavior;->onInterceptTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z\nPLcom/google/android/material/appbar/HeaderBehavior;->onTouchEvent(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/MotionEvent;)Z\nPLcom/google/android/material/appbar/HeaderScrollingViewBehavior;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/android/material/appbar/HeaderScrollingViewBehavior;->getOverlapPixelsForOffset(Landroid/view/View;)I\nPLcom/google/android/material/appbar/ViewOffsetBehavior;-><init>()V\nPLcom/google/android/material/appbar/ViewOffsetBehavior;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/android/material/appbar/ViewOffsetBehavior;->getTopAndBottomOffset()I\nPLcom/google/android/material/appbar/ViewOffsetBehavior;->layoutChild(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;I)V\nPLcom/google/android/material/appbar/ViewOffsetHelper;-><init>(Landroid/view/View;)V\nPLcom/google/android/material/appbar/ViewOffsetHelper;->setTopAndBottomOffset(I)Z\nPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;-><init>(Landroid/content/Context;)V\nPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->getItemDefaultMarginResId()I\nPLcom/google/android/material/bottomnavigation/BottomNavigationItemView;->getItemLayoutResId()I\nPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;-><init>(Landroid/content/Context;)V\nPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->createNavigationBarItemView(Landroid/content/Context;)Lcom/google/android/material/navigation/NavigationBarItemView;\nPLcom/google/android/material/bottomnavigation/BottomNavigationMenuView;->onLayout(ZIIII)V\nPLcom/google/android/material/bottomnavigation/BottomNavigationView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/android/material/bottomnavigation/BottomNavigationView;->createNavigationBarMenuView(Landroid/content/Context;)Lcom/google/android/material/navigation/NavigationBarMenuView;\nPLcom/google/android/material/bottomnavigation/BottomNavigationView;->getMaxItemCount()I\nPLcom/google/android/material/bottomnavigation/BottomNavigationView;->onMeasure(II)V\nPLcom/google/android/material/bottomnavigation/BottomNavigationView;->setItemHorizontalTranslationEnabled(Z)V\nPLcom/google/android/material/button/MaterialButton$SavedState;-><clinit>()V\nPLcom/google/android/material/button/MaterialButton$SavedState;-><init>(Landroid/os/Parcelable;)V\nPLcom/google/android/material/button/MaterialButton$SavedState;->writeToParcel(Landroid/os/Parcel;I)V\nPLcom/google/android/material/button/MaterialButton;-><clinit>()V\nPLcom/google/android/material/button/MaterialButton;->isCheckable()Z\nPLcom/google/android/material/button/MaterialButton;->isChecked()Z\nPLcom/google/android/material/button/MaterialButton;->isIconEnd()Z\nPLcom/google/android/material/button/MaterialButton;->isIconStart()Z\nPLcom/google/android/material/button/MaterialButton;->isIconTop()Z\nPLcom/google/android/material/button/MaterialButton;->isUsingOriginalBackground()Z\nPLcom/google/android/material/button/MaterialButton;->onAttachedToWindow()V\nPLcom/google/android/material/button/MaterialButton;->onCreateDrawableState(I)[I\nPLcom/google/android/material/button/MaterialButton;->onSaveInstanceState()Landroid/os/Parcelable;\nPLcom/google/android/material/button/MaterialButton;->onTextChanged(Ljava/lang/CharSequence;III)V\nPLcom/google/android/material/button/MaterialButton;->refreshDrawableState()V\nPLcom/google/android/material/button/MaterialButton;->setBackgroundTintList(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/button/MaterialButton;->setInternalBackground(Landroid/graphics/drawable/Drawable;)V\nPLcom/google/android/material/button/MaterialButton;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/button/MaterialButton;->updateIcon(Z)V\nPLcom/google/android/material/button/MaterialButton;->updateIconPosition(II)V\nPLcom/google/android/material/button/MaterialButtonHelper;-><init>(Lcom/google/android/material/button/MaterialButton;Lcom/google/android/material/shape/ShapeAppearanceModel;)V\nPLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable;\nPLcom/google/android/material/button/MaterialButtonHelper;->getMaterialShapeDrawable(Z)Lcom/google/android/material/shape/MaterialShapeDrawable;\nPLcom/google/android/material/datepicker/CalendarStyle;-><init>(Landroidx/constraintlayout/widget/ConstraintLayout;Lcom/google/android/material/bottomnavigation/BottomNavigationView;Landroid/widget/FrameLayout;Landroidx/fragment/app/FragmentContainerView;Lcom/google/android/material/navigationrail/NavigationRailView;Landroidx/constraintlayout/widget/ConstraintLayout;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;Landroid/view/View;)V\nPLcom/google/android/material/datepicker/YearGridAdapter$1;-><init>(Ljava/lang/Object;II)V\nPLcom/google/android/material/elevation/ElevationOverlayProvider;-><clinit>()V\nPLcom/google/android/material/elevation/ElevationOverlayProvider;-><init>(Landroid/content/Context;)V\nPLcom/google/android/material/elevation/ElevationOverlayProvider;->compositeOverlayIfNeeded(IF)I\nPLcom/google/android/material/internal/BaselineLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/android/material/internal/BaselineLayout;->onLayout(ZIIII)V\nPLcom/google/android/material/internal/CheckableImageButton;-><clinit>()V\nPLcom/google/android/material/internal/CheckableImageButton;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/android/material/internal/CheckableImageButton;->isChecked()Z\nPLcom/google/android/material/internal/CheckableImageButton;->setPressed(Z)V\nPLcom/google/android/material/internal/ParcelableSparseArray;-><clinit>()V\nPLcom/google/android/material/internal/ParcelableSparseArray;-><init>()V\nPLcom/google/android/material/internal/ParcelableSparseArray;->writeToParcel(Landroid/os/Parcel;I)V\nPLcom/google/android/material/internal/TextScale$1;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/google/android/material/internal/TextScale;-><init>()V\nPLcom/google/android/material/internal/ViewUtils$RelativePadding;-><init>()V\nPLcom/google/android/material/internal/ViewUtils$RelativePadding;-><init>(IIII)V\nPLcom/google/android/material/internal/ViewUtils$RelativePadding;-><init>(Lcom/google/android/material/internal/ViewUtils$RelativePadding;)V\nPLcom/google/android/material/internal/ViewUtils$RelativePadding;->setFrom(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Lcom/google/android/material/internal/ViewUtils$RelativePadding;\nPLcom/google/android/material/navigation/NavigationBarItemView$ActiveIndicatorUnlabeledTransform;-><init>(Landroidx/appcompat/widget/SearchView$4;)V\nPLcom/google/android/material/navigation/NavigationBarItemView;-><clinit>()V\nPLcom/google/android/material/navigation/NavigationBarItemView;->calculateTextScaleFactors(FF)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->getIconOrContainer()Landroid/view/View;\nPLcom/google/android/material/navigation/NavigationBarItemView;->getItemBackgroundResId()I\nPLcom/google/android/material/navigation/NavigationBarItemView;->getItemVisiblePosition()I\nPLcom/google/android/material/navigation/NavigationBarItemView;->getSuggestedIconHeight()I\nPLcom/google/android/material/navigation/NavigationBarItemView;->getSuggestedIconWidth()I\nPLcom/google/android/material/navigation/NavigationBarItemView;->getSuggestedMinimumHeight()I\nPLcom/google/android/material/navigation/NavigationBarItemView;->getSuggestedMinimumWidth()I\nPLcom/google/android/material/navigation/NavigationBarItemView;->hasBadge()Z\nPLcom/google/android/material/navigation/NavigationBarItemView;->onSizeChanged(IIII)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->refreshChecked()V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorDrawable(Landroid/graphics/drawable/Drawable;)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorEnabled(Z)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorHeight(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorMarginHorizontal(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorProgress(FF)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorResizeable(Z)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setActiveIndicatorWidth(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setCheckable(Z)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setEnabled(Z)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setIconSize(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setIconTintList(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setItemBackground(Landroid/graphics/drawable/Drawable;)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPaddingBottom(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPaddingTop(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setItemPosition(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setLabelVisibilityMode(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setShifting(Z)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceActive(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setTextAppearanceInactive(I)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setTextColor(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setTitle(Ljava/lang/CharSequence;)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->setViewTopMarginAndGravity(Landroid/view/View;II)V\nPLcom/google/android/material/navigation/NavigationBarItemView;->updateViewPaddingBottom(Landroid/view/View;I)V\nPLcom/google/android/material/navigation/NavigationBarMenu;-><init>(Landroid/content/Context;Ljava/lang/Class;I)V\nPLcom/google/android/material/navigation/NavigationBarMenu;->addInternal(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;\nPLcom/google/android/material/navigation/NavigationBarMenuView;-><clinit>()V\nPLcom/google/android/material/navigation/NavigationBarMenuView;-><init>(Landroid/content/Context;)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->createDefaultColorStateList(I)Landroid/content/res/ColorStateList;\nPLcom/google/android/material/navigation/NavigationBarMenuView;->createItemActiveIndicatorDrawable()Landroid/graphics/drawable/Drawable;\nPLcom/google/android/material/navigation/NavigationBarMenuView;->getBadgeDrawables()Landroid/util/SparseArray;\nPLcom/google/android/material/navigation/NavigationBarMenuView;->getLabelVisibilityMode()I\nPLcom/google/android/material/navigation/NavigationBarMenuView;->getMenu()Landroidx/appcompat/view/menu/MenuBuilder;\nPLcom/google/android/material/navigation/NavigationBarMenuView;->getNewItem()Lcom/google/android/material/navigation/NavigationBarItemView;\nPLcom/google/android/material/navigation/NavigationBarMenuView;->getSelectedItemId()I\nPLcom/google/android/material/navigation/NavigationBarMenuView;->isShifting(II)Z\nPLcom/google/android/material/navigation/NavigationBarMenuView;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setBadgeIfNeeded(Lcom/google/android/material/navigation/NavigationBarItemView;)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setIconTintList(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemBackground(Landroid/graphics/drawable/Drawable;)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemIconSize(I)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemPaddingBottom(I)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemPaddingTop(I)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceActive(I)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextAppearanceInactive(I)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setItemTextColor(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setLabelVisibilityMode(I)V\nPLcom/google/android/material/navigation/NavigationBarMenuView;->setPresenter(Lcom/google/android/material/navigation/NavigationBarPresenter;)V\nPLcom/google/android/material/navigation/NavigationBarPresenter$SavedState;-><clinit>()V\nPLcom/google/android/material/navigation/NavigationBarPresenter$SavedState;-><init>()V\nPLcom/google/android/material/navigation/NavigationBarPresenter$SavedState;->writeToParcel(Landroid/os/Parcel;I)V\nPLcom/google/android/material/navigation/NavigationBarPresenter;-><init>()V\nPLcom/google/android/material/navigation/NavigationBarPresenter;->getId()I\nPLcom/google/android/material/navigation/NavigationBarPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V\nPLcom/google/android/material/navigation/NavigationBarPresenter;->onSaveInstanceState()Landroid/os/Parcelable;\nPLcom/google/android/material/navigation/NavigationBarPresenter;->updateMenuView(Z)V\nPLcom/google/android/material/navigation/NavigationBarView$SavedState;-><clinit>()V\nPLcom/google/android/material/navigation/NavigationBarView$SavedState;-><init>(Landroid/os/Parcelable;)V\nPLcom/google/android/material/navigation/NavigationBarView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V\nPLcom/google/android/material/navigation/NavigationBarView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V\nPLcom/google/android/material/navigation/NavigationBarView;->getMenu()Landroid/view/Menu;\nPLcom/google/android/material/navigation/NavigationBarView;->getMenuInflater()Landroid/view/MenuInflater;\nPLcom/google/android/material/navigation/NavigationBarView;->getMenuView()Landroidx/appcompat/view/menu/MenuView;\nPLcom/google/android/material/navigation/NavigationBarView;->onAttachedToWindow()V\nPLcom/google/android/material/navigation/NavigationBarView;->onSaveInstanceState()Landroid/os/Parcelable;\nPLcom/google/android/material/navigation/NavigationBarView;->setElevation(F)V\nPLcom/google/android/material/navigation/NavigationBarView;->setItemIconSize(I)V\nPLcom/google/android/material/navigation/NavigationBarView;->setItemPaddingBottom(I)V\nPLcom/google/android/material/navigation/NavigationBarView;->setItemPaddingTop(I)V\nPLcom/google/android/material/navigation/NavigationBarView;->setItemRippleColor(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceActive(I)V\nPLcom/google/android/material/navigation/NavigationBarView;->setItemTextAppearanceInactive(I)V\nPLcom/google/android/material/navigation/NavigationBarView;->setItemTextColor(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/navigation/NavigationBarView;->setLabelVisibilityMode(I)V\nPLcom/google/android/material/navigation/NavigationBarView;->setOnItemReselectedListener(Lcom/google/android/material/navigation/NavigationBarView$OnItemReselectedListener;)V\nPLcom/google/android/material/navigation/NavigationBarView;->setOnItemSelectedListener(Lcom/google/android/material/navigation/NavigationBarView$OnItemSelectedListener;)V\nPLcom/google/android/material/shadow/ShadowRenderer;-><clinit>()V\nPLcom/google/android/material/shape/AbsoluteCornerSize;-><init>(F)V\nPLcom/google/android/material/shape/AbsoluteCornerSize;->getCornerSize(Landroid/graphics/RectF;)F\nPLcom/google/android/material/shape/AdjustedCornerSize;-><init>(FLcom/google/android/material/shape/CornerSize;)V\nPLcom/google/android/material/shape/AdjustedCornerSize;->getCornerSize(Landroid/graphics/RectF;)F\nPLcom/google/android/material/shape/MaterialShapeDrawable$MaterialShapeDrawableState;->newDrawable()Landroid/graphics/drawable/Drawable;\nPLcom/google/android/material/shape/MaterialShapeDrawable;-><clinit>()V\nPLcom/google/android/material/shape/MaterialShapeDrawable;-><init>()V\nPLcom/google/android/material/shape/MaterialShapeDrawable;-><init>(Lcom/google/android/material/shape/ShapeAppearanceModel;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->calculatePath(Landroid/graphics/RectF;Landroid/graphics/Path;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->calculatePathForSize(Landroid/graphics/RectF;Landroid/graphics/Path;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->compositeElevationOverlayIfNeeded(I)I\nPLcom/google/android/material/shape/MaterialShapeDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;\nPLcom/google/android/material/shape/MaterialShapeDrawable;->getOpacity()I\nPLcom/google/android/material/shape/MaterialShapeDrawable;->getOutline(Landroid/graphics/Outline;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->getPadding(Landroid/graphics/Rect;)Z\nPLcom/google/android/material/shape/MaterialShapeDrawable;->getStrokeInsetLength()F\nPLcom/google/android/material/shape/MaterialShapeDrawable;->getTopLeftCornerResolvedSize()F\nPLcom/google/android/material/shape/MaterialShapeDrawable;->initializeElevationOverlay(Landroid/content/Context;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->invalidateSelf()V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->mutate()Landroid/graphics/drawable/Drawable;\nPLcom/google/android/material/shape/MaterialShapeDrawable;->onBoundsChange(Landroid/graphics/Rect;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->onStateChange([I)Z\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setElevation(F)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setFillColor(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FI)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FLandroid/content/res/ColorStateList;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setStrokeColor(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setTint(I)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setTintList(Landroid/content/res/ColorStateList;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->setTintMode(Landroid/graphics/PorterDuff$Mode;)V\nPLcom/google/android/material/shape/MaterialShapeDrawable;->updateColorsForState([I)Z\nPLcom/google/android/material/shape/MaterialShapeDrawable;->updateZ()V\nPLcom/google/android/material/shape/RelativeCornerSize;-><init>(F)V\nPLcom/google/android/material/shape/RoundedCornerTreatment;-><init>()V\nPLcom/google/android/material/shape/RoundedCornerTreatment;->getCornerPath(Lcom/google/android/material/shape/ShapePath;FFF)V\nPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;-><init>()V\nPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;-><init>(Lcom/google/android/material/shape/ShapeAppearanceModel;)V\nPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->build()Lcom/google/android/material/shape/ShapeAppearanceModel;\nPLcom/google/android/material/shape/ShapeAppearanceModel$Builder;->compatCornerTreatmentSize(Landroidx/core/R$dimen;)F\nPLcom/google/android/material/shape/ShapeAppearanceModel;-><clinit>()V\nPLcom/google/android/material/shape/ShapeAppearanceModel;-><init>()V\nPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;IILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;\nPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;II)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;\nPLcom/google/android/material/shape/ShapeAppearanceModel;->builder(Landroid/content/Context;Landroid/util/AttributeSet;IILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/ShapeAppearanceModel$Builder;\nPLcom/google/android/material/shape/ShapeAppearanceModel;->getCornerSize(Landroid/content/res/TypedArray;ILcom/google/android/material/shape/CornerSize;)Lcom/google/android/material/shape/CornerSize;\nPLcom/google/android/material/shape/ShapeAppearancePathProvider$Lazy;-><clinit>()V\nPLcom/google/android/material/shape/ShapeAppearancePathProvider;-><init>()V\nPLcom/google/android/material/shape/ShapePath$1;-><init>(Lcom/google/android/material/shape/ShapePath;Ljava/util/List;Landroid/graphics/Matrix;)V\nPLcom/google/android/material/shape/ShapePath$ArcShadowOperation;-><init>(Lcom/google/android/material/shape/ShapePath$PathArcOperation;)V\nPLcom/google/android/material/shape/ShapePath$LineShadowOperation;-><init>(Lcom/google/android/material/shape/ShapePath$PathLineOperation;FF)V\nPLcom/google/android/material/shape/ShapePath$LineShadowOperation;->getAngle()F\nPLcom/google/android/material/shape/ShapePath$PathArcOperation;-><clinit>()V\nPLcom/google/android/material/shape/ShapePath$PathArcOperation;-><init>(FFFF)V\nPLcom/google/android/material/shape/ShapePath$PathArcOperation;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V\nPLcom/google/android/material/shape/ShapePath$PathLineOperation;-><init>()V\nPLcom/google/android/material/shape/ShapePath$PathLineOperation;->applyToPath(Landroid/graphics/Matrix;Landroid/graphics/Path;)V\nPLcom/google/android/material/shape/ShapePath$PathOperation;-><init>()V\nPLcom/google/android/material/shape/ShapePath$ShadowCompatOperation;-><clinit>()V\nPLcom/google/android/material/shape/ShapePath$ShadowCompatOperation;-><init>()V\nPLcom/google/android/material/shape/ShapePath;-><init>()V\nPLcom/google/android/material/shape/ShapePath;->addConnectingShadowIfNecessary(F)V\nPLcom/google/android/material/textview/MaterialTextView;->setTextAppearance(Landroid/content/Context;I)V\nPLcom/google/android/material/theme/MaterialComponentsViewInflater;-><init>()V\nPLcom/google/android/material/theme/MaterialComponentsViewInflater;->createButton(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/appcompat/widget/AppCompatButton;\nPLcom/google/ar/core/ArCoreApk$Availability;-><clinit>()V\nPLcom/google/ar/core/ArCoreApk$Availability;-><init>(Ljava/lang/String;II)V\nPLcom/google/ar/core/ArCoreApk$Availability;-><init>(Ljava/lang/String;IILcom/google/ar/core/aj;)V\nPLcom/google/ar/core/ArCoreApk$Availability;->isTransient()Z\nPLcom/google/ar/core/ArCoreApk;-><init>()V\nPLcom/google/ar/core/ArCoreApk;->getInstance()Lcom/google/ar/core/ArCoreApk;\nPLcom/google/ar/core/a;-><init>(Ljava/lang/String;)V\nPLcom/google/ar/core/a;->isUnknown()Z\nPLcom/google/ar/core/ab;-><init>()V\nPLcom/google/ar/core/ac;-><init>()V\nPLcom/google/ar/core/ac;-><init>(Ljava/lang/Object;I)V\nPLcom/google/ar/core/ac;->encode(Ljava/lang/Object;)Ljava/lang/String;\nPLcom/google/ar/core/ac;->encode(Ljava/lang/Object;Ljava/io/Writer;)V\nPLcom/google/ar/core/ac;->onComplete(Lcom/google/android/gms/tasks/Task;)V\nPLcom/google/ar/core/ac;->onEvent(Ljava/lang/String;Landroid/os/Bundle;)V\nPLcom/google/ar/core/ac;->registerBreadcrumbHandler(Lio/grpc/Attributes$Key;)V\nPLcom/google/ar/core/ac;->serializeEvent(Ljava/lang/String;Landroid/os/Bundle;)Ljava/lang/String;\nPLcom/google/ar/core/ac;->then(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object;\nPLcom/google/ar/core/aj;-><init>(Lcom/google/ar/core/h;)V\nPLcom/google/ar/core/aj;->a(Lcom/google/ar/core/ArCoreApk$Availability;)V\nPLcom/google/ar/core/ap;-><init>(Ljava/lang/Object;Ljava/lang/Object;IILandroidx/appcompat/R$id$$IA$1;)V\nPLcom/google/ar/core/ap;->run()V\nPLcom/google/ar/core/b;-><init>(Ljava/lang/String;)V\nPLcom/google/ar/core/c;-><init>(Ljava/lang/String;)V\nPLcom/google/ar/core/d;-><init>(Ljava/lang/String;)V\nPLcom/google/ar/core/e;-><init>(Ljava/lang/String;)V\nPLcom/google/ar/core/f;-><init>(Ljava/lang/String;)V\nPLcom/google/ar/core/g;-><init>(Ljava/lang/String;)V\nPLcom/google/ar/core/h;-><clinit>()V\nPLcom/google/ar/core/h;-><init>()V\nPLcom/google/ar/core/h;->a(Landroid/content/Context;)Lcom/google/ar/core/o;\nPLcom/google/ar/core/h;->b(Landroid/content/Context;)Z\nPLcom/google/ar/core/h;->checkAvailability(Landroid/content/Context;)Lcom/google/ar/core/ArCoreApk$Availability;\nPLcom/google/ar/core/h;->d(Landroid/content/Context;)I\nPLcom/google/ar/core/h;->e(Landroid/content/Context;)V\nPLcom/google/ar/core/n;-><init>(Ljava/lang/Object;I)V\nPLcom/google/ar/core/n;->onAnimationCancel(Landroid/animation/Animator;)V\nPLcom/google/ar/core/n;->onAnimationEnd(Landroid/animation/Animator;)V\nPLcom/google/ar/core/n;->onAnimationStart(Landroid/animation/Animator;)V\nPLcom/google/ar/core/o;-><init>(B)V\nPLcom/google/ar/core/o;->a(Landroid/content/Context;)V\nPLcom/google/ar/core/o;->a(Landroid/content/Context;Lcom/google/ar/core/ArCoreApk$a;)V\nPLcom/google/ar/core/o;->a(Ljava/lang/Runnable;)V\nPLcom/google/ar/core/q;-><init>(I)V\nPLcom/google/ar/core/s;-><init>(Ljava/lang/Object;I)V\nPLcom/google/ar/core/t;-><init>(Lcom/google/ar/core/o;Landroid/content/Context;Lcom/google/ar/core/ArCoreApk$a;)V\nPLcom/google/ar/core/w;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/google/ar/core/y;-><init>(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V\nPLcom/google/ar/core/y;->run()V\nPLcom/google/common/base/Splitter;-><init>(I)V\nPLcom/google/common/base/Splitter;->build()Lcom/google/common/collect/ImmutableMap;\nPLcom/google/common/base/Splitter;->ensureCapacity(I)V\nPLcom/google/common/base/Splitter;->put(Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/base/Splitter;\nPLcom/google/common/collect/ImmutableCollection;-><clinit>()V\nPLcom/google/common/collect/ImmutableCollection;-><init>()V\nPLcom/google/common/collect/ImmutableMap;-><init>()V\nPLcom/google/common/collect/ImmutableSet;-><init>()V\nPLcom/google/common/collect/ImmutableSet;->chooseTableSize(I)I\nPLcom/google/common/collect/ImmutableSet;->construct(I[Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSet;\nPLcom/google/common/collect/Maps;-><clinit>()V\nPLcom/google/common/collect/Maps;->get(Ljava/lang/Class;)Ljava/lang/Object;\nPLcom/google/common/collect/Maps;->getFontFamilyResult(Landroid/content/Context;Landroidx/core/provider/FontRequest;Landroid/os/CancellationSignal;)Landroidx/appcompat/app/AlertDialog$Builder;\nPLcom/google/common/collect/Maps;->resolveBoolean(Landroid/content/Context;IZ)Z\nPLcom/google/common/collect/Maps;->setOf(Ljava/lang/Class;)Ljava/util/Set;\nPLcom/google/common/collect/RegularImmutableMap;-><clinit>()V\nPLcom/google/common/collect/RegularImmutableMap;-><init>([I[Ljava/lang/Object;I)V\nPLcom/google/common/collect/RegularImmutableMap;->get(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/common/collect/RegularImmutableSet;-><clinit>()V\nPLcom/google/common/collect/RegularImmutableSet;-><init>([Ljava/lang/Object;I[Ljava/lang/Object;II)V\nPLcom/google/common/collect/RegularImmutableSet;->contains(Ljava/lang/Object;)Z\nPLcom/google/common/collect/RegularImmutableSet;->size()I\nPLcom/google/firebase/FirebaseApp$$Lambda$1;-><init>(Lcom/google/firebase/FirebaseApp;Landroid/content/Context;)V\nPLcom/google/firebase/FirebaseApp$$Lambda$1;->get()Ljava/lang/Object;\nPLcom/google/firebase/FirebaseApp$GlobalBackgroundStateListener;-><clinit>()V\nPLcom/google/firebase/FirebaseApp$GlobalBackgroundStateListener;-><init>()V\nPLcom/google/firebase/FirebaseApp$GlobalBackgroundStateListener;->onBackgroundStateChanged(Z)V\nPLcom/google/firebase/FirebaseApp$UiExecutor;-><clinit>()V\nPLcom/google/firebase/FirebaseApp$UiExecutor;-><init>(Lkotlin/ResultKt;)V\nPLcom/google/firebase/FirebaseApp;-><clinit>()V\nPLcom/google/firebase/FirebaseApp;-><init>(Landroid/content/Context;Ljava/lang/String;Lcom/google/firebase/FirebaseOptions;)V\nPLcom/google/firebase/FirebaseApp;->getInstance()Lcom/google/firebase/FirebaseApp;\nPLcom/google/firebase/FirebaseApp;->initializeAllApis()V\nPLcom/google/firebase/FirebaseApp;->initializeApp(Landroid/content/Context;Lcom/google/firebase/FirebaseOptions;)Lcom/google/firebase/FirebaseApp;\nPLcom/google/firebase/FirebaseApp;->isDataCollectionDefaultEnabled()Z\nPLcom/google/firebase/FirebaseApp;->isDefaultApp()Z\nPLcom/google/firebase/FirebaseException;-><init>()V\nPLcom/google/firebase/FirebaseOptions;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/firebase/FirebaseOptions;->fromResource(Landroid/content/Context;)Lcom/google/firebase/FirebaseOptions;\nPLcom/google/firebase/abt/FirebaseABTesting;-><init>(Lcom/google/firebase/analytics/connector/AnalyticsConnector;Ljava/lang/String;)V\nPLcom/google/firebase/abt/component/AbtComponent;-><init>(Landroid/content/Context;Lcom/google/firebase/analytics/connector/AnalyticsConnector;)V\nPLcom/google/firebase/abt/component/AbtRegistrar;-><init>()V\nPLcom/google/firebase/abt/component/AbtRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/abt/component/AbtRegistrar;->lambda$getComponents$0(Lcom/google/firebase/components/ComponentContainer;)Lcom/google/firebase/abt/component/AbtComponent;\nPLcom/google/firebase/analytics/FirebaseAnalytics;-><init>(Lcom/google/android/gms/internal/measurement/zzz;)V\nPLcom/google/firebase/analytics/FirebaseAnalytics;->getFirebaseInstanceId()Ljava/lang/String;\nPLcom/google/firebase/analytics/FirebaseAnalytics;->getInstance(Landroid/content/Context;)Lcom/google/firebase/analytics/FirebaseAnalytics;\nPLcom/google/firebase/analytics/FirebaseAnalytics;->getScionFrontendApiImplementation(Landroid/content/Context;Landroid/os/Bundle;)Lcom/google/android/gms/measurement/internal/zzhy;\nPLcom/google/firebase/analytics/FirebaseAnalytics;->logEvent(Ljava/lang/String;Landroid/os/Bundle;)V\nPLcom/google/firebase/analytics/FirebaseAnalytics;->setCurrentScreen(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/firebase/analytics/FirebaseAnalytics;->setUserProperty(Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/firebase/analytics/connector/AnalyticsConnectorImpl;-><init>(Lcom/google/android/gms/measurement/AppMeasurement;)V\nPLcom/google/firebase/analytics/connector/AnalyticsConnectorImpl;->registerAnalyticsConnectorListener(Ljava/lang/String;Lio/grpc/CallOptions$Key;)Landroidx/compose/runtime/SnapshotThreadLocal;\nPLcom/google/firebase/analytics/connector/internal/AnalyticsConnectorRegistrar;-><init>()V\nPLcom/google/firebase/analytics/connector/internal/AnalyticsConnectorRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/analytics/connector/internal/zzb;-><clinit>()V\nPLcom/google/firebase/analytics/connector/internal/zzb;->zza(Ljava/lang/String;)Z\nPLcom/google/firebase/analytics/connector/internal/zzd;-><init>(Ljava/lang/Object;I)V\nPLcom/google/firebase/analytics/connector/internal/zzd;->onEvent(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;J)V\nPLcom/google/firebase/analytics/connector/zza;-><clinit>()V\nPLcom/google/firebase/analytics/connector/zza;-><init>()V\nPLcom/google/firebase/analytics/ktx/AnalyticsKt;-><clinit>()V\nPLcom/google/firebase/analytics/ktx/FirebaseAnalyticsKtxRegistrar;-><init>()V\nPLcom/google/firebase/analytics/ktx/FirebaseAnalyticsKtxRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/analytics/zzb;-><init>(Lcom/google/android/gms/internal/measurement/zzz;)V\nPLcom/google/firebase/auth/FirebaseAuth;-><init>(Lcom/google/firebase/FirebaseApp;)V\nPLcom/google/firebase/auth/FirebaseAuthRegistrar;-><init>()V\nPLcom/google/firebase/auth/FirebaseAuthRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/auth/api/internal/zzal;-><init>(Lcom/google/android/gms/common/api/GoogleApi;Lcom/google/android/gms/common/api/GoogleApi;Lokhttp3/internal/http2/Huffman$Node;)V\nPLcom/google/firebase/auth/api/internal/zzaq;-><clinit>()V\nPLcom/google/firebase/auth/api/internal/zzaq;-><init>(Landroid/content/Context;Lcom/google/android/gms/common/api/Api;Lcom/google/android/gms/common/api/Api$ApiOptions;Lcom/google/android/gms/common/api/internal/StatusExceptionMapper;)V\nPLcom/google/firebase/auth/api/internal/zzau;-><clinit>()V\nPLcom/google/firebase/auth/api/internal/zzau;-><init>(Landroid/content/Context;Lcom/google/firebase/auth/api/internal/zzeu;)V\nPLcom/google/firebase/auth/api/internal/zzau;->zza()Ljava/util/concurrent/Future;\nPLcom/google/firebase/auth/api/internal/zzed;-><init>(Lcom/google/firebase/auth/api/internal/zzeu;Landroid/content/Context;)V\nPLcom/google/firebase/auth/api/internal/zzed;->call()Ljava/lang/Object;\nPLcom/google/firebase/auth/api/internal/zzed;->zza(ZLandroid/content/Context;)Lcom/google/android/gms/common/api/GoogleApi;\nPLcom/google/firebase/auth/api/internal/zzei;-><clinit>()V\nPLcom/google/firebase/auth/api/internal/zzei;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/google/android/gms/common/internal/ClientSettings;Lcom/google/firebase/auth/api/internal/zzeu;Lcom/google/android/gms/common/api/internal/ConnectionCallbacks;Lcom/google/android/gms/common/api/internal/OnConnectionFailedListener;)V\nPLcom/google/firebase/auth/api/internal/zzei;->getMinApkVersion()I\nPLcom/google/firebase/auth/api/internal/zzei;->requiresGooglePlayServices()Z\nPLcom/google/firebase/auth/api/internal/zzet;-><clinit>()V\nPLcom/google/firebase/auth/api/internal/zzeu;-><init>(Ljava/lang/String;Lcom/google/android/gms/signin/zaa;)V\nPLcom/google/firebase/auth/api/internal/zzeu;->clone()Ljava/lang/Object;\nPLcom/google/firebase/auth/api/internal/zzeu;->hashCode()I\nPLcom/google/firebase/auth/internal/zzaf;-><init>()V\nPLcom/google/firebase/auth/internal/zzaf;-><init>(Z)V\nPLcom/google/firebase/auth/internal/zzao;-><clinit>()V\nPLcom/google/firebase/auth/internal/zzao;-><init>()V\nPLcom/google/firebase/auth/internal/zzau;-><clinit>()V\nPLcom/google/firebase/auth/internal/zzau;-><init>()V\nPLcom/google/firebase/auth/internal/zzaw;-><init>(Landroid/content/Context;Ljava/lang/String;)V\nPLcom/google/firebase/auth/internal/zzay;-><init>(Ljava/lang/Object;I)V\nPLcom/google/firebase/auth/internal/zzay;->onBackgroundStateChanged(Z)V\nPLcom/google/firebase/auth/internal/zzbb;-><clinit>()V\nPLcom/google/firebase/auth/internal/zzbb;-><init>()V\nPLcom/google/firebase/auth/internal/zzl;-><init>(Lcom/google/firebase/FirebaseApp;)V\nPLcom/google/firebase/auth/zzaa;-><init>(I)V\nPLcom/google/firebase/auth/zzaa;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;\nPLcom/google/firebase/auth/zzl;-><init>(Ljava/lang/Object;I)V\nPLcom/google/firebase/auth/zzl;->checkUpdatedTable()Ljava/util/Set;\nPLcom/google/firebase/auth/zzl;->run()V\nPLcom/google/firebase/components/Component$Builder;-><init>(Ljava/lang/Class;[Ljava/lang/Class;Landroidx/transition/Styleable;)V\nPLcom/google/firebase/components/Component$Builder;->add(Lcom/google/firebase/components/Dependency;)Lcom/google/firebase/components/Component$Builder;\nPLcom/google/firebase/components/Component$Builder;->build()Lcom/google/firebase/components/Component;\nPLcom/google/firebase/components/Component$Builder;->factory(Lcom/google/firebase/components/ComponentFactory;)Lcom/google/firebase/components/Component$Builder;\nPLcom/google/firebase/components/Component$Builder;->setInstantiation(I)Lcom/google/firebase/components/Component$Builder;\nPLcom/google/firebase/components/Component;-><init>(Ljava/util/Set;Ljava/util/Set;IILcom/google/firebase/components/ComponentFactory;Ljava/util/Set;Landroidx/transition/Styleable;)V\nPLcom/google/firebase/components/Component;->builder(Ljava/lang/Class;)Lcom/google/firebase/components/Component$Builder;\nPLcom/google/firebase/components/Component;->isValue()Z\nPLcom/google/firebase/components/Component;->of(Ljava/lang/Object;Ljava/lang/Class;[Ljava/lang/Class;)Lcom/google/firebase/components/Component;\nPLcom/google/firebase/components/ComponentRuntime$$Lambda$1;-><init>(Lcom/google/firebase/components/ComponentRuntime;Lcom/google/firebase/components/Component;)V\nPLcom/google/firebase/components/ComponentRuntime$$Lambda$1;->get()Ljava/lang/Object;\nPLcom/google/firebase/components/ComponentRuntime$$Lambda$4;-><init>(Ljava/util/Set;)V\nPLcom/google/firebase/components/ComponentRuntime$$Lambda$4;->get()Ljava/lang/Object;\nPLcom/google/firebase/components/ComponentRuntime;-><init>(Ljava/util/concurrent/Executor;Ljava/lang/Iterable;[Lcom/google/firebase/components/Component;)V\nPLcom/google/firebase/components/ComponentRuntime;->getProvider(Ljava/lang/Class;)Lcom/google/firebase/inject/Provider;\nPLcom/google/firebase/components/ComponentRuntime;->setOfProvider(Ljava/lang/Class;)Lcom/google/firebase/inject/Provider;\nPLcom/google/firebase/components/CycleDetector$ComponentNode;-><init>(Lcom/google/firebase/components/Component;)V\nPLcom/google/firebase/components/CycleDetector$ComponentNode;->isRoot()Z\nPLcom/google/firebase/components/CycleDetector$Dep;-><init>(Ljava/lang/Class;ZLandroidx/transition/Styleable;)V\nPLcom/google/firebase/components/CycleDetector$Dep;->equals(Ljava/lang/Object;)Z\nPLcom/google/firebase/components/CycleDetector$Dep;->hashCode()I\nPLcom/google/firebase/components/Dependency;-><init>(Ljava/lang/Class;II)V\nPLcom/google/firebase/components/Dependency;->hashCode()I\nPLcom/google/firebase/components/Dependency;->isSet()Z\nPLcom/google/firebase/components/EventBus;-><init>(Ljava/util/concurrent/Executor;)V\nPLcom/google/firebase/components/EventBus;->subscribe(Ljava/lang/Class;Ljava/util/concurrent/Executor;Lcom/google/firebase/events/EventHandler;)V\nPLcom/google/firebase/components/Lazy;-><clinit>()V\nPLcom/google/firebase/components/Lazy;-><init>(Lcom/google/firebase/inject/Provider;)V\nPLcom/google/firebase/components/Lazy;->get()Ljava/lang/Object;\nPLcom/google/firebase/components/RestrictedComponentContainer;-><init>(Lcom/google/firebase/components/Component;Lcom/google/firebase/components/ComponentContainer;)V\nPLcom/google/firebase/components/RestrictedComponentContainer;->get(Ljava/lang/Class;)Ljava/lang/Object;\nPLcom/google/firebase/components/RestrictedComponentContainer;->setOf(Ljava/lang/Class;)Ljava/util/Set;\nPLcom/google/firebase/crashlytics/CrashlyticsRegistrar;-><init>()V\nPLcom/google/firebase/crashlytics/CrashlyticsRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/crashlytics/FirebaseCrashlytics$1;-><init>(Lcom/google/firebase/crashlytics/internal/Onboarding;Ljava/util/concurrent/ExecutorService;Lcom/google/firebase/crashlytics/internal/settings/SettingsController;ZLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;)V\nPLcom/google/firebase/crashlytics/FirebaseCrashlytics$1;->call()Ljava/lang/Object;\nPLcom/google/firebase/crashlytics/FirebaseCrashlytics;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;)V\nPLcom/google/firebase/crashlytics/internal/MissingNativeComponent;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/MissingNativeComponent;-><init>()V\nPLcom/google/firebase/crashlytics/internal/Onboarding;-><init>(Lcom/google/firebase/FirebaseApp;Landroid/content/Context;Lcom/google/firebase/crashlytics/internal/common/IdManager;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;)V\nPLcom/google/firebase/crashlytics/internal/Onboarding;->getOverridenSpiEndpoint()Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/analytics/BlockingAnalyticsEventLogger;-><init>(Lio/grpc/Attributes$Key;ILjava/util/concurrent/TimeUnit;)V\nPLcom/google/firebase/crashlytics/internal/common/AbstractSpiCall;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/common/AbstractSpiCall;-><init>(Ljava/lang/String;Ljava/lang/String;Lcom/google/android/gms/stats/zza;I)V\nPLcom/google/firebase/crashlytics/internal/common/BackgroundPriorityRunnable;-><init>()V\nPLcom/google/firebase/crashlytics/internal/common/BackgroundPriorityRunnable;->run()V\nPLcom/google/firebase/crashlytics/internal/common/CLSUUID;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/common/CLSUUID;-><init>(Lcom/google/firebase/crashlytics/internal/common/IdManager;)V\nPLcom/google/firebase/crashlytics/internal/common/CLSUUID;->convertLongToTwoByteBuffer(J)[B\nPLcom/google/firebase/crashlytics/internal/common/CommonUtils$Architecture;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/common/CommonUtils$Architecture;-><init>(Ljava/lang/String;I)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;-><init>(Ljava/util/concurrent/ExecutorService;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;->checkRunningOnThread()V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;->submit(Ljava/lang/Runnable;)Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;->submit(Ljava/util/concurrent/Callable;)Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$10;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;JLjava/lang/String;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$10;->call()Ljava/lang/Object;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$19;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;Ljava/lang/String;Ljava/lang/String;Z)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$19;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$1;-><init>(Ljava/lang/String;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$1;->accept(Ljava/io/File;Ljava/lang/String;)Z\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$20;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;ILjava/lang/String;IJJZILjava/lang/String;Ljava/lang/String;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$20;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$7;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController$7;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController$1;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;-><init>(Landroid/content/Context;Lcom/google/firebase/crashlytics/internal/common/CrashlyticsBackgroundWorker;Lcom/google/android/gms/stats/zza;Lcom/google/firebase/crashlytics/internal/common/IdManager;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;Lcom/bumptech/glide/module/ManifestParser;Landroidx/lifecycle/ViewModelProvider;Landroidx/databinding/ViewStubProxy;Lcom/google/firebase/iid/zzz;Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController$7;Lcom/google/firebase/crashlytics/internal/CrashlyticsNativeComponent;Lcom/google/android/gms/tasks/zzr;Lcom/google/firebase/crashlytics/internal/analytics/AnalyticsEventLogger;Lcom/google/firebase/crashlytics/internal/settings/SettingsDataProvider;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->access$1000(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->doCloseSessions(IZ)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->finalizeSessions(I)Z\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getCurrentSessionId()Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getCurrentTimestampSeconds()J\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getFatalSessionFilesDir()Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getFilesDir()Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getNativeSessionFilesDir()Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getNonFatalSessionFilesDir()Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->getSessionIdFromSessionFile(Ljava/io/File;)Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->isHandlingException()Z\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->listCompleteSessionFiles()[Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->listFilesMatching(Ljava/io/File;Ljava/io/FilenameFilter;)[Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->listSortedSessionBeginFiles()[Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->makeFirebaseSessionIdentifier(Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->submitAllReports(FLcom/google/android/gms/tasks/Task;)Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsController;->writeSessionPartFile(Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController$CodedOutputStreamWriteAction;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore$3;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;I)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore$3;->call()Ljava/lang/Boolean;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore$3;->call()Ljava/lang/Object;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;-><init>(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/crashlytics/internal/common/IdManager;Lcom/google/firebase/crashlytics/internal/CrashlyticsNativeComponent;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;Lcom/google/firebase/crashlytics/internal/breadcrumbs/BreadcrumbSource;Lcom/google/firebase/crashlytics/internal/analytics/AnalyticsEventLogger;Ljava/util/concurrent/ExecutorService;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;->access$000(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;Lcom/google/firebase/crashlytics/internal/settings/SettingsDataProvider;)Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsCore;->markInitializationComplete()V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsReportDataCapture;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsReportDataCapture;-><init>(Landroid/content/Context;Lcom/google/firebase/crashlytics/internal/common/IdManager;Landroidx/databinding/ViewStubProxy;Lcom/google/firebase/crashlytics/internal/stacktrace/StackTraceTrimmingStrategy;)V\nPLcom/google/firebase/crashlytics/internal/common/CrashlyticsUncaughtExceptionHandler;-><init>(Lio/grpc/Attributes$Key;Lcom/google/firebase/crashlytics/internal/settings/SettingsDataProvider;Ljava/lang/Thread$UncaughtExceptionHandler;)V\nPLcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;-><init>(Lcom/google/firebase/FirebaseApp;)V\nPLcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;->isAutomaticDataCollectionEnabled()Z\nPLcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;->logDataCollectionState(Z)V\nPLcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;->waitForDataCollectionPermission()Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/crashlytics/internal/common/ExecutorUtils$1$1;-><init>(Landroidx/arch/core/executor/DefaultTaskExecutor$1;Ljava/lang/Runnable;)V\nPLcom/google/firebase/crashlytics/internal/common/ExecutorUtils$1$1;->onRun()V\nPLcom/google/firebase/crashlytics/internal/common/ExecutorUtils$2;-><init>(Ljava/lang/String;Ljava/util/concurrent/ExecutorService;JLjava/util/concurrent/TimeUnit;)V\nPLcom/google/firebase/crashlytics/internal/common/IdManager;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/common/IdManager;-><init>(Landroid/content/Context;Ljava/lang/String;Lcom/google/firebase/installations/FirebaseInstallationsApi;)V\nPLcom/google/firebase/crashlytics/internal/common/IdManager;->getCrashlyticsInstallId()Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/common/IdManager;->getInstallerPackageName()Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/common/IdManager;->removeForwardSlashesIn(Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/common/MetaDataStore;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/common/MetaDataStore;-><init>(Ljava/io/File;)V\nPLcom/google/firebase/crashlytics/internal/common/MetaDataStore;->getUserDataFileForSession(Ljava/lang/String;)Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/common/Utils$1;-><init>(I)V\nPLcom/google/firebase/crashlytics/internal/common/Utils$1;-><init>(Lcom/google/firebase/crashlytics/internal/common/CrashlyticsController$1;)V\nPLcom/google/firebase/crashlytics/internal/common/Utils$1;->accept(Ljava/io/File;Ljava/lang/String;)Z\nPLcom/google/firebase/crashlytics/internal/common/Utils;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/common/Utils;->awaitEvenIfOnMainThread(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object;\nPLcom/google/firebase/crashlytics/internal/log/LogFileManager;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/log/LogFileManager;-><init>(Landroid/content/Context;Lio/grpc/Attributes$Key;)V\nPLcom/google/firebase/crashlytics/internal/log/LogFileManager;->setCurrentSession(Ljava/lang/String;)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile$Element;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile$Element;-><init>(II)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;-><init>(Ljava/io/File;)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->add([B)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->expandIfNecessary(I)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->isEmpty()Z\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->readElement(I)Lcom/google/firebase/crashlytics/internal/log/QueueFile$Element;\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->readInt([BI)I\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->ringWrite(I[BII)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->usedBytes()I\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->wrapPosition(I)I\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->writeHeader(IIII)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFile;->writeInt([BII)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFileLogStore;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/log/QueueFileLogStore;-><init>(Ljava/io/File;I)V\nPLcom/google/firebase/crashlytics/internal/log/QueueFileLogStore;->openLogFile()V\nPLcom/google/firebase/crashlytics/internal/log/QueueFileLogStore;->writeToLog(JLjava/lang/String;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportCustomAttributeEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportCustomAttributeEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportFilesPayloadEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportFilesPayloadEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportFilesPayloadFileEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportFilesPayloadFileEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationOrganizationEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionApplicationOrganizationEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionDeviceEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionDeviceEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionDeviceEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionBinaryImageEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionBinaryImageEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionExceptionEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionExceptionEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionSignalEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionSignalEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionThreadEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionThreadEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionThreadFrameEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventApplicationExecutionThreadFrameEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventDeviceEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventDeviceEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventLogEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionEventLogEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionOperatingSystemEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionOperatingSystemEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionOperatingSystemEncoder;->encode(Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionUserEncoder;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoCrashlyticsReportEncoder$CrashlyticsReportSessionUserEncoder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport$Builder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport$Builder;->build()Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport;\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport;-><init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$FilesPayload;Lokhttp3/RequestBody;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session$Builder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session$Builder;->build()Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session;\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session$Builder;->setCrashed(Z)Lcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session$Builder;\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session;-><init>(Ljava/lang/String;Ljava/lang/String;JLjava/lang/Long;ZLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Application;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$User;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$OperatingSystem;Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Device;Lcom/google/firebase/crashlytics/internal/model/ImmutableList;ILkotlin/ResultKt;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_Application;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/iid/zzh;Ljava/lang/String;Lokhttp3/RequestBody;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_Device$Builder;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_Device$Builder;->build()Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Device;\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_Device;-><init>(ILjava/lang/String;IJJZILjava/lang/String;Ljava/lang/String;Landroidx/core/R$dimen;)V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_OperatingSystem$Builder;-><init>(I)V\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_OperatingSystem$Builder;->build()Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$OperatingSystem;\nPLcom/google/firebase/crashlytics/internal/model/AutoValue_CrashlyticsReport_Session_OperatingSystem;-><init>(ILjava/lang/String;Ljava/lang/String;ZLcom/google/common/collect/Maps;)V\nPLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Application;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$Device;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session$OperatingSystem;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport$Session;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/CrashlyticsReport;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform;-><init>()V\nPLcom/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform;->reportToJson(Lcom/google/firebase/crashlytics/internal/model/CrashlyticsReport;)Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$2;-><init>(Ljava/lang/String;)V\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$2;->accept(Ljava/io/File;)Z\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$5;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$5;-><init>()V\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$6;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$6;-><init>()V\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence$$Lambda$6;->accept(Ljava/io/File;Ljava/lang/String;)Z\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;-><init>(Ljava/io/File;Lcom/google/firebase/crashlytics/internal/settings/SettingsDataProvider;)V\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->combineReportFiles([Ljava/util/List;)Ljava/util/List;\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getAllFilesInDirectory(Ljava/io/File;)Ljava/util/List;\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getAllFinalizedReportFiles()Ljava/util/List;\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getFilesInDirectory(Ljava/io/File;Ljava/io/FileFilter;)Ljava/util/List;\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getFilesInDirectory(Ljava/io/File;Ljava/io/FilenameFilter;)Ljava/util/List;\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->getSessionDirectoryById(Ljava/lang/String;)Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->prepareDirectory(Ljava/io/File;)Ljava/io/File;\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->recursiveDelete(Ljava/io/File;)V\nPLcom/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence;->writeTextFile(Ljava/io/File;Ljava/lang/String;)V\nPLcom/google/firebase/crashlytics/internal/proto/ByteString;-><init>([B)V\nPLcom/google/firebase/crashlytics/internal/proto/ByteString;->copyFromUtf8(Ljava/lang/String;)Lcom/google/firebase/crashlytics/internal/proto/ByteString;\nPLcom/google/firebase/crashlytics/internal/proto/ClsFileOutputStream;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/proto/ClsFileOutputStream;-><init>(Ljava/io/File;Ljava/lang/String;)V\nPLcom/google/firebase/crashlytics/internal/proto/ClsFileOutputStream;->close()V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;-><init>(Ljava/io/OutputStream;[B)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeBoolSize(IZ)I\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeBytesSize(ILcom/google/firebase/crashlytics/internal/proto/ByteString;)I\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeEnumSize(II)I\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeRawVarint32Size(I)I\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeTagSize(I)I\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeUInt32Size(II)I\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->computeUInt64Size(IJ)I\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->flush()V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->newInstance(Ljava/io/OutputStream;)Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->refreshBuffer()V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeBool(IZ)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeBytes(ILcom/google/firebase/crashlytics/internal/proto/ByteString;)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeEnum(II)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeRawByte(I)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeRawVarint32(I)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeRawVarint64(J)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeTag(II)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeUInt32(II)V\nPLcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;->writeUInt64(IJ)V\nPLcom/google/firebase/crashlytics/internal/proto/SessionProtobufHelper;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/proto/SessionProtobufHelper;->stringToByteString(Ljava/lang/String;)Lcom/google/firebase/crashlytics/internal/proto/ByteString;\nPLcom/google/firebase/crashlytics/internal/send/DataTransportCrashlyticsReportSender;-><clinit>()V\nPLcom/google/firebase/crashlytics/internal/send/DataTransportCrashlyticsReportSender;-><init>(Lcom/google/android/datatransport/Transport;Lcom/google/android/datatransport/Transformer;)V\nPLcom/google/firebase/crashlytics/internal/send/DataTransportCrashlyticsReportSender;->mergeStrings(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/firebase/crashlytics/internal/settings/SettingsController;-><init>(Landroid/content/Context;Lcom/google/firebase/crashlytics/internal/settings/model/SettingsRequest;Lcom/google/android/gms/stats/zza;Lcom/google/firebase/iid/zzz;Landroidx/appcompat/view/ActionBarPolicy;Lcom/google/firebase/crashlytics/internal/settings/network/SettingsSpiCall;Lcom/google/firebase/crashlytics/internal/common/DataCollectionArbiter;)V\nPLcom/google/firebase/crashlytics/internal/settings/SettingsController;->getAppSettings()Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/crashlytics/internal/settings/SettingsController;->getCachedSettingsData$enumunboxing$(I)Lcom/google/firebase/crashlytics/internal/settings/model/SettingsData;\nPLcom/google/firebase/crashlytics/internal/settings/SettingsController;->getSettings()Lcom/google/firebase/crashlytics/internal/settings/model/SettingsData;\nPLcom/google/firebase/crashlytics/internal/settings/SettingsController;->loadSettingsData$enumunboxing$(ILjava/util/concurrent/Executor;)Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/crashlytics/internal/settings/model/SettingsData;-><init>(JLcom/google/firebase/crashlytics/internal/settings/model/AppSettingsData;Landroidx/compose/material/FabPlacement;Lcom/google/firebase/auth/internal/zzaf;II)V\nPLcom/google/firebase/crashlytics/internal/settings/model/SettingsRequest;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/common/InstallIdProvider;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V\nPLcom/google/firebase/crashlytics/internal/settings/network/DefaultSettingsSpiCall;-><init>(Ljava/lang/String;Ljava/lang/String;Lcom/google/android/gms/stats/zza;)V\nPLcom/google/firebase/datatransport/TransportRegistrar;-><init>()V\nPLcom/google/firebase/datatransport/TransportRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/datatransport/TransportRegistrar;->lambda$getComponents$0(Lcom/google/firebase/components/ComponentContainer;)Lcom/google/android/datatransport/TransportFactory;\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$1;-><clinit>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$1;-><init>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$4;-><clinit>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$4;-><init>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$4;->encode(Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$5;-><clinit>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$$Lambda$5;-><init>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$TimestampEncoder;-><clinit>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder$TimestampEncoder;-><init>(Lcom/google/ar/core/ac;)V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder;-><clinit>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder;-><init>()V\nPLcom/google/firebase/encoders/json/JsonDataEncoderBuilder;->build()Lcom/google/ar/core/ac;\nPLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;-><init>(Ljava/io/Writer;Ljava/util/Map;Ljava/util/Map;Lcom/google/firebase/encoders/ObjectEncoder;Z)V\nPLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->add(Ljava/lang/Object;Z)Lcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;\nPLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->add(Ljava/lang/String;I)Lcom/google/firebase/encoders/ObjectEncoderContext;\nPLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->add(Ljava/lang/String;Ljava/lang/Object;)Lcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;\nPLcom/google/firebase/encoders/json/JsonValueObjectEncoderContext;->maybeUnNest()V\nPLcom/google/firebase/firestore/FirestoreRegistrar;-><init>()V\nPLcom/google/firebase/firestore/FirestoreRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/firestore/ktx/FirebaseFirestoreKtxRegistrar;-><init>()V\nPLcom/google/firebase/firestore/ktx/FirebaseFirestoreKtxRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/functions/FunctionsRegistrar;-><init>()V\nPLcom/google/firebase/functions/FunctionsRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/functions/ktx/FirebaseFunctionsKtxRegistrar;-><init>()V\nPLcom/google/firebase/functions/ktx/FirebaseFunctionsKtxRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;-><init>(Landroid/content/Context;)V\nPLcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;->getHeartBeatCode$enumunboxing$(Ljava/lang/String;)I\nPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;-><init>(Landroid/content/Context;)V\nPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->shouldSendSdkHeartBeat(Ljava/lang/String;J)Z\nPLcom/google/firebase/iid/FirebaseInstanceId;-><clinit>()V\nPLcom/google/firebase/iid/FirebaseInstanceId;-><init>(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/events/Subscriber;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;)V\nPLcom/google/firebase/iid/FirebaseInstanceId;->getInstance()Lcom/google/firebase/iid/FirebaseInstanceId;\nPLcom/google/firebase/iid/FirebaseInstanceId;->getInstance(Lcom/google/firebase/FirebaseApp;)Lcom/google/firebase/iid/FirebaseInstanceId;\nPLcom/google/firebase/iid/FirebaseInstanceId;->zza(J)V\nPLcom/google/firebase/iid/FirebaseInstanceId;->zza(Lcom/google/firebase/iid/zzay;)Z\nPLcom/google/firebase/iid/FirebaseInstanceId;->zza(Ljava/lang/Runnable;J)V\nPLcom/google/firebase/iid/FirebaseInstanceId;->zza(Z)V\nPLcom/google/firebase/iid/FirebaseInstanceId;->zzb(Ljava/lang/String;Ljava/lang/String;)Lcom/google/firebase/iid/zzay;\nPLcom/google/firebase/iid/FirebaseInstanceId;->zzj()V\nPLcom/google/firebase/iid/FirebaseInstanceId;->zzk()V\nPLcom/google/firebase/iid/FirebaseInstanceId;->zzm()Ljava/lang/String;\nPLcom/google/firebase/iid/Registrar;-><init>()V\nPLcom/google/firebase/iid/Registrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/iid/zzab;-><init>(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/coroutines/CoroutineContext;)V\nPLcom/google/firebase/iid/zzab;->endOptional()V\nPLcom/google/firebase/iid/zzao;-><init>(Landroid/content/Context;)V\nPLcom/google/firebase/iid/zzao;->zza(Lcom/google/firebase/FirebaseApp;)Ljava/lang/String;\nPLcom/google/firebase/iid/zzao;->zzb()I\nPLcom/google/firebase/iid/zzaq;-><clinit>()V\nPLcom/google/firebase/iid/zzaq;-><init>()V\nPLcom/google/firebase/iid/zzaq;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/google/firebase/iid/zzar;-><clinit>()V\nPLcom/google/firebase/iid/zzar;-><init>()V\nPLcom/google/firebase/iid/zzau;-><init>(Landroid/content/Context;Lcom/google/firebase/iid/zzao;)V\nPLcom/google/firebase/iid/zzaw;-><init>(Landroid/widget/ImageView;)V\nPLcom/google/firebase/iid/zzaw;-><init>(Landroidx/compose/runtime/SnapshotThreadLocal;Ljava/lang/Class;Ljava/lang/reflect/Type;)V\nPLcom/google/firebase/iid/zzaw;-><init>(Lcom/google/firebase/crashlytics/internal/Onboarding;Ljava/lang/String;Lcom/google/firebase/crashlytics/internal/settings/SettingsController;Ljava/util/concurrent/Executor;)V\nPLcom/google/firebase/iid/zzaw;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/firebase/iid/zzaw;-><init>(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)V\nPLcom/google/firebase/iid/zzaw;->addFragment(Landroidx/fragment/app/Fragment;)V\nPLcom/google/firebase/iid/zzaw;->construct()Ljava/lang/Object;\nPLcom/google/firebase/iid/zzaw;->findActiveFragment(Ljava/lang/String;)Landroidx/fragment/app/Fragment;\nPLcom/google/firebase/iid/zzaw;->getActiveFragments()Ljava/util/List;\nPLcom/google/firebase/iid/zzaw;->getFragmentStateManager(Ljava/lang/String;)Landroidx/fragment/app/FragmentStateManager;\nPLcom/google/firebase/iid/zzaw;->makeActive(Landroidx/fragment/app/FragmentStateManager;)V\nPLcom/google/firebase/iid/zzaw;->makeInactive(Landroidx/fragment/app/FragmentStateManager;)V\nPLcom/google/firebase/iid/zzaw;->offer(Ljava/lang/Object;)V\nPLcom/google/firebase/iid/zzaw;->setSavedState(Ljava/lang/String;Landroidx/fragment/app/FragmentState;)Landroidx/fragment/app/FragmentState;\nPLcom/google/firebase/iid/zzaw;->zza()Lcom/google/firebase/iid/zzaw;\nPLcom/google/firebase/iid/zzaw;->zza(Landroid/content/Context;)Z\nPLcom/google/firebase/iid/zzax;-><init>(Lcom/google/firebase/iid/zzau;Landroid/os/Looper;)V\nPLcom/google/firebase/iid/zzay;-><clinit>()V\nPLcom/google/firebase/iid/zzay;->zza(Ljava/lang/String;)Lcom/google/firebase/iid/zzay;\nPLcom/google/firebase/iid/zzba;-><init>(Ljava/lang/Object;I)V\nPLcom/google/firebase/iid/zzba;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V\nPLcom/google/firebase/iid/zzbb;-><init>(Lcom/google/android/gms/measurement/internal/zzig;Lcom/google/android/gms/measurement/internal/zzih;J)V\nPLcom/google/firebase/iid/zzbb;-><init>(Lcom/google/firebase/iid/FirebaseInstanceId;J)V\nPLcom/google/firebase/iid/zzbb;->run()V\nPLcom/google/firebase/iid/zzbb;->zza()Landroid/content/Context;\nPLcom/google/firebase/iid/zzc;-><init>(Ljava/util/concurrent/Executor;)V\nPLcom/google/firebase/iid/zzf;-><clinit>()V\nPLcom/google/firebase/iid/zzf;-><init>()V\nPLcom/google/firebase/iid/zzf;->configure(Lcom/google/firebase/encoders/config/EncoderConfig;)V\nPLcom/google/firebase/iid/zzf;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/google/firebase/iid/zzh;-><clinit>()V\nPLcom/google/firebase/iid/zzh;->getMyProcessName()Ljava/lang/String;\nPLcom/google/firebase/iid/zzh;->writeProfile(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Z)V\nPLcom/google/firebase/iid/zzh;->zzb()Ljava/util/concurrent/ExecutorService;\nPLcom/google/firebase/iid/zzh;->zzk(Ljava/lang/String;)Ljava/io/BufferedReader;\nPLcom/google/firebase/iid/zzk;-><init>(Landroid/content/Context;)V\nPLcom/google/firebase/iid/zzk;-><init>(Landroid/content/Intent;)V\nPLcom/google/firebase/iid/zzk;-><init>(Lcom/google/android/gms/measurement/AppMeasurement;Lio/grpc/CallOptions$Key;)V\nPLcom/google/firebase/iid/zzk;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/google/firebase/iid/zzk;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V\nPLcom/google/firebase/iid/zzk;->acquire()Ljava/lang/Object;\nPLcom/google/firebase/iid/zzk;->getBoolean(IZ)Z\nPLcom/google/firebase/iid/zzk;->getColorStateList(I)Landroid/content/res/ColorStateList;\nPLcom/google/firebase/iid/zzk;->getDimensionPixelOffset(II)I\nPLcom/google/firebase/iid/zzk;->getDrawable(I)Landroid/graphics/drawable/Drawable;\nPLcom/google/firebase/iid/zzk;->getDrawableIfKnown(I)Landroid/graphics/drawable/Drawable;\nPLcom/google/firebase/iid/zzk;->getHiltViewModelFactory(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;Landroidx/lifecycle/ViewModelProvider$Factory;)Landroidx/lifecycle/ViewModelProvider$Factory;\nPLcom/google/firebase/iid/zzk;->getInteger(II)I\nPLcom/google/firebase/iid/zzk;->getText(I)Ljava/lang/CharSequence;\nPLcom/google/firebase/iid/zzk;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[I)Lcom/google/firebase/iid/zzk;\nPLcom/google/firebase/iid/zzk;->release(Ljava/lang/Object;)Z\nPLcom/google/firebase/iid/zzk;->zza(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/firebase/iid/zzk;->zzb(Ljava/lang/String;)J\nPLcom/google/firebase/iid/zzk;->zzc(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/firebase/iid/zzk;->zzd(Ljava/lang/String;)J\nPLcom/google/firebase/iid/zzn;-><clinit>()V\nPLcom/google/firebase/iid/zzn;-><init>()V\nPLcom/google/firebase/iid/zzn;->execute(Ljava/lang/Runnable;)V\nPLcom/google/firebase/iid/zzq;-><init>(Lcom/google/android/gms/internal/clearcut/zzao;)V\nPLcom/google/firebase/iid/zzt;-><init>(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/zzao;Ljava/util/concurrent/Executor;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;)V\nPLcom/google/firebase/iid/zzv;-><clinit>()V\nPLcom/google/firebase/iid/zzv;-><init>()V\nPLcom/google/firebase/iid/zzv;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/google/firebase/iid/zzy;-><init>(Ljava/lang/Object;I)V\nPLcom/google/firebase/iid/zzy;->call()Ljava/lang/Object;\nPLcom/google/firebase/iid/zzy;->call()Ljava/lang/Void;\nPLcom/google/firebase/iid/zzz;-><init>(ILandroidx/appcompat/R$id$$IA$1;)V\nPLcom/google/firebase/iid/zzz;-><init>(Landroid/content/Context;)V\nPLcom/google/firebase/iid/zzz;-><init>(Ljava/lang/Object;I)V\nPLcom/google/firebase/iid/zzz;->get()Ljava/lang/Object;\nPLcom/google/firebase/iid/zzz;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;Lcom/google/android/material/internal/ViewUtils$RelativePadding;)Landroidx/core/view/WindowInsetsCompat;\nPLcom/google/firebase/iid/zzz;->then(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object;\nPLcom/google/firebase/iid/zzz;->zza()Ljava/lang/String;\nPLcom/google/firebase/installations/FirebaseInstallations$$Lambda$2;-><init>(Lcom/google/firebase/installations/FirebaseInstallations;ZI)V\nPLcom/google/firebase/installations/FirebaseInstallations;-><clinit>()V\nPLcom/google/firebase/installations/FirebaseInstallations;-><init>(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;)V\nPLcom/google/firebase/installations/FirebaseInstallations;->doRegistrationOrRefresh(Z)V\nPLcom/google/firebase/installations/FirebaseInstallations;->getApiKey()Ljava/lang/String;\nPLcom/google/firebase/installations/FirebaseInstallations;->getApplicationId()Ljava/lang/String;\nPLcom/google/firebase/installations/FirebaseInstallations;->getId()Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/installations/FirebaseInstallations;->getProjectIdentifier()Ljava/lang/String;\nPLcom/google/firebase/installations/FirebaseInstallations;->triggerOnException(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;Ljava/lang/Exception;)V\nPLcom/google/firebase/installations/FirebaseInstallations;->triggerOnStateReached(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;)V\nPLcom/google/firebase/installations/FirebaseInstallationsException;-><init>(I)V\nPLcom/google/firebase/installations/FirebaseInstallationsRegistrar;-><init>()V\nPLcom/google/firebase/installations/FirebaseInstallationsRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/installations/FirebaseInstallationsRegistrar;->lambda$getComponents$0(Lcom/google/firebase/components/ComponentContainer;)Lcom/google/firebase/installations/FirebaseInstallationsApi;\nPLcom/google/firebase/installations/GetIdListener;-><init>(Lcom/google/android/gms/tasks/TaskCompletionSource;)V\nPLcom/google/firebase/installations/GetIdListener;->onException(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;Ljava/lang/Exception;)Z\nPLcom/google/firebase/installations/GetIdListener;->onStateReached(Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;)Z\nPLcom/google/firebase/installations/RandomFidGenerator;-><clinit>()V\nPLcom/google/firebase/installations/RandomFidGenerator;-><init>()V\nPLcom/google/firebase/installations/Utils;-><clinit>()V\nPLcom/google/firebase/installations/Utils;-><init>()V\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;-><init>()V\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->setExpiresInSecs(J)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->setRegistrationStatus$enumunboxing$(I)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;->setTokenCreationEpochInSecs(J)Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;-><clinit>()V\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->isErrored()Z\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->isNotGenerated()Z\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->isRegistered()Z\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->isUnregistered()Z\nPLcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry;->toBuilder()Lcom/google/firebase/installations/local/AutoValue_PersistedInstallationEntry$Builder;\nPLcom/google/firebase/installations/local/IidStore;-><clinit>()V\nPLcom/google/firebase/installations/local/IidStore;-><init>(Lcom/google/firebase/FirebaseApp;)V\nPLcom/google/firebase/installations/remote/AutoValue_InstallationResponse;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/google/firebase/installations/remote/AutoValue_TokenResult;ILokio/Base64;)V\nPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;-><clinit>()V\nPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;-><init>(Landroid/content/Context;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;)V\nPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->getFullyQualifiedRequestUri(Ljava/lang/String;)Ljava/net/URL;\nPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->writeFIDCreateRequestBodyToOutputStream(Ljava/net/HttpURLConnection;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;->writeRequestBodyToOutputStream(Ljava/net/URLConnection;[B)V\nPLcom/google/firebase/internal/DataCollectionConfigStorage;-><init>(Landroid/content/Context;Ljava/lang/String;Lcom/google/firebase/events/Publisher;)V\nPLcom/google/firebase/ktx/FirebaseCommonKtxRegistrar;-><init>()V\nPLcom/google/firebase/ktx/FirebaseCommonKtxRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/messaging/FirebaseMessaging;-><init>(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;Lcom/google/android/datatransport/TransportFactory;)V\nPLcom/google/firebase/messaging/FirebaseMessagingRegistrar;-><init>()V\nPLcom/google/firebase/messaging/FirebaseMessagingRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/messaging/zzj;-><init>(ILandroidx/appcompat/R$id$$IA$1;)V\nPLcom/google/firebase/messaging/zzj;-><init>(Landroid/content/Context;)V\nPLcom/google/firebase/messaging/zzj;-><init>(Landroidx/room/RoomDatabase;)V\nPLcom/google/firebase/messaging/zzj;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/google/firebase/messaging/zzj;-><init>(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V\nPLcom/google/firebase/messaging/zzj;->getEncodeStrategy$enumunboxing$(Lcom/bumptech/glide/load/Options;)I\nPLcom/google/firebase/messaging/zzj;->getOrAddEntryList(Ljava/lang/String;)Ljava/util/List;\nPLcom/google/firebase/messaging/zzj;->getResourceClasses(Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/List;\nPLcom/google/firebase/messaging/zzj;->getString(Ljava/lang/String;)Ljava/lang/String;\nPLcom/google/firebase/messaging/zzj;->onTypefaceRequestFailed(I)V\nPLcom/google/firebase/messaging/zzj;->onTypefaceResult(Landroidx/core/provider/FontRequestWorker$TypefaceResult;)V\nPLcom/google/firebase/messaging/zzj;->release(Ljava/lang/String;)V\nPLcom/google/firebase/messaging/zzj;->writeTo(Lcom/google/firebase/crashlytics/internal/proto/CodedOutputStream;)V\nPLcom/google/firebase/messaging/zzl;-><clinit>()V\nPLcom/google/firebase/messaging/zzl;-><init>()V\nPLcom/google/firebase/messaging/zzl;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLcom/google/firebase/messaging/zzu;-><clinit>()V\nPLcom/google/firebase/messaging/zzu;-><init>(Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/iid/zzao;Lcom/google/firebase/platforminfo/DefaultUserAgentPublisher;Lcom/google/firebase/heartbeatinfo/DefaultHeartBeatInfo;Lcom/google/firebase/installations/FirebaseInstallationsApi;Landroid/content/Context;Ljava/util/concurrent/Executor;Ljava/util/concurrent/ScheduledExecutorService;)V\nPLcom/google/firebase/messaging/zzu;->zzf()Ljava/lang/String;\nPLcom/google/firebase/platforminfo/AutoValue_LibraryVersion;-><init>(Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/firebase/platforminfo/AutoValue_LibraryVersion;->hashCode()I\nPLcom/google/firebase/platforminfo/DefaultUserAgentPublisher;-><init>(Ljava/util/Set;Lokhttp3/internal/connection/RouteDatabase;)V\nPLcom/google/firebase/platforminfo/DefaultUserAgentPublisher;->toUserAgent(Ljava/util/Set;)Ljava/lang/String;\nPLcom/google/firebase/provider/FirebaseInitProvider;-><init>()V\nPLcom/google/firebase/provider/FirebaseInitProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V\nPLcom/google/firebase/provider/FirebaseInitProvider;->onCreate()Z\nPLcom/google/firebase/remoteconfig/FirebaseRemoteConfig;-><init>(Landroid/content/Context;Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/abt/FirebaseABTesting;Ljava/util/concurrent/Executor;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;Lcom/google/firebase/remoteconfig/internal/ConfigGetParameterHandler;Lcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;)V\nPLcom/google/firebase/remoteconfig/RemoteConfigComponent;-><clinit>()V\nPLcom/google/firebase/remoteconfig/RemoteConfigComponent;-><init>(Landroid/content/Context;Lcom/google/firebase/FirebaseApp;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/abt/FirebaseABTesting;Lcom/google/firebase/analytics/connector/AnalyticsConnector;)V\nPLcom/google/firebase/remoteconfig/RemoteConfigComponent;->get(Lcom/google/firebase/FirebaseApp;Ljava/lang/String;Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/abt/FirebaseABTesting;Ljava/util/concurrent/Executor;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;Lcom/google/firebase/remoteconfig/internal/ConfigGetParameterHandler;Lcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;)Lcom/google/firebase/remoteconfig/FirebaseRemoteConfig;\nPLcom/google/firebase/remoteconfig/RemoteConfigComponent;->getCacheClient(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;\nPLcom/google/firebase/remoteconfig/RemoteConfigComponent;->getFetchHandler(Ljava/lang/String;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;)Lcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;\nPLcom/google/firebase/remoteconfig/RemoteConfigRegistrar;-><init>()V\nPLcom/google/firebase/remoteconfig/RemoteConfigRegistrar;->getComponents()Ljava/util/List;\nPLcom/google/firebase/remoteconfig/RemoteConfigRegistrar;->lambda$getComponents$0(Lcom/google/firebase/components/ComponentContainer;)Lcom/google/firebase/remoteconfig/RemoteConfigComponent;\nPLcom/google/firebase/remoteconfig/internal/ConfigCacheClient;-><clinit>()V\nPLcom/google/firebase/remoteconfig/internal/ConfigCacheClient;-><init>(Ljava/util/concurrent/ExecutorService;Lcom/google/firebase/remoteconfig/internal/ConfigStorageClient;)V\nPLcom/google/firebase/remoteconfig/internal/ConfigCacheClient;->get()Lcom/google/android/gms/tasks/Task;\nPLcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;-><clinit>()V\nPLcom/google/firebase/remoteconfig/internal/ConfigFetchHandler;-><init>(Lcom/google/firebase/iid/FirebaseInstanceId;Lcom/google/firebase/analytics/connector/AnalyticsConnector;Ljava/util/concurrent/Executor;Lcom/google/android/gms/common/util/Clock;Ljava/util/Random;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigFetchHttpClient;Lcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;Ljava/util/Map;)V\nPLcom/google/firebase/remoteconfig/internal/ConfigFetchHttpClient;-><clinit>()V\nPLcom/google/firebase/remoteconfig/internal/ConfigFetchHttpClient;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJ)V\nPLcom/google/firebase/remoteconfig/internal/ConfigGetParameterHandler;-><clinit>()V\nPLcom/google/firebase/remoteconfig/internal/ConfigGetParameterHandler;-><init>(Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;Lcom/google/firebase/remoteconfig/internal/ConfigCacheClient;)V\nPLcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;-><clinit>()V\nPLcom/google/firebase/remoteconfig/internal/ConfigMetadataClient;-><init>(Landroid/content/SharedPreferences;)V\nPLcom/google/firebase/remoteconfig/internal/ConfigStorageClient;-><clinit>()V\nPLcom/google/firebase/remoteconfig/internal/ConfigStorageClient;-><init>(Landroid/content/Context;Ljava/lang/String;)V\nPLcom/google/firebase/remoteconfig/internal/LegacyConfigsHandler;-><clinit>()V\nPLcom/google/firebase/remoteconfig/internal/LegacyConfigsHandler;-><init>(Landroid/content/Context;Ljava/lang/String;)V\nPLcom/google/gson/DefaultDateTypeAdapter;-><init>(Lcom/google/gson/Gson;Ljava/lang/reflect/Type;Lcom/google/gson/TypeAdapter;Lcom/google/gson/internal/ObjectConstructor;)V\nPLcom/google/gson/DefaultDateTypeAdapter;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V\nPLcom/google/gson/FieldNamingPolicy$1;-><init>(Ljava/lang/String;I)V\nPLcom/google/gson/FieldNamingPolicy$1;->translateName(Ljava/lang/reflect/Field;)Ljava/lang/String;\nPLcom/google/gson/FieldNamingPolicy$2;-><init>(Ljava/lang/String;I)V\nPLcom/google/gson/FieldNamingPolicy$3;-><init>(Ljava/lang/String;I)V\nPLcom/google/gson/FieldNamingPolicy$4;-><init>(Ljava/lang/String;I)V\nPLcom/google/gson/FieldNamingPolicy$5;-><init>(Ljava/lang/String;I)V\nPLcom/google/gson/FieldNamingPolicy$6;-><init>(Ljava/lang/String;I)V\nPLcom/google/gson/FieldNamingPolicy;-><clinit>()V\nPLcom/google/gson/FieldNamingPolicy;-><init>(Ljava/lang/String;ILcom/google/gson/FieldNamingPolicy$1;)V\nPLcom/google/gson/Gson$1;-><init>(Lcom/google/gson/Gson;I)V\nPLcom/google/gson/Gson$3;-><init>(I)V\nPLcom/google/gson/Gson$3;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Number;)V\nPLcom/google/gson/Gson$3;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V\nPLcom/google/gson/Gson$4;-><init>(Lcom/google/gson/TypeAdapter;I)V\nPLcom/google/gson/Gson$FutureTypeAdapter;-><init>()V\nPLcom/google/gson/Gson;-><clinit>()V\nPLcom/google/gson/Gson;->newJsonWriter(Ljava/io/Writer;)Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/Gson;->toJson(Ljava/lang/Object;Ljava/lang/reflect/Type;Lcom/google/gson/stream/JsonWriter;)V\nPLcom/google/gson/GsonBuilder;-><init>()V\nPLcom/google/gson/GsonBuilder;->create()Lcom/google/gson/Gson;\nPLcom/google/gson/GsonBuilder;->registerTypeAdapter(Ljava/lang/reflect/Type;Ljava/lang/Object;)Lcom/google/gson/GsonBuilder;\nPLcom/google/gson/JsonPrimitive;->getAsInt()I\nPLcom/google/gson/LongSerializationPolicy$1;-><init>(Ljava/lang/String;I)V\nPLcom/google/gson/LongSerializationPolicy$2;-><init>(Ljava/lang/String;I)V\nPLcom/google/gson/LongSerializationPolicy;-><clinit>()V\nPLcom/google/gson/LongSerializationPolicy;-><init>(Ljava/lang/String;ILcom/google/gson/LongSerializationPolicy$1;)V\nPLcom/google/gson/TypeAdapter;-><init>()V\nPLcom/google/gson/TypeAdapter;->nullSafe()Lcom/google/gson/TypeAdapter;\nPLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;-><init>(Ljava/lang/reflect/Type;Ljava/lang/reflect/Type;[Ljava/lang/reflect/Type;)V\nPLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->getActualTypeArguments()[Ljava/lang/reflect/Type;\nPLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->getOwnerType()Ljava/lang/reflect/Type;\nPLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->getRawType()Ljava/lang/reflect/Type;\nPLcom/google/gson/internal/$Gson$Types$ParameterizedTypeImpl;->hashCode()I\nPLcom/google/gson/internal/ConstructorConstructor$7;-><init>(Landroidx/compose/runtime/SnapshotThreadLocal;I)V\nPLcom/google/gson/internal/ConstructorConstructor$7;->construct()Ljava/lang/Object;\nPLcom/google/gson/internal/Excluder;-><clinit>()V\nPLcom/google/gson/internal/Excluder;-><init>()V\nPLcom/google/gson/internal/Excluder;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nPLcom/google/gson/internal/Excluder;->excludeClassInStrategy(Ljava/lang/Class;Z)Z\nPLcom/google/gson/internal/Excluder;->isAnonymousOrLocal(Ljava/lang/Class;)Z\nPLcom/google/gson/internal/JavaVersion;-><clinit>()V\nPLcom/google/gson/internal/LazilyParsedNumber;->intValue()I\nPLcom/google/gson/internal/LinkedTreeMap$KeySet$1;-><init>(Lcom/google/gson/internal/LinkedTreeMap$KeySet;)V\nPLcom/google/gson/internal/LinkedTreeMap$KeySet$1;->next()Ljava/lang/Object;\nPLcom/google/gson/internal/LinkedTreeMap$KeySet;-><init>(Lcom/google/gson/internal/LinkedTreeMap;I)V\nPLcom/google/gson/internal/LinkedTreeMap$KeySet;->iterator()Ljava/util/Iterator;\nPLcom/google/gson/internal/LinkedTreeMap$LinkedTreeMapIterator;-><init>(Lcom/google/gson/internal/LinkedTreeMap;)V\nPLcom/google/gson/internal/LinkedTreeMap$LinkedTreeMapIterator;->hasNext()Z\nPLcom/google/gson/internal/LinkedTreeMap$LinkedTreeMapIterator;->nextNode()Lcom/google/gson/internal/LinkedTreeMap$Node;\nPLcom/google/gson/internal/LinkedTreeMap$Node;->getValue()Ljava/lang/Object;\nPLcom/google/gson/internal/LinkedTreeMap;-><clinit>()V\nPLcom/google/gson/internal/LinkedTreeMap;->entrySet()Ljava/util/Set;\nPLcom/google/gson/internal/LinkedTreeMap;->get(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/gson/internal/LinkedTreeMap;->size()I\nPLcom/google/gson/internal/UnsafeAllocator$1;-><init>(Ljava/lang/reflect/Method;Ljava/lang/Object;)V\nPLcom/google/gson/internal/UnsafeAllocator$1;->newInstance(Ljava/lang/Class;)Ljava/lang/Object;\nPLcom/google/gson/internal/bind/ArrayTypeAdapter;-><clinit>()V\nPLcom/google/gson/internal/bind/CollectionTypeAdapterFactory;-><init>(Landroidx/compose/runtime/SnapshotThreadLocal;I)V\nPLcom/google/gson/internal/bind/CollectionTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nPLcom/google/gson/internal/bind/DateTypeAdapter;-><clinit>()V\nPLcom/google/gson/internal/bind/MapTypeAdapterFactory$Adapter;-><init>(Lcom/google/gson/internal/bind/MapTypeAdapterFactory;Lcom/google/gson/Gson;Ljava/lang/reflect/Type;Lcom/google/gson/TypeAdapter;Ljava/lang/reflect/Type;Lcom/google/gson/TypeAdapter;Lcom/google/gson/internal/ObjectConstructor;)V\nPLcom/google/gson/internal/bind/MapTypeAdapterFactory;-><init>(Landroidx/compose/runtime/SnapshotThreadLocal;Z)V\nPLcom/google/gson/internal/bind/MapTypeAdapterFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nPLcom/google/gson/internal/bind/ObjectTypeAdapter;-><clinit>()V\nPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$1;-><init>(Lcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;Ljava/lang/String;ZZLjava/lang/reflect/Field;ZLcom/google/gson/TypeAdapter;Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;Z)V\nPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$Adapter;-><init>(Lcom/google/gson/internal/ObjectConstructor;Ljava/util/Map;)V\nPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$Adapter;->read(Lcom/google/gson/stream/JsonReader;)Ljava/lang/Object;\nPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory$Adapter;->write(Lcom/google/gson/stream/JsonWriter;Ljava/lang/Object;)V\nPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;-><init>(Landroidx/compose/runtime/SnapshotThreadLocal;Lcom/google/gson/FieldNamingStrategy;Lcom/google/gson/internal/Excluder;Lcom/google/gson/internal/bind/CollectionTypeAdapterFactory;)V\nPLcom/google/gson/internal/bind/ReflectiveTypeAdapterFactory;->excludeField(Ljava/lang/reflect/Field;Z)Z\nPLcom/google/gson/internal/bind/SqlDateTypeAdapter;-><clinit>()V\nPLcom/google/gson/internal/bind/TimeTypeAdapter;-><clinit>()V\nPLcom/google/gson/internal/bind/TreeTypeAdapter$SingleTypeFactory;-><init>(Ljava/lang/Object;Lcom/google/gson/reflect/TypeToken;ZLjava/lang/Class;)V\nPLcom/google/gson/internal/bind/TreeTypeAdapter$SingleTypeFactory;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nPLcom/google/gson/internal/bind/TreeTypeAdapter;-><init>(Lcom/google/gson/JsonSerializer;Lcom/google/gson/JsonDeserializer;Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;Lcom/google/gson/TypeAdapterFactory;)V\nPLcom/google/gson/internal/bind/TypeAdapters$26;-><init>(I)V\nPLcom/google/gson/internal/bind/TypeAdapters$26;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nPLcom/google/gson/internal/bind/TypeAdapters$32;-><init>(Ljava/lang/Object;Lcom/google/gson/TypeAdapter;I)V\nPLcom/google/gson/internal/bind/TypeAdapters$32;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nPLcom/google/gson/internal/bind/TypeAdapters$33;-><init>(Ljava/lang/Class;Ljava/lang/Class;Lcom/google/gson/TypeAdapter;I)V\nPLcom/google/gson/internal/bind/TypeAdapters$33;->create(Lcom/google/gson/Gson;Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/TypeAdapter;\nPLcom/google/gson/internal/bind/TypeAdapters;-><clinit>()V\nPLcom/google/gson/internal/bind/TypeAdapters;->newFactory(Ljava/lang/Class;Lcom/google/gson/TypeAdapter;)Lcom/google/gson/TypeAdapterFactory;\nPLcom/google/gson/internal/bind/TypeAdapters;->newFactory(Ljava/lang/Class;Ljava/lang/Class;Lcom/google/gson/TypeAdapter;)Lcom/google/gson/TypeAdapterFactory;\nPLcom/google/gson/internal/reflect/PreJava9ReflectionAccessor;-><init>()V\nPLcom/google/gson/internal/reflect/PreJava9ReflectionAccessor;->makeAccessible(Ljava/lang/reflect/AccessibleObject;)V\nPLcom/google/gson/internal/reflect/ReflectionAccessor;-><clinit>()V\nPLcom/google/gson/internal/reflect/ReflectionAccessor;-><init>()V\nPLcom/google/gson/reflect/TypeToken;->hashCode()I\nPLcom/google/gson/stream/JsonReader;-><clinit>()V\nPLcom/google/gson/stream/JsonReader;-><init>(Ljava/io/Reader;)V\nPLcom/google/gson/stream/JsonWriter;-><clinit>()V\nPLcom/google/gson/stream/JsonWriter;-><init>(Ljava/io/Writer;)V\nPLcom/google/gson/stream/JsonWriter;->beginArray()Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/stream/JsonWriter;->beginObject()Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/stream/JsonWriter;->close(IIC)Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/stream/JsonWriter;->endArray()Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/stream/JsonWriter;->endObject()Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/stream/JsonWriter;->name(Ljava/lang/String;)Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/stream/JsonWriter;->newline()V\nPLcom/google/gson/stream/JsonWriter;->push(I)V\nPLcom/google/gson/stream/JsonWriter;->replaceTop(I)V\nPLcom/google/gson/stream/JsonWriter;->value(Ljava/lang/Number;)Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/stream/JsonWriter;->value(Ljava/lang/String;)Lcom/google/gson/stream/JsonWriter;\nPLcom/google/gson/stream/JsonWriter;->writeDeferredName()V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCBuilder;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCImpl;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Landroid/app/Activity;)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl$SwitchingProvider;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;I)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl$SwitchingProvider;->get()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/common/collect/Maps;)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$FragmentCImpl$SwitchingProvider;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCImpl;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$FragmentCImpl;I)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$FragmentCImpl$SwitchingProvider;->get()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$FragmentCImpl;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityCImpl;Lio/grpc/Metadata$1;Landroidx/fragment/app/Fragment;Lcom/google/common/collect/Maps;)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$SwitchingProvider;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;I)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;-><init>(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;I)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->get()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;->access$4600(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;)Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;->access$6800(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC$ViewModelCImpl;)Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegate;\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;-><init>(Lio/grpc/Metadata$2;Landroidx/appcompat/view/ActionBarPolicy;Lcom/google/samples/apps/iosched/di/SignInModule;Lio/grpc/Metadata$2;Lcom/google/samples/apps/iosched/di/SignInModule;Lcom/google/samples/apps/iosched/di/SignInModule;Lio/grpc/Metadata$2;Lcom/google/common/collect/Maps;)V\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;->access$1400(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;)Z\nPLcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;->access$4400(Lcom/google/samples/apps/iosched/DaggerMainApplication_HiltComponents_SingletonC;)Z\nPLcom/google/samples/apps/iosched/DataBinderMapperImpl;-><clinit>()V\nPLcom/google/samples/apps/iosched/DataBinderMapperImpl;-><init>()V\nPLcom/google/samples/apps/iosched/DataBinderMapperImpl;->collectDependencies()Ljava/util/List;\nPLcom/google/samples/apps/iosched/Hilt_MainApplication;-><init>()V\nPLcom/google/samples/apps/iosched/Hilt_MainApplication;->generatedComponent()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/Hilt_MainApplication;->onCreate()V\nPLcom/google/samples/apps/iosched/MainApplication;-><init>()V\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBinding;-><init>(Ljava/lang/Object;Landroid/view/View;ILcom/google/android/material/appbar/AppBarLayout;Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroidx/recyclerview/widget/RecyclerView;Landroid/widget/TextView;Landroid/widget/ProgressBar;Landroidx/recyclerview/widget/RecyclerView;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;Lcom/google/samples/apps/iosched/widget/CustomSwipeRefreshLayout;Landroidx/appcompat/widget/Toolbar;)V\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;-><clinit>()V\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;-><init>(Landroidx/databinding/DataBindingComponent;Landroid/view/View;)V\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->executeBindings()V\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->hasPendingBindings()Z\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->invalidateAll()V\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->onFieldChange(ILjava/lang/Object;I)Z\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->setIsEmpty(Z)V\nPLcom/google/samples/apps/iosched/databinding/FragmentScheduleBindingImpl;->setViewModel(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;)V\nPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBinding;-><init>(Ljava/lang/Object;Landroid/view/View;I)V\nPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->hasPendingBindings()Z\nPLcom/google/samples/apps/iosched/databinding/ItemInlineTagBindingImpl;->invalidateAll()V\nPLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBinding;-><init>(Ljava/lang/Object;Landroid/view/View;ILandroid/widget/CheckedTextView;)V\nPLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;-><init>(Landroidx/databinding/DataBindingComponent;Landroid/view/View;)V\nPLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->executeBindings()V\nPLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->hasPendingBindings()Z\nPLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->invalidateAll()V\nPLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->setIndicator(Lcom/google/samples/apps/iosched/ui/schedule/DayIndicator;)V\nPLcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBindingImpl;->setViewModel(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;)V\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBinding;-><init>(Ljava/lang/Object;Landroid/view/View;ILcom/google/android/material/internal/CheckableImageButton;Landroidx/constraintlayout/widget/Guideline;Landroidx/constraintlayout/widget/Guideline;Landroid/widget/TextView;Landroid/widget/ImageView;Lcom/google/samples/apps/iosched/ui/reservation/ReservationTextView;Lcom/google/samples/apps/iosched/widget/NoTouchRecyclerView;Landroidx/constraintlayout/widget/Barrier;Landroid/widget/TextView;)V\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBinding;->inflate(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Z)Lcom/google/samples/apps/iosched/databinding/ItemSessionBinding;\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;-><clinit>()V\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->invalidateAll()V\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->onFieldChange(ILjava/lang/Object;I)Z\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setSessionClickListener(Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionClickListener;)V\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setSessionStarClickListener(Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickListener;)V\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setShowReservations(Lkotlinx/coroutines/flow/StateFlow;)V\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setShowTime(Ljava/lang/Boolean;)V\nPLcom/google/samples/apps/iosched/databinding/ItemSessionBindingImpl;->setTimeZoneId(Lkotlinx/coroutines/flow/StateFlow;)V\nPLcom/google/samples/apps/iosched/di/PreferencesStorageModule;-><clinit>()V\nPLcom/google/samples/apps/iosched/di/PreferencesStorageModule;-><init>()V\nPLcom/google/samples/apps/iosched/di/SignInModule;-><init>(I)V\nPLcom/google/samples/apps/iosched/di/SignInModule;-><init>(Lkotlin/LazyKt__LazyKt;I)V\nPLcom/google/samples/apps/iosched/model/Codelab;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/util/List;)V\nPLcom/google/samples/apps/iosched/model/Codelab;->getDescription()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/Codelab;->getId()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/Codelab;->getTitle()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/ConferenceData;-><init>(Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;I)V\nPLcom/google/samples/apps/iosched/model/ConferenceData;->copy$default(Lcom/google/samples/apps/iosched/model/ConferenceData;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;II)Lcom/google/samples/apps/iosched/model/ConferenceData;\nPLcom/google/samples/apps/iosched/model/ConferenceData;->getCodelabs()Ljava/util/List;\nPLcom/google/samples/apps/iosched/model/ConferenceData;->getRooms()Ljava/util/List;\nPLcom/google/samples/apps/iosched/model/ConferenceData;->getSessions()Ljava/util/List;\nPLcom/google/samples/apps/iosched/model/ConferenceData;->getSpeakers()Ljava/util/List;\nPLcom/google/samples/apps/iosched/model/ConferenceData;->getTags()Ljava/util/List;\nPLcom/google/samples/apps/iosched/model/ConferenceDay;-><init>(Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZonedDateTime;)V\nPLcom/google/samples/apps/iosched/model/ConferenceDay;->getEnd()Lorg/threeten/bp/ZonedDateTime;\nPLcom/google/samples/apps/iosched/model/ConferenceDay;->hashCode()I\nPLcom/google/samples/apps/iosched/model/Room;-><init>(Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/samples/apps/iosched/model/Session$type$2;->invoke()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/model/Session;->copy$default(Lcom/google/samples/apps/iosched/model/Session;Ljava/lang/String;Lorg/threeten/bp/ZonedDateTime;Lorg/threeten/bp/ZonedDateTime;Ljava/lang/String;Ljava/lang/String;Lcom/google/samples/apps/iosched/model/Room;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/lang/String;Ljava/util/Set;I)Lcom/google/samples/apps/iosched/model/Session;\nPLcom/google/samples/apps/iosched/model/Session;->equals(Ljava/lang/Object;)Z\nPLcom/google/samples/apps/iosched/model/Session;->getDescription()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/Session;->getEndTime()Lorg/threeten/bp/ZonedDateTime;\nPLcom/google/samples/apps/iosched/model/Session;->getSpeakers()Ljava/util/Set;\nPLcom/google/samples/apps/iosched/model/SessionType$Companion;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLcom/google/samples/apps/iosched/model/SessionType;-><clinit>()V\nPLcom/google/samples/apps/iosched/model/SessionType;-><init>(Ljava/lang/String;ILjava/lang/String;)V\nPLcom/google/samples/apps/iosched/model/SessionType;->access$getReservableTypes$cp()Ljava/util/List;\nPLcom/google/samples/apps/iosched/model/Speaker;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/samples/apps/iosched/model/Speaker;->copy$default(Lcom/google/samples/apps/iosched/model/Speaker;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Lcom/google/samples/apps/iosched/model/Speaker;\nPLcom/google/samples/apps/iosched/model/Speaker;->getBiography()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/Speaker;->getId()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/Speaker;->getName()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/Tag$Companion;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLcom/google/samples/apps/iosched/model/Tag;-><clinit>()V\nPLcom/google/samples/apps/iosched/model/Tag;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;ILjava/lang/Integer;)V\nPLcom/google/samples/apps/iosched/model/Tag;->getColor()I\nPLcom/google/samples/apps/iosched/model/Tag;->getDisplayName()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/Theme;-><clinit>()V\nPLcom/google/samples/apps/iosched/model/Theme;-><init>(Ljava/lang/String;ILjava/lang/String;)V\nPLcom/google/samples/apps/iosched/model/Theme;->getStorageKey()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/Theme;->values()[Lcom/google/samples/apps/iosched/model/Theme;\nPLcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult$ReservationRequestStatus$Companion;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult$ReservationRequestStatus;-><clinit>()V\nPLcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult$ReservationRequestStatus;-><init>(Ljava/lang/String;I)V\nPLcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult;-><init>(Lcom/google/samples/apps/iosched/model/reservations/ReservationRequestResult$ReservationRequestStatus;Ljava/lang/String;J)V\nPLcom/google/samples/apps/iosched/model/schedule/PinnedSessionsSchedule;-><init>(Ljava/util/List;)V\nPLcom/google/samples/apps/iosched/model/userdata/UserEvent$ReservationStatus$Companion;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLcom/google/samples/apps/iosched/model/userdata/UserEvent$ReservationStatus;-><clinit>()V\nPLcom/google/samples/apps/iosched/model/userdata/UserEvent$ReservationStatus;-><init>(Ljava/lang/String;I)V\nPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->getId()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->isStarredOrReserved()Z\nPLcom/google/samples/apps/iosched/model/userdata/UserEvent;->isWaitlisted()Z\nPLcom/google/samples/apps/iosched/model/userdata/UserSession;->equals(Ljava/lang/Object;)Z\nPLcom/google/samples/apps/iosched/shared/data/BootstrapConferenceDataSource;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/data/BootstrapConferenceDataSource;-><init>()V\nPLcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;-><init>(Lcom/google/samples/apps/iosched/shared/data/ConferenceDataSource;Lcom/google/samples/apps/iosched/shared/data/ConferenceDataSource;Lcom/google/samples/apps/iosched/shared/data/db/AppDatabase;)V\nPLcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;->getOfflineConferenceData()Lcom/google/samples/apps/iosched/model/ConferenceData;\nPLcom/google/samples/apps/iosched/shared/data/FakeAppConfigDataSource;-><init>()V\nPLcom/google/samples/apps/iosched/shared/data/FakeConferenceDataSource;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/data/FakeConferenceDataSource;-><init>()V\nPLcom/google/samples/apps/iosched/shared/data/FakeConferenceDataSource;->getOfflineConferenceData()Lcom/google/samples/apps/iosched/model/ConferenceData;\nPLcom/google/samples/apps/iosched/shared/data/TempConferenceData;->getRooms()Ljava/util/List;\nPLcom/google/samples/apps/iosched/shared/data/TempConferenceData;->getSessions()Ljava/util/List;\nPLcom/google/samples/apps/iosched/shared/data/TempConferenceData;->getSpeakers()Ljava/util/Map;\nPLcom/google/samples/apps/iosched/shared/data/TempConferenceData;->getTags()Ljava/util/List;\nPLcom/google/samples/apps/iosched/shared/data/ar/FakeArDebugFlagEndpoint;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/data/ar/FakeArDebugFlagEndpoint;-><init>()V\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase;-><init>()V\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl$1;-><init>(Lcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;I)V\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;-><init>()V\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->codelabFtsDao()Landroidx/lifecycle/ViewModelProvider;\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->createInvalidationTracker()Landroidx/room/InvalidationTracker;\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->createOpenHelper(Landroidx/room/DatabaseConfiguration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper;\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->getAutoMigrations(Ljava/util/Map;)Ljava/util/List;\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->getRequiredAutoMigrationSpecs()Ljava/util/Set;\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->getRequiredTypeConverters()Ljava/util/Map;\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->sessionFtsDao()Landroidx/compose/runtime/SnapshotThreadLocal;\nPLcom/google/samples/apps/iosched/shared/data/db/AppDatabase_Impl;->speakerFtsDao()Lcom/google/firebase/messaging/zzj;\nPLcom/google/samples/apps/iosched/shared/data/db/CodelabFtsDao_Impl$1;-><init>(Ljava/lang/Object;Landroidx/room/RoomDatabase;I)V\nPLcom/google/samples/apps/iosched/shared/data/db/CodelabFtsEntity;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/samples/apps/iosched/shared/data/db/SpeakerFtsEntity;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthStateUserDataSource;-><init>(ZZLjava/lang/String;Landroid/content/Context;Lcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater;)V\nPLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;-><init>(Landroid/content/Context;ZZLjava/lang/String;I)V\nPLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->getDisplayName()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->getPhotoUrl()Landroid/net/Uri;\nPLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->getUid()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingAuthenticatedUserInfo;->isSignedIn()Z\nPLcom/google/samples/apps/iosched/shared/data/login/datasources/StagingRegisteredUserDataSource;-><init>(Z)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$PreferencesKeys;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$areScheduleUiHintsShown$$inlined$map$1$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$1$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$2$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$3$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$4$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$5$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$6$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$8$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage$special$$inlined$map$9$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/prefs/DataStorePreferenceStorage;-><init>(Landroidx/datastore/core/DataStore;)V\nPLcom/google/samples/apps/iosched/shared/data/session/DefaultSessionRepository;-><init>(Lcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;)V\nPLcom/google/samples/apps/iosched/shared/data/session/DefaultSessionRepository;->getSessions()Ljava/util/List;\nPLcom/google/samples/apps/iosched/shared/data/session/json/CodelabTemp;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/util/List;I)V\nPLcom/google/samples/apps/iosched/shared/data/session/json/TagDeserializer;-><init>(I)V\nPLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;-><init>(Lcom/google/samples/apps/iosched/shared/data/signin/AuthenticatedUserInfo;Ljava/lang/Boolean;)V\nPLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->getDisplayName()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->getPhotoUrl()Landroid/net/Uri;\nPLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->getUid()Ljava/lang/String;\nPLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->isRegistered()Z\nPLcom/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo;->isSignedIn()Z\nPLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository$getObservableUserEvents$1$invokeSuspend$$inlined$map$1$2$1;-><init>(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository$getObservableUserEvents$1;-><init>(Ljava/lang/String;Lcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository$getObservableUserEvents$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository$getObservableUserEvents$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;-><init>(Lcom/google/samples/apps/iosched/shared/data/userevent/UserEventDataSource;Lcom/google/samples/apps/iosched/shared/data/session/DefaultSessionRepository;)V\nPLcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;->getObservableUserEvents(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource$getObservableUserEvents$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource$getObservableUserEvents$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource$getObservableUserEvents$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource;-><init>()V\nPLcom/google/samples/apps/iosched/shared/data/userevent/ObservableUserEvents;-><init>(Ljava/util/List;Lcom/google/samples/apps/iosched/model/Session;)V\nPLcom/google/samples/apps/iosched/shared/data/userevent/ObservableUserEvents;-><init>(Ljava/util/List;Lcom/google/samples/apps/iosched/model/Session;I)V\nPLcom/google/samples/apps/iosched/shared/data/userevent/UserEventsResult;-><init>(Ljava/util/List;I)V\nPLcom/google/samples/apps/iosched/shared/domain/FlowUseCase$invoke$1;-><init>(Lcom/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/FlowUseCase$invoke$1;-><init>(Lkotlin/coroutines/Continuation;I)V\nPLcom/google/samples/apps/iosched/shared/domain/FlowUseCase$invoke$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/FlowUseCase$invoke$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$1;-><init>(Lcom/google/samples/apps/iosched/shared/domain/UseCase;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$2;-><init>(Lcom/google/samples/apps/iosched/shared/domain/UseCase;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/shared/domain/UseCase$invoke$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/UseCase;-><init>(Lkotlinx/coroutines/CoroutineDispatcher;I)V\nPLcom/google/samples/apps/iosched/shared/domain/UseCase;->invoke(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/shared/domain/UseCase;->invoke(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/ar/ArDebugFlagEndpoint;Lkotlinx/coroutines/CoroutineDispatcher;)V\nPLcom/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase;->execute(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$authStateChanges$1;-><init>(Lcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$authStateChanges$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$authStateChanges$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$userSignedIn$2;-><init>(Lcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;Ljava/lang/String;Lcom/google/samples/apps/iosched/shared/data/signin/AuthenticatedUserInfo;Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$userSignedIn$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase$userSignedIn$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/signin/datasources/RegisteredUserDataSource;Lcom/google/samples/apps/iosched/shared/data/signin/datasources/AuthStateUserDataSource;Lcom/google/samples/apps/iosched/shared/fcm/StagingTopicSubscriber;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineDispatcher;)V\nPLcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;->execute(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;Lkotlinx/coroutines/CoroutineDispatcher;)V\nPLcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage;Lkotlinx/coroutines/CoroutineDispatcher;I)V\nPLcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;->execute(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;->execute(Lkotlin/Unit;)Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase$execute$$inlined$map$1$2$1;-><init>(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;Lcom/google/gson/Gson;Lkotlinx/coroutines/CoroutineDispatcher;)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase;->execute(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadScheduleUserSessionsParameters;-><init>(Ljava/lang/String;Lorg/threeten/bp/ZonedDateTime;I)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadScheduleUserSessionsResult;-><init>(Ljava/util/List;Lcom/google/samples/apps/iosched/model/Session;IILandroidx/compose/runtime/SnapshotThreadLocal;)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadScheduleUserSessionsUseCase$execute$$inlined$map$1$2$1;-><init>(Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository;Lkotlinx/coroutines/CoroutineDispatcher;I)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;->execute(Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;->findFirstUnfinishedSession(Ljava/util/List;Lorg/threeten/bp/ZonedDateTime;)I\nPLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1$events$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1$events$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1;-><init>(Lcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater;Ljava/lang/String;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater$updateAll$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater;-><init>(Lcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;Lcom/google/samples/apps/iosched/shared/data/userevent/SessionAndUserEventRepository;Lkotlinx/coroutines/CoroutineScope;)V\nPLcom/google/samples/apps/iosched/shared/domain/sessions/StarReserveNotificationAlarmUpdater;-><init>(Lcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;)V\nPLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase$execute$1;-><init>(Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase$execute$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage;Lkotlinx/coroutines/CoroutineDispatcher;I)V\nPLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;->execute(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;->execute(Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;->execute(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/shared/domain/settings/ObserveThemeModeUseCase$execute$$inlined$map$1$2$1;-><init>(Landroidx/compose/material/SwipeableState$special$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/shared/domain/speakers/LoadSpeakerUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/ConferenceDataRepository;Lkotlinx/coroutines/CoroutineDispatcher;I)V\nPLcom/google/samples/apps/iosched/shared/domain/users/StarEventAndNotifyUseCase;-><init>(Lcom/google/samples/apps/iosched/shared/data/userevent/SessionAndUserEventRepository;Lcom/google/samples/apps/iosched/shared/domain/sessions/StarReserveNotificationAlarmUpdater;Lkotlinx/coroutines/CoroutineDispatcher;)V\nPLcom/google/samples/apps/iosched/shared/fcm/StagingTopicSubscriber;-><init>()V\nPLcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;-><init>(Landroid/content/Context;)V\nPLcom/google/samples/apps/iosched/shared/notifications/SessionAlarmManager;->setAlarmForSession(Lcom/google/samples/apps/iosched/model/userdata/UserSession;)V\nPLcom/google/samples/apps/iosched/shared/result/Result$Loading;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/result/Result$Loading;-><init>()V\nPLcom/google/samples/apps/iosched/shared/result/Result$Success;-><init>(Ljava/lang/Object;)V\nPLcom/google/samples/apps/iosched/shared/result/Result$Success;->equals(Ljava/lang/Object;)Z\nPLcom/google/samples/apps/iosched/shared/result/Result;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLcom/google/samples/apps/iosched/shared/util/TimeUtils;-><clinit>()V\nPLcom/google/samples/apps/iosched/shared/util/TimeUtils;-><init>()V\nPLcom/google/samples/apps/iosched/shared/util/TimeUtils;->getShortLabelResForDay(Lcom/google/samples/apps/iosched/model/ConferenceDay;Z)I\nPLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment$$ExternalSyntheticLambda0;-><clinit>()V\nPLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment$$ExternalSyntheticLambda0;-><init>()V\nPLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment$$ExternalSyntheticLambda0;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\nPLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment;-><init>()V\nPLcom/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V\nPLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;-><init>(I)V\nPLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->componentManager()Ldagger/hilt/android/internal/managers/ActivityComponentManager;\nPLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->createComponentManager()Ldagger/hilt/android/internal/managers/ActivityComponentManager;\nPLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->generatedComponent()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory;\nPLcom/google/samples/apps/iosched/ui/Hilt_MainActivity;->inject()V\nPLcom/google/samples/apps/iosched/ui/MainActivity$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Object;I)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$$ExternalSyntheticLambda1;-><clinit>()V\nPLcom/google/samples/apps/iosched/ui/MainActivity$$ExternalSyntheticLambda1;-><init>(I)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$1;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$1;->onDestinationChanged(Landroidx/navigation/NavHostController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1$1;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;I)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$2;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3$1;-><clinit>()V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3$1;-><init>(I)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$4;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$5;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$5;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivity;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/MainActivity$onCreate$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity$special$$inlined$viewModels$default$1;-><init>(Landroidx/activity/ComponentActivity;I)V\nPLcom/google/samples/apps/iosched/ui/MainActivity$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory;\nPLcom/google/samples/apps/iosched/ui/MainActivity$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelStore;\nPLcom/google/samples/apps/iosched/ui/MainActivity$special$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivity;-><clinit>()V\nPLcom/google/samples/apps/iosched/ui/MainActivity;-><init>()V\nPLcom/google/samples/apps/iosched/ui/MainActivity;->configureNavMenu(Landroid/view/Menu;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity;->getViewModel()Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;\nPLcom/google/samples/apps/iosched/ui/MainActivity;->navigateTo(I)V\nPLcom/google/samples/apps/iosched/ui/MainActivity;->onCreate(Landroid/os/Bundle;)V\nPLcom/google/samples/apps/iosched/ui/MainActivity;->onUserInteraction()V\nPLcom/google/samples/apps/iosched/ui/MainActivityViewModel$arCoreAvailability$1;-><init>(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/MainActivityViewModel$arCoreAvailability$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivityViewModel$arCoreAvailability$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/MainActivityViewModel;-><init>(Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegate;Lcom/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase;Lcom/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase;Landroid/content/Context;)V\nPLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->getCurrentTheme()Lcom/google/samples/apps/iosched/model/Theme;\nPLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->getCurrentUserImageUri()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->getTheme()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/MainActivityViewModel;->getUserInfo()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/MainNavigationFragment;-><init>()V\nPLcom/google/samples/apps/iosched/ui/MainNavigationFragment;->onAttach(Landroid/content/Context;)V\nPLcom/google/samples/apps/iosched/ui/MainNavigationFragment;->onDetach()V\nPLcom/google/samples/apps/iosched/ui/MainNavigationFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$feed$1;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$feed$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$feed$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$sessionContainer$1;-><init>(Landroidx/lifecycle/ViewModel;Lkotlin/coroutines/Continuation;I)V\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$sessionContainer$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$sessionContainer$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$special$$inlined$map$2;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel$special$$inlined$map$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel_Factory;->provideContext(Landroidx/appcompat/view/ActionBarPolicy;)Landroid/content/Context;\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel_Factory;->providesIoDispatcher()Lkotlinx/coroutines/CoroutineDispatcher;\nPLcom/google/samples/apps/iosched/ui/feed/FeedViewModel_Factory;->providesMainDispatcher()Lkotlinx/coroutines/CoroutineDispatcher;\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;-><init>(I)V\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->componentManager$com$google$samples$apps$iosched$ui$schedule$Hilt_ScheduleFragment()Ldagger/hilt/android/internal/managers/FragmentComponentManager;\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->componentManager()Ldagger/hilt/android/internal/managers/FragmentComponentManager;\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->createComponentManager()Ldagger/hilt/android/internal/managers/FragmentComponentManager;\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->generatedComponent()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->getContext()Landroid/content/Context;\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory;\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->initializeComponentContext()V\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->inject()V\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->onAttach(Landroid/app/Activity;)V\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->onAttach(Landroid/content/Context;)V\nPLcom/google/samples/apps/iosched/ui/info/Hilt_FaqFragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;\nPLcom/google/samples/apps/iosched/ui/map/MapFragment$$ExternalSyntheticLambda2;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLcom/google/samples/apps/iosched/ui/map/MapFragment$$ExternalSyntheticLambda2;->run()V\nPLcom/google/samples/apps/iosched/ui/map/MapFragment$special$$inlined$viewModels$default$3;-><init>(Lkotlin/jvm/functions/Function0;Landroidx/fragment/app/Fragment;I)V\nPLcom/google/samples/apps/iosched/ui/map/MapFragment$special$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory;\nPLcom/google/samples/apps/iosched/ui/map/MapFragment$special$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/map/MapViewModel$1$1;-><init>(Ljava/lang/Object;I)V\nPLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;-><init>(Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Landroidx/fragment/app/Fragment;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;)V\nPLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1;-><init>(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/Lifecycle$State;Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Landroidx/fragment/app/Fragment;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;)V\nPLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensionsKt$setupSnackbarManager$$inlined$launchAndRepeatWithViewLifecycle$default$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;-><init>(Lcom/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage;Lkotlinx/coroutines/CoroutineScope;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;)V\nPLcom/google/samples/apps/iosched/ui/reservation/ReservationViewState;-><clinit>()V\nPLcom/google/samples/apps/iosched/ui/reservation/ReservationViewState;-><init>(Ljava/lang/String;I[III)V\nPLcom/google/samples/apps/iosched/ui/schedule/DayIndicator;-><init>(Lcom/google/samples/apps/iosched/model/ConferenceDay;ZZI)V\nPLcom/google/samples/apps/iosched/ui/schedule/DayIndicator;->equals(Ljava/lang/Object;)Z\nPLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Landroidx/lifecycle/LifecycleOwner;)V\nPLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V\nPLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder;\nPLcom/google/samples/apps/iosched/ui/schedule/DayIndicatorViewHolder;-><init>(Lcom/google/samples/apps/iosched/databinding/ItemScheduleDayIndicatorBinding;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Landroidx/lifecycle/LifecycleOwner;)V\nPLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;-><init>()V\nPLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->generatedComponent()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->initializeComponentContext()V\nPLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->inject()V\nPLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->onAttach(Landroid/app/Activity;)V\nPLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->onAttach(Landroid/content/Context;)V\nPLcom/google/samples/apps/iosched/ui/schedule/Hilt_ScheduleTwoPaneFragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;\nPLcom/google/samples/apps/iosched/ui/schedule/IndicatorDiff;-><clinit>()V\nPLcom/google/samples/apps/iosched/ui/schedule/IndicatorDiff;-><init>()V\nPLcom/google/samples/apps/iosched/ui/schedule/IndicatorDiff;->areContentsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z\nPLcom/google/samples/apps/iosched/ui/schedule/IndicatorDiff;->areItemsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$doOnNextLayout$1;-><init>()V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$doOnNextLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;-><init>(Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;-><init>(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/Lifecycle$State;Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1$1;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;I)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$2;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$3;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$4;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$5;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$5;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment$onViewCreated$5$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;-><init>()V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->getScheduleViewModel()Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleFragment;->rebuildDayIndicators()V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$BackPressHandler;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$BackPressHandler;->onDestinationChanged(Landroidx/navigation/NavHostController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$BackPressHandler;->syncEnabledState()V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;-><init>(Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;-><init>(Landroidx/fragment/app/Fragment;Landroidx/lifecycle/Lifecycle$State;Lkotlin/coroutines/Continuation;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$$inlined$launchAndRepeatWithViewLifecycle$default$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$1$1;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;I)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$1;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$2;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$3;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment$onViewCreated$4$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;-><init>()V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;->access$getScheduleTwoPaneViewModel(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;)Lcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneViewModel;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneViewModel;-><init>(Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegate;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneViewModel;->getNavigateToSignInDialogEvents()Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleUiData;-><init>(Ljava/util/List;Lorg/threeten/bp/ZoneId;Landroidx/compose/runtime/SnapshotThreadLocal;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleUiData;-><init>(Ljava/util/List;Lorg/threeten/bp/ZoneId;Landroidx/compose/runtime/SnapshotThreadLocal;I)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleUiData;->equals(Ljava/lang/Object;)Z\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$1;-><init>(Lcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$2;-><init>(Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$isConferenceTimeZone$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$isConferenceTimeZone$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$isLoading$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$isLoading$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadDataSignal$1;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadDataSignal$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadDataSignal$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadSessionsResult$2;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadSessionsResult$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$loadSessionsResult$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$scrollToEvent$1;-><init>(Lcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$timeZoneId$1;-><init>(Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$timeZoneId$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel$timeZoneId$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;-><init>(Lcom/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase;Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lcom/google/samples/apps/iosched/shared/fcm/StagingTopicSubscriber;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lcom/google/samples/apps/iosched/shared/domain/speakers/LoadSpeakerUseCase;Lcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;)V\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;->getShowReservations()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;->getSignInNavigationActions()Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/ui/schedule/ScheduleViewModel;->getUserId()Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;-><init>(Landroidx/fragment/app/Fragment;I)V\nPLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment;\nPLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory;\nPLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelStore;\nPLcom/google/samples/apps/iosched/ui/search/SearchFragment$special$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/sessioncommon/DefaultOnSessionStarClickDelegate;-><init>(Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/shared/domain/users/StarEventAndNotifyUseCase;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Lcom/google/samples/apps/iosched/shared/analytics/AnalyticsHelper;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineDispatcher;)V\nPLcom/google/samples/apps/iosched/ui/sessioncommon/DefaultOnSessionStarClickDelegate;->getNavigateToSignInDialogEvents()Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionDiff;-><clinit>()V\nPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionDiff;-><init>()V\nPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionDiff;->areContentsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z\nPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionViewHolder;-><init>(Lcom/google/samples/apps/iosched/databinding/ItemSessionBinding;)V\nPLcom/google/samples/apps/iosched/ui/sessioncommon/SessionsAdapter;-><init>(Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool;Lkotlinx/coroutines/flow/StateFlow;Lkotlinx/coroutines/flow/StateFlow;Landroidx/lifecycle/LifecycleOwner;Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionClickListener;Lcom/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickListener;)V\nPLcom/google/samples/apps/iosched/ui/sessioncommon/TagAdapter;-><init>()V\nPLcom/google/samples/apps/iosched/ui/sessioncommon/TagViewHolder;-><init>(Lcom/google/samples/apps/iosched/databinding/ItemInlineTagBinding;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1$emit$1;-><init>(Lcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1;-><init>(Lcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1$1;->emit(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1;-><init>(Lcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$1$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$2$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$3$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$4$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$5$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$special$$inlined$map$6$2$1;-><init>(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$userId$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate$userId$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;-><init>(Lcom/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;Lkotlinx/coroutines/CoroutineDispatcher;Lkotlinx/coroutines/CoroutineDispatcher;ZLkotlinx/coroutines/CoroutineScope;)V\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getCurrentUserImageUri()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getShowReservations()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getSignInNavigationActions()Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getUserId()Lkotlinx/coroutines/flow/Flow;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->getUserInfo()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->isUserRegistered()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegate;->isUserSignedIn()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroid/view/MenuItem;Landroidx/appcompat/widget/Toolbar;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2;-><init>(Landroidx/lifecycle/LifecycleOwner;Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroid/view/MenuItem;Landroidx/appcompat/widget/Toolbar;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3$1;-><init>(Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroidx/appcompat/widget/Toolbar;Lcom/bumptech/glide/request/target/BaseTarget;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3;-><init>(Landroidx/lifecycle/LifecycleOwner;Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroidx/appcompat/widget/Toolbar;Lcom/bumptech/glide/request/target/BaseTarget;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/signin/SignInViewExtensionsKt$setupProfileMenuItem$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;-><init>(Lkotlinx/coroutines/flow/FlowCollector;I)V\nPLcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$currentTheme$1;-><init>(Lcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$currentTheme$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$currentTheme$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$special$$inlined$map$1$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$special$$inlined$map$1;-><init>(Lkotlinx/coroutines/flow/Flow;I)V\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl$special$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl;-><init>(Lkotlinx/coroutines/CoroutineScope;Lcom/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase;Lcom/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase;)V\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl;->getCurrentTheme()Lcom/google/samples/apps/iosched/model/Theme;\nPLcom/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateImpl;->getTheme()Lkotlinx/coroutines/flow/StateFlow;\nPLcom/google/samples/apps/iosched/util/CrashlyticsTree;-><init>()V\nPLcom/google/samples/apps/iosched/util/CrashlyticsTree;->log(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V\nPLcom/google/samples/apps/iosched/util/ExtensionsKt$$ExternalSyntheticLambda0;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V\nPLcom/google/samples/apps/iosched/util/ExtensionsKt$$ExternalSyntheticLambda0;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;\nPLcom/google/samples/apps/iosched/util/ExtensionsKt$WhenMappings;-><clinit>()V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1$1;-><init>(Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;I)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1$1;->emit(Z)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1;-><init>(Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$2;-><init>(Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$3;-><init>(Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$4;-><init>(Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$1$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$2$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$3$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$4$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$5$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$6$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper$logSendUsageStatsFlagChanges$$inlined$map$7$2$1;-><init>(Lcom/google/samples/apps/iosched/ui/speaker/SpeakerViewModel$speakerUserSessions$1$1$1;Lkotlin/coroutines/Continuation;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;-><init>(Lkotlinx/coroutines/CoroutineScope;Lcom/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate;Lcom/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;->access$logSendUsageStatsFlagChanges(Lcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;->logUiEvent(Ljava/lang/String;Ljava/lang/String;)V\nPLcom/google/samples/apps/iosched/util/FirebaseAnalyticsHelper;->sendScreenView(Ljava/lang/String;Landroid/app/Activity;)V\nPLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;-><init>(ILandroid/view/MenuItem;)V\nPLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->getSize(Lcom/bumptech/glide/request/target/SizeReadyCallback;)V\nPLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->onLoadCleared(Landroid/graphics/drawable/Drawable;)V\nPLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->onLoadStarted(Landroid/graphics/drawable/Drawable;)V\nPLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->onResourceReady(Ljava/lang/Object;Lcom/bumptech/glide/request/transition/Transition;)V\nPLcom/google/samples/apps/iosched/util/GlideTargetsKt$asGlideTarget$1;->removeCallback(Lcom/bumptech/glide/request/target/SizeReadyCallback;)V\nPLcom/google/samples/apps/iosched/util/HeightTopWindowInsetsListener;-><clinit>()V\nPLcom/google/samples/apps/iosched/util/HeightTopWindowInsetsListener;-><init>()V\nPLcom/google/samples/apps/iosched/util/HeightTopWindowInsetsListener;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\nPLcom/google/samples/apps/iosched/util/NoopWindowInsetsListener;-><clinit>()V\nPLcom/google/samples/apps/iosched/util/NoopWindowInsetsListener;-><init>()V\nPLcom/google/samples/apps/iosched/util/NoopWindowInsetsListener;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;\nPLcom/google/samples/apps/iosched/util/SharingStartedViewsKt;-><clinit>()V\nPLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->onApplyWindowInsets(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;\nPLcom/google/samples/apps/iosched/util/StatusBarScrimBehavior;->onDependentViewChanged(Landroidx/coordinatorlayout/widget/CoordinatorLayout;Landroid/view/View;Landroid/view/View;)Z\nPLcom/google/samples/apps/iosched/util/ViewPaddingState;-><init>(IIIIII)V\nPLcom/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer;-><init>()V\nPLcom/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer;->create(Landroid/content/Context;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer;->dependencies()Ljava/util/List;\nPLcom/google/samples/apps/iosched/util/initializers/StrictModeInitializer;-><init>()V\nPLcom/google/samples/apps/iosched/util/initializers/StrictModeInitializer;->create(Landroid/content/Context;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/initializers/StrictModeInitializer;->dependencies()Ljava/util/List;\nPLcom/google/samples/apps/iosched/util/initializers/TimberInitializer;-><init>()V\nPLcom/google/samples/apps/iosched/util/initializers/TimberInitializer;->create(Landroid/content/Context;)Ljava/lang/Object;\nPLcom/google/samples/apps/iosched/util/initializers/TimberInitializer;->dependencies()Ljava/util/List;\nPLcom/google/samples/apps/iosched/widget/BubbleDecoration$$ExternalSyntheticLambda0;-><init>(Lcom/google/samples/apps/iosched/widget/BubbleDecoration;Landroid/animation/ValueAnimator;Landroidx/recyclerview/widget/RecyclerView;)V\nPLcom/google/samples/apps/iosched/widget/BubbleDecoration;-><init>(Landroid/content/Context;)V\nPLcom/google/samples/apps/iosched/widget/CountdownView$1;-><init>(Landroidx/slidingpanelayout/widget/SlidingPaneLayout;)V\nPLcom/google/samples/apps/iosched/widget/CustomSwipeRefreshLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/samples/apps/iosched/widget/CustomSwipeRefreshLayout;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z\nPLcom/google/samples/apps/iosched/widget/FadingSnackbar;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/samples/apps/iosched/widget/IoSlidingPaneLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/google/samples/apps/iosched/widget/JumpSmoothScroller;-><init>(Landroid/content/Context;II)V\nPLcom/google/samples/apps/iosched/widget/NoTouchRecyclerView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V\nPLcom/jakewharton/threetenabp/AndroidThreeTen;-><clinit>()V\nPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$1;-><init>(Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory;Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder;)V\nPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;-><init>(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;Ljava/util/Set;Landroidx/lifecycle/ViewModelProvider$Factory;Ldagger/hilt/android/internal/builders/ViewModelComponentBuilder;)V\nPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;\nPLdagger/hilt/android/internal/managers/ActivityComponentManager;-><init>(Landroid/app/Activity;)V\nPLdagger/hilt/android/internal/managers/ActivityComponentManager;->createComponent()Ljava/lang/Object;\nPLdagger/hilt/android/internal/managers/ActivityComponentManager;->generatedComponent()Ljava/lang/Object;\nPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$1;-><init>(Ldagger/hilt/android/internal/managers/FragmentComponentManager;Landroid/content/Context;)V\nPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;\nPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;-><init>(Ldagger/hilt/android/components/ActivityRetainedComponent;)V\nPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;->onCleared()V\nPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$Lifecycle;-><init>()V\nPLdagger/hilt/android/internal/managers/FragmentComponentManager;-><init>(Landroidx/activity/ComponentActivity;)V\nPLdagger/hilt/android/internal/managers/FragmentComponentManager;-><init>(Landroidx/fragment/app/Fragment;)V\nPLdagger/hilt/android/internal/managers/FragmentComponentManager;-><init>(Lcom/google/firebase/iid/zzz;)V\nPLdagger/hilt/android/internal/managers/FragmentComponentManager;->createComponent()Ldagger/hilt/android/components/ActivityRetainedComponent;\nPLdagger/hilt/android/internal/managers/FragmentComponentManager;->createComponent()Ljava/lang/Object;\nPLdagger/hilt/android/internal/managers/FragmentComponentManager;->generatedComponent()Ljava/lang/Object;\nPLdagger/hilt/android/internal/managers/FragmentComponentManager;->getViewModelProvider(Landroidx/lifecycle/ViewModelStoreOwner;Landroid/content/Context;)Landroidx/lifecycle/ViewModelProvider;\nPLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper$1;-><init>(Ldagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper;)V\nPLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper$1;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V\nPLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper;-><init>(Landroid/content/Context;Landroidx/fragment/app/Fragment;)V\nPLdagger/hilt/android/internal/managers/ViewComponentManager$FragmentContextWrapper;-><init>(Landroid/view/LayoutInflater;Landroidx/fragment/app/Fragment;)V\nPLdagger/internal/DoubleCheck;-><clinit>()V\nPLdagger/internal/DoubleCheck;-><init>(Ljavax/inject/Provider;)V\nPLdagger/internal/DoubleCheck;->reentrantCheck(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLdagger/internal/InstanceFactory;-><init>(Ljava/lang/Object;)V\nPLdagger/internal/InstanceFactory;->get()Ljava/lang/Object;\nPLio/grpc/Attributes$Key;-><init>(Ljava/lang/Object;I)V\nPLio/grpc/Attributes$Key;->getLogFileDir()Ljava/io/File;\nPLio/grpc/Attributes$Key;->then(Lcom/google/android/gms/tasks/Task;)Ljava/lang/Object;\nPLio/grpc/CallOptions$Key;-><init>(ILandroidx/appcompat/R$id$$IA$1;)V\nPLio/grpc/CallOptions$Key;-><init>(ILandroidx/appcompat/R$id$$IA$2;)V\nPLio/grpc/CallOptions$Key;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLio/grpc/CallOptions$Key;-><init>(Ljava/lang/Object;Ljava/lang/Object;ILandroidx/appcompat/R$id$$IA$1;)V\nPLio/grpc/CallOptions$Key;->notifyEventReceivers(Ljava/lang/String;Landroid/os/Bundle;)V\nPLio/grpc/CallOptions$Key;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;\nPLio/grpc/CallOptions$Key;->onDecodeComplete(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Landroid/graphics/Bitmap;)V\nPLio/grpc/CallOptions$Key;->onMessageTriggered(ILandroid/os/Bundle;)V\nPLio/grpc/CallOptions$Key;->onObtainBounds()V\nPLio/grpc/CallOptions$Key;->zza()V\nPLio/grpc/CallOptions$Key;->zza(Landroid/content/Context;)Lio/grpc/CallOptions$Key;\nPLio/grpc/CallOptions$Key;->zzc(Ljava/lang/String;)Ljava/lang/String;\nPLio/grpc/Metadata$1;-><init>(I)V\nPLio/grpc/Metadata$1;-><init>(Lkotlin/LazyKt__LazyKt;I)V\nPLio/grpc/Metadata$2;-><clinit>()V\nPLio/grpc/Metadata$2;-><init>()V\nPLio/grpc/Metadata$2;-><init>(Ljava/lang/Object;)V\nPLio/grpc/Metadata$2;->build(Lcom/bumptech/glide/load/model/MultiModelLoaderFactory;)Lcom/bumptech/glide/load/model/ModelLoader;\nPLio/grpc/Metadata$2;->canLog(I)Z\nPLio/grpc/Metadata$2;->create(Lcom/google/firebase/components/ComponentContainer;)Ljava/lang/Object;\nPLio/grpc/Metadata$2;->d(Ljava/lang/String;)V\nPLio/grpc/Metadata$2;->transcode(Lcom/bumptech/glide/load/engine/Resource;Lcom/bumptech/glide/load/Options;)Lcom/bumptech/glide/load/engine/Resource;\nPLio/grpc/Metadata$2;->zza()Ljava/lang/Object;\nPLio/grpc/ServiceProviders$1;-><init>(Ljava/lang/Object;I)V\nPLio/grpc/Status;-><clinit>()V\nPLio/grpc/Status;-><init>()V\nPLio/grpc/Status;->canonicalize(Ljava/lang/reflect/Type;)Ljava/lang/reflect/Type;\nPLio/grpc/Status;->checkCompatibleTheme(Landroid/content/Context;Landroid/util/AttributeSet;II)V\nPLio/grpc/Status;->checkNotPrimitive(Ljava/lang/reflect/Type;)V\nPLio/grpc/Status;->checkTextAppearance(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)V\nPLio/grpc/Status;->checkTheme(Landroid/content/Context;[ILjava/lang/String;)V\nPLio/grpc/Status;->combineInternal(Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLio/grpc/Status;->dexKeySeparator([B)Ljava/lang/String;\nPLio/grpc/Status;->equals(Ljava/lang/reflect/Type;Ljava/lang/reflect/Type;)Z\nPLio/grpc/Status;->getGenericSupertype(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Type;\nPLio/grpc/Status;->getIndentFunction$StringsKt__IndentKt(Ljava/lang/String;)Lkotlin/jvm/functions/Function1;\nPLio/grpc/Status;->getRawType(Ljava/lang/reflect/Type;)Ljava/lang/Class;\nPLio/grpc/Status;->getSupertype(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Type;\nPLio/grpc/Status;->mapCapacity(I)I\nPLio/grpc/Status;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Landroid/content/res/TypedArray;\nPLio/grpc/Status;->obtainTintedStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III[I)Lcom/google/firebase/iid/zzk;\nPLio/grpc/Status;->plus-FjFbRPM(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLio/grpc/Status;->resolve(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/reflect/Type;)Ljava/lang/reflect/Type;\nPLio/grpc/Status;->resolve(Ljava/lang/reflect/Type;Ljava/lang/Class;Ljava/lang/reflect/Type;Ljava/util/Collection;)Ljava/lang/reflect/Type;\nPLio/grpc/Status;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I\nPLio/grpc/Status;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J\nPLio/grpc/Status;->systemProp(Ljava/lang/String;)Ljava/lang/String;\nPLio/grpc/Status;->systemProp(Ljava/lang/String;III)I\nPLio/grpc/Status;->systemProp(Ljava/lang/String;JJJ)J\nPLio/grpc/Status;->systemProp(Ljava/lang/String;Z)Z\nPLio/grpc/Status;->toSingletonMap(Ljava/util/Map;)Ljava/util/Map;\nPLio/grpc/Status;->trimMargin$default(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;\nPLkotlin/KotlinVersion;-><clinit>()V\nPLkotlin/KotlinVersion;-><init>(III)V\nPLkotlin/LazyKt__LazyKt;->SupervisorJob$default(Lkotlinx/coroutines/Job;I)Lkotlinx/coroutines/CompletableJob;\nPLkotlin/LazyKt__LazyKt;->asStateFlow(Lkotlinx/coroutines/flow/StateFlowImpl;)Lkotlinx/coroutines/flow/StateFlow;\nPLkotlin/LazyKt__LazyKt;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V\nPLkotlin/LazyKt__LazyKt;->catchImpl(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlin/LazyKt__LazyKt;->coerceAtMost(JJ)J\nPLkotlin/LazyKt__LazyKt;->coerceIn(FFF)F\nPLkotlin/LazyKt__LazyKt;->coerceIn(III)I\nPLkotlin/LazyKt__LazyKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlin/LazyKt__LazyKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlin/LazyKt__LazyKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlin/LazyKt__LazyKt;->flowCombineTransform(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow;\nPLkotlin/LazyKt__LazyKt;->get(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;\nPLkotlin/LazyKt__LazyKt;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;\nPLkotlin/LazyKt__LazyKt;->mapLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow;\nPLkotlin/LazyKt__LazyKt;->mod(II)I\nPLkotlin/LazyKt__LazyKt;->onEach(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow;\nPLkotlin/LazyKt__LazyKt;->plus(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;\nPLkotlin/LazyKt__LazyKt;->receiveAsFlow(Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/flow/Flow;\nPLkotlin/LazyKt__LazyKt;->runBlocking(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\nPLkotlin/LazyKt__LazyKt;->shareIn$default(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;IILjava/lang/Object;)Lkotlinx/coroutines/flow/SharedFlow;\nPLkotlin/LazyKt__LazyKt;->shareIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;I)Lkotlinx/coroutines/flow/SharedFlow;\nPLkotlin/LazyKt__LazyKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow;\nPLkotlin/LazyKt__LazyKt;->transformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow;\nPLkotlin/LazyKt__LazyKt;->until(II)Lkotlin/ranges/IntRange;\nPLkotlin/Result;-><clinit>()V\nPLkotlin/ResultKt;-><clinit>()V\nPLkotlin/ResultKt;->cancel$default(Lkotlinx/coroutines/Job;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V\nPLkotlin/ResultKt;->cancelIfActive(Lkotlinx/coroutines/Job;)V\nPLkotlin/ResultKt;->checkState(ZLjava/lang/String;[Ljava/lang/Object;)V\nPLkotlin/ResultKt;->clearDecorations(Landroidx/recyclerview/widget/RecyclerView;)V\nPLkotlin/ResultKt;->closeFinally(Ljava/io/Closeable;Ljava/lang/Throwable;)V\nPLkotlin/ResultKt;->compareBy([Lkotlin/jvm/functions/Function1;)Ljava/util/Comparator;\nPLkotlin/ResultKt;->create(Ljava/lang/String;Ljava/lang/String;)Lcom/google/firebase/components/Component;\nPLkotlin/ResultKt;->doOnApplyWindowInsets(Landroid/view/View;Lcom/google/android/material/internal/ViewUtils$OnApplyWindowInsetsListener;)V\nPLkotlin/ResultKt;->fuse$default(Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;\nPLkotlin/ResultKt;->getDelay(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Delay;\nPLkotlin/ResultKt;->getViewModelScope(Landroidx/lifecycle/ViewModel;)Lkotlinx/coroutines/CoroutineScope;\nPLkotlin/ResultKt;->isFragmentGetContextFixDisabled(Landroid/content/Context;)Z\nPLkotlin/ResultKt;->parseTintMode(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuff$Mode;\nPLkotlin/ResultKt;->setupProfileMenuItem(Landroidx/appcompat/widget/Toolbar;Lcom/google/samples/apps/iosched/ui/MainActivityViewModel;Landroidx/lifecycle/LifecycleOwner;)V\nPLkotlin/ResultKt;->toEpochMilli(Lorg/threeten/bp/ZonedDateTime;)J\nPLkotlin/SafePublicationLazyImpl;-><clinit>()V\nPLkotlin/SynchronizedLazyImpl;-><init>(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;I)V\nPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object;\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->_determineFrom(Ljava/lang/String;)I\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->_values$1()[I\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->_values()[I\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->getId(I)I\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m$1()Ljava/util/Iterator;\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m$1(ILjava/lang/String;)V\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m()Ljava/util/Iterator;\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m(ILjava/lang/String;)V\nPLkotlin/TuplesKt$$ExternalSyntheticCheckNotZero0;->m(Lcom/google/samples/apps/iosched/ui/Hilt_MainActivity;I)V\nPLkotlin/TuplesKt;-><clinit>()V\nPLkotlin/TuplesKt;->MutableSharedFlow$default(IILkotlinx/coroutines/channels/BufferOverflow;I)Lkotlinx/coroutines/flow/MutableSharedFlow;\nPLkotlin/TuplesKt;->MutableSharedFlow(IILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/MutableSharedFlow;\nPLkotlin/TuplesKt;->cancel$default(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V\nPLkotlin/TuplesKt;->cancel(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;)V\nPLkotlin/TuplesKt;->checkParameterIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V\nPLkotlin/TuplesKt;->convertToRippleDrawableColor(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList;\nPLkotlin/TuplesKt;->enabled(II)Z\nPLkotlin/TuplesKt;->get(Lorg/threeten/bp/temporal/TemporalField;)I\nPLkotlin/TuplesKt;->getApplication(Landroid/content/Context;)Landroid/app/Application;\nPLkotlin/TuplesKt;->getColorForState(Landroid/content/res/ColorStateList;[I)I\nPLkotlin/TuplesKt;->isCancellableMode(I)Z\nPLkotlin/TuplesKt;->isWhitespace(C)Z\nPLkotlin/TuplesKt;->listOf(Ljava/lang/Object;)Ljava/util/List;\nPLkotlin/TuplesKt;->listOf([Ljava/lang/Object;)Ljava/util/List;\nPLkotlin/TuplesKt;->optimizeReadOnlyList(Ljava/util/List;)Ljava/util/List;\nPLkotlin/TuplesKt;->range(Lorg/threeten/bp/temporal/TemporalField;)Lorg/threeten/bp/temporal/ValueRange;\nPLkotlin/TuplesKt;->sanitizeRippleDrawableColor(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList;\nPLkotlin/TuplesKt;->setContentMaxWidth(Landroid/view/View;)V\nPLkotlin/TuplesKt;->setupSnackbarManager(Landroidx/fragment/app/Fragment;Lcom/google/samples/apps/iosched/ui/messages/SnackbarMessageManager;Lcom/google/samples/apps/iosched/widget/FadingSnackbar;)V\nPLkotlin/ULong$Companion;-><init>(I)V\nPLkotlin/ULong$Companion;-><init>(Lkotlin/LazyKt__LazyKt;I)V\nPLkotlin/ULong$Companion;->checkElementIndex$kotlin_stdlib(II)V\nPLkotlin/ULong$Companion;->closed-JP2dKIU(Ljava/lang/Throwable;)Ljava/lang/Object;\nPLkotlin/ULong$Companion;->queryFrom(Lorg/threeten/bp/temporal/TemporalAccessor;)Ljava/lang/Object;\nPLkotlin/Unit;-><clinit>()V\nPLkotlin/Unit;-><init>()V\nPLkotlin/collections/AbstractList;-><clinit>()V\nPLkotlin/collections/AbstractMap$toString$1;-><init>(Ljava/lang/Object;I)V\nPLkotlin/collections/AbstractMap$toString$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlin/collections/AbstractMutableList;-><init>()V\nPLkotlin/collections/AbstractMutableList;->size()I\nPLkotlin/collections/ArrayDeque;-><clinit>()V\nPLkotlin/collections/ArrayDeque;-><init>()V\nPLkotlin/collections/ArrayDeque;->addAll(Ljava/util/Collection;)Z\nPLkotlin/collections/ArrayDeque;->addFirst(Ljava/lang/Object;)V\nPLkotlin/collections/ArrayDeque;->addLast(Ljava/lang/Object;)V\nPLkotlin/collections/ArrayDeque;->copyCollectionElements(ILjava/util/Collection;)V\nPLkotlin/collections/ArrayDeque;->decremented(I)I\nPLkotlin/collections/ArrayDeque;->ensureCapacity(I)V\nPLkotlin/collections/ArrayDeque;->first()Ljava/lang/Object;\nPLkotlin/collections/ArrayDeque;->firstOrNull()Ljava/lang/Object;\nPLkotlin/collections/ArrayDeque;->getSize()I\nPLkotlin/collections/ArrayDeque;->isEmpty()Z\nPLkotlin/collections/ArrayDeque;->last()Ljava/lang/Object;\nPLkotlin/collections/ArrayDeque;->lastOrNull()Ljava/lang/Object;\nPLkotlin/collections/ArrayDeque;->toArray()[Ljava/lang/Object;\nPLkotlin/collections/ArrayDeque;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;\nPLkotlin/collections/CollectionsKt__ReversedViewsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z\nPLkotlin/collections/CollectionsKt___CollectionsKt;->first(Ljava/util/List;)Ljava/lang/Object;\nPLkotlin/collections/CollectionsKt___CollectionsKt;->intersect(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/Set;\nPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo$default(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;I)Ljava/lang/Appendable;\nPLkotlin/collections/CollectionsKt___CollectionsKt;->last(Ljava/util/List;)Ljava/lang/Object;\nPLkotlin/collections/CollectionsKt___CollectionsKt;->maxOrNull(Ljava/lang/Iterable;)Ljava/lang/Comparable;\nPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/List;\nPLkotlin/collections/CollectionsKt___CollectionsKt;->sortedWith(Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/util/List;\nPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableSet(Ljava/lang/Iterable;)Ljava/util/Set;\nPLkotlin/collections/EmptyIterator;-><clinit>()V\nPLkotlin/collections/EmptyIterator;-><init>()V\nPLkotlin/collections/EmptyIterator;->hasNext()Z\nPLkotlin/collections/EmptyIterator;->hasPrevious()Z\nPLkotlin/collections/EmptyList;-><clinit>()V\nPLkotlin/collections/EmptyList;-><init>()V\nPLkotlin/collections/EmptyList;->equals(Ljava/lang/Object;)Z\nPLkotlin/collections/EmptyList;->isEmpty()Z\nPLkotlin/collections/EmptyList;->iterator()Ljava/util/Iterator;\nPLkotlin/collections/EmptyList;->listIterator(I)Ljava/util/ListIterator;\nPLkotlin/collections/EmptyList;->size()I\nPLkotlin/collections/EmptyList;->toArray()[Ljava/lang/Object;\nPLkotlin/collections/EmptyMap;-><clinit>()V\nPLkotlin/collections/EmptyMap;-><init>()V\nPLkotlin/collections/EmptyMap;->entrySet()Ljava/util/Set;\nPLkotlin/collections/EmptyMap;->keySet()Ljava/util/Set;\nPLkotlin/collections/EmptyMap;->size()I\nPLkotlin/collections/EmptySet;-><clinit>()V\nPLkotlin/collections/EmptySet;-><init>()V\nPLkotlin/collections/EmptySet;->contains(Ljava/lang/Object;)Z\nPLkotlin/collections/EmptySet;->iterator()Ljava/util/Iterator;\nPLkotlin/collections/IndexedValue;-><init>(ILjava/lang/Object;)V\nPLkotlin/collections/MapsKt___MapsKt;->mutableMapOf([Lkotlin/Pair;)Ljava/util/Map;\nPLkotlin/collections/MapsKt___MapsKt;->putAll(Ljava/util/Map;[Lkotlin/Pair;)V\nPLkotlin/collections/MapsKt___MapsKt;->toMap(Ljava/lang/Iterable;)Ljava/util/Map;\nPLkotlin/collections/MapsKt___MapsKt;->toMap(Ljava/lang/Iterable;Ljava/util/Map;)Ljava/util/Map;\nPLkotlin/collections/MapsKt___MapsKt;->toMap(Ljava/util/Map;)Ljava/util/Map;\nPLkotlin/collections/MapsKt___MapsKt;->toMutableMap(Ljava/util/Map;)Ljava/util/Map;\nPLkotlin/coroutines/AbstractCoroutineContextElement;-><init>(Lkotlin/coroutines/CoroutineContext$Key;)V\nPLkotlin/coroutines/AbstractCoroutineContextElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key;\nPLkotlin/coroutines/AbstractCoroutineContextElement;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;\nPLkotlin/coroutines/AbstractCoroutineContextKey;-><init>(Lkotlin/coroutines/CoroutineContext$Key;Lkotlin/jvm/functions/Function1;)V\nPLkotlin/coroutines/CombinedContext;->equals(Ljava/lang/Object;)Z\nPLkotlin/coroutines/CombinedContext;->size()I\nPLkotlin/coroutines/CoroutineContext$plus$1;-><clinit>()V\nPLkotlin/coroutines/CoroutineContext$plus$1;-><init>(I)V\nPLkotlin/coroutines/EmptyCoroutineContext;-><clinit>()V\nPLkotlin/coroutines/EmptyCoroutineContext;-><init>()V\nPLkotlin/coroutines/EmptyCoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;\nPLkotlin/coroutines/EmptyCoroutineContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;\nPLkotlin/coroutines/intrinsics/CoroutineSingletons;-><clinit>()V\nPLkotlin/coroutines/intrinsics/CoroutineSingletons;-><init>(Ljava/lang/String;I)V\nPLkotlin/coroutines/jvm/internal/CompletedContinuation;-><clinit>()V\nPLkotlin/coroutines/jvm/internal/CompletedContinuation;-><init>()V\nPLkotlin/coroutines/jvm/internal/ContinuationImpl;-><init>(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V\nPLkotlin/internal/PlatformImplementations;-><init>()V\nPLkotlin/internal/PlatformImplementations;->defaultPlatformRandom()Lkotlin/random/Random;\nPLkotlin/internal/PlatformImplementationsKt;-><clinit>()V\nPLkotlin/jvm/internal/ArrayIterator;-><init>(Ljava/lang/Object;I)V\nPLkotlin/jvm/internal/CallableReference$NoReceiver;-><clinit>()V\nPLkotlin/jvm/internal/CallableReference$NoReceiver;-><init>()V\nPLkotlin/jvm/internal/CallableReference;-><init>(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Z)V\nPLkotlin/jvm/internal/ClassReference;-><clinit>()V\nPLkotlin/jvm/internal/ClassReference;-><init>(Ljava/lang/Class;)V\nPLkotlin/jvm/internal/ClassReference;->getJClass()Ljava/lang/Class;\nPLkotlin/jvm/internal/FunctionReferenceImpl;-><init>(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V\nPLkotlin/jvm/internal/FunctionReferenceImpl;->getArity()I\nPLkotlin/jvm/internal/PropertyReference2Impl;-><init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V\nPLkotlin/jvm/internal/PropertyReference;-><init>(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V\nPLkotlin/jvm/internal/Ref$BooleanRef;-><init>()V\nPLkotlin/jvm/internal/Ref$ObjectRef;-><init>()V\nPLkotlin/jvm/internal/Reflection;-><clinit>()V\nPLkotlin/jvm/internal/Reflection;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass;\nPLkotlin/jvm/internal/ReflectionFactory;-><init>()V\nPLkotlin/math/MathKt;->asList([Ljava/lang/Object;)Ljava/util/List;\nPLkotlin/math/MathKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIII)[Ljava/lang/Object;\nPLkotlin/math/MathKt;->copyInto([Ljava/lang/Object;[Ljava/lang/Object;III)[Ljava/lang/Object;\nPLkotlin/math/MathKt;->fill([Ljava/lang/Object;Ljava/lang/Object;II)V\nPLkotlin/math/MathKt;->getLastIndex([Ljava/lang/Object;)I\nPLkotlin/random/AbstractPlatformRandom;-><init>()V\nPLkotlin/random/AbstractPlatformRandom;->nextInt()I\nPLkotlin/random/FallbackThreadLocalRandom;-><init>()V\nPLkotlin/random/FallbackThreadLocalRandom;->getImpl()Ljava/util/Random;\nPLkotlin/random/Random$Default;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLkotlin/random/Random;-><clinit>()V\nPLkotlin/random/Random;-><init>()V\nPLkotlin/ranges/IntProgression;-><clinit>()V\nPLkotlin/ranges/IntProgression;->iterator()Ljava/util/Iterator;\nPLkotlin/ranges/IntProgressionIterator;-><init>(III)V\nPLkotlin/ranges/IntProgressionIterator;->nextInt()I\nPLkotlin/ranges/IntRange;-><clinit>()V\nPLkotlin/sequences/ConstrainedOnceSequence;-><init>(Lkotlin/sequences/Sequence;)V\nPLkotlin/sequences/ConstrainedOnceSequence;->iterator()Ljava/util/Iterator;\nPLkotlin/sequences/FilteringSequence$iterator$1;-><init>(Lkotlin/sequences/FilteringSequence;)V\nPLkotlin/sequences/FilteringSequence$iterator$1;->calcNext()V\nPLkotlin/sequences/FilteringSequence$iterator$1;->hasNext()Z\nPLkotlin/sequences/FilteringSequence$iterator$1;->next()Ljava/lang/Object;\nPLkotlin/sequences/FilteringSequence;-><init>(Lkotlin/sequences/Sequence;ZLkotlin/jvm/functions/Function1;)V\nPLkotlin/sequences/GeneratorSequence$iterator$1;-><init>(Lkotlin/sequences/TakeWhileSequence;)V\nPLkotlin/sequences/GeneratorSequence$iterator$1;->calcNext()V\nPLkotlin/sequences/GeneratorSequence$iterator$1;->hasNext()Z\nPLkotlin/sequences/GeneratorSequence$iterator$1;->next()Ljava/lang/Object;\nPLkotlin/sequences/SequencesKt;->toList(Lkotlin/sequences/Sequence;)Ljava/util/List;\nPLkotlin/sequences/SequencesKt;->toMutableList(Lkotlin/sequences/Sequence;)Ljava/util/List;\nPLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;-><init>(Ljava/lang/Object;I)V\nPLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator;\nPLkotlin/sequences/SequencesKt___SequencesJvmKt;->asSequence(Ljava/util/Iterator;)Lkotlin/sequences/Sequence;\nPLkotlin/sequences/SequencesKt___SequencesJvmKt;->generateSequence(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence;\nPLkotlin/sequences/TakeWhileSequence;-><init>(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V\nPLkotlin/sequences/TakeWhileSequence;-><init>(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;I)V\nPLkotlin/sequences/TakeWhileSequence;->iterator()Ljava/util/Iterator;\nPLkotlin/sequences/TransformingSequence$iterator$1;-><init>(Lkotlin/sequences/TakeWhileSequence;)V\nPLkotlin/sequences/TransformingSequence$iterator$1;->hasNext()Z\nPLkotlin/sequences/TransformingSequence$iterator$1;->next()Ljava/lang/Object;\nPLkotlin/text/Charsets;-><clinit>()V\nPLkotlin/text/DelimitedRangesSequence$iterator$1;-><init>(Lkotlin/text/DelimitedRangesSequence;)V\nPLkotlin/text/DelimitedRangesSequence$iterator$1;->calcNext()V\nPLkotlin/text/DelimitedRangesSequence$iterator$1;->hasNext()Z\nPLkotlin/text/DelimitedRangesSequence$iterator$1;->next()Ljava/lang/Object;\nPLkotlin/text/DelimitedRangesSequence;-><init>(Ljava/lang/CharSequence;IILkotlin/jvm/functions/Function2;)V\nPLkotlin/text/DelimitedRangesSequence;->iterator()Ljava/util/Iterator;\nPLkotlin/text/StringsKt__StringsKt$rangesDelimitedBy$2;-><init>(Ljava/util/List;Z)V\nPLkotlin/text/StringsKt__StringsKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;ZI)Z\nPLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I\nPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;CIZI)I\nPLkotlin/text/StringsKt__StringsKt;->isBlank(Ljava/lang/CharSequence;)Z\nPLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CIZI)I\nPLkotlin/text/StringsKt__StringsKt;->lines(Ljava/lang/CharSequence;)Ljava/util/List;\nPLkotlin/text/StringsKt__StringsKt;->rangesDelimitedBy$StringsKt__StringsKt$default(Ljava/lang/CharSequence;[Ljava/lang/String;IZII)Lkotlin/sequences/Sequence;\nPLkotlin/text/StringsKt__StringsKt;->regionMatches(Ljava/lang/String;ILjava/lang/String;IIZ)Z\nPLkotlin/text/StringsKt__StringsKt;->requireNonNegativeLimit(I)V\nPLkotlin/text/StringsKt__StringsKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;ZI)Z\nPLkotlin/text/StringsKt__StringsKt;->substring(Ljava/lang/CharSequence;Lkotlin/ranges/IntRange;)Ljava/lang/String;\nPLkotlin/text/StringsKt__StringsKt;->substringAfterLast$default(Ljava/lang/String;CLjava/lang/String;I)Ljava/lang/String;\nPLkotlin/text/StringsKt__StringsKt;->substringAfterLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String;\nPLkotlinx/coroutines/AbstractCoroutine;->cancellationExceptionMessage()Ljava/lang/String;\nPLkotlinx/coroutines/AbstractCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V\nPLkotlinx/coroutines/AbstractCoroutine;->onCompleted(Ljava/lang/Object;)V\nPLkotlinx/coroutines/Active;-><clinit>()V\nPLkotlinx/coroutines/Active;-><init>()V\nPLkotlinx/coroutines/BlockingCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Thread;Lkotlinx/coroutines/EventLoopImplPlatform;)V\nPLkotlinx/coroutines/BlockingCoroutine;->afterCompletion(Ljava/lang/Object;)V\nPLkotlinx/coroutines/BlockingEventLoop;-><init>(Ljava/lang/Thread;)V\nPLkotlinx/coroutines/BlockingEventLoop;->getThread()Ljava/lang/Thread;\nPLkotlinx/coroutines/CancellableContinuationImpl;-><clinit>()V\nPLkotlinx/coroutines/CancellableContinuationImpl;->callCancelHandler(Lkotlinx/coroutines/CancelHandler;Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/CancellableContinuationImpl;->resumeUndispatched(Lkotlinx/coroutines/CoroutineDispatcher;Ljava/lang/Object;)V\nPLkotlinx/coroutines/CancelledContinuation;-><clinit>()V\nPLkotlinx/coroutines/ChildHandleNode;->childCancelled(Ljava/lang/Throwable;)Z\nPLkotlinx/coroutines/ChildHandleNode;->getParent()Lkotlinx/coroutines/Job;\nPLkotlinx/coroutines/CompletedExceptionally;-><clinit>()V\nPLkotlinx/coroutines/CoroutineDispatcher$Key$1;-><clinit>()V\nPLkotlinx/coroutines/CoroutineDispatcher$Key$1;-><init>(I)V\nPLkotlinx/coroutines/CoroutineDispatcher$Key;-><init>(I)V\nPLkotlinx/coroutines/CoroutineDispatcher;-><clinit>()V\nPLkotlinx/coroutines/CoroutineDispatcher;-><init>()V\nPLkotlinx/coroutines/CoroutineDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V\nPLkotlinx/coroutines/CoroutineExceptionHandlerImplKt;-><clinit>()V\nPLkotlinx/coroutines/DefaultExecutorKt;-><clinit>()V\nPLkotlinx/coroutines/DispatchedCoroutine;-><clinit>()V\nPLkotlinx/coroutines/DispatchedCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/DispatchedTask;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/DispatchedTask;->handleFatalException(Ljava/lang/Throwable;Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/Dispatchers;-><clinit>()V\nPLkotlinx/coroutines/Empty;-><init>(Z)V\nPLkotlinx/coroutines/Empty;->getList()Lkotlinx/coroutines/NodeList;\nPLkotlinx/coroutines/EventLoopImplBase;-><clinit>()V\nPLkotlinx/coroutines/EventLoopImplBase;-><init>()V\nPLkotlinx/coroutines/EventLoopImplBase;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V\nPLkotlinx/coroutines/EventLoopImplBase;->enqueue(Ljava/lang/Runnable;)V\nPLkotlinx/coroutines/EventLoopImplBase;->enqueueImpl(Ljava/lang/Runnable;)Z\nPLkotlinx/coroutines/EventLoopImplBase;->processNextEvent()J\nPLkotlinx/coroutines/EventLoopImplBase;->shutdown()V\nPLkotlinx/coroutines/EventLoopImplPlatform;-><init>()V\nPLkotlinx/coroutines/EventLoopImplPlatform;->delta(Z)J\nPLkotlinx/coroutines/ExecutorCoroutineDispatcher;-><init>()V\nPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;-><init>(Ljava/util/concurrent/Executor;)V\nPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V\nPLkotlinx/coroutines/InvokeOnCancel;-><init>(Ljava/lang/Object;I)V\nPLkotlinx/coroutines/InvokeOnCancel;->invoke(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/InvokeOnCompletion;-><init>(Ljava/lang/Object;I)V\nPLkotlinx/coroutines/InvokeOnCompletion;->invoke(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/Job;-><clinit>()V\nPLkotlinx/coroutines/JobCancellationException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;Lkotlinx/coroutines/Job;)V\nPLkotlinx/coroutines/JobCancellationException;->equals(Ljava/lang/Object;)Z\nPLkotlinx/coroutines/JobCancellationException;->fillInStackTrace()Ljava/lang/Throwable;\nPLkotlinx/coroutines/JobImpl;-><init>(Lkotlinx/coroutines/Job;)V\nPLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z\nPLkotlinx/coroutines/JobNode;->getList()Lkotlinx/coroutines/NodeList;\nPLkotlinx/coroutines/JobNode;->isActive()Z\nPLkotlinx/coroutines/JobSupport$ChildCompletion;-><init>(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V\nPLkotlinx/coroutines/JobSupport$ChildCompletion;->invoke(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/JobSupport$Finishing;->isActive()Z\nPLkotlinx/coroutines/JobSupport$Finishing;->isSealed()Z\nPLkotlinx/coroutines/JobSupport;-><clinit>()V\nPLkotlinx/coroutines/JobSupport;->afterCompletion(Ljava/lang/Object;)V\nPLkotlinx/coroutines/JobSupport;->cancelInternal(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/JobSupport;->cancellationExceptionMessage()Ljava/lang/String;\nPLkotlinx/coroutines/JobSupport;->childCancelled(Ljava/lang/Throwable;)Z\nPLkotlinx/coroutines/JobSupport;->getParentHandle$kotlinx_coroutines_core()Lkotlinx/coroutines/ChildHandle;\nPLkotlinx/coroutines/JobSupport;->isCancelled()Z\nPLkotlinx/coroutines/JobSupport;->onCompletionInternal(Ljava/lang/Object;)V\nPLkotlinx/coroutines/JobSupport;->toCancellationException$default(Lkotlinx/coroutines/JobSupport;Ljava/lang/Throwable;Ljava/lang/String;ILjava/lang/Object;)Ljava/util/concurrent/CancellationException;\nPLkotlinx/coroutines/JobSupport;->tryWaitForChild(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)Z\nPLkotlinx/coroutines/MainCoroutineDispatcher;-><init>()V\nPLkotlinx/coroutines/NodeList;->getList()Lkotlinx/coroutines/NodeList;\nPLkotlinx/coroutines/NodeList;->isActive()Z\nPLkotlinx/coroutines/NonDisposableHandle;-><clinit>()V\nPLkotlinx/coroutines/NonDisposableHandle;-><init>()V\nPLkotlinx/coroutines/NonDisposableHandle;->dispose()V\nPLkotlinx/coroutines/SupervisorJobImpl;-><init>(Lkotlinx/coroutines/Job;)V\nPLkotlinx/coroutines/SupervisorJobImpl;->childCancelled(Ljava/lang/Throwable;)Z\nPLkotlinx/coroutines/ThreadLocalEventLoop;-><clinit>()V\nPLkotlinx/coroutines/Unconfined;-><clinit>()V\nPLkotlinx/coroutines/Unconfined;-><init>()V\nPLkotlinx/coroutines/UndispatchedMarker;-><clinit>()V\nPLkotlinx/coroutines/UndispatchedMarker;-><init>()V\nPLkotlinx/coroutines/UndispatchedMarker;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;\nPLkotlinx/coroutines/UndispatchedMarker;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;\nPLkotlinx/coroutines/UndispatchedMarker;->getKey()Lkotlin/coroutines/CoroutineContext$Key;\nPLkotlinx/coroutines/YieldContext;-><clinit>()V\nPLkotlinx/coroutines/YieldContext;-><init>()V\nPLkotlinx/coroutines/android/AndroidDispatcherFactory;-><init>()V\nPLkotlinx/coroutines/android/AndroidDispatcherFactory;->createDispatcher(Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher;\nPLkotlinx/coroutines/android/AndroidExceptionPreHandler;-><init>()V\nPLkotlinx/coroutines/android/HandlerContext;-><init>(Landroid/os/Handler;Ljava/lang/String;Z)V\nPLkotlinx/coroutines/android/HandlerContext;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V\nPLkotlinx/coroutines/android/HandlerDispatcher;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLkotlinx/coroutines/android/HandlerDispatcherKt;-><clinit>()V\nPLkotlinx/coroutines/android/HandlerDispatcherKt;->asHandler(Landroid/os/Looper;Z)Landroid/os/Handler;\nPLkotlinx/coroutines/channels/AbstractChannel$Itr;-><init>(Lkotlinx/coroutines/channels/AbstractChannel;)V\nPLkotlinx/coroutines/channels/AbstractChannel$Itr;->hasNext(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/channels/AbstractChannel$Itr;->hasNextResult(Ljava/lang/Object;)Z\nPLkotlinx/coroutines/channels/AbstractChannel$Itr;->next()Ljava/lang/Object;\nPLkotlinx/coroutines/channels/AbstractChannel$ReceiveHasNext;-><init>(Lkotlinx/coroutines/channels/AbstractChannel$Itr;Lkotlinx/coroutines/CancellableContinuation;)V\nPLkotlinx/coroutines/channels/AbstractChannel$RemoveReceiveOnCancel;->invoke(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/channels/AbstractChannel;-><init>(Lkotlin/jvm/functions/Function1;)V\nPLkotlinx/coroutines/channels/AbstractChannel;->cancel(Ljava/util/concurrent/CancellationException;)V\nPLkotlinx/coroutines/channels/AbstractChannel;->isClosedForReceive()Z\nPLkotlinx/coroutines/channels/AbstractChannel;->pollInternal()Ljava/lang/Object;\nPLkotlinx/coroutines/channels/AbstractChannel;->receive(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/channels/AbstractChannel;->tryReceive-PtdJZtk()Ljava/lang/Object;\nPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;-><init>(Ljava/lang/Object;)V\nPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->completeResumeSend()V\nPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->getPollResult()Ljava/lang/Object;\nPLkotlinx/coroutines/channels/AbstractSendChannel$SendBuffered;->tryResumeSend(Lkotlinx/coroutines/internal/LockFreeLinkedListNode$PrepareOp;)Lkotlinx/coroutines/internal/Symbol;\nPLkotlinx/coroutines/channels/AbstractSendChannel;-><clinit>()V\nPLkotlinx/coroutines/channels/AbstractSendChannel;->offer(Ljava/lang/Object;)Z\nPLkotlinx/coroutines/channels/AbstractSendChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/channels/AbstractSendChannel;->takeFirstSendOrPeekClosed()Lkotlinx/coroutines/channels/Send;\nPLkotlinx/coroutines/channels/AbstractSendChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/channels/ArrayChannel;->enqueueElement(ILjava/lang/Object;)V\nPLkotlinx/coroutines/channels/ArrayChannel;->isBufferAlwaysEmpty()Z\nPLkotlinx/coroutines/channels/ArrayChannel;->isBufferEmpty()Z\nPLkotlinx/coroutines/channels/ArrayChannel;->isClosedForReceive()Z\nPLkotlinx/coroutines/channels/BufferOverflow;-><clinit>()V\nPLkotlinx/coroutines/channels/BufferOverflow;-><init>(Ljava/lang/String;I)V\nPLkotlinx/coroutines/channels/Channel$Factory;-><clinit>()V\nPLkotlinx/coroutines/channels/Channel$Factory;-><init>()V\nPLkotlinx/coroutines/channels/Channel;-><clinit>()V\nPLkotlinx/coroutines/channels/ChannelResult$Closed;-><init>(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/channels/ChannelResult$Failed;-><init>()V\nPLkotlinx/coroutines/channels/ChannelResult;-><clinit>()V\nPLkotlinx/coroutines/channels/ChannelResult;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable;\nPLkotlinx/coroutines/channels/ChannelResult;->getOrNull-impl(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/channels/ChannelResult;->getOrThrow-impl(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/channels/Closed;-><init>(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/channels/ConflatedChannel;-><init>(Lkotlin/jvm/functions/Function1;)V\nPLkotlinx/coroutines/channels/ConflatedChannel;->enqueueReceiveInternal(Lkotlinx/coroutines/channels/Receive;)Z\nPLkotlinx/coroutines/channels/ConflatedChannel;->isBufferAlwaysEmpty()Z\nPLkotlinx/coroutines/channels/ConflatedChannel;->isBufferEmpty()Z\nPLkotlinx/coroutines/channels/ConflatedChannel;->pollInternal()Ljava/lang/Object;\nPLkotlinx/coroutines/channels/LinkedListChannel;-><init>(Lkotlin/jvm/functions/Function1;I)V\nPLkotlinx/coroutines/channels/LinkedListChannel;->isBufferAlwaysEmpty()Z\nPLkotlinx/coroutines/channels/LinkedListChannel;->offerInternal(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/channels/ProducerCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/Channel;)V\nPLkotlinx/coroutines/channels/ProducerCoroutine;->cancel(Ljava/util/concurrent/CancellationException;)V\nPLkotlinx/coroutines/channels/ProducerCoroutine;->cancelInternal(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/channels/ProducerCoroutine;->isActive()Z\nPLkotlinx/coroutines/channels/ProducerCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V\nPLkotlinx/coroutines/channels/ProducerCoroutine;->onCompleted(Ljava/lang/Object;)V\nPLkotlinx/coroutines/channels/Receive;-><init>()V\nPLkotlinx/coroutines/channels/Receive;->getOfferResult()Ljava/lang/Object;\nPLkotlinx/coroutines/channels/Receive;->resumeOnCancellationFun(Ljava/lang/Object;)Lkotlin/jvm/functions/Function1;\nPLkotlinx/coroutines/channels/Send;-><init>()V\nPLkotlinx/coroutines/flow/AbstractFlow$collect$1;-><init>(Lkotlinx/coroutines/flow/SafeFlow;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1;-><init>(Lkotlinx/coroutines/flow/CallbackFlowBuilder;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/CallbackFlowBuilder;-><init>(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V\nPLkotlinx/coroutines/flow/CallbackFlowBuilder;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/ChannelAsFlow;-><clinit>()V\nPLkotlinx/coroutines/flow/ChannelAsFlow;-><init>(Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V\nPLkotlinx/coroutines/flow/ChannelAsFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/ChannelAsFlow;->dropChannelOperators()Lkotlinx/coroutines/flow/Flow;\nPLkotlinx/coroutines/flow/ChannelAsFlow;->markConsumed()V\nPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;-><init>(Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;-><init>(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLkotlinx/coroutines/flow/DistinctFlowImpl;-><init>(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V\nPLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1$1;-><init>(Lkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1;-><init>([Ljava/lang/Object;)V\nPLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__DistinctKt;-><clinit>()V\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1;-><init>(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;-><init>(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2$emit$1;-><init>(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;-><init>(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/internal/Ref$ObjectRef;)V\nPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;-><init>(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;I)V\nPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;-><init>(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;-><init>(Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V\nPLkotlinx/coroutines/flow/FlowKt__MergeKt;-><clinit>()V\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1;-><init>(Lkotlin/jvm/internal/Ref$ObjectRef;)V\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1;-><init>(Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;-><init>(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;)V\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;-><init>(Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$1;-><init>(Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;-><init>(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;-><init>(Lkotlinx/coroutines/flow/SharingStarted;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;-><init>(Lkotlinx/coroutines/flow/StartedLazily$command$1$1;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;-><init>(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function4;I)V\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;-><init>(Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Ljava/lang/Object;I)V\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;-><init>(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combineTransform$$inlined$combineTransformUnsafe$FlowKt__ZipKt$1;-><init>([Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function4;)V\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combineTransform$$inlined$combineTransformUnsafe$FlowKt__ZipKt$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$combineTransform$$inlined$combineTransformUnsafe$FlowKt__ZipKt$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;-><clinit>()V\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;-><init>(I)V\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->invoke()Landroidx/window/extensions/layout/WindowLayoutComponent;\nPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->invoke()Ljava/lang/Object;\nPLkotlinx/coroutines/flow/ReadonlySharedFlow;-><init>(Lkotlinx/coroutines/flow/SharedFlow;Lkotlinx/coroutines/Job;)V\nPLkotlinx/coroutines/flow/ReadonlySharedFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/ReadonlyStateFlow;-><init>(Lkotlinx/coroutines/flow/StateFlow;Lkotlinx/coroutines/Job;)V\nPLkotlinx/coroutines/flow/ReadonlyStateFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/SafeFlow;-><init>(Lkotlin/jvm/functions/Function2;)V\nPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;-><init>(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/SharedFlowImpl;-><init>(IILkotlinx/coroutines/channels/BufferOverflow;)V\nPLkotlinx/coroutines/flow/SharedFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;\nPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;\nPLkotlinx/coroutines/flow/SharedFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/SharedFlowImpl;->growBuffer([Ljava/lang/Object;II)[Ljava/lang/Object;\nPLkotlinx/coroutines/flow/SharedFlowSlot;-><init>()V\nPLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Ljava/lang/Object;)Z\nPLkotlinx/coroutines/flow/SharedFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation;\nPLkotlinx/coroutines/flow/SharingCommand;-><clinit>()V\nPLkotlinx/coroutines/flow/SharingCommand;-><init>(Ljava/lang/String;I)V\nPLkotlinx/coroutines/flow/StartedLazily$command$1$1;-><init>(Ljava/lang/Object;Ljava/lang/Object;I)V\nPLkotlinx/coroutines/flow/StartedLazily$command$1$1;-><init>(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;I)V\nPLkotlinx/coroutines/flow/StartedLazily;-><init>(I)V\nPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;-><init>(Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/StartedWhileSubscribed;-><init>(JJ)V\nPLkotlinx/coroutines/flow/StartedWhileSubscribed;->command(Lkotlinx/coroutines/flow/StateFlow;)Lkotlinx/coroutines/flow/Flow;\nPLkotlinx/coroutines/flow/StartedWhileSubscribed;->equals(Ljava/lang/Object;)Z\nPLkotlinx/coroutines/flow/StateFlowImpl;-><init>(Ljava/lang/Object;)V\nPLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;\nPLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;\nPLkotlinx/coroutines/flow/StateFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/StateFlowImpl;->setValue(Ljava/lang/Object;)V\nPLkotlinx/coroutines/flow/StateFlowSlot;-><clinit>()V\nPLkotlinx/coroutines/flow/StateFlowSlot;-><init>()V\nPLkotlinx/coroutines/flow/internal/AbortFlowException;-><init>(Lkotlinx/coroutines/flow/FlowCollector;)V\nPLkotlinx/coroutines/flow/internal/AbortFlowException;->fillInStackTrace()Ljava/lang/Throwable;\nPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;-><init>()V\nPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSubscriptionCount()Lkotlinx/coroutines/flow/StateFlow;\nPLkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;-><init>()V\nPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;-><init>(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/internal/ChannelFlow;->dropChannelOperators()Lkotlinx/coroutines/flow/Flow;\nPLkotlinx/coroutines/flow/internal/ChannelFlow;->fuse(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow;\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2$1;-><init>(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/internal/SendingCollector;Lkotlinx/coroutines/sync/Semaphore;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2$emit$1;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2;-><init>(Lkotlinx/coroutines/Job;Lkotlinx/coroutines/sync/Semaphore;Lkotlinx/coroutines/channels/ProducerScope;Lkotlinx/coroutines/flow/internal/SendingCollector;)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge$collectTo$2;->emit(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge;-><init>(Lkotlinx/coroutines/flow/Flow;ILkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/ChannelFlowMerge;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel;\nPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;-><init>(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;-><init>(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;-><init>(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;-><init>(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;-><init>(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;I)V\nPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->create(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/internal/ChannelFlow;\nPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/ChildCancelledException;->fillInStackTrace()Ljava/lang/Throwable;\nPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;-><init>(Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;-><init>(Lkotlinx/coroutines/channels/Channel;I)V\nPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;-><init>([Lkotlinx/coroutines/flow/Flow;ILjava/util/concurrent/atomic/AtomicInteger;Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;\nPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;-><init>([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/DownstreamExceptionElement;-><clinit>()V\nPLkotlinx/coroutines/flow/internal/DownstreamExceptionElement;-><init>(Ljava/lang/Throwable;)V\nPLkotlinx/coroutines/flow/internal/FlowCoroutine;-><init>(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V\nPLkotlinx/coroutines/flow/internal/FlowCoroutine;->childCancelled(Ljava/lang/Throwable;)Z\nPLkotlinx/coroutines/flow/internal/NoOpContinuation;-><clinit>()V\nPLkotlinx/coroutines/flow/internal/NoOpContinuation;-><init>()V\nPLkotlinx/coroutines/flow/internal/NopCollector;-><clinit>()V\nPLkotlinx/coroutines/flow/internal/NopCollector;-><init>()V\nPLkotlinx/coroutines/flow/internal/NopCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/SafeCollector;->getContext()Lkotlin/coroutines/CoroutineContext;\nPLkotlinx/coroutines/flow/internal/SafeCollector;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/SafeCollector;->releaseIntercepted()V\nPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;-><clinit>()V\nPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;-><init>()V\nPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\nPLkotlinx/coroutines/flow/internal/SafeCollectorKt;-><clinit>()V\nPLkotlinx/coroutines/flow/internal/SendingCollector;-><init>(Lkotlinx/coroutines/channels/SendChannel;)V\nPLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;-><init>(I)V\nPLkotlinx/coroutines/internal/AtomicOp;-><clinit>()V\nPLkotlinx/coroutines/internal/ConcurrentKt;-><clinit>()V\nPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;-><clinit>()V\nPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;-><init>(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)V\nPLkotlinx/coroutines/internal/ContextScope;-><init>(Lkotlin/coroutines/CoroutineContext;)V\nPLkotlinx/coroutines/internal/ContextScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext;\nPLkotlinx/coroutines/internal/DispatchedContinuation;-><clinit>()V\nPLkotlinx/coroutines/internal/DispatchedContinuation;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation;\nPLkotlinx/coroutines/internal/DispatchedContinuation;->postponeCancellation(Ljava/lang/Throwable;)Z\nPLkotlinx/coroutines/internal/LimitedDispatcher;-><init>(Lkotlinx/coroutines/CoroutineDispatcher;I)V\nPLkotlinx/coroutines/internal/LimitedDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V\nPLkotlinx/coroutines/internal/LimitedDispatcher;->run()V\nPLkotlinx/coroutines/internal/LimitedDispatcher;->tryAllocateWorker()Z\nPLkotlinx/coroutines/internal/LockFreeLinkedListNode;-><clinit>()V\nPLkotlinx/coroutines/internal/LockFreeTaskQueue;-><clinit>()V\nPLkotlinx/coroutines/internal/LockFreeTaskQueue;-><init>(Z)V\nPLkotlinx/coroutines/internal/LockFreeTaskQueue;->getSize()I\nPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;-><clinit>()V\nPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;-><init>(IZ)V\nPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->getSize()I\nPLkotlinx/coroutines/internal/MainDispatcherLoader;-><clinit>()V\nPLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V\nPLkotlinx/coroutines/internal/ScopeCoroutine;->afterResume(Ljava/lang/Object;)V\nPLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z\nPLkotlinx/coroutines/internal/Segment;-><clinit>()V\nPLkotlinx/coroutines/internal/Segment;-><init>(JLkotlinx/coroutines/internal/Segment;I)V\nPLkotlinx/coroutines/internal/Symbol;-><init>(Ljava/lang/String;)V\nPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;-><clinit>()V\nPLkotlinx/coroutines/internal/ThreadContextKt;-><clinit>()V\nPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;-><clinit>()V\nPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;-><init>(Lkotlinx/coroutines/scheduling/CoroutineScheduler;I)V\nPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setIndexInArray(I)V\nPLkotlinx/coroutines/scheduling/CoroutineScheduler;-><clinit>()V\nPLkotlinx/coroutines/scheduling/CoroutineScheduler;-><init>(IIJLjava/lang/String;)V\nPLkotlinx/coroutines/scheduling/CoroutineScheduler;->createNewWorker()I\nPLkotlinx/coroutines/scheduling/CoroutineScheduler;->runSafely(Lkotlinx/coroutines/scheduling/Task;)V\nPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryCreateWorker(J)Z\nPLkotlinx/coroutines/scheduling/DefaultIoScheduler;-><clinit>()V\nPLkotlinx/coroutines/scheduling/DefaultIoScheduler;-><init>()V\nPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V\nPLkotlinx/coroutines/scheduling/DefaultScheduler;-><clinit>()V\nPLkotlinx/coroutines/scheduling/DefaultScheduler;-><init>()V\nPLkotlinx/coroutines/scheduling/GlobalQueue;-><init>()V\nPLkotlinx/coroutines/scheduling/NanoTimeSource;-><clinit>()V\nPLkotlinx/coroutines/scheduling/NanoTimeSource;-><init>()V\nPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;-><init>(IIJLjava/lang/String;)V\nPLkotlinx/coroutines/scheduling/Task;-><init>(JLorg/threeten/bp/chrono/Chronology$1;)V\nPLkotlinx/coroutines/scheduling/TaskImpl;-><init>(Ljava/lang/Runnable;JLorg/threeten/bp/chrono/Chronology$1;)V\nPLkotlinx/coroutines/scheduling/TaskImpl;->run()V\nPLkotlinx/coroutines/scheduling/TasksKt;-><clinit>()V\nPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;-><clinit>()V\nPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;-><init>()V\nPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V\nPLkotlinx/coroutines/scheduling/WorkQueue;-><clinit>()V\nPLkotlinx/coroutines/scheduling/WorkQueue;-><init>()V\nPLkotlinx/coroutines/scheduling/WorkQueue;->addLast(Lkotlinx/coroutines/scheduling/Task;)Lkotlinx/coroutines/scheduling/Task;\nPLkotlinx/coroutines/scheduling/WorkQueue;->getBufferSize$kotlinx_coroutines_core()I\nPLkotlinx/coroutines/sync/Empty;-><init>(Ljava/lang/Object;)V\nPLkotlinx/coroutines/sync/MutexImpl;-><clinit>()V\nPLkotlinx/coroutines/sync/MutexImpl;-><init>(Z)V\nPLkotlinx/coroutines/sync/MutexImpl;->lock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/sync/MutexImpl;->tryLock(Ljava/lang/Object;)Z\nPLkotlinx/coroutines/sync/MutexImpl;->unlock(Ljava/lang/Object;)V\nPLkotlinx/coroutines/sync/SemaphoreImpl;-><clinit>()V\nPLkotlinx/coroutines/sync/SemaphoreImpl;-><init>(II)V\nPLkotlinx/coroutines/sync/SemaphoreImpl;->acquire(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;\nPLkotlinx/coroutines/sync/SemaphoreKt;-><clinit>()V\nPLkotlinx/coroutines/sync/SemaphoreSegment;-><init>(JLkotlinx/coroutines/sync/SemaphoreSegment;I)V\nPLokhttp3/CertificatePinner$Builder;-><init>(I)V\nPLokhttp3/ConnectionPool$1;-><init>(Ljava/lang/Object;I)V\nPLokhttp3/ConnectionPool$1;->run()V\nPLokhttp3/ConnectionSpec$Builder;-><init>()V\nPLokhttp3/Dns$1;-><clinit>()V\nPLokhttp3/Dns$1;-><init>()V\nPLokhttp3/Headers$Builder;-><init>(I)V\nPLokhttp3/Request$Builder;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V\nPLokhttp3/RequestBody;-><clinit>()V\nPLokhttp3/RequestBody;-><init>()V\nPLokhttp3/RequestBody;->assertInstantiable(Ljava/lang/Class;)V\nPLokhttp3/RequestBody;->bytesToStringUppercase([BZ)Ljava/lang/String;\nPLokhttp3/RequestBody;->closeOrLog(Ljava/io/Closeable;Ljava/lang/String;)V\nPLokhttp3/RequestBody;->convertMemInfoToBytes(Ljava/lang/String;Ljava/lang/String;I)J\nPLokhttp3/RequestBody;->createInstanceIdFrom([Ljava/lang/String;)Ljava/lang/String;\nPLokhttp3/RequestBody;->extractFieldFromSystemFile(Ljava/io/File;Ljava/lang/String;)Ljava/lang/String;\nPLokhttp3/RequestBody;->flushOrLog(Ljava/io/Flushable;Ljava/lang/String;)V\nPLokhttp3/RequestBody;->getBooleanResourceValue(Landroid/content/Context;Ljava/lang/String;Z)Z\nPLokhttp3/RequestBody;->getColor(Landroid/content/Context;II)I\nPLokhttp3/RequestBody;->getDeviceState(Landroid/content/Context;)I\nPLokhttp3/RequestBody;->getMappingFileId(Landroid/content/Context;)Ljava/lang/String;\nPLokhttp3/RequestBody;->getResourcesIdentifier(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I\nPLokhttp3/RequestBody;->getSharedPrefs(Landroid/content/Context;)Landroid/content/SharedPreferences;\nPLokhttp3/RequestBody;->getTotalRamInBytes()J\nPLokhttp3/RequestBody;->hexify([B)Ljava/lang/String;\nPLokhttp3/RequestBody;->isEmulator(Landroid/content/Context;)Z\nPLokhttp3/RequestBody;->isNullOrEmpty(Ljava/lang/String;)Z\nPLokhttp3/RequestBody;->isRooted(Landroid/content/Context;)Z\nPLokhttp3/RequestBody;->matchDestination$navigation_ui_release(Landroidx/navigation/NavDestination;I)Z\nPLokhttp3/RequestBody;->sha1(Ljava/lang/String;)Ljava/lang/String;\nPLokhttp3/internal/Util$1;-><init>(I)V\nPLokhttp3/internal/Util$1;->compare(Landroid/view/View;Landroid/view/View;)I\nPLokhttp3/internal/Util$1;->compare(Ljava/io/File;Ljava/io/File;)I\nPLokhttp3/internal/Util$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I\nPLokhttp3/internal/connection/RouteDatabase;-><init>(I)V\nPLokhttp3/internal/connection/RouteSelector$Selection;-><init>()V\nPLokhttp3/internal/http/HttpDate$1;-><init>(I)V\nPLokhttp3/internal/http/HttpDate$1;->initialValue()Ljava/lang/Object;\nPLokhttp3/internal/http/StatusLine;-><init>(I[Lcom/google/firebase/crashlytics/internal/stacktrace/StackTraceTrimmingStrategy;)V\nPLokhttp3/internal/http/StatusLine;-><init>(Lcom/bumptech/glide/load/engine/Engine$LazyDiskCacheProvider;)V\nPLokhttp3/internal/http/StatusLine;->build(Lcom/bumptech/glide/GlideContext;Ljava/lang/Object;Lcom/bumptech/glide/load/engine/EngineKey;Lcom/bumptech/glide/load/Key;IILjava/lang/Class;Ljava/lang/Class;Lcom/bumptech/glide/Priority;Lcom/bumptech/glide/load/engine/DiskCacheStrategy;Ljava/util/Map;ZZZLcom/bumptech/glide/load/Options;Lcom/bumptech/glide/load/engine/DecodeJob$Callback;)Lcom/bumptech/glide/load/engine/DecodeJob;\nPLokhttp3/internal/http2/Huffman$Node;-><init>(I)V\nPLokhttp3/internal/http2/Huffman$Node;-><init>(IILjava/util/Map;)V\nPLokhttp3/internal/http2/Huffman$Node;->zza()Z\nPLokhttp3/internal/platform/AndroidPlatform$CloseGuard;-><init>(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)V\nPLokio/Base64;-><clinit>()V\nPLokio/Base64;->call(Ljava/util/concurrent/Executor;Ljava/util/concurrent/Callable;)Lcom/google/android/gms/tasks/Task;\nPLokio/Base64;->checkElementNotNull(Ljava/lang/Object;I)Ljava/lang/Object;\nPLokio/Base64;->createCornerTreatment(I)Landroidx/core/R$dimen;\nPLokio/Base64;->createDefaultEdgeTreatment()Landroidx/compose/material/Strings$Companion;\nPLokio/Base64;->forResult(Ljava/lang/Object;)Lcom/google/android/gms/tasks/Task;\nPLokio/Base64;->generateDexKey(Ljava/lang/String;Ljava/lang/String;[B)Ljava/lang/String;\nPLokio/Base64;->getColorStateList(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/content/res/ColorStateList;\nPLokio/Base64;->getColorStateList(Landroid/content/Context;Lcom/google/firebase/iid/zzk;I)Landroid/content/res/ColorStateList;\nPLokio/Base64;->getData(Lcom/google/samples/apps/iosched/shared/result/Result;)Ljava/lang/Object;\nPLokio/Base64;->getDrawable(Landroid/content/Context;Landroid/content/res/TypedArray;I)Landroid/graphics/drawable/Drawable;\nPLokio/Base64;->parseColor(Ljava/lang/String;)I\nPLokio/Base64;->readClasses(Ljava/io/InputStream;I)[I\nPLokio/Base64;->readHeader(Ljava/io/InputStream;[B)[B\nPLokio/Base64;->readProfile(Ljava/io/InputStream;[BLjava/lang/String;)[Landroidx/profileinstaller/DexProfileData;\nPLokio/Base64;->setElevation(Landroid/view/View;F)V\nPLokio/Base64;->setParentAbsoluteElevation(Landroid/view/View;Lcom/google/android/material/shape/MaterialShapeDrawable;)V\nPLokio/Base64;->smear(I)I\nPLokio/Base64;->successOr(Lcom/google/samples/apps/iosched/shared/result/Result;Ljava/lang/Object;)Ljava/lang/Object;\nPLokio/Base64;->themeFromStorageKey(Ljava/lang/String;)Lcom/google/samples/apps/iosched/model/Theme;\nPLokio/Base64;->unboxState(Ljava/lang/Object;)Ljava/lang/Object;\nPLokio/Base64;->writeClasses(Ljava/io/OutputStream;Landroidx/profileinstaller/DexProfileData;)V\nPLokio/SegmentPool;-><clinit>()V\nPLokio/SegmentPool;-><init>()V\nPLokio/SegmentPool;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlowImpl;\nPLokio/SegmentPool;->convert(Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Landroid/graphics/drawable/Drawable;II)Lcom/bumptech/glide/load/engine/Resource;\nPLokio/SegmentPool;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z\nPLokio/SegmentPool;->safeMultiply(JJ)J\nPLokio/SegmentPool;->safeToInt(J)I\nPLorg/threeten/bp/DayOfWeek;-><clinit>()V\nPLorg/threeten/bp/DayOfWeek;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/DayOfWeek;->getValue()I\nPLorg/threeten/bp/DayOfWeek;->of(I)Lorg/threeten/bp/DayOfWeek;\nPLorg/threeten/bp/DayOfWeek;->values()[Lorg/threeten/bp/DayOfWeek;\nPLorg/threeten/bp/Duration;-><clinit>()V\nPLorg/threeten/bp/Duration;-><init>(JI)V\nPLorg/threeten/bp/Duration;->create(JI)Lorg/threeten/bp/Duration;\nPLorg/threeten/bp/Duration;->ofNanos(J)Lorg/threeten/bp/Duration;\nPLorg/threeten/bp/Duration;->ofSeconds(J)Lorg/threeten/bp/Duration;\nPLorg/threeten/bp/Duration;->ofSeconds(JJ)Lorg/threeten/bp/Duration;\nPLorg/threeten/bp/Instant;-><clinit>()V\nPLorg/threeten/bp/Instant;->compareTo(Lorg/threeten/bp/Instant;)I\nPLorg/threeten/bp/Instant;->now()Lorg/threeten/bp/Instant;\nPLorg/threeten/bp/Instant;->plus(JJ)Lorg/threeten/bp/Instant;\nPLorg/threeten/bp/Instant;->plusMillis(J)Lorg/threeten/bp/Instant;\nPLorg/threeten/bp/LocalDate;-><clinit>()V\nPLorg/threeten/bp/LocalDate;->create(ILorg/threeten/bp/Month;I)Lorg/threeten/bp/LocalDate;\nPLorg/threeten/bp/LocalDate;->get(Lorg/threeten/bp/temporal/TemporalField;)I\nPLorg/threeten/bp/LocalDate;->getDayOfWeek()Lorg/threeten/bp/DayOfWeek;\nPLorg/threeten/bp/LocalDate;->isSupported(Lorg/threeten/bp/temporal/TemporalField;)Z\nPLorg/threeten/bp/LocalDate;->of(III)Lorg/threeten/bp/LocalDate;\nPLorg/threeten/bp/LocalDate;->of(ILorg/threeten/bp/Month;I)Lorg/threeten/bp/LocalDate;\nPLorg/threeten/bp/LocalDate;->plus(JLorg/threeten/bp/temporal/TemporalUnit;)Lorg/threeten/bp/LocalDate;\nPLorg/threeten/bp/LocalDate;->plus(JLorg/threeten/bp/temporal/TemporalUnit;)Lorg/threeten/bp/temporal/Temporal;\nPLorg/threeten/bp/LocalDate;->with(Lorg/threeten/bp/temporal/TemporalAdjuster;)Lorg/threeten/bp/LocalDate;\nPLorg/threeten/bp/LocalDateTime;-><clinit>()V\nPLorg/threeten/bp/LocalDateTime;->isSupported(Lorg/threeten/bp/temporal/TemporalField;)Z\nPLorg/threeten/bp/LocalDateTime;->of(Lorg/threeten/bp/LocalDate;Lorg/threeten/bp/LocalTime;)Lorg/threeten/bp/LocalDateTime;\nPLorg/threeten/bp/LocalDateTime;->plusHours(J)Lorg/threeten/bp/LocalDateTime;\nPLorg/threeten/bp/LocalTime;-><clinit>()V\nPLorg/threeten/bp/LocalTime;->isSupported(Lorg/threeten/bp/temporal/TemporalField;)Z\nPLorg/threeten/bp/LocalTime;->of(II)Lorg/threeten/bp/LocalTime;\nPLorg/threeten/bp/Month;-><clinit>()V\nPLorg/threeten/bp/Month;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/Month;->getValue()I\nPLorg/threeten/bp/Month;->length(Z)I\nPLorg/threeten/bp/Month;->of(I)Lorg/threeten/bp/Month;\nPLorg/threeten/bp/Month;->values()[Lorg/threeten/bp/Month;\nPLorg/threeten/bp/Period;-><clinit>()V\nPLorg/threeten/bp/Period;-><init>(III)V\nPLorg/threeten/bp/ZoneId;-><clinit>()V\nPLorg/threeten/bp/ZoneId;-><init>()V\nPLorg/threeten/bp/ZoneId;->from(Lorg/threeten/bp/temporal/TemporalAccessor;)Lorg/threeten/bp/ZoneId;\nPLorg/threeten/bp/ZoneId;->of(Ljava/lang/String;)Lorg/threeten/bp/ZoneId;\nPLorg/threeten/bp/ZoneId;->systemDefault()Lorg/threeten/bp/ZoneId;\nPLorg/threeten/bp/ZoneOffset;-><clinit>()V\nPLorg/threeten/bp/ZoneOffset;-><init>(I)V\nPLorg/threeten/bp/ZoneOffset;->hashCode()I\nPLorg/threeten/bp/ZoneOffset;->ofTotalSeconds(I)Lorg/threeten/bp/ZoneOffset;\nPLorg/threeten/bp/ZoneRegion;-><clinit>()V\nPLorg/threeten/bp/ZoneRegion;-><init>(Ljava/lang/String;Lorg/threeten/bp/zone/ZoneRules;)V\nPLorg/threeten/bp/ZonedDateTime;-><clinit>()V\nPLorg/threeten/bp/ZonedDateTime;->from(Lorg/threeten/bp/temporal/TemporalAccessor;)Lorg/threeten/bp/ZonedDateTime;\nPLorg/threeten/bp/ZonedDateTime;->now()Lorg/threeten/bp/ZonedDateTime;\nPLorg/threeten/bp/ZonedDateTime;->parse(Ljava/lang/CharSequence;)Lorg/threeten/bp/ZonedDateTime;\nPLorg/threeten/bp/ZonedDateTime;->plusHours(J)Lorg/threeten/bp/ZonedDateTime;\nPLorg/threeten/bp/ZonedDateTime;->query(Lorg/threeten/bp/temporal/TemporalQuery;)Ljava/lang/Object;\nPLorg/threeten/bp/ZonedDateTime;->resolveInstant(Lorg/threeten/bp/LocalDateTime;)Lorg/threeten/bp/ZonedDateTime;\nPLorg/threeten/bp/chrono/ChronoZonedDateTime;->isAfter(Lorg/threeten/bp/chrono/ChronoZonedDateTime;)Z\nPLorg/threeten/bp/chrono/ChronoZonedDateTime;->isBefore(Lorg/threeten/bp/chrono/ChronoZonedDateTime;)Z\nPLorg/threeten/bp/chrono/ChronoZonedDateTime;->query(Lorg/threeten/bp/temporal/TemporalQuery;)Ljava/lang/Object;\nPLorg/threeten/bp/chrono/Chronology$1;-><init>(I)V\nPLorg/threeten/bp/chrono/Chronology$1;-><init>(Landroidx/datastore/preferences/protobuf/ByteString$1;I)V\nPLorg/threeten/bp/chrono/Chronology$1;->queryFrom(Lorg/threeten/bp/temporal/TemporalAccessor;)Ljava/lang/Object;\nPLorg/threeten/bp/chrono/Chronology$1;->queryFrom(Lorg/threeten/bp/temporal/TemporalAccessor;)Lorg/threeten/bp/ZoneId;\nPLorg/threeten/bp/chrono/Chronology;-><clinit>()V\nPLorg/threeten/bp/chrono/Chronology;-><init>()V\nPLorg/threeten/bp/chrono/Chronology;->equals(Ljava/lang/Object;)Z\nPLorg/threeten/bp/chrono/IsoChronology;-><clinit>()V\nPLorg/threeten/bp/chrono/IsoChronology;-><init>()V\nPLorg/threeten/bp/format/DateTimeBuilder;-><init>()V\nPLorg/threeten/bp/format/DateTimeBuilder;->checkDate(Lorg/threeten/bp/LocalDate;)V\nPLorg/threeten/bp/format/DateTimeBuilder;->crossCheck(Lorg/threeten/bp/temporal/TemporalAccessor;)V\nPLorg/threeten/bp/format/DateTimeBuilder;->getLong(Lorg/threeten/bp/temporal/TemporalField;)J\nPLorg/threeten/bp/format/DateTimeBuilder;->isSupported(Lorg/threeten/bp/temporal/TemporalField;)Z\nPLorg/threeten/bp/format/DateTimeBuilder;->mergeDate(Lorg/threeten/bp/format/ResolverStyle;)V\nPLorg/threeten/bp/format/DateTimeBuilder;->mergeInstantFields()V\nPLorg/threeten/bp/format/DateTimeBuilder;->mergeTime(Lorg/threeten/bp/format/ResolverStyle;)V\nPLorg/threeten/bp/format/DateTimeBuilder;->query(Lorg/threeten/bp/temporal/TemporalQuery;)Ljava/lang/Object;\nPLorg/threeten/bp/format/DateTimeFormatter;-><clinit>()V\nPLorg/threeten/bp/format/DateTimeFormatter;->parseToBuilder(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Lorg/threeten/bp/format/DateTimeBuilder;\nPLorg/threeten/bp/format/DateTimeFormatter;->withChronology(Lorg/threeten/bp/chrono/Chronology;)Lorg/threeten/bp/format/DateTimeFormatter;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$2;-><init>(Lorg/threeten/bp/format/DateTimeFormatterBuilder;Lorg/threeten/bp/format/SimpleDateTimeTextProvider$LocaleStore;)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$CharLiteralPrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$CompositePrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$FractionPrinterParser;-><init>(Lorg/threeten/bp/temporal/TemporalField;IIZ)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$FractionPrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$InstantPrinterParser;-><init>(I)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;-><clinit>()V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;-><init>(Lorg/threeten/bp/temporal/TemporalField;IIII)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->getValue(Lcom/google/firebase/iid/zzab;J)J\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->setValue(Lorg/threeten/bp/format/DateTimeParseContext;JII)I\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->withFixedWidth()Lorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;->withSubsequentWidth(I)Lorg/threeten/bp/format/DateTimeFormatterBuilder$NumberPrinterParser;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;-><clinit>()V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;-><init>(Ljava/lang/String;Ljava/lang/String;)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;->parseNumber([IILjava/lang/CharSequence;Z)Z\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$SettingsParser;-><clinit>()V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$SettingsParser;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$SettingsParser;->parse(Lorg/threeten/bp/format/DateTimeParseContext;Ljava/lang/CharSequence;I)I\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$SettingsParser;->print(Lcom/google/firebase/iid/zzab;Ljava/lang/StringBuilder;)Z\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$StringLiteralPrinterParser;-><init>(Ljava/lang/Object;I)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder$ZoneIdPrinterParser;-><init>(Lorg/threeten/bp/temporal/TemporalQuery;Ljava/lang/String;)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;-><clinit>()V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;-><init>(Lorg/threeten/bp/format/DateTimeFormatterBuilder;Z)V\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->append(Lorg/threeten/bp/format/DateTimeFormatter;)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendFraction(Lorg/threeten/bp/temporal/TemporalField;IIZ)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendLiteral(Ljava/lang/String;)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendOffset(Ljava/lang/String;Ljava/lang/String;)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendText(Lorg/threeten/bp/temporal/TemporalField;Ljava/util/Map;)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->appendValue$enumunboxing$(Lorg/threeten/bp/temporal/TemporalField;III)Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->optionalEnd()Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->optionalStart()Lorg/threeten/bp/format/DateTimeFormatterBuilder;\nPLorg/threeten/bp/format/DateTimeFormatterBuilder;->toFormatter(Lorg/threeten/bp/format/ResolverStyle;)Lorg/threeten/bp/format/DateTimeFormatter;\nPLorg/threeten/bp/format/DateTimeParseContext$Parsed;-><init>(Lorg/threeten/bp/format/DateTimeParseContext;)V\nPLorg/threeten/bp/format/DateTimeParseContext;-><init>(Lorg/threeten/bp/format/DateTimeFormatter;)V\nPLorg/threeten/bp/format/DateTimeParseContext;->charEquals(CC)Z\nPLorg/threeten/bp/format/DateTimeParseContext;->currentParsed()Lorg/threeten/bp/format/DateTimeParseContext$Parsed;\nPLorg/threeten/bp/format/DateTimeParseContext;->endOptional(Z)V\nPLorg/threeten/bp/format/DateTimeParseContext;->setParsedField(Lorg/threeten/bp/temporal/TemporalField;JII)I\nPLorg/threeten/bp/format/DateTimeParseContext;->subSequenceEquals(Ljava/lang/CharSequence;ILjava/lang/CharSequence;II)Z\nPLorg/threeten/bp/format/DateTimeTextProvider$ProviderSingleton;-><clinit>()V\nPLorg/threeten/bp/format/DateTimeTextProvider;-><clinit>()V\nPLorg/threeten/bp/format/DateTimeTextProvider;-><init>()V\nPLorg/threeten/bp/format/DecimalStyle;-><clinit>()V\nPLorg/threeten/bp/format/DecimalStyle;-><init>(CCCC)V\nPLorg/threeten/bp/format/ResolverStyle;-><clinit>()V\nPLorg/threeten/bp/format/ResolverStyle;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/format/SimpleDateTimeTextProvider$LocaleStore;-><init>(Ljava/util/Map;)V\nPLorg/threeten/bp/format/SimpleDateTimeTextProvider;-><clinit>()V\nPLorg/threeten/bp/format/SimpleDateTimeTextProvider;-><init>()V\nPLorg/threeten/bp/format/SimpleDateTimeTextProvider;->createLocaleStore(Ljava/util/Map;)Lorg/threeten/bp/format/SimpleDateTimeTextProvider$LocaleStore;\nPLorg/threeten/bp/format/TextStyle;-><clinit>()V\nPLorg/threeten/bp/format/TextStyle;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/temporal/ChronoField;-><clinit>()V\nPLorg/threeten/bp/temporal/ChronoField;-><init>(Ljava/lang/String;ILjava/lang/String;Lorg/threeten/bp/temporal/TemporalUnit;Lorg/threeten/bp/temporal/TemporalUnit;Lorg/threeten/bp/temporal/ValueRange;)V\nPLorg/threeten/bp/temporal/ChronoField;->isDateBased()Z\nPLorg/threeten/bp/temporal/ChronoField;->range()Lorg/threeten/bp/temporal/ValueRange;\nPLorg/threeten/bp/temporal/ChronoField;->resolve(Ljava/util/Map;Lorg/threeten/bp/temporal/TemporalAccessor;Lorg/threeten/bp/format/ResolverStyle;)Lorg/threeten/bp/temporal/TemporalAccessor;\nPLorg/threeten/bp/temporal/ChronoUnit;-><clinit>()V\nPLorg/threeten/bp/temporal/ChronoUnit;-><init>(Ljava/lang/String;ILjava/lang/String;Lorg/threeten/bp/Duration;)V\nPLorg/threeten/bp/temporal/IsoFields$Field$1;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/temporal/IsoFields$Field$2;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/temporal/IsoFields$Field$3;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/temporal/IsoFields$Field$4;-><init>(Ljava/lang/String;I)V\nPLorg/threeten/bp/temporal/IsoFields$Field;-><clinit>()V\nPLorg/threeten/bp/temporal/IsoFields$Field;-><init>(Ljava/lang/String;ILandroidx/appcompat/R$bool;)V\nPLorg/threeten/bp/temporal/IsoFields$Unit;-><clinit>()V\nPLorg/threeten/bp/temporal/IsoFields$Unit;-><init>(Ljava/lang/String;ILjava/lang/String;Lorg/threeten/bp/Duration;)V\nPLorg/threeten/bp/temporal/IsoFields;-><clinit>()V\nPLorg/threeten/bp/temporal/ValueRange;-><init>(JJJJ)V\nPLorg/threeten/bp/temporal/ValueRange;->of(JJ)Lorg/threeten/bp/temporal/ValueRange;\nPLorg/threeten/bp/temporal/ValueRange;->of(JJJ)Lorg/threeten/bp/temporal/ValueRange;\nPLorg/threeten/bp/temporal/ValueRange;->of(JJJJ)Lorg/threeten/bp/temporal/ValueRange;\nPLorg/threeten/bp/zone/Ser;->readEpochSec(Ljava/io/DataInput;)J\nPLorg/threeten/bp/zone/Ser;->readOffset(Ljava/io/DataInput;)Lorg/threeten/bp/ZoneOffset;\nPLorg/threeten/bp/zone/StandardZoneRules;-><init>([J[Lorg/threeten/bp/ZoneOffset;[J[Lorg/threeten/bp/ZoneOffset;[Lorg/threeten/bp/zone/ZoneOffsetTransitionRule;)V\nPLorg/threeten/bp/zone/TzdbZoneRulesProvider$Version;-><init>(Ljava/lang/String;[Ljava/lang/String;[SLjava/util/concurrent/atomic/AtomicReferenceArray;)V\nPLorg/threeten/bp/zone/TzdbZoneRulesProvider$Version;->createRule(S)Lorg/threeten/bp/zone/ZoneRules;\nPLorg/threeten/bp/zone/TzdbZoneRulesProvider;-><clinit>()V\nPLorg/threeten/bp/zone/TzdbZoneRulesProvider;-><init>(Ljava/io/InputStream;)V\nPLorg/threeten/bp/zone/TzdbZoneRulesProvider;->getRules(Ljava/lang/String;Z)Lorg/threeten/bp/zone/ZoneRules;\nPLorg/threeten/bp/zone/TzdbZoneRulesProvider;->load(Ljava/io/InputStream;)Z\nPLorg/threeten/bp/zone/TzdbZoneRulesProvider;->registerProvider(Lorg/threeten/bp/zone/TzdbZoneRulesProvider;)V\nPLorg/threeten/bp/zone/ZoneOffsetTransition;-><init>(Lorg/threeten/bp/LocalDateTime;Lorg/threeten/bp/ZoneOffset;Lorg/threeten/bp/ZoneOffset;)V\nPLorg/threeten/bp/zone/ZoneOffsetTransitionRule;-><init>(Lorg/threeten/bp/Month;ILorg/threeten/bp/DayOfWeek;Lorg/threeten/bp/LocalTime;ZILorg/threeten/bp/ZoneOffset;Lorg/threeten/bp/ZoneOffset;Lorg/threeten/bp/ZoneOffset;)V\nPLorg/threeten/bp/zone/ZoneOffsetTransitionRule;->readExternal(Ljava/io/DataInput;)Lorg/threeten/bp/zone/ZoneOffsetTransitionRule;\nPLorg/threeten/bp/zone/ZoneRulesInitializer$ServiceLoaderZoneRulesInitializer;-><init>()V\nPLorg/threeten/bp/zone/ZoneRulesInitializer$ServiceLoaderZoneRulesInitializer;->initializeProviders()V\nPLorg/threeten/bp/zone/ZoneRulesInitializer;-><clinit>()V\nPLorg/threeten/bp/zone/ZoneRulesInitializer;-><init>()V\nPLtimber/log/Timber$Forest;-><init>(Lkotlin/LazyKt__LazyKt;)V\nPLtimber/log/Timber$Forest;->d(Ljava/lang/String;[Ljava/lang/Object;)V\nPLtimber/log/Timber$Tree;-><init>()V\nPLtimber/log/Timber$Tree;->d(Ljava/lang/String;[Ljava/lang/Object;)V\nPLtimber/log/Timber$Tree;->prepareLog(ILjava/lang/Throwable;Ljava/lang/String;[Ljava/lang/Object;)V\nPLtimber/log/Timber;-><clinit>()V\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/MainApplication.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched\n\nimport android.app.Application\nimport dagger.hilt.android.HiltAndroidApp\n\n@HiltAndroidApp\nclass MainApplication : Application()\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/di/AppModule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.di\n\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.net.ConnectivityManager\nimport android.net.wifi.WifiManager\nimport com.google.gson.Gson\nimport com.google.gson.GsonBuilder\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.data.agenda.AgendaRepository\nimport com.google.samples.apps.iosched.shared.data.agenda.DefaultAgendaRepository\nimport com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource\nimport com.google.samples.apps.iosched.shared.data.db.AppDatabase\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.DefaultDispatcher\nimport com.google.samples.apps.iosched.shared.di.MainThreadHandler\nimport com.google.samples.apps.iosched.shared.domain.internal.IOSchedHandler\nimport com.google.samples.apps.iosched.shared.domain.internal.IOSchedMainHandler\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.util.FirebaseAnalyticsHelper\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.SupervisorJob\nimport javax.inject.Singleton\n\n/**\n * Defines all the classes that need to be provided in the scope of the app.\n *\n * Define here all objects that are shared throughout the app, like SharedPreferences, navigators or\n * others. If some of those objects are singletons, they should be annotated with `@Singleton`.\n */\n@InstallIn(SingletonComponent::class)\n@Module\nclass AppModule {\n\n    @Provides\n    fun provideWifiManager(@ApplicationContext context: Context): WifiManager =\n        context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager\n\n    @Provides\n    fun provideConnectivityManager(@ApplicationContext context: Context): ConnectivityManager =\n        context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)\n            as ConnectivityManager\n\n    @Provides\n    fun provideClipboardManager(@ApplicationContext context: Context): ClipboardManager =\n        context.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE)\n            as ClipboardManager\n\n    @ApplicationScope\n    @Singleton\n    @Provides\n    fun providesApplicationScope(\n        @DefaultDispatcher defaultDispatcher: CoroutineDispatcher\n    ): CoroutineScope = CoroutineScope(SupervisorJob() + defaultDispatcher)\n\n    @Singleton\n    @Provides\n    @MainThreadHandler\n    fun provideMainThreadHandler(): IOSchedHandler = IOSchedMainHandler()\n\n    @Singleton\n    @Provides\n    fun provideAnalyticsHelper(\n        @ApplicationScope applicationScope: CoroutineScope,\n        signInDelegate: SignInViewModelDelegate,\n        preferenceStorage: PreferenceStorage\n    ): AnalyticsHelper =\n        FirebaseAnalyticsHelper(applicationScope, signInDelegate, preferenceStorage)\n\n    @Singleton\n    @Provides\n    fun provideAgendaRepository(appConfigDataSource: AppConfigDataSource): AgendaRepository =\n        DefaultAgendaRepository(appConfigDataSource)\n\n    @Singleton\n    @Provides\n    fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {\n        return AppDatabase.buildDatabase(context)\n    }\n\n    @Singleton\n    @Provides\n    fun provideGson(): Gson {\n        return GsonBuilder().create()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/di/CoroutinesModule.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.di\n\nimport com.google.samples.apps.iosched.shared.di.DefaultDispatcher\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport com.google.samples.apps.iosched.shared.di.MainImmediateDispatcher\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\n\n@InstallIn(SingletonComponent::class)\n@Module\nobject CoroutinesModule {\n\n    @DefaultDispatcher\n    @Provides\n    fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default\n\n    @IoDispatcher\n    @Provides\n    fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO\n\n    @MainDispatcher\n    @Provides\n    fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main\n\n    @MainImmediateDispatcher\n    @Provides\n    fun providesMainImmediateDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/di/PreferencesStorageModule.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.di\n\nimport android.content.Context\nimport androidx.datastore.preferences.SharedPreferencesMigration\nimport androidx.datastore.preferences.preferencesDataStore\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nobject PreferencesStorageModule {\n\n    val Context.dataStore by preferencesDataStore(\n        name = DataStorePreferenceStorage.PREFS_NAME,\n        produceMigrations = { context ->\n            listOf(\n                SharedPreferencesMigration(\n                    context,\n                    DataStorePreferenceStorage.PREFS_NAME\n                )\n            )\n        }\n    )\n\n    @Singleton\n    @Provides\n    fun providePreferenceStorage(@ApplicationContext context: Context): PreferenceStorage =\n        DataStorePreferenceStorage(context.dataStore)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/DispatchInsetsNavHostFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport android.os.Bundle\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.forEach\nimport androidx.navigation.fragment.NavHostFragment\n\nclass DispatchInsetsNavHostFragment : NavHostFragment() {\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        view.setOnApplyWindowInsetsListener { v, insets ->\n            // During fragment transitions, multiple fragment's view hierarchies can be added at the\n            // same time. If one consumes window insets, the other might not be layed out properly.\n            // To workaround that, make sure we dispatch the insets to all children, regardless of\n            // how they are consumed.\n            (v as? ViewGroup)?.forEach { child ->\n                child.dispatchApplyWindowInsets(insets)\n            }\n            insets\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/LaunchViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.shared.domain.prefs.OnboardingCompletedUseCase\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToMainActivityAction\nimport com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToOnboardingAction\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.SharingStarted.Companion.Eagerly\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport javax.inject.Inject\n\n/**\n * Logic for determining which screen to send users to on app launch.\n */\n@HiltViewModel\nclass LaunchViewModel @Inject constructor(\n    onboardingCompletedUseCase: OnboardingCompletedUseCase\n) : ViewModel() {\n    val launchDestination = onboardingCompletedUseCase(Unit).map { result ->\n        if (result.data == false) {\n            NavigateToOnboardingAction\n        } else {\n            NavigateToMainActivityAction\n        }\n    }.stateIn(viewModelScope, Eagerly, Loading)\n}\n\nsealed class LaunchNavigatonAction {\n    object NavigateToOnboardingAction : LaunchNavigatonAction()\n    object NavigateToMainActivityAction : LaunchNavigatonAction()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/LauncherActivity.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToMainActivityAction\nimport com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToOnboardingAction\nimport com.google.samples.apps.iosched.ui.onboarding.OnboardingActivity\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\n\n/**\n * A 'Trampoline' activity for sending users to an appropriate screen on launch.\n */\n@AndroidEntryPoint\nclass LauncherActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val viewModel: LaunchViewModel by viewModels()\n\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                viewModel.launchDestination.collect { action ->\n                    when (action) {\n                        is NavigateToMainActivityAction -> startActivity(\n                            Intent(this@LauncherActivity, MainActivity::class.java)\n                        )\n                        is NavigateToOnboardingAction -> startActivity(\n                            Intent(this@LauncherActivity, OnboardingActivity::class.java)\n                        )\n                    }\n                    finish()\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/MainActivity.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.net.ConnectivityManager\nimport android.os.Bundle\nimport android.view.Menu\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.graphics.Insets\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.isVisible\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.navigation.NavController\nimport androidx.navigation.fragment.NavHostFragment\nimport androidx.navigation.ui.AppBarConfiguration\nimport androidx.navigation.ui.setupWithNavController\nimport com.firebase.ui.auth.IdpResponse\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.ar.ArActivity\nimport com.google.samples.apps.iosched.databinding.ActivityMainBinding\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.di.CodelabsEnabledFlag\nimport com.google.samples.apps.iosched.shared.di.ExploreArEnabledFlag\nimport com.google.samples.apps.iosched.shared.di.MapFeatureEnabledFlag\nimport com.google.samples.apps.iosched.shared.domain.ar.ArConstants\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessage\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.signin.SignInDialogFragment\nimport com.google.samples.apps.iosched.ui.signin.SignOutDialogFragment\nimport com.google.samples.apps.iosched.util.HeightTopWindowInsetsListener\nimport com.google.samples.apps.iosched.util.signin.FirebaseAuthErrorCodeConverter\nimport com.google.samples.apps.iosched.util.updateForTheme\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport java.util.UUID\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass MainActivity : AppCompatActivity(), NavigationHost {\n\n    companion object {\n        /** Key for an int extra defining the initial navigation target. */\n        const val EXTRA_NAVIGATION_ID = \"extra.NAVIGATION_ID\"\n\n        private const val NAV_ID_NONE = -1\n\n        private const val DIALOG_SIGN_IN = \"dialog_sign_in\"\n        private const val DIALOG_SIGN_OUT = \"dialog_sign_out\"\n\n        private val TOP_LEVEL_DESTINATIONS = setOf(\n            R.id.navigation_feed,\n            R.id.navigation_schedule,\n            R.id.navigation_map,\n            R.id.navigation_info,\n            R.id.navigation_agenda,\n            R.id.navigation_codelabs,\n            R.id.navigation_settings\n        )\n    }\n\n    @Inject\n    lateinit var snackbarMessageManager: SnackbarMessageManager\n\n    @Inject\n    lateinit var connectivityManager: ConnectivityManager\n\n    @Inject\n    lateinit var analyticsHelper: AnalyticsHelper\n\n    @Inject\n    @JvmField\n    @MapFeatureEnabledFlag\n    var mapFeatureEnabled: Boolean = false\n\n    @Inject\n    @JvmField\n    @CodelabsEnabledFlag\n    var codelabsFeatureEnabled: Boolean = false\n\n    @Inject\n    @JvmField\n    @ExploreArEnabledFlag\n    var exploreArFeatureEnabled: Boolean = false\n\n    private val viewModel: MainActivityViewModel by viewModels()\n\n    private lateinit var binding: ActivityMainBinding\n\n    private lateinit var navController: NavController\n    private lateinit var navHostFragment: NavHostFragment\n    private var currentNavId = NAV_ID_NONE\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        // Update for Dark Mode straight away\n        updateForTheme(viewModel.currentTheme)\n        WindowCompat.setDecorFitsSystemWindows(window, false)\n\n        binding = ActivityMainBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        binding.statusBarScrim.setOnApplyWindowInsetsListener(HeightTopWindowInsetsListener)\n\n        navHostFragment = supportFragmentManager\n            .findFragmentById(R.id.nav_host_fragment) as NavHostFragment\n\n        navController = navHostFragment.navController\n        navController.addOnDestinationChangedListener { _, destination, _ ->\n            currentNavId = destination.id\n            // TODO: hide nav if not a top-level destination?\n        }\n\n        // Either of two different navigation views might exist depending on the configuration.\n        binding.bottomNavigation?.apply {\n            configureNavMenu(menu)\n            setupWithNavController(navController)\n            setOnItemReselectedListener { } // prevent navigating to the same item\n        }\n        binding.navigationRail?.apply {\n            configureNavMenu(menu)\n            setupWithNavController(navController)\n            setOnItemReselectedListener { } // prevent navigating to the same item\n        }\n\n        if (savedInstanceState == null) {\n            currentNavId = navController.graph.startDestinationId\n            val requestedNavId = intent.getIntExtra(EXTRA_NAVIGATION_ID, currentNavId)\n            navigateTo(requestedNavId)\n        }\n\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                launch {\n                    viewModel.navigationActions.collect { action ->\n                        when (action) {\n                            MainNavigationAction.OpenSignIn -> openSignInDialog()\n                            MainNavigationAction.OpenSignOut -> openSignOutDialog()\n                        }\n                    }\n                }\n                launch {\n                    viewModel.theme.collect { theme ->\n                        updateForTheme(theme)\n                    }\n                }\n                // AR-related Flows\n                launch {\n                    viewModel.arCoreAvailability.collect { result ->\n                        // Do nothing - activate flow\n                        Timber.d(\"ArCoreAvailability = $result\")\n                    }\n                }\n                launch {\n                    viewModel.pinnedSessionsJson.collect { /* Do nothing - activate flow */ }\n                }\n                launch {\n                    viewModel.canSignedInUserDemoAr.collect { /* Do nothing - activate flow  */ }\n                }\n            }\n        }\n\n        binding.navigationRail?.let {\n            ViewCompat.setOnApplyWindowInsetsListener(it) { view, insets ->\n                // Pad the Navigation Rail so its content is not behind system bars.\n                val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())\n                view.updatePadding(top = systemBars.top, bottom = systemBars.bottom)\n                insets\n            }\n        }\n        ViewCompat.setOnApplyWindowInsetsListener(binding.rootContainer) { view, insets ->\n            // Hide the bottom navigation view whenever the keyboard is visible.\n            val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime())\n            binding.bottomNavigation?.isVisible = !imeVisible\n\n            // If we're showing the bottom navigation, add bottom padding. Also, add left and right\n            // padding since there's no better we can do with horizontal insets.\n            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())\n            val bottomPadding = if (binding.bottomNavigation?.isVisible == true) {\n                systemBars.bottom\n            } else 0\n            view.updatePadding(\n                left = systemBars.left,\n                right = systemBars.right,\n                bottom = bottomPadding\n            )\n            // Consume the insets we've used.\n            WindowInsetsCompat.Builder(insets).setInsets(\n                WindowInsetsCompat.Type.systemBars(),\n                Insets.of(0, systemBars.top, 0, systemBars.bottom - bottomPadding)\n            ).build()\n        }\n    }\n\n    private fun configureNavMenu(menu: Menu) {\n        menu.findItem(R.id.navigation_map)?.isVisible = mapFeatureEnabled\n        menu.findItem(R.id.navigation_codelabs)?.isVisible = codelabsFeatureEnabled\n        menu.findItem(R.id.navigation_explore_ar)?.apply {\n            // Handle launching new activities, otherwise assume the destination is handled\n            // by the nav graph. We want to launch a new Activity for only the AR menu item.\n            isVisible = exploreArFeatureEnabled\n            setOnMenuItemClickListener {\n                if (connectivityManager.activeNetworkInfo?.isConnected == true) {\n                    if (viewModel.arCoreAvailability.value?.isSupported == true) {\n                        analyticsHelper.logUiEvent(\n                            \"Navigate to Explore I/O ARCore supported\",\n                            AnalyticsActions.CLICK\n                        )\n                        openExploreAr()\n                    } else {\n                        analyticsHelper.logUiEvent(\n                            \"Navigate to Explore I/O ARCore NOT supported\",\n                            AnalyticsActions.CLICK\n                        )\n                        openArCoreNotSupported()\n                    }\n                } else {\n                    openNoConnection()\n                }\n                true\n            }\n        }\n    }\n\n    override fun registerToolbarWithNavigation(toolbar: Toolbar) {\n        val appBarConfiguration = AppBarConfiguration(TOP_LEVEL_DESTINATIONS)\n        toolbar.setupWithNavController(navController, appBarConfiguration)\n    }\n\n    override fun onRestoreInstanceState(savedInstanceState: Bundle) {\n        super.onRestoreInstanceState(savedInstanceState)\n        currentNavId = navController.currentDestination?.id ?: NAV_ID_NONE\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        if (resultCode == Activity.RESULT_CANCELED) {\n            Timber.d(\"An activity returned RESULT_CANCELED\")\n            val response = IdpResponse.fromResultIntent(data)\n            response?.error?.let {\n                snackbarMessageManager.addMessage(\n                    SnackbarMessage(\n                        messageId = FirebaseAuthErrorCodeConverter.convert(it.errorCode),\n                        requestChangeId = UUID.randomUUID().toString()\n                    )\n                )\n            }\n        }\n    }\n\n    override fun onUserInteraction() {\n        super.onUserInteraction()\n        getCurrentFragment()?.onUserInteraction()\n    }\n\n    private fun getCurrentFragment(): MainNavigationFragment? {\n        return navHostFragment\n            .childFragmentManager\n            .primaryNavigationFragment as? MainNavigationFragment\n    }\n\n    private fun navigateTo(navId: Int) {\n        if (navId == currentNavId) {\n            return // user tapped the current item\n        }\n        navController.navigate(navId)\n    }\n\n    private fun openSignInDialog() {\n        SignInDialogFragment().show(supportFragmentManager, DIALOG_SIGN_IN)\n    }\n\n    private fun openSignOutDialog() {\n        SignOutDialogFragment().show(supportFragmentManager, DIALOG_SIGN_OUT)\n    }\n\n    private fun openExploreAr() {\n        val intent = Intent(\n            this,\n            ArActivity::class.java\n        ).apply {\n            addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)\n            putExtra(ArConstants.CAN_SIGNED_IN_USER_DEMO_AR, viewModel.canSignedInUserDemoAr.value)\n            putExtra(ArConstants.PINNED_SESSIONS_JSON_KEY, viewModel.pinnedSessionsJson.value)\n        }\n        startActivity(intent)\n    }\n\n    private fun openNoConnection() {\n        navigateTo(R.id.navigation_no_network_ar)\n    }\n\n    private fun openArCoreNotSupported() {\n        navigateTo(R.id.navigation_phone_does_not_support_arcore)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/MainActivityViewModel.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.ar.core.ArCoreApk\nimport com.google.samples.apps.iosched.shared.domain.ar.LoadArDebugFlagUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadPinnedSessionsJsonUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.ui.theme.ThemedActivityDelegate\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.flow.transformLatest\nimport javax.inject.Inject\n\n@HiltViewModel\nclass MainActivityViewModel @Inject constructor(\n    signInViewModelDelegate: SignInViewModelDelegate,\n    themedActivityDelegate: ThemedActivityDelegate,\n    loadPinnedSessionsUseCase: LoadPinnedSessionsJsonUseCase,\n    loadArDebugFlagUseCase: LoadArDebugFlagUseCase,\n    @ApplicationContext context: Context\n) : ViewModel(),\n    SignInViewModelDelegate by signInViewModelDelegate,\n    ThemedActivityDelegate by themedActivityDelegate {\n\n    private val _navigationActions = Channel<MainNavigationAction>(Channel.CONFLATED)\n    val navigationActions = _navigationActions.receiveAsFlow()\n\n    val pinnedSessionsJson: StateFlow<String> = userInfo.transformLatest { user ->\n        val uid = user?.getUid()\n        if (uid != null) {\n            loadPinnedSessionsUseCase(uid).collect { result ->\n                if (result is Result.Success) {\n                    emit(result.data)\n                }\n            }\n        } else {\n            emit(\"\")\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, \"\")\n\n    val canSignedInUserDemoAr: StateFlow<Boolean> = userInfo.transformLatest {\n        val result = loadArDebugFlagUseCase(Unit)\n        if (result is Result.Success) {\n            emit(result.data)\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, false)\n\n    val arCoreAvailability: StateFlow<ArCoreApk.Availability?> = flow<ArCoreApk.Availability> {\n        var result: ArCoreApk.Availability? = null\n        while (result == null) {\n            val availability = ArCoreApk.getInstance().checkAvailability(context)\n            // If the availability is transient, we need to call availability check again\n            // as in https://developers.google.com/ar/develop/java/enable-arcore#check_supported\n            if (availability.isTransient) {\n                delay(1000)\n            } else {\n                result = availability\n                emit(result)\n            }\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, null)\n\n    fun onProfileClicked() {\n        if (isUserSignedInValue) {\n            _navigationActions.tryOffer(MainNavigationAction.OpenSignOut)\n        } else {\n            _navigationActions.tryOffer(MainNavigationAction.OpenSignIn)\n        }\n    }\n}\n\nsealed class MainNavigationAction {\n    object OpenSignIn : MainNavigationAction()\n    object OpenSignOut : MainNavigationAction()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/MainNavigation.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.widget.Toolbar\nimport androidx.fragment.app.Fragment\nimport com.google.samples.apps.iosched.R\n\n/**\n * To be implemented by components that host top-level navigation destinations.\n */\ninterface NavigationHost {\n\n    /** Called by MainNavigationFragment to setup it's toolbar with the navigation controller. */\n    fun registerToolbarWithNavigation(toolbar: Toolbar)\n}\n\n/**\n * To be implemented by main navigation destinations shown by a [NavigationHost].\n */\ninterface NavigationDestination {\n\n    /** Called by the host when the user interacts with it. */\n    fun onUserInteraction() {}\n}\n\n/**\n * Fragment representing a main navigation destination. This class handles wiring up the [Toolbar]\n * navigation icon if the fragment is attached to a [NavigationHost].\n */\nopen class MainNavigationFragment : Fragment(), NavigationDestination {\n\n    protected var navigationHost: NavigationHost? = null\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        if (context is NavigationHost) {\n            navigationHost = context\n        }\n    }\n\n    override fun onDetach() {\n        super.onDetach()\n        navigationHost = null\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        // If we have a toolbar and we are attached to a proper navigation host, set up the toolbar\n        // navigation icon.\n        val host = navigationHost ?: return\n        val mainToolbar: Toolbar = view.findViewById(R.id.toolbar) ?: return\n        mainToolbar.apply {\n            host.registerToolbarWithNavigation(this)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/NavigationExtensions.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport android.os.Bundle\nimport androidx.core.view.forEach\nimport androidx.navigation.NavController\nimport androidx.navigation.NavDestination\nimport androidx.navigation.ui.NavigationUI.onNavDestinationSelected\nimport com.google.android.material.navigationrail.NavigationRailView\nimport java.lang.ref.WeakReference\n\n/**\n * Like BottomNavigationView.setupWithnavController, but for NavigationRailView.\n * TODO(jdkoren): A future release of material will combine the listeners (since both views have a\n * common superclass), which will make this unnecessary.\n */\nfun NavigationRailView.setupWithNavController(navController: NavController) {\n    setOnItemSelectedListener { item ->\n        onNavDestinationSelected(item, navController)\n    }\n    val weakRef = WeakReference(this)\n    val listener = object : NavController.OnDestinationChangedListener {\n        override fun onDestinationChanged(\n            controller: NavController,\n            destination: NavDestination,\n            arguments: Bundle?\n        ) {\n            val view = weakRef.get()\n            if (view == null) {\n                navController.removeOnDestinationChangedListener(this)\n            } else {\n                view.menu.forEach { item ->\n                    if (matchNavDestination(destination, item.itemId)) {\n                        item.isChecked = true\n                    }\n                }\n            }\n        }\n    }\n    navController.addOnDestinationChangedListener(listener)\n}\n\n/**\n * Copy of package-private method in NavigationUI. TODO(jdkoren): remove when the above is removed.\n */\nprivate fun matchNavDestination(destination: NavDestination, id: Int): Boolean {\n    var currentDestination = destination\n    while (currentDestination.id != id && currentDestination.parent != null) {\n        currentDestination = currentDestination.parent as NavDestination\n    }\n    return currentDestination.id == id\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/SectionHeader.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport androidx.annotation.StringRes\n\ndata class SectionHeader(\n    @StringRes val titleId: Int,\n    val useHorizontalPadding: Boolean = true\n)\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaAdapter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.agenda\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.databinding.ViewDataBinding\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.samples.apps.iosched.BR\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Block\nimport org.threeten.bp.ZoneId\n\nclass AgendaAdapter(var timeZoneId: ZoneId = ZoneId.systemDefault()) :\n    ListAdapter<Block, AgendaViewHolder>(BlockDiff) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AgendaViewHolder {\n        return AgendaViewHolder(\n            DataBindingUtil.inflate(LayoutInflater.from(parent.context), viewType, parent, false)\n        )\n    }\n\n    override fun onBindViewHolder(holder: AgendaViewHolder, position: Int) {\n        holder.bind(getItem(position), timeZoneId)\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return if (getItem(position).isDark) {\n            R.layout.item_agenda_dark\n        } else {\n            R.layout.item_agenda_light\n        }\n    }\n}\n\nclass AgendaViewHolder(\n    private val binding: ViewDataBinding\n) : RecyclerView.ViewHolder(binding.root) {\n    fun bind(block: Block, timeZoneId: ZoneId) {\n        binding.setVariable(BR.agenda, block)\n        binding.setVariable(BR.timeZoneId, timeZoneId)\n        binding.executePendingBindings()\n    }\n}\n\nobject BlockDiff : DiffUtil.ItemCallback<Block>() {\n    override fun areItemsTheSame(oldItem: Block, newItem: Block): Boolean {\n        return oldItem.title == newItem.title &&\n            oldItem.startTime == newItem.startTime &&\n            oldItem.endTime == newItem.endTime\n    }\n\n    override fun areContentsTheSame(oldItem: Block, newItem: Block) = oldItem == newItem\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.agenda\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\nimport androidx.databinding.BindingAdapter\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.samples.apps.iosched.databinding.FragmentAgendaBinding\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.ui.MainNavigationFragment\nimport com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem\nimport com.google.samples.apps.iosched.util.clearDecorations\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport dagger.hilt.android.AndroidEntryPoint\nimport org.threeten.bp.ZoneId\n\n@AndroidEntryPoint\nclass AgendaFragment : MainNavigationFragment() {\n\n    private val viewModel: AgendaViewModel by viewModels()\n    private val mainActivityViewModel: MainActivityViewModel by activityViewModels()\n    private lateinit var binding: FragmentAgendaBinding\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentAgendaBinding.inflate(inflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n        }\n        // Pad the bottom of the RecyclerView so that the content scrolls up above the nav bar\n        binding.recyclerView.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        binding.viewModel = viewModel\n        binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)\n    }\n}\n\n@BindingAdapter(value = [\"agendaItems\", \"timeZoneId\"])\nfun agendaItems(recyclerView: RecyclerView, list: List<Block>?, zoneId: ZoneId?) {\n    list ?: return\n    zoneId ?: return\n    val isInConferenceTimeZone = TimeUtils.isConferenceTimeZone(zoneId)\n    if (recyclerView.adapter == null) {\n        recyclerView.adapter = AgendaAdapter()\n    }\n    (recyclerView.adapter as AgendaAdapter).apply {\n        submitList(list)\n        timeZoneId = zoneId\n    }\n    // Recreate the decoration used for the sticky date headers\n    recyclerView.clearDecorations()\n    if (list.isNotEmpty()) {\n        recyclerView.addItemDecoration(\n            AgendaHeadersDecoration(recyclerView.context, list, isInConferenceTimeZone)\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaHeaderIndexer.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.agenda\n\nimport com.google.samples.apps.iosched.model.Block\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Find the first block of each day (rounded down to nearest day) and return pairs of\n * index to start time. Assumes that [agendaItems] are sorted by ascending start time.\n */\nfun indexAgendaHeaders(agendaItems: List<Block>): List<Pair<Int, ZonedDateTime>> {\n    return agendaItems\n        .mapIndexed { index, block -> index to block.startTime }\n        .distinctBy { it.second.dayOfMonth }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaHeadersDecoration.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.agenda\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.graphics.Rect\nimport android.text.Layout.Alignment.ALIGN_CENTER\nimport android.text.StaticLayout\nimport android.text.TextPaint\nimport android.view.View\nimport androidx.core.content.res.ResourcesCompat\nimport androidx.core.content.res.getColorOrThrow\nimport androidx.core.content.res.getDimensionOrThrow\nimport androidx.core.content.res.getDimensionPixelSizeOrThrow\nimport androidx.core.content.res.getResourceIdOrThrow\nimport androidx.core.graphics.withTranslation\nimport androidx.core.view.forEach\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.ItemDecoration\nimport androidx.recyclerview.widget.RecyclerView.State\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.util.newStaticLayout\nimport kotlin.math.ceil\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * A [RecyclerView.ItemDecoration] which draws sticky headers marking the days in a given list of\n * [Block]s. It also inserts gaps between days.\n */\nclass AgendaHeadersDecoration(\n    context: Context,\n    blocks: List<Block>,\n    inConferenceTimeZone: Boolean\n) : ItemDecoration() {\n\n    private val paint: TextPaint\n    private val textWidth: Int\n    private val decorHeight: Int\n    private val verticalBias: Float\n\n    init {\n        val attrs = context.obtainStyledAttributes(\n            R.style.Widget_IOSched_DateHeaders,\n            R.styleable.DateHeader\n        )\n        paint = TextPaint(Paint.ANTI_ALIAS_FLAG or Paint.SUBPIXEL_TEXT_FLAG).apply {\n            color = attrs.getColorOrThrow(R.styleable.DateHeader_android_textColor)\n            textSize = attrs.getDimensionOrThrow(R.styleable.DateHeader_android_textSize)\n            try {\n                typeface = ResourcesCompat.getFont(\n                    context,\n                    attrs.getResourceIdOrThrow(R.styleable.DateHeader_android_fontFamily)\n                )\n            } catch (_: Exception) {\n                // ignore\n            }\n        }\n\n        textWidth = attrs.getDimensionPixelSizeOrThrow(R.styleable.DateHeader_android_width)\n        val height = attrs.getDimensionPixelSizeOrThrow(R.styleable.DateHeader_android_height)\n        val minHeight = ceil(paint.textSize).toInt()\n        decorHeight = Math.max(height, minHeight)\n\n        verticalBias = attrs.getFloat(R.styleable.DateHeader_verticalBias, 0.5f).coerceIn(0f, 1f)\n\n        attrs.recycle()\n    }\n\n    // Get the block index:day and create header layouts for each\n    private val daySlots: Map<Int, StaticLayout> =\n        indexAgendaHeaders(blocks).map {\n            it.first to createHeader(context, it.second, inConferenceTimeZone)\n        }.toMap()\n\n    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: State) {\n        val position = parent.getChildAdapterPosition(view)\n        outRect.top = if (daySlots.containsKey(position)) decorHeight else 0\n    }\n\n    override fun onDraw(canvas: Canvas, parent: RecyclerView, state: State) {\n        val layoutManager = parent.layoutManager ?: return\n        val centerX = parent.width / 2f\n\n        parent.forEach { child ->\n            if (child.top < parent.height && child.bottom > 0) {\n                // Child is visible\n                val layout = daySlots[parent.getChildAdapterPosition(child)]\n                if (layout != null) {\n                    val dx = centerX - (layout.width / 2)\n                    val dy = layoutManager.getDecoratedTop(child) +\n                        child.translationY +\n                        // offset vertically within the space according to the bias\n                        (decorHeight - layout.height) * verticalBias\n                    canvas.withTranslation(x = dx, y = dy) {\n                        layout.draw(this)\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Create a header layout for the given [time]\n     */\n    private fun createHeader(\n        context: Context,\n        time: ZonedDateTime,\n        inConferenceTimeZone: Boolean\n    ): StaticLayout {\n        val labelRes = TimeUtils.getLabelResForTime(time, inConferenceTimeZone)\n        val text = context.getText(labelRes)\n        return newStaticLayout(text, paint, textWidth, ALIGN_CENTER, 1f, 0f, false)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaItemBindingAdapter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.agenda\n\nimport android.graphics.drawable.GradientDrawable\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.databinding.BindingAdapter\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\nimport org.threeten.bp.format.DateTimeFormatter\n\nprivate val agendaTimePattern = DateTimeFormatter.ofPattern(\"h:mm a\")\n\n@BindingAdapter(\n    value = [\"agendaColor\", \"agendaStrokeColor\", \"agendaStrokeWidth\"], requireAll = true\n)\nfun agendaColor(view: View, fillColor: Int, strokeColor: Int, strokeWidth: Float) {\n    view.background = (view.background as? GradientDrawable ?: GradientDrawable()).apply {\n        setColor(fillColor)\n        setStroke(strokeWidth.toInt(), strokeColor)\n    }\n}\n\n@BindingAdapter(\"agendaIcon\")\nfun agendaIcon(imageView: ImageView, type: String) {\n    val iconId = when (type) {\n        \"after_hours\" -> R.drawable.ic_agenda_after_hours\n        \"badge\" -> R.drawable.ic_agenda_badge\n        \"codelab\" -> R.drawable.ic_agenda_codelab\n        \"concert\" -> R.drawable.ic_agenda_concert\n        \"keynote\" -> R.drawable.ic_agenda_keynote\n        \"meal\" -> R.drawable.ic_agenda_meal\n        \"office_hours\" -> R.drawable.ic_agenda_office_hours\n        \"sandbox\" -> R.drawable.ic_agenda_sandbox\n        \"store\" -> R.drawable.ic_agenda_store\n        else -> R.drawable.ic_agenda_session\n    }\n    imageView.setImageDrawable(AppCompatResources.getDrawable(imageView.context, iconId))\n}\n\n@BindingAdapter(value = [\"startTime\", \"endTime\", \"timeZoneId\"], requireAll = true)\nfun agendaDuration(\n    textView: TextView,\n    startTime: ZonedDateTime,\n    endTime: ZonedDateTime,\n    timeZoneId: ZoneId\n) {\n    textView.text = textView.context.getString(\n        R.string.agenda_duration,\n        agendaTimePattern.format(TimeUtils.zonedTime(startTime, timeZoneId)),\n        agendaTimePattern.format(TimeUtils.zonedTime(endTime, timeZoneId))\n    )\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaViewModel.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.agenda\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.shared.domain.agenda.LoadAgendaUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.stateIn\nimport org.threeten.bp.ZoneId\nimport javax.inject.Inject\n\n@HiltViewModel\nclass AgendaViewModel @Inject constructor(\n    private val loadAgendaUseCase: LoadAgendaUseCase,\n    private val getTimeZoneUseCase: GetTimeZoneUseCase\n) : ViewModel() {\n\n    // Expose agenda data\n    val agenda: StateFlow<List<Block>> = flow {\n        val agendaData = loadAgendaUseCase(false).data ?: emptyList()\n        emit(agendaData)\n    }.stateIn(viewModelScope, WhileViewSubscribed, initialValue = emptyList())\n\n    // Expose whether we're on conference timezone or local\n    val timeZoneId = flow<ZoneId> {\n        if (getTimeZoneUseCase(Unit).data == true) {\n            emit(TimeUtils.CONFERENCE_TIMEZONE)\n        } else {\n            emit(ZoneId.systemDefault())\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, initialValue = ZoneId.systemDefault())\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/ar/ArCoreNotSupportedFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.ar\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport com.google.samples.apps.iosched.R\n\nclass ArCoreNotSupportedFragment : Fragment() {\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_arcore_not_supported, container, false)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/ar/NoNetworkConnectionFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.ar\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport com.google.samples.apps.iosched.R\n\nclass NoNetworkConnectionFragment : Fragment() {\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_no_network, container, false)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsActionsHandler.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.codelabs\n\nimport com.google.samples.apps.iosched.model.Codelab\n\ninterface CodelabsActionsHandler {\n\n    fun dismissCodelabsInfoCard()\n\n    fun openCodelabsOnMap()\n\n    fun launchCodelabsWebsite()\n\n    fun startCodelab(codelab: Codelab)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsAdapter.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.codelabs\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.transition.TransitionInflater\nimport android.transition.TransitionManager\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.android.flexbox.FlexboxLayoutManager\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemCodelabBinding\nimport com.google.samples.apps.iosched.databinding.ItemCodelabsInformationCardBinding\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.ui.codelabs.CodelabsViewHolder.CodelabItemHolder\nimport com.google.samples.apps.iosched.ui.codelabs.CodelabsViewHolder.CodelabsInformationCardHolder\nimport com.google.samples.apps.iosched.util.compatRemoveIf\nimport com.google.samples.apps.iosched.util.executeAfter\n\ninternal class CodelabsAdapter(\n    private val codelabsActionsHandler: CodelabsActionsHandler,\n    private val tagViewPool: RecycledViewPool,\n    savedState: Bundle?\n) : ListAdapter<Any, CodelabsViewHolder>(CodelabsDiffCallback) {\n\n    companion object {\n        private const val STATE_KEY_EXPANDED_IDS = \"CodelabsAdapter:expandedIds\"\n    }\n\n    private var expandedIds = mutableSetOf<String>()\n\n    init {\n        savedState?.getStringArray(STATE_KEY_EXPANDED_IDS)?.let {\n            expandedIds.addAll(it)\n        }\n    }\n\n    fun onSaveInstanceState(state: Bundle) {\n        state.putStringArray(STATE_KEY_EXPANDED_IDS, expandedIds.toTypedArray())\n    }\n\n    override fun submitList(list: List<Any>?) {\n        // Clear out any invalid IDs\n        if (list == null) {\n            expandedIds.clear()\n        } else {\n            val ids = list.filterIsInstance<Codelab>().map { it.id }\n            expandedIds.compatRemoveIf { it !in ids }\n        }\n        super.submitList(list)\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return when (val item = getItem(position)) {\n            is Codelab -> R.layout.item_codelab\n            is CodelabsInformationCard -> R.layout.item_codelabs_information_card\n            else -> throw IllegalStateException(\"Unknown type: ${item::class.java.simpleName}\")\n        }\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CodelabsViewHolder {\n        val inflater = LayoutInflater.from(parent.context)\n        return when (viewType) {\n            R.layout.item_codelab -> CodelabItemHolder(\n                ItemCodelabBinding.inflate(inflater, parent, false).apply {\n                    actionHandler = codelabsActionsHandler\n                    codelabTags.apply {\n                        setRecycledViewPool(tagViewPool)\n                        layoutManager = FlexboxLayoutManager(parent.context).apply {\n                            recycleChildrenOnDetach = true\n                        }\n                    }\n                }\n            )\n            R.layout.item_codelabs_information_card -> CodelabsInformationCardHolder(\n                ItemCodelabsInformationCardBinding.inflate(inflater, parent, false).apply {\n                    actionHandler = codelabsActionsHandler\n                }\n            )\n            else -> throw IllegalArgumentException(\"Invalid viewType\")\n        }\n    }\n\n    override fun onBindViewHolder(holder: CodelabsViewHolder, position: Int) {\n        if (holder is CodelabItemHolder) {\n            bindCodelabItemHolder(holder, getItem(position) as Codelab)\n        }\n        // Other types don't need additional binding\n    }\n\n    private fun bindCodelabItemHolder(holder: CodelabItemHolder, item: Codelab) {\n        holder.binding.executeAfter {\n            codelab = item\n            isExpanded = expandedIds.contains(item.id)\n        }\n        // In certain configurations the view already has a click listener to start the codelab.\n        if (!holder.itemView.hasOnClickListeners()) {\n            holder.itemView.setOnClickListener {\n                val parent = holder.itemView.parent as? ViewGroup ?: return@setOnClickListener\n                val expanded = holder.binding.isExpanded ?: false\n                if (expanded) {\n                    expandedIds.remove(item.id)\n                } else {\n                    expandedIds.add(item.id)\n                }\n                val transition = TransitionInflater.from(holder.itemView.context)\n                    .inflateTransition(R.transition.codelab_toggle)\n                TransitionManager.beginDelayedTransition(parent, transition)\n                holder.binding.executeAfter {\n                    isExpanded = !expanded\n                }\n            }\n        }\n    }\n}\n\n// Marker objects for singleton items\nobject CodelabsInformationCard\n\ninternal sealed class CodelabsViewHolder(itemView: View) : ViewHolder(itemView) {\n\n    class CodelabItemHolder(\n        val binding: ItemCodelabBinding\n    ) : CodelabsViewHolder(binding.root)\n\n    class CodelabsInformationCardHolder(\n        val binding: ItemCodelabsInformationCardBinding\n    ) : CodelabsViewHolder(binding.root)\n}\n\ninternal object CodelabsDiffCallback : DiffUtil.ItemCallback<Any>() {\n\n    override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean {\n        return when {\n            oldItem === CodelabsInformationCard && newItem === CodelabsInformationCard -> true\n            oldItem is Codelab && newItem is Codelab -> oldItem.id == newItem.id\n            else -> false\n        }\n    }\n\n    @SuppressLint(\"DiffUtilEquals\")\n    // Workaround of https://issuetracker.google.com/issues/122928037\n    override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean {\n        return when {\n            oldItem is Codelab && newItem is Codelab -> oldItem == newItem\n            else -> true\n        }\n    }\n}\n\n@BindingAdapter(\"codelabDuration\")\nfun codelabDuration(view: TextView, durationMinutes: Int) {\n    view.text = view.resources.getString(R.string.codelab_duration, durationMinutes)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.codelabs\n\nimport android.net.Uri\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.navigation.fragment.findNavController\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentCodelabsBinding\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.di.MapFeatureEnabledFlag\nimport com.google.samples.apps.iosched.shared.util.consume\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.ui.MainNavigationFragment\nimport com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.util.openWebsiteUri\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport javax.inject.Inject\nimport javax.inject.Named\n\n@AndroidEntryPoint\nclass CodelabsFragment : MainNavigationFragment(), CodelabsActionsHandler {\n\n    companion object {\n        private const val CODELABS_WEBSITE = \"https://g.co/io/codelabs\"\n        private const val PARAM_UTM_SOURCE = \"utm_source\"\n        private const val PARAM_UTM_MEDIUM = \"utm_medium\"\n        private const val VALUE_UTM_SOURCE = \"ioapp\"\n        private const val VALUE_UTM_MEDIUM = \"android\"\n    }\n\n    @Inject\n    @Named(\"tagViewPool\")\n    lateinit var tagRecycledViewPool: RecycledViewPool\n\n    @Inject\n    @JvmField\n    @MapFeatureEnabledFlag\n    var mapFeatureEnabled: Boolean = false\n\n    @Inject lateinit var analyticsHelper: AnalyticsHelper\n\n    private lateinit var binding: FragmentCodelabsBinding\n    private val codelabsViewModel: CodelabsViewModel by viewModels()\n    private val mainActivityViewModel: MainActivityViewModel by activityViewModels()\n    private lateinit var codelabsAdapter: CodelabsAdapter\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentCodelabsBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        binding.toolbar.apply {\n            setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)\n            menu.findItem(R.id.action_see_on_map)?.isVisible = mapFeatureEnabled\n            setOnMenuItemClickListener {\n                when (it.itemId) {\n                    R.id.action_see_on_map -> consume { openCodelabsOnMap() }\n                    R.id.action_codelabs_website -> consume { launchCodelabsWebsite() }\n                }\n                false\n            }\n        }\n\n        codelabsAdapter = CodelabsAdapter(\n            this,\n            tagRecycledViewPool,\n            savedInstanceState\n        )\n        binding.codelabsList.apply {\n            adapter = codelabsAdapter\n            setHasFixedSize(true)\n        }\n\n        // Pad the bottom of the RecyclerView so that the content scrolls up above the nav bar\n        binding.codelabsList.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n\n        launchAndRepeatWithViewLifecycle {\n            codelabsViewModel.screenContent.collect {\n                codelabsAdapter.submitList(it)\n            }\n        }\n\n        analyticsHelper.sendScreenView(\"Codelabs\", requireActivity())\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        codelabsAdapter.onSaveInstanceState(outState)\n    }\n\n    override fun dismissCodelabsInfoCard() {\n        // Pass to ViewModel, which will update the list contents\n        codelabsViewModel.dismissCodelabsInfoCard()\n    }\n\n    override fun openCodelabsOnMap() {\n        findNavController().navigate(CodelabsFragmentDirections.toMap())\n        // No analytics event, we log map marker selection in MapViewModel already.\n    }\n\n    override fun launchCodelabsWebsite() {\n        openWebsiteUri(requireContext(), addCodelabsAnalyticsQueryParams(CODELABS_WEBSITE))\n        analyticsHelper.logUiEvent(\"Codelabs Website\", AnalyticsActions.CLICK)\n    }\n\n    override fun startCodelab(codelab: Codelab) {\n        if (codelab.hasUrl()) {\n            openWebsiteUri(requireContext(), addCodelabsAnalyticsQueryParams(codelab.codelabUrl))\n            analyticsHelper.logUiEvent(\"Start codelab \\\"${codelab.title}\\\"\", AnalyticsActions.CLICK)\n        }\n    }\n\n    private fun addCodelabsAnalyticsQueryParams(url: String): Uri {\n        return Uri.parse(url)\n            .buildUpon()\n            .appendQueryParameter(PARAM_UTM_SOURCE, VALUE_UTM_SOURCE)\n            .appendQueryParameter(PARAM_UTM_MEDIUM, VALUE_UTM_MEDIUM)\n            .build()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsViewModel.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.codelabs\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.shared.domain.codelabs.GetCodelabsInfoCardShownUseCase\nimport com.google.samples.apps.iosched.shared.domain.codelabs.LoadCodelabsUseCase\nimport com.google.samples.apps.iosched.shared.domain.codelabs.SetCodelabsInfoCardShownUseCase\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport java.util.Collections.emptyList\nimport javax.inject.Inject\n\n@HiltViewModel\nclass CodelabsViewModel @Inject constructor(\n    loadCodelabsUseCase: LoadCodelabsUseCase,\n    getCodelabsInfoCardShownUseCase: GetCodelabsInfoCardShownUseCase,\n    private val setCodelabsInfoCardShownUseCase: SetCodelabsInfoCardShownUseCase\n) : ViewModel() {\n\n    private val infoCardDismissed = getCodelabsInfoCardShownUseCase(Unit).map {\n        it.successOr(false)\n    }\n\n    private val codelabs = flow {\n        emit(loadCodelabsUseCase(Unit).successOr(emptyList()))\n    }\n\n    val screenContent = combine(codelabs, infoCardDismissed) { list, cardDismissed ->\n        buildScreenContent(list, cardDismissed)\n    }.stateIn(viewModelScope, WhileViewSubscribed, emptyList())\n\n    private fun buildScreenContent(codelabs: List<Codelab>, cardDismissed: Boolean): List<Any> {\n        val items = mutableListOf<Any>()\n        if (!cardDismissed) {\n            items.add(CodelabsInformationCard)\n        }\n        items.addAll(codelabs)\n        return items\n    }\n\n    fun dismissCodelabsInfoCard() {\n        viewModelScope.launch {\n            setCodelabsInfoCardShownUseCase(Unit)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/AnnouncementsFragment.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.isVisible\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport com.google.common.collect.ImmutableMap\nimport com.google.samples.apps.iosched.databinding.FragmentAnnouncementsBinding\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.ui.MainNavigationFragment\nimport com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass AnnouncementsFragment : MainNavigationFragment() {\n\n    @Inject\n    lateinit var analyticsHelper: AnalyticsHelper\n\n    private val model: AnnouncementsViewModel by viewModels()\n    private val mainActivityViewModel: MainActivityViewModel by activityViewModels()\n\n    private lateinit var binding: FragmentAnnouncementsBinding\n    private lateinit var adapter: FeedAdapter\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        binding = FragmentAnnouncementsBinding.inflate(inflater, container, false)\n            .apply {\n                lifecycleOwner = viewLifecycleOwner\n                viewModel = model\n            }\n        adapter = createAdapter()\n        binding.recyclerView.adapter = adapter\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        analyticsHelper.sendScreenView(\"Announcements\", requireActivity())\n\n        binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)\n\n        binding.root.doOnApplyWindowInsets { _, insets, _ ->\n            val systemInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.statusBar.run {\n                layoutParams.height = systemInsets.top\n                isVisible = layoutParams.height > 0\n                requestLayout()\n            }\n        }\n\n        binding.recyclerView.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n\n        launchAndRepeatWithViewLifecycle {\n            model.announcements.collect {\n                (binding.recyclerView.adapter as FeedAdapter).submitList(it)\n            }\n        }\n    }\n\n    private fun createAdapter(): FeedAdapter {\n        val announcementViewBinder = AnnouncementViewBinder(model.timeZoneId, this)\n        val announcementsEmptyViewBinder = AnnouncementsEmptyViewBinder()\n        val announcementsLoadingViewBinder = AnnouncementsLoadingViewBinder()\n\n        @Suppress(\"UNCHECKED_CAST\")\n        return FeedAdapter(\n            ImmutableMap.builder<FeedItemClass, FeedItemBinder>()\n                .put(\n                    announcementViewBinder.modelClass,\n                    announcementViewBinder as FeedItemBinder\n                )\n                .put(\n                    announcementsEmptyViewBinder.modelClass,\n                    announcementsEmptyViewBinder as FeedItemBinder\n                )\n                .put(\n                    announcementsLoadingViewBinder.modelClass,\n                    announcementsLoadingViewBinder as FeedItemBinder\n                ).build()\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/AnnouncementsViewModel.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.shared.domain.feed.LoadAnnouncementsUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.SharingStarted.Companion.Eagerly\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.stateIn\nimport org.threeten.bp.ZoneId\nimport javax.inject.Inject\n\n@HiltViewModel\nclass AnnouncementsViewModel @Inject constructor(\n    loadAnnouncementsUseCase: LoadAnnouncementsUseCase,\n    getTimeZoneUseCase: GetTimeZoneUseCase,\n    timeProvider: TimeProvider\n) : ViewModel() {\n\n    val announcements: StateFlow<List<Any>> = flow {\n        val loadAnnouncementsResult = loadAnnouncementsUseCase(timeProvider.now())\n        if (loadAnnouncementsResult is Loading) {\n            emit(listOf(LoadingIndicator))\n        } else {\n            val items = loadAnnouncementsResult.successOr(emptyList())\n            if (items.isNotEmpty()) {\n                emit(items)\n            } else {\n                emit(listOf(AnnouncementsEmpty))\n            }\n        }\n    }.stateIn(viewModelScope, Eagerly, emptyList())\n\n    val timeZoneId: StateFlow<ZoneId> = flow {\n        val timeZoneResult = getTimeZoneUseCase(Unit)\n        if (timeZoneResult.successOr(true)) {\n            emit(TimeUtils.CONFERENCE_TIMEZONE)\n        } else {\n            emit(ZoneId.systemDefault())\n        }\n    }.stateIn(viewModelScope, Eagerly, TimeUtils.CONFERENCE_TIMEZONE)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedAdapter.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\n\ntypealias FeedItemClass = Class<out Any>\n\ntypealias FeedItemBinder = FeedItemViewBinder<Any, ViewHolder>\n\nclass FeedAdapter(\n    private val viewBinders: Map<FeedItemClass, FeedItemBinder>\n) : ListAdapter<Any, ViewHolder>(FeedDiffCallback(viewBinders)) {\n\n    private val viewTypeToBinders = viewBinders.mapKeys { it.value.getFeedItemType() }\n\n    private fun getViewBinder(viewType: Int): FeedItemBinder = viewTypeToBinders.getValue(viewType)\n\n    override fun getItemViewType(position: Int): Int =\n        viewBinders.getValue(super.getItem(position).javaClass).getFeedItemType()\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        return getViewBinder(viewType).createViewHolder(parent)\n    }\n\n    override fun onBindViewHolder(holder: ViewHolder, position: Int) {\n        return getViewBinder(getItemViewType(position)).bindViewHolder(getItem(position), holder)\n    }\n\n    override fun onViewRecycled(holder: ViewHolder) {\n        getViewBinder(holder.itemViewType).onViewRecycled(holder)\n        super.onViewRecycled(holder)\n    }\n\n    override fun onViewDetachedFromWindow(holder: ViewHolder) {\n        getViewBinder(holder.itemViewType).onViewDetachedFromWindow(holder)\n        super.onViewDetachedFromWindow(holder)\n    }\n}\n\n/** Encapsulates logic to create and bind a ViewHolder for a type of item in the Feed. */\nabstract class FeedItemViewBinder<M, in VH : ViewHolder>(\n    val modelClass: Class<out M>\n) : DiffUtil.ItemCallback<M>() {\n\n    abstract fun createViewHolder(parent: ViewGroup): ViewHolder\n    abstract fun bindViewHolder(model: M, viewHolder: VH)\n    abstract fun getFeedItemType(): Int\n\n    // Having these as non abstract because not all the viewBinders are required to implement them.\n    open fun onViewRecycled(viewHolder: VH) = Unit\n    open fun onViewDetachedFromWindow(viewHolder: VH) = Unit\n}\n\ninternal class FeedDiffCallback(\n    private val viewBinders: Map<FeedItemClass, FeedItemBinder>\n) : DiffUtil.ItemCallback<Any>() {\n\n    override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean {\n        if (oldItem::class != newItem::class) {\n            return false\n        }\n        return viewBinders[oldItem::class.java]?.areItemsTheSame(oldItem, newItem) ?: false\n    }\n\n    override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean {\n        // We know the items are the same class because [areItemsTheSame] returned true\n        return viewBinders[oldItem::class.java]?.areContentsTheSame(oldItem, newItem) ?: false\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedAnnouncementViewBinders.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemFeedAnnouncementBinding\nimport com.google.samples.apps.iosched.databinding.ItemFeedAnnouncementsHeaderBinding\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport kotlinx.coroutines.flow.StateFlow\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\n\n/** A data class representing the state of the announcements header card on feed */\ndata class AnnouncementsHeader(\n    val showPastNotificationsButton: Boolean\n)\n\nclass AnnouncementsHeaderViewBinder(\n    private val lifecycleOwner: LifecycleOwner,\n    private val eventListener: FeedEventListener\n) : FeedItemViewBinder<AnnouncementsHeader, AnnouncementsPreviewViewHolder>(\n    AnnouncementsHeader::class.java\n) {\n\n    override fun createViewHolder(parent: ViewGroup) =\n        AnnouncementsPreviewViewHolder(\n            ItemFeedAnnouncementsHeaderBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            ),\n            lifecycleOwner,\n            eventListener\n        )\n\n    override fun bindViewHolder(\n        model: AnnouncementsHeader,\n        viewHolder: AnnouncementsPreviewViewHolder\n    ) = viewHolder.bind(model)\n\n    override fun getFeedItemType() = R.layout.item_feed_announcements_header\n\n    override fun areItemsTheSame(\n        oldItem: AnnouncementsHeader,\n        newItem: AnnouncementsHeader\n    ) = true\n\n    override fun areContentsTheSame(\n        oldItem: AnnouncementsHeader,\n        newItem: AnnouncementsHeader\n    ) = oldItem == newItem\n}\n\nclass AnnouncementsPreviewViewHolder(\n    private val binding: ItemFeedAnnouncementsHeaderBinding,\n    private val lifecycleOwner: LifecycleOwner,\n    private val eventListener: FeedEventListener\n) : ViewHolder(binding.root) {\n\n    fun bind(model: AnnouncementsHeader) {\n        binding.announcementsHeaderState = model\n        binding.lifecycleOwner = lifecycleOwner\n        binding.eventListener = eventListener\n    }\n}\n\n// For Announcement items\nclass AnnouncementViewBinder(\n    private val timeZoneId: StateFlow<ZoneId>,\n    private val lifecycleOwner: LifecycleOwner\n) : FeedItemViewBinder<Announcement, AnnouncementViewHolder>(\n    Announcement::class.java\n) {\n\n    override fun createViewHolder(parent: ViewGroup): AnnouncementViewHolder =\n        AnnouncementViewHolder(\n            ItemFeedAnnouncementBinding.inflate(LayoutInflater.from(parent.context), parent, false),\n            lifecycleOwner,\n            timeZoneId\n        )\n\n    override fun bindViewHolder(model: Announcement, viewHolder: AnnouncementViewHolder) {\n        viewHolder.bind(model)\n    }\n\n    override fun getFeedItemType(): Int = R.layout.item_feed_announcement\n\n    override fun areItemsTheSame(oldItem: Announcement, newItem: Announcement): Boolean =\n        oldItem.id == newItem.id\n\n    override fun areContentsTheSame(oldItem: Announcement, newItem: Announcement) =\n        oldItem == newItem\n}\n\nclass AnnouncementViewHolder(\n    private val binding: ItemFeedAnnouncementBinding,\n    private val lifecycleOwner: LifecycleOwner,\n    private val timeZoneId: StateFlow<ZoneId>\n) : ViewHolder(binding.root) {\n\n    fun bind(announcement: Announcement) {\n        binding.announcement = announcement\n        binding.lifecycleOwner = lifecycleOwner\n        binding.timeZoneId = timeZoneId\n        binding.executePendingBindings()\n    }\n}\n\n// Shown while loading Announcements\nobject LoadingIndicator\n\nclass LoadingViewHolder(itemView: View) : ViewHolder(itemView)\n\nclass AnnouncementsLoadingViewBinder : FeedItemViewBinder<LoadingIndicator, LoadingViewHolder>(\n    LoadingIndicator::class.java\n) {\n\n    override fun createViewHolder(parent: ViewGroup): ViewHolder {\n        return LoadingViewHolder(\n            LayoutInflater.from(parent.context).inflate(getFeedItemType(), parent, false)\n        )\n    }\n\n    override fun bindViewHolder(model: LoadingIndicator, viewHolder: LoadingViewHolder) {}\n\n    override fun getFeedItemType() = R.layout.item_feed_announcements_loading\n\n    override fun areItemsTheSame(oldItem: LoadingIndicator, newItem: LoadingIndicator) = true\n\n    override fun areContentsTheSame(oldItem: LoadingIndicator, newItem: LoadingIndicator) = true\n}\n\n// Shown if there are no Announcements or fetching Announcments fails\nobject AnnouncementsEmpty\n\nclass EmptyViewHolder(itemView: View) : ViewHolder(itemView)\n\nclass AnnouncementsEmptyViewBinder : FeedItemViewBinder<AnnouncementsEmpty, EmptyViewHolder>(\n    AnnouncementsEmpty::class.java\n) {\n\n    override fun createViewHolder(parent: ViewGroup): ViewHolder {\n        return EmptyViewHolder(\n            LayoutInflater.from(parent.context).inflate(getFeedItemType(), parent, false)\n        )\n    }\n\n    override fun bindViewHolder(model: AnnouncementsEmpty, viewHolder: EmptyViewHolder) {}\n\n    override fun getFeedItemType() = R.layout.item_feed_announcements_empty\n\n    override fun areItemsTheSame(oldItem: AnnouncementsEmpty, newItem: AnnouncementsEmpty) = true\n\n    override fun areContentsTheSame(oldItem: AnnouncementsEmpty, newItem: AnnouncementsEmpty) = true\n}\n\n@BindingAdapter(\"announcementTime\", \"timeZoneId\")\nfun announcementTime(\n    textView: TextView,\n    announcementTime: ZonedDateTime,\n    timeZoneId: ZoneId?\n) {\n    timeZoneId ?: return\n    // TODO(gauravbhola): Show relative time '2 minutes ago', '1 hour ago' etc\n    textView.text =\n        TimeUtils.abbreviatedTimeForAnnouncements(TimeUtils.zonedTime(announcementTime, timeZoneId))\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.doOnLayout\nimport androidx.core.view.isVisible\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.navigation.fragment.findNavController\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.common.collect.ImmutableMap\nimport com.google.samples.apps.iosched.databinding.FragmentFeedBinding\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.ui.MainNavigationFragment\nimport com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.NavigateAction\nimport com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.NavigateToScheduleAction\nimport com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.NavigateToSession\nimport com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.OpenLiveStreamAction\nimport com.google.samples.apps.iosched.ui.feed.FeedNavigationAction.OpenSignInDialogAction\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.messages.setupSnackbarManager\nimport com.google.samples.apps.iosched.ui.signin.SignInDialogFragment\nimport com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.util.openWebsiteUrl\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass FeedFragment : MainNavigationFragment() {\n\n    companion object {\n        private const val DIALOG_NEED_TO_SIGN_IN = \"dialog_need_to_sign_in\"\n        private const val BUNDLE_KEY_SESSIONS_LAYOUT_MANAGER_STATE = \"sessions_layout_manager\"\n    }\n\n    @Inject\n    lateinit var snackbarMessageManager: SnackbarMessageManager\n\n    @Inject\n    lateinit var analyticsHelper: AnalyticsHelper\n\n    private val model: FeedViewModel by viewModels()\n    private val mainActivityViewModel: MainActivityViewModel by activityViewModels()\n\n    private lateinit var binding: FragmentFeedBinding\n    private var adapter: FeedAdapter? = null\n    private lateinit var sessionsViewBinder: FeedSessionsViewBinder\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentFeedBinding.inflate(\n            inflater, container, false\n        ).apply {\n            lifecycleOwner = viewLifecycleOwner\n            viewModel = model\n        }\n\n        return binding.root\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        if (::sessionsViewBinder.isInitialized) {\n            outState.putParcelable(\n                BUNDLE_KEY_SESSIONS_LAYOUT_MANAGER_STATE,\n                sessionsViewBinder.recyclerViewManagerState\n            )\n        }\n        super.onSaveInstanceState(outState)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        analyticsHelper.sendScreenView(\"Home\", requireActivity())\n\n        binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)\n\n        binding.root.doOnApplyWindowInsets { _, insets, _ ->\n            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.statusBar.run {\n                layoutParams.height = systemBars.top\n                isVisible = layoutParams.height > 0\n                requestLayout()\n            }\n        }\n\n        if (adapter == null) {\n            // Initialising sessionsViewBinder here to handle config change.\n            sessionsViewBinder =\n                FeedSessionsViewBinder(\n                    model,\n                    savedInstanceState?.getParcelable(\n                        BUNDLE_KEY_SESSIONS_LAYOUT_MANAGER_STATE\n                    )\n                )\n        }\n\n        binding.recyclerView.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n\n        binding.snackbar.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n\n        setupSnackbarManager(snackbarMessageManager, binding.snackbar)\n\n        // Observe feed\n        launchAndRepeatWithViewLifecycle {\n            model.feed.collect {\n                showFeedItems(binding.recyclerView, it)\n            }\n        }\n\n        // Observe navigation events\n        launchAndRepeatWithViewLifecycle {\n            model.navigationActions.collect { action ->\n                when (action) {\n                    is NavigateAction -> findNavController().navigate(action.directions)\n                    NavigateToScheduleAction ->\n                        findNavController().navigate(FeedFragmentDirections.toSchedule())\n                    is NavigateToSession -> openSessionDetail(action.sessionId)\n                    is OpenLiveStreamAction -> openLiveStreamUrl(action.url)\n                    OpenSignInDialogAction -> openSignInDialog()\n                }\n            }\n        }\n    }\n\n    private fun openSessionDetail(id: SessionId) {\n        // TODO support opening a session detail\n        // findNavController().navigate(toSessionDetail(id))\n    }\n\n    private fun showFeedItems(recyclerView: RecyclerView, list: List<Any>?) {\n        if (adapter == null) {\n            val sectionHeaderViewBinder = FeedSectionHeaderViewBinder()\n            val countdownViewBinder = CountdownViewBinder()\n            val momentViewBinder = MomentViewBinder(\n                eventListener = model,\n                userInfo = model.userInfo,\n                theme = model.theme\n            )\n            val sessionsViewBinder = FeedSessionsViewBinder(model)\n            val feedAnnouncementsHeaderViewBinder =\n                AnnouncementsHeaderViewBinder(this, model)\n            val announcementViewBinder = AnnouncementViewBinder(model.timeZoneId, this)\n            val announcementsEmptyViewBinder = AnnouncementsEmptyViewBinder()\n            val announcementsLoadingViewBinder = AnnouncementsLoadingViewBinder()\n            val feedSustainabilitySectionViewBinder = FeedSustainabilitySectionViewBinder()\n            val feedSocialChannelsSectionViewBinder = FeedSocialChannelsSectionViewBinder()\n            @Suppress(\"UNCHECKED_CAST\")\n            val viewBinders = ImmutableMap.builder<FeedItemClass, FeedItemBinder>()\n                .put(\n                    sectionHeaderViewBinder.modelClass,\n                    sectionHeaderViewBinder as FeedItemBinder\n                )\n                .put(\n                    countdownViewBinder.modelClass,\n                    countdownViewBinder as FeedItemBinder\n                )\n                .put(\n                    momentViewBinder.modelClass,\n                    momentViewBinder as FeedItemBinder\n                )\n                .put(\n                    sessionsViewBinder.modelClass,\n                    sessionsViewBinder as FeedItemBinder\n                )\n                .put(\n                    feedAnnouncementsHeaderViewBinder.modelClass,\n                    feedAnnouncementsHeaderViewBinder as FeedItemBinder\n                )\n                .put(\n                    announcementViewBinder.modelClass,\n                    announcementViewBinder as FeedItemBinder\n                )\n                .put(\n                    announcementsEmptyViewBinder.modelClass,\n                    announcementsEmptyViewBinder as FeedItemBinder\n                )\n                .put(\n                    announcementsLoadingViewBinder.modelClass,\n                    announcementsLoadingViewBinder as FeedItemBinder\n                )\n                .put(\n                    feedSustainabilitySectionViewBinder.modelClass,\n                    feedSustainabilitySectionViewBinder as FeedItemBinder\n                )\n                .put(\n                    feedSocialChannelsSectionViewBinder.modelClass,\n                    feedSocialChannelsSectionViewBinder as FeedItemBinder\n                )\n                .build()\n\n            adapter = FeedAdapter(viewBinders)\n        }\n        if (recyclerView.adapter == null) {\n            recyclerView.adapter = adapter\n        }\n        (recyclerView.adapter as FeedAdapter).submitList(list ?: emptyList())\n        // After submitting the list to the adapter, the recycler view starts measuring and drawing\n        // so let's wait for the layout to be drawn before reporting fully drawn.\n        binding.recyclerView.doOnLayout {\n            // reportFullyDrawn() prints `I/ActivityTaskManager: Fully drawn {activity} {time}`\n            // to logcat. The framework ensures that the statement is printed only once for the\n            // activity, so there is no need to add dedupping logic to the app.\n            activity?.reportFullyDrawn()\n        }\n    }\n\n    private fun openSignInDialog() {\n        SignInDialogFragment().show(\n            requireActivity().supportFragmentManager, DIALOG_NEED_TO_SIGN_IN\n        )\n    }\n\n    private fun openLiveStreamUrl(url: String) {\n        openWebsiteUrl(requireContext(), url)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedHeaderViewBinders.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport androidx.core.view.isVisible\nimport androidx.databinding.BindingAdapter\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.android.material.button.MaterialButton\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemFeedMomentBinding\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.model.Moment.Companion.CTA_LIVE_STREAM\nimport com.google.samples.apps.iosched.model.Moment.Companion.CTA_MAP_LOCATION\nimport com.google.samples.apps.iosched.model.Moment.Companion.CTA_SIGNIN\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo\nimport com.google.samples.apps.iosched.util.executeAfter\nimport kotlinx.coroutines.flow.StateFlow\n\n// Countdown is shown before the Keynote\nobject CountdownItem\n\nclass CountdownViewHolder(itemView: View) : ViewHolder(itemView)\n\nclass CountdownViewBinder : FeedItemViewBinder<CountdownItem, CountdownViewHolder>(\n    CountdownItem::class.java\n) {\n\n    override fun createViewHolder(parent: ViewGroup): CountdownViewHolder {\n        return CountdownViewHolder(\n            LayoutInflater.from(parent.context).inflate(getFeedItemType(), parent, false)\n        )\n    }\n\n    override fun bindViewHolder(model: CountdownItem, viewHolder: CountdownViewHolder) {}\n\n    override fun getFeedItemType() = R.layout.item_feed_countdown\n\n    override fun areItemsTheSame(oldItem: CountdownItem, newItem: CountdownItem) = true\n\n    override fun areContentsTheSame(oldItem: CountdownItem, newItem: CountdownItem) = true\n}\n\n// A Moment may be shown during or after the conference based on the current time\nclass MomentViewBinder(\n    private val eventListener: FeedEventListener,\n    private val userInfo: StateFlow<AuthenticatedUserInfo?>,\n    private val theme: StateFlow<Theme>\n) : FeedItemViewBinder<Moment, MomentViewHolder>(Moment::class.java) {\n\n    override fun createViewHolder(parent: ViewGroup): MomentViewHolder {\n        val binding =\n            ItemFeedMomentBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return MomentViewHolder(binding, eventListener, userInfo, theme)\n    }\n\n    override fun bindViewHolder(model: Moment, viewHolder: MomentViewHolder) {\n        viewHolder.bind(model)\n    }\n\n    override fun getFeedItemType(): Int = R.layout.item_feed_moment\n\n    override fun areItemsTheSame(oldItem: Moment, newItem: Moment): Boolean =\n        oldItem.id == newItem.id\n\n    override fun areContentsTheSame(oldItem: Moment, newItem: Moment) = oldItem == newItem\n}\n\nclass MomentViewHolder(\n    private val binding: ItemFeedMomentBinding,\n    private val eventListener: FeedEventListener,\n    private val userInfo: StateFlow<AuthenticatedUserInfo?>,\n    private val theme: StateFlow<Theme>\n) : ViewHolder(binding.root) {\n\n    fun bind(item: Moment) {\n        binding.executeAfter {\n            moment = item\n            theme = theme\n            userInfo = userInfo\n            eventListener = this@MomentViewHolder.eventListener\n        }\n    }\n}\n\n@BindingAdapter(\"moment\", \"userInfo\", \"eventListener\")\nfun setMomentActionButton(\n    button: Button,\n    moment: Moment?,\n    userInfo: AuthenticatedUserInfo?,\n    eventListener: FeedEventListener?\n) {\n    if (button !is MaterialButton) return\n    moment ?: return\n    eventListener ?: return\n    val userSignedIn = userInfo?.isSignedIn() ?: false\n\n    when (moment.ctaType) {\n        CTA_LIVE_STREAM -> {\n            val url = moment.streamUrl\n            if (url.isNullOrEmpty()) {\n                button.isVisible = false\n            } else {\n                button.apply {\n                    isVisible = true\n                    setText(R.string.feed_watch_live_stream)\n                    setOnClickListener {\n                        eventListener.openLiveStream(url)\n                    }\n                    setIconResource(R.drawable.ic_play_circle_outline)\n                }\n            }\n        }\n        CTA_MAP_LOCATION -> {\n            button.apply {\n                isVisible = true\n                text = moment.featureName\n                setOnClickListener {\n                    eventListener.openMap(moment)\n                }\n                setIconResource(R.drawable.ic_nav_map)\n            }\n        }\n        CTA_SIGNIN -> {\n            if (userSignedIn) {\n                button.isVisible = false\n            } else {\n                button.apply {\n                    isVisible = true\n                    setText(R.string.sign_in)\n                    setOnClickListener { eventListener.signIn() }\n                    setIconResource(R.drawable.ic_default_profile_avatar)\n                }\n            }\n        }\n        else /* CTA_NO_ACTION */ -> button.isVisible = false\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedSectionHeaderViewBinder.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemGenericSectionHeaderBinding\nimport com.google.samples.apps.iosched.ui.SectionHeader\n\nclass FeedSectionHeaderViewBinder :\n    FeedItemViewBinder<SectionHeader, SectionHeaderViewHolder>(SectionHeader::class.java) {\n\n    override fun createViewHolder(parent: ViewGroup): SectionHeaderViewHolder =\n        SectionHeaderViewHolder(\n            ItemGenericSectionHeaderBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            )\n        )\n\n    override fun bindViewHolder(model: SectionHeader, viewHolder: SectionHeaderViewHolder) {\n        viewHolder.bind(model)\n    }\n\n    override fun getFeedItemType(): Int = R.layout.item_generic_section_header\n\n    override fun areItemsTheSame(oldItem: SectionHeader, newItem: SectionHeader): Boolean =\n        oldItem.titleId == newItem.titleId\n\n    // This is called if [areItemsTheSame] is true, in which case we know the contents match.\n    override fun areContentsTheSame(oldItem: SectionHeader, newItem: SectionHeader) = true\n}\n\nclass SectionHeaderViewHolder(\n    private val binding: ItemGenericSectionHeaderBinding\n) : ViewHolder(binding.root) {\n\n    fun bind(model: SectionHeader) {\n        binding.sectionHeader = model\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedSessionsViewBinder.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.os.Parcelable\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.annotation.StringRes\nimport androidx.databinding.BindingAdapter\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.HORIZONTAL\nimport androidx.recyclerview.widget.RecyclerView.LayoutManager\nimport androidx.recyclerview.widget.RecyclerView.NO_POSITION\nimport androidx.recyclerview.widget.RecyclerView.OnScrollListener\nimport androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemFeedSessionBinding\nimport com.google.samples.apps.iosched.databinding.ItemFeedSessionsContainerBinding\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.sessioncommon.SessionDiff\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\n\n/** A data class representing the state of FeedSEssionsContainer */\ndata class FeedSessions(\n    @StringRes val titleId: Int,\n    @StringRes val actionTextId: Int,\n    val userSessions: List<UserSession>,\n    val timeZoneId: ZoneId = ZoneId.systemDefault(),\n    val isMapFeatureEnabled: Boolean,\n    val isLoading: Boolean\n)\n\nclass FeedSessionsViewBinder(\n    private val eventListener: FeedEventListener,\n    var recyclerViewManagerState: Parcelable? = null\n) : FeedItemViewBinder<FeedSessions, FeedSessionsViewHolder>(FeedSessions::class.java) {\n\n    override fun createViewHolder(parent: ViewGroup): FeedSessionsViewHolder {\n        val holder = FeedSessionsViewHolder(\n            ItemFeedSessionsContainerBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            ),\n            eventListener\n        )\n\n        holder.binding.recyclerView.addOnScrollListener(object : OnScrollListener() {\n            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n                super.onScrollStateChanged(recyclerView, newState)\n                if (newState == SCROLL_STATE_IDLE) {\n                    saveInstanceState(holder)\n                }\n            }\n        })\n        return holder\n    }\n\n    override fun bindViewHolder(model: FeedSessions, viewHolder: FeedSessionsViewHolder) {\n        viewHolder.bind(model, recyclerViewManagerState)\n    }\n\n    override fun getFeedItemType(): Int = R.layout.item_feed_sessions_container\n\n    override fun areItemsTheSame(oldItem: FeedSessions, newItem: FeedSessions): Boolean = true\n\n    override fun areContentsTheSame(oldItem: FeedSessions, newItem: FeedSessions) =\n        oldItem == newItem\n\n    override fun onViewRecycled(viewHolder: FeedSessionsViewHolder) {\n        saveInstanceState(viewHolder)\n    }\n\n    override fun onViewDetachedFromWindow(viewHolder: FeedSessionsViewHolder) {\n        saveInstanceState(viewHolder)\n    }\n\n    fun saveInstanceState(viewHolder: FeedSessionsViewHolder) {\n        if (viewHolder.adapterPosition == NO_POSITION) {\n            return\n        }\n        recyclerViewManagerState = viewHolder.getLayoutManagerState()\n    }\n}\n\nclass FeedSessionsViewHolder(\n    val binding: ItemFeedSessionsContainerBinding,\n    private val eventListener: FeedEventListener\n) : ViewHolder(binding.root) {\n\n    private var layoutManager: LayoutManager? = null\n\n    fun bind(sessions: FeedSessions, layoutManagerState: Parcelable?) {\n        binding.sessionContainerState = sessions\n        binding.eventListener = eventListener\n        val sessionAdapter =\n            FeedSessionAdapter(\n                eventListener = eventListener,\n                timeZoneId = sessions.timeZoneId,\n                isMapFeatureEnabled = sessions.isMapFeatureEnabled\n            )\n        binding.recyclerView.apply {\n            layoutManager = LinearLayoutManager(context, HORIZONTAL, false)\n            adapter = sessionAdapter\n        }\n        layoutManager = binding.recyclerView.layoutManager\n\n        binding.actionButton.setOnClickListener {\n            eventListener.openSchedule(true)\n        }\n        sessionAdapter.submitList(sessions.userSessions)\n        if (layoutManagerState != null) {\n            layoutManager?.onRestoreInstanceState(layoutManagerState)\n        }\n\n        binding.executePendingBindings()\n    }\n\n    fun getLayoutManagerState(): Parcelable? = layoutManager?.onSaveInstanceState()\n}\n\n/** Adapter which provides views for sessions inside the FeedSessionsContainer */\nclass FeedSessionAdapter(\n    private val eventListener: FeedEventListener,\n    private val timeZoneId: ZoneId,\n    private val isMapFeatureEnabled: Boolean\n) : ListAdapter<UserSession, FeedSessionItemViewHolder>(SessionDiff) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FeedSessionItemViewHolder {\n        val binding = ItemFeedSessionBinding.inflate(\n            LayoutInflater.from(parent.context), parent, false\n        )\n        return FeedSessionItemViewHolder(binding, eventListener, timeZoneId, isMapFeatureEnabled)\n    }\n\n    override fun onBindViewHolder(holder: FeedSessionItemViewHolder, position: Int) {\n        holder.bind(getItem(position))\n    }\n}\n\n/** ViewHolder for the sessions inside the FeedSessionsContainer */\nclass FeedSessionItemViewHolder(\n    private val binding: ItemFeedSessionBinding,\n    private val eventListener: FeedEventListener,\n    private val timeZoneId: ZoneId,\n    private val isMapFeatureEnabled: Boolean\n) : ViewHolder(binding.root) {\n    fun bind(userSession: UserSession) {\n        binding.userSession = userSession\n        binding.eventListener = eventListener\n        binding.timeZoneId = timeZoneId\n        binding.isMapFeatureEnabled = isMapFeatureEnabled\n    }\n}\n\n@BindingAdapter(\"feedSessionStartTime\", \"feedSessionEndTime\", \"timeZoneId\")\nfun sessionTime(\n    textView: TextView,\n    feedSessionStartTime: ZonedDateTime,\n    feedSessionEndTime: ZonedDateTime,\n    timeZoneId: ZoneId\n) {\n    textView.text = TimeUtils.timeString(\n        TimeUtils.zonedTime(feedSessionStartTime, timeZoneId),\n        TimeUtils.zonedTime(feedSessionEndTime, timeZoneId),\n        withDate = false\n    )\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedSocialChannelsSectionViewBinder.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.text.SpannableString\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.style.ForegroundColorSpan\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemFeedSocialChannelsBinding\nimport com.google.samples.apps.iosched.util.getColorFromTheme\n\nobject FeedSocialChannelsSection\n\nclass FeedSocialChannelsSectionViewBinder :\n    FeedItemViewBinder<FeedSocialChannelsSection, FeedSocialChannelsSectionViewHolder>(\n        FeedSocialChannelsSection::class.java\n    ) {\n\n    override fun createViewHolder(parent: ViewGroup): ViewHolder =\n        FeedSocialChannelsSectionViewHolder(\n            ItemFeedSocialChannelsBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            )\n        )\n\n    override fun bindViewHolder(\n        model: FeedSocialChannelsSection,\n        viewHolder: FeedSocialChannelsSectionViewHolder\n    ) = viewHolder.bind()\n\n    override fun getFeedItemType() = R.layout.item_feed_social_channels\n\n    override fun areItemsTheSame(\n        oldItem: FeedSocialChannelsSection,\n        newItem: FeedSocialChannelsSection\n    ) = true\n\n    override fun areContentsTheSame(\n        oldItem: FeedSocialChannelsSection,\n        newItem: FeedSocialChannelsSection\n    ) = true\n}\n\nclass FeedSocialChannelsSectionViewHolder(val binding: ItemFeedSocialChannelsBinding) :\n    ViewHolder(binding.root) {\n\n    fun bind() {\n        val titleText = SpannableStringBuilder()\n            .append(SpannableString(\"#Google\"))\n            .append(\n                SpannableString(\"IO\")\n                    .apply {\n                        setSpan(\n                            ForegroundColorSpan(\n                                binding.root.context.getColorFromTheme(R.attr.colorPrimary)\n                            ),\n                            0, length, Spanned.SPAN_INCLUSIVE_INCLUSIVE\n                        )\n                    }\n            )\n        binding.title.text = titleText\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedSustainabilitySectionViewBinder.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemFeedSustainabilityBinding\n\nobject FeedSustainabilitySection\n\nclass FeedSustainabilitySectionViewBinder :\n    FeedItemViewBinder<FeedSustainabilitySection, FeedSustainabilitySectionViewHolder>(\n        FeedSustainabilitySection::class.java\n    ) {\n\n    override fun createViewHolder(parent: ViewGroup): ViewHolder =\n        FeedSustainabilitySectionViewHolder(\n            ItemFeedSustainabilityBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            )\n        )\n\n    override fun bindViewHolder(\n        model: FeedSustainabilitySection,\n        viewHolder: FeedSustainabilitySectionViewHolder\n    ) = Unit\n\n    override fun getFeedItemType() = R.layout.item_feed_sustainability\n\n    override fun areItemsTheSame(\n        oldItem: FeedSustainabilitySection,\n        newItem: FeedSustainabilitySection\n    ) = true\n\n    override fun areContentsTheSame(\n        oldItem: FeedSustainabilitySection,\n        newItem: FeedSustainabilitySection\n    ) = true\n}\n\nclass FeedSustainabilitySectionViewHolder(\n    binding: ItemFeedSustainabilityBinding\n) : ViewHolder(binding.root)\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedViewModel.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.navigation.NavDirections\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo\nimport com.google.samples.apps.iosched.shared.di.MapFeatureEnabledFlag\nimport com.google.samples.apps.iosched.shared.di.ReservationEnabledFlag\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.ENDED\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.UPCOMING\nimport com.google.samples.apps.iosched.shared.domain.feed.GetConferenceStateUseCase\nimport com.google.samples.apps.iosched.shared.domain.feed.LoadAnnouncementsUseCase\nimport com.google.samples.apps.iosched.shared.domain.feed.LoadCurrentMomentUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadStarredAndReservedSessionsUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.shared.util.TimeUtils.ConferenceDays\nimport com.google.samples.apps.iosched.shared.util.toEpochMilli\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessage\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickListener\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.ui.theme.ThemedActivityDelegate\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.SharingStarted.Companion.Eagerly\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.stateIn\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\nimport javax.inject.Inject\n\n/**\n * Loads data and exposes it to the view.\n * By annotating the constructor with [@Inject], Dagger will use that constructor when needing to\n * create the object, so defining a [@Provides] method for this class won't be needed.\n */\n@HiltViewModel\nclass FeedViewModel @Inject constructor(\n    private val loadCurrentMomentUseCase: LoadCurrentMomentUseCase,\n    loadAnnouncementsUseCase: LoadAnnouncementsUseCase,\n    private val loadStarredAndReservedSessionsUseCase: LoadStarredAndReservedSessionsUseCase,\n    getTimeZoneUseCase: GetTimeZoneUseCase,\n    getConferenceStateUseCase: GetConferenceStateUseCase,\n    private val timeProvider: TimeProvider,\n    private val analyticsHelper: AnalyticsHelper,\n    private val signInViewModelDelegate: SignInViewModelDelegate,\n    themedActivityDelegate: ThemedActivityDelegate,\n    private val snackbarMessageManager: SnackbarMessageManager\n) : ViewModel(),\n    FeedEventListener,\n    ThemedActivityDelegate by themedActivityDelegate,\n    SignInViewModelDelegate by signInViewModelDelegate {\n\n    companion object {\n        // Show at max 10 sessions in the horizontal sessions list as user can click on\n        // View All sessions and go to schedule to view the full list\n        private const val MAX_SESSIONS = 10\n\n        // Indicates there is no header to show at the current time.\n        private object NoHeader\n\n        // Indicates there is no sessions related display on the home screen as the conference is\n        // over.\n        private object NoSessionsContainer\n    }\n\n    @Inject\n    @JvmField\n    @ReservationEnabledFlag\n    var isReservationEnabledByRemoteConfig: Boolean = false\n\n    @Inject\n    @JvmField\n    @MapFeatureEnabledFlag\n    var isMapEnabledByRemoteConfig: Boolean = false\n\n    // Exposed to the view as a StateFlow but it's a one-shot operation.\n    val timeZoneId = flow<ZoneId> {\n        if (getTimeZoneUseCase(Unit).successOr(true)) {\n            emit(TimeUtils.CONFERENCE_TIMEZONE)\n        } else {\n            emit(ZoneId.systemDefault())\n        }\n    }.stateIn(viewModelScope, Eagerly, TimeUtils.CONFERENCE_TIMEZONE)\n\n    private val loadSessionsResult: StateFlow<Result<List<UserSession>>> =\n        signInViewModelDelegate.userId\n            .flatMapLatest {\n                // TODO(jdkoren): might need to show sessions for not signed in users too...\n                loadStarredAndReservedSessionsUseCase(it)\n            }\n            .stateIn(viewModelScope, WhileViewSubscribed, Result.Loading)\n\n    private val conferenceState: StateFlow<ConferenceState> = getConferenceStateUseCase(Unit)\n        .onEach {\n            if (it is Result.Error) {\n                snackbarMessageManager.addMessage(SnackbarMessage(R.string.feed_loading_error))\n            }\n        }\n        .map { it.successOr(UPCOMING) }\n        .stateIn(viewModelScope, WhileViewSubscribed, UPCOMING)\n\n    // SIDE EFFECTS: Navigation actions\n    private val _navigationActions = Channel<FeedNavigationAction>(capacity = Channel.CONFLATED)\n    // Exposed with receiveAsFlow to make sure that only one observer receives updates.\n    val navigationActions = _navigationActions.receiveAsFlow()\n\n    private val currentMomentResult: StateFlow<Result<Moment?>> = conferenceState.map {\n        // Reload if conferenceState changes\n        loadCurrentMomentUseCase(timeProvider.now())\n    }.stateIn(viewModelScope, WhileViewSubscribed, Result.Loading)\n\n    private val loadAnnouncementsResult: StateFlow<Result<List<Announcement>>> = flow {\n        emit(loadAnnouncementsUseCase(timeProvider.now()))\n    }.onEach {\n        if (it is Result.Error) {\n            snackbarMessageManager.addMessage(SnackbarMessage(R.string.feed_loading_error))\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, Result.Loading)\n\n    private val announcementsPreview: StateFlow<List<Any>> = loadAnnouncementsResult.map {\n        val announcementsHeader = AnnouncementsHeader(\n            showPastNotificationsButton = it.successOr(emptyList()).size > 1\n        )\n        if (it is Result.Loading) {\n            listOf(announcementsHeader, LoadingIndicator)\n        } else {\n            listOf(\n                announcementsHeader,\n                it.successOr(emptyList()).firstOrNull() ?: AnnouncementsEmpty\n            )\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, emptyList())\n\n    private val feedSessionsContainer: Flow<FeedSessions> = loadSessionsResult\n        .combine(timeZoneId) { sessions, timeZone ->\n            createFeedSessionsContainer(sessions, timeZone)\n        }\n\n    private val sessionContainer: StateFlow<Any> =\n        combine(\n            feedSessionsContainer,\n            conferenceState,\n            signInViewModelDelegate.userInfo\n        ) { sessionsContainer: FeedSessions,\n            conferenceState: ConferenceState,\n            userInfo: AuthenticatedUserInfo?\n            ->\n            val isSignedIn = userInfo?.isSignedIn() ?: false\n            val isRegistered = userInfo?.isRegistered() ?: false\n            if (conferenceState != ENDED && isSignedIn && isRegistered &&\n                isReservationEnabledByRemoteConfig\n            ) {\n                sessionsContainer\n            } else {\n                NoSessionsContainer\n            }\n        }.stateIn(viewModelScope, WhileViewSubscribed, NoSessionsContainer)\n\n    private val currentFeedHeader: StateFlow<Any> = conferenceState.combine(\n        currentMomentResult\n    ) { conferenceStarted: ConferenceState, momentResult ->\n        if (conferenceStarted == UPCOMING) {\n            CountdownItem\n        } else {\n            // Use case can return null even on success, so replace nulls with a sentinel\n            momentResult.successOr(null) ?: NoHeader\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, NoHeader)\n\n    // TODO: Replace Any with something meaningful.\n    val feed: StateFlow<List<Any>> = combine(\n        currentFeedHeader,\n        sessionContainer,\n        announcementsPreview\n    ) { feedHeader: Any, sessionContainer: Any, announcementsPreview: List<Any> ->\n        val feedItems = mutableListOf<Any>()\n        if (feedHeader != NoHeader) {\n            feedItems.add(feedHeader)\n        }\n        if (sessionContainer != NoSessionsContainer) {\n            feedItems.add(sessionContainer)\n        }\n        feedItems\n            .plus(announcementsPreview)\n            .plus(FeedSustainabilitySection)\n            .plus(FeedSocialChannelsSection)\n    }.stateIn(viewModelScope, WhileViewSubscribed, emptyList())\n\n    private fun createFeedSessionsContainer(\n        sessionsResult: Result<List<UserSession>>,\n        timeZoneId: ZoneId\n    ): FeedSessions {\n        val sessions = sessionsResult.successOr(emptyList())\n        val now = ZonedDateTime.ofInstant(timeProvider.now(), timeZoneId)\n\n        // TODO: Making conferenceState a sealed class and moving currentDay in STARTED\n        //  state might be a better option\n        val currentDayEndTime = TimeUtils.getCurrentConferenceDay()?.end\n            // Treat start of the conference as endTime as sessions shouldn't be shown if the\n            // currentConferenceDay is null\n            ?: ConferenceDays.first().start\n\n        val upcomingReservedSessions = sessions\n            .filter {\n                it.userEvent.isReserved() &&\n                    it.session.endTime.isAfter(now) &&\n                    it.session.endTime.isBefore(currentDayEndTime)\n            }\n            .take(MAX_SESSIONS)\n\n        val titleId = R.string.feed_sessions_title\n        val actionId = R.string.feed_view_full_schedule\n\n        return FeedSessions(\n            titleId = titleId,\n            actionTextId = actionId,\n            userSessions = upcomingReservedSessions,\n            timeZoneId = timeZoneId,\n            isLoading = sessionsResult is Result.Loading,\n            isMapFeatureEnabled = isMapEnabledByRemoteConfig\n        )\n    }\n\n    override fun openEventDetail(id: SessionId) {\n        analyticsHelper.logUiEvent(\n            \"Home to event detail\",\n            AnalyticsActions.HOME_TO_SESSION_DETAIL\n        )\n        _navigationActions.tryOffer(FeedNavigationAction.NavigateToSession(id))\n    }\n\n    override fun openSchedule(showOnlyPinnedSessions: Boolean) {\n        analyticsHelper.logUiEvent(\"Home to Schedule\", AnalyticsActions.HOME_TO_SCHEDULE)\n        _navigationActions.tryOffer(FeedNavigationAction.NavigateToScheduleAction)\n    }\n\n    override fun onStarClicked(userSession: UserSession) {\n        TODO(\"not implemented\")\n    }\n\n    override fun signIn() {\n        analyticsHelper.logUiEvent(\"Home to Sign In\", AnalyticsActions.HOME_TO_SIGN_IN)\n        _navigationActions.tryOffer(FeedNavigationAction.OpenSignInDialogAction)\n    }\n\n    override fun openMap(moment: Moment) {\n        analyticsHelper.logUiEvent(moment.title.toString(), AnalyticsActions.HOME_TO_MAP)\n        _navigationActions.tryOffer(\n            FeedNavigationAction.NavigateAction(\n                FeedFragmentDirections.toMap(\n                    featureId = moment.featureId,\n                    startTime = moment.startTime.toEpochMilli()\n                )\n            )\n        )\n    }\n\n    override fun openLiveStream(liveStreamUrl: String) {\n        analyticsHelper.logUiEvent(liveStreamUrl, AnalyticsActions.HOME_TO_LIVESTREAM)\n        _navigationActions.tryOffer(FeedNavigationAction.OpenLiveStreamAction(liveStreamUrl))\n    }\n\n    override fun openMapForSession(session: Session) {\n        analyticsHelper.logUiEvent(session.id, AnalyticsActions.HOME_TO_MAP)\n        val directions = FeedFragmentDirections.toMap(\n            featureId = session.room?.id,\n            startTime = session.startTime.toEpochMilli()\n        )\n        _navigationActions.tryOffer(FeedNavigationAction.NavigateAction(directions))\n    }\n\n    override fun openPastAnnouncements() {\n        analyticsHelper.logUiEvent(\"\", AnalyticsActions.HOME_TO_ANNOUNCEMENTS)\n        val directions = FeedFragmentDirections.toAnnouncementsFragment()\n        _navigationActions.tryOffer(FeedNavigationAction.NavigateAction(directions))\n    }\n}\n\ninterface FeedEventListener : OnSessionClickListener, OnSessionStarClickListener {\n    fun openSchedule(showOnlyPinnedSessions: Boolean)\n    fun signIn()\n    fun openMap(moment: Moment)\n    fun openLiveStream(liveStreamUrl: String)\n    fun openMapForSession(session: Session)\n    fun openPastAnnouncements()\n}\n\nsealed class FeedNavigationAction {\n    class NavigateToSession(val sessionId: SessionId) : FeedNavigationAction()\n    class NavigateAction(val directions: NavDirections) : FeedNavigationAction()\n    object OpenSignInDialogAction : FeedNavigationAction()\n    class OpenLiveStreamAction(val url: String) : FeedNavigationAction()\n    object NavigateToScheduleAction : FeedNavigationAction()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/CloseableFilterChipAdapter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.filters\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.databinding.ItemFilterChipCloseableBinding\nimport com.google.samples.apps.iosched.ui.filters.CloseableFilterChipAdapter.FilterChipViewHolder\nimport com.google.samples.apps.iosched.util.executeAfter\n\n// TODO(jdkoren): Maybe combine this with SelectableFilterChipAdapter\n/** Adapter for closeable filters, e.g. those shown above search results. */\nclass CloseableFilterChipAdapter(\n    private val viewModelDelegate: FiltersViewModelDelegate\n) : ListAdapter<FilterChip, FilterChipViewHolder>(FilterChipDiff) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FilterChipViewHolder {\n        return FilterChipViewHolder(\n            ItemFilterChipCloseableBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            ).apply {\n                viewModel = viewModelDelegate\n            }\n        )\n    }\n\n    override fun onBindViewHolder(holder: FilterChipViewHolder, position: Int) {\n        holder.bind(getItem(position))\n    }\n\n    class FilterChipViewHolder(\n        private val binding: ItemFilterChipCloseableBinding\n    ) : ViewHolder(binding.root) {\n        fun bind(item: FilterChip) {\n            binding.executeAfter {\n                filterChip = item\n            }\n        }\n    }\n}\n\nprivate object FilterChipDiff : DiffUtil.ItemCallback<FilterChip>() {\n    override fun areItemsTheSame(oldItem: FilterChip, newItem: FilterChip) =\n        oldItem.filter == newItem.filter\n\n    override fun areContentsTheSame(oldItem: FilterChip, newItem: FilterChip) =\n        oldItem.isSelected == newItem.isSelected\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FilterChip.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.filters\n\nimport android.graphics.Color\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Tag\nimport com.google.samples.apps.iosched.model.filters.Filter\nimport com.google.samples.apps.iosched.model.filters.Filter.DateFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.MyScheduleFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.TagFilter\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\n\n/** Wrapper model for showing [Filter] as a chip in the UI. */\ndata class FilterChip(\n    val filter: Filter,\n    val isSelected: Boolean,\n    val categoryLabel: Int = 0,\n    val color: Int = Color.parseColor(\"#4768fd\"), // @color/indigo\n    val selectedTextColor: Int = Color.WHITE,\n    val textResId: Int = 0,\n    val text: String = \"\"\n)\n\nfun Filter.asChip(isSelected: Boolean): FilterChip = when (this) {\n    is TagFilter -> FilterChip(\n        filter = this,\n        isSelected = isSelected,\n        color = tag.color,\n        text = tag.displayName,\n        selectedTextColor = tag.fontColor ?: Color.TRANSPARENT,\n        categoryLabel = tag.filterCategoryLabel()\n    )\n    is DateFilter -> FilterChip(\n        filter = this,\n        isSelected = isSelected,\n        textResId = TimeUtils.getShortLabelResForDay(day),\n        categoryLabel = R.string.category_heading_dates\n    )\n    MyScheduleFilter -> FilterChip(\n        filter = this,\n        isSelected = isSelected,\n        textResId = R.string.my_events,\n        categoryLabel = R.string.category_heading_dates\n    )\n}\n\nprivate fun Tag.filterCategoryLabel(): Int = when (this.category) {\n    Tag.CATEGORY_TYPE -> R.string.category_heading_types\n    Tag.CATEGORY_TOPIC -> R.string.category_heading_tracks\n    Tag.CATEGORY_LEVEL -> R.string.category_heading_levels\n    else -> 0\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FiltersFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.filters\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewGroup.MarginLayoutParams\nimport androidx.activity.OnBackPressedCallback\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.doOnLayout\nimport androidx.core.view.marginBottom\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePadding\nimport androidx.databinding.ObservableFloat\nimport androidx.fragment.app.Fragment\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.OnScrollListener\nimport com.google.android.flexbox.FlexboxItemDecoration\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentFiltersBinding\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.util.slideOffsetToAlpha\nimport com.google.samples.apps.iosched.widget.BottomSheetBehavior\nimport com.google.samples.apps.iosched.widget.BottomSheetBehavior.BottomSheetCallback\nimport com.google.samples.apps.iosched.widget.BottomSheetBehavior.Companion.STATE_COLLAPSED\nimport com.google.samples.apps.iosched.widget.BottomSheetBehavior.Companion.STATE_EXPANDED\nimport com.google.samples.apps.iosched.widget.BottomSheetBehavior.Companion.STATE_HIDDEN\nimport kotlinx.coroutines.flow.collect\n\n/**\n * Fragment that shows the list of filters for the Schedule\n */\nabstract class FiltersFragment : Fragment() {\n\n    companion object {\n        // Threshold for when the filter sheet content should become invisible.\n        // This should be a value between 0 and 1, coinciding with a point between the bottom\n        // sheet's collapsed (0) and expanded (1) states.\n        private const val ALPHA_CONTENT_START = 0.1f\n        // Threshold for when the filter sheet content should become visible.\n        // This should be a value between 0 and 1, coinciding with a point between the bottom\n        // sheet's collapsed (0) and expanded (1) states.\n        private const val ALPHA_CONTENT_END = 0.3f\n    }\n\n    private lateinit var viewModel: FiltersViewModelDelegate\n\n    private lateinit var filterAdapter: SelectableFilterChipAdapter\n\n    private lateinit var binding: FragmentFiltersBinding\n\n    private lateinit var behavior: BottomSheetBehavior<*>\n\n    private var contentAlpha = ObservableFloat(1f)\n\n    private val backPressedCallback = object : OnBackPressedCallback(false) {\n        override fun handleOnBackPressed() {\n            if (::behavior.isInitialized && behavior.state == STATE_EXPANDED) {\n                behavior.state = STATE_HIDDEN\n            }\n        }\n    }\n\n    private var pendingSheetState = -1\n\n    /** Resolve the [FiltersViewModelDelegate] for this instance. */\n    abstract fun resolveViewModelDelegate(): FiltersViewModelDelegate\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        requireActivity().onBackPressedDispatcher.addCallback(this, backPressedCallback)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        binding = FragmentFiltersBinding.inflate(inflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n            contentAlpha = this@FiltersFragment.contentAlpha\n        }\n\n        // Pad the bottom of the RecyclerView so that the content scrolls up above the nav bar\n        binding.recyclerviewFilters.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n\n        return binding.root\n    }\n\n    // In order to acquire the behavior associated with this sheet, we need to be attached to the\n    // view hierarchy of our parent, otherwise we get an exception that our view is not a child of a\n    // CoordinatorLayout. Therefore we do most initialization here instead of in onViewCreated().\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        viewModel = resolveViewModelDelegate()\n        binding.viewModel = viewModel\n\n        behavior = BottomSheetBehavior.from(binding.filterSheet)\n\n        filterAdapter = SelectableFilterChipAdapter(viewModel)\n        binding.recyclerviewFilters.apply {\n            adapter = filterAdapter\n            setHasFixedSize(true)\n            itemAnimator = null\n            addOnScrollListener(object : OnScrollListener() {\n                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n                    binding.filtersHeaderShadow.isActivated = recyclerView.canScrollVertically(-1)\n                }\n            })\n            addItemDecoration(\n                FlexboxItemDecoration(context).apply {\n                    setDrawable(context.getDrawable(R.drawable.divider_empty_margin_small))\n                    setOrientation(FlexboxItemDecoration.VERTICAL)\n                }\n            )\n        }\n\n        // Update the peek and margins so that it scrolls and rests within sys ui\n        val peekHeight = behavior.peekHeight\n        val marginBottom = binding.root.marginBottom\n        binding.root.doOnApplyWindowInsets { v, insets, _ ->\n            val gestureInsets = insets.getInsets(WindowInsetsCompat.Type.systemGestures())\n            // Update the peek height so that it is above the navigation bar\n            behavior.peekHeight = gestureInsets.bottom + peekHeight\n\n            v.updateLayoutParams<MarginLayoutParams> {\n                bottomMargin = marginBottom + gestureInsets.top\n            }\n        }\n\n        behavior.addBottomSheetCallback(object : BottomSheetCallback {\n            override fun onSlide(bottomSheet: View, slideOffset: Float) {\n                updateFilterContentsAlpha(slideOffset)\n            }\n\n            override fun onStateChanged(bottomSheet: View, newState: Int) {\n                updateBackPressedCallbackEnabled(newState)\n            }\n        })\n\n        binding.collapseArrow.setOnClickListener {\n            behavior.state = if (behavior.skipCollapsed) STATE_HIDDEN else STATE_COLLAPSED\n        }\n\n        binding.filterSheet.doOnLayout {\n            val slideOffset = when (behavior.state) {\n                STATE_EXPANDED -> 1f\n                STATE_COLLAPSED -> 0f\n                else /*BottomSheetBehavior.STATE_HIDDEN*/ -> -1f\n            }\n            updateFilterContentsAlpha(slideOffset)\n        }\n\n        if (pendingSheetState != -1) {\n            behavior.state = pendingSheetState\n            pendingSheetState = -1\n        }\n        updateBackPressedCallbackEnabled(behavior.state)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        launchAndRepeatWithViewLifecycle {\n            viewModel.filterChips.collect {\n                filterAdapter.submitFilterList(it)\n            }\n        }\n    }\n\n    private fun updateFilterContentsAlpha(slideOffset: Float) {\n        // Since the content is visible behind the navigation bar, apply a short alpha transition.\n        contentAlpha.set(\n            slideOffsetToAlpha(slideOffset, ALPHA_CONTENT_START, ALPHA_CONTENT_END)\n        )\n    }\n\n    private fun updateBackPressedCallbackEnabled(state: Int) {\n        backPressedCallback.isEnabled = !(state == STATE_COLLAPSED || state == STATE_HIDDEN)\n    }\n\n    fun showFiltersSheet() {\n        if (::behavior.isInitialized) {\n            behavior.state = STATE_EXPANDED\n        } else {\n            pendingSheetState = STATE_EXPANDED\n        }\n    }\n\n    fun hideFiltersSheet() {\n        if (::behavior.isInitialized) {\n            behavior.state = STATE_HIDDEN\n        } else {\n            pendingSheetState = STATE_HIDDEN\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FiltersViewBindingAdapters.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.filters\n\nimport android.content.res.ColorStateList\nimport android.graphics.Color\nimport android.widget.TextView\nimport androidx.core.content.ContextCompat\nimport androidx.databinding.BindingAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.chip.Chip\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.widget.SpaceDecoration\n\n@BindingAdapter(\"activeFilters\", \"viewModel\", requireAll = true)\nfun activeFilters(\n    recyclerView: RecyclerView,\n    filters: List<FilterChip>?,\n    viewModel: FiltersViewModelDelegate\n) {\n    val filterChipAdapter: CloseableFilterChipAdapter\n    if (recyclerView.adapter == null) {\n        filterChipAdapter = CloseableFilterChipAdapter(viewModel)\n        recyclerView.apply {\n            adapter = filterChipAdapter\n            val space = resources.getDimensionPixelSize(R.dimen.spacing_micro)\n            addItemDecoration(SpaceDecoration(start = space, end = space))\n        }\n    } else {\n        filterChipAdapter = recyclerView.adapter as CloseableFilterChipAdapter\n    }\n    filterChipAdapter.submitList(filters ?: emptyList())\n}\n\n@BindingAdapter(\"showResultCount\", \"resultCount\", requireAll = true)\nfun filterHeader(textView: TextView, showResultCount: Boolean?, resultCount: Int?) {\n    if (showResultCount == true && resultCount != null) {\n        textView.text = textView.resources.getString(R.string.result_count, resultCount)\n    } else {\n        textView.setText(R.string.filters)\n    }\n}\n\n@BindingAdapter(\"filterChipOnClick\", \"viewModel\", requireAll = true)\nfun filterChipOnClick(\n    chip: Chip,\n    filterChip: FilterChip,\n    viewModel: FiltersViewModelDelegate\n) {\n    chip.setOnClickListener {\n        viewModel.toggleFilter(filterChip.filter, !filterChip.isSelected)\n    }\n}\n\n@BindingAdapter(\"filterChipOnClose\", \"viewModel\", requireAll = true)\nfun filterChipOnClose(\n    chip: Chip,\n    filterChip: FilterChip,\n    viewModel: FiltersViewModelDelegate\n) {\n    chip.setOnCloseIconClickListener {\n        viewModel.toggleFilter(filterChip.filter, false)\n    }\n}\n\n@BindingAdapter(\"filterChipText\")\nfun filterChipText(chip: Chip, filter: FilterChip) {\n    if (filter.textResId != 0) {\n        chip.setText(filter.textResId)\n    } else {\n        chip.text = filter.text\n    }\n}\n\n@BindingAdapter(\"filterChipTint\")\nfun filterChipTint(chip: Chip, color: Int) {\n    val tintColor = if (color != Color.TRANSPARENT) {\n        color\n    } else {\n        ContextCompat.getColor(chip.context, R.color.default_tag_color)\n    }\n    chip.chipIconTint = ColorStateList.valueOf(tintColor)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FiltersViewModel.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.filters\n\nimport com.google.samples.apps.iosched.model.filters.Filter\nimport com.google.samples.apps.iosched.util.compatRemoveIf\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\n\n/**\n * Interface to add filters functionality to a screen through a ViewModel.\n */\ninterface FiltersViewModelDelegate {\n    /** The full list of filter chips. */\n    val filterChips: Flow<List<FilterChip>>\n    /** The list of selected filters. */\n    val selectedFilters: StateFlow<List<Filter>>\n    /** The list of selected filter chips. */\n    val selectedFilterChips: StateFlow<List<FilterChip>>\n    /** True if there are any selected filters. */\n    val hasAnyFilters: StateFlow<Boolean>\n    /** Number of results from applying filters. Can be set by implementers. */\n    val resultCount: MutableStateFlow<Int>\n    /** Whether to show the result count instead of the \"Filters\" header. */\n    val showResultCount: StateFlow<Boolean>\n\n    /** Set the list of filters. */\n    fun setSupportedFilters(filters: List<Filter>)\n\n    /** Set the selected state of the filter. Must be one of the supported filters. */\n    fun toggleFilter(filter: Filter, enabled: Boolean)\n\n    /** Clear all selected filters. */\n    fun clearFilters()\n}\n\nclass FiltersViewModelDelegateImpl(\n    externalScope: CoroutineScope\n) : FiltersViewModelDelegate {\n\n    private val _filterChips = MutableStateFlow<List<FilterChip>>(emptyList())\n    override val filterChips: Flow<List<FilterChip>> = _filterChips\n\n    private val _selectedFilters = MutableStateFlow<List<Filter>>(emptyList())\n    override val selectedFilters: StateFlow<List<Filter>> = _selectedFilters\n\n    private val _selectedFilterChips = MutableStateFlow<List<FilterChip>>(emptyList())\n    override val selectedFilterChips: StateFlow<List<FilterChip>> = _selectedFilterChips\n\n    override val hasAnyFilters = selectedFilterChips\n        .map { it.isNotEmpty() }\n        .stateIn(externalScope, SharingStarted.Lazily, false)\n\n    override val resultCount = MutableStateFlow(0)\n\n    // Default behavior: show count when there are active filters.\n    override val showResultCount = hasAnyFilters\n\n    // State for internal logic\n    private var _filters = mutableListOf<Filter>()\n    private val _selectedFiltersList = mutableSetOf<Filter>()\n    private var _filterChipsList = mutableListOf<FilterChip>()\n    private var _selectedFilterChipsList = mutableListOf<FilterChip>()\n\n    override fun setSupportedFilters(filters: List<Filter>) {\n        // Remove orphaned filters\n        val selectedChanged = _selectedFiltersList.compatRemoveIf { it !in filters }\n        _filters = filters.toMutableList()\n        _filterChipsList = _filters.mapTo(mutableListOf()) {\n            it.asChip(it in _selectedFiltersList)\n        }\n\n        if (selectedChanged) {\n            _selectedFilterChipsList = _filterChipsList.filterTo(mutableListOf()) { it.isSelected }\n        }\n        publish(selectedChanged)\n    }\n\n    private fun publish(selectedChanged: Boolean) {\n        _filterChips.value = _filterChipsList\n        if (selectedChanged) {\n            _selectedFilters.value = _selectedFiltersList.toList()\n            _selectedFilterChips.value = _selectedFilterChipsList\n        }\n    }\n\n    override fun toggleFilter(filter: Filter, enabled: Boolean) {\n        if (filter !in _filters) {\n            throw IllegalArgumentException(\"Unsupported filter: $filter\")\n        }\n        val changed = if (enabled) {\n            _selectedFiltersList.add(filter)\n        } else {\n            _selectedFiltersList.remove(filter)\n        }\n        if (changed) {\n            _selectedFilterChipsList =\n                _selectedFiltersList.mapTo(mutableListOf()) { it.asChip(true) }\n            val index = _filterChipsList.indexOfFirst { it.filter == filter }\n            _filterChipsList[index] = filter.asChip(enabled)\n\n            publish(true)\n        }\n    }\n\n    override fun clearFilters() {\n        if (_selectedFiltersList.isNotEmpty()) {\n            _selectedFiltersList.clear()\n            _selectedFilterChipsList.clear()\n            _filterChipsList = _filterChipsList.mapTo(mutableListOf()) {\n                if (it.isSelected) it.copy(isSelected = false) else it\n            }\n\n            publish(true)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/FiltersViewModelDelegateModule.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.filters\n\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineScope\n\n@InstallIn(SingletonComponent::class)\n@Module\nclass FiltersViewModelDelegateModule {\n\n    @Provides\n    fun provideFiltersViewModelDelegate(\n        @ApplicationScope applicationScope: CoroutineScope\n    ): FiltersViewModelDelegate = FiltersViewModelDelegateImpl(applicationScope)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/filters/SelectableFilterChipAdapter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.filters\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemFilterChipSelectableBinding\nimport com.google.samples.apps.iosched.databinding.ItemGenericSectionHeaderBinding\nimport com.google.samples.apps.iosched.shared.util.exceptionInDebug\nimport com.google.samples.apps.iosched.ui.SectionHeader\n\n/** Adapter for selectable filters, e.g. ones shown in the filter sheet. */\nclass SelectableFilterChipAdapter(\n    private val viewModelDelegate: FiltersViewModelDelegate\n) : ListAdapter<Any, ViewHolder>(FilterChipAndHeadingDiff) {\n\n    companion object {\n        private const val VIEW_TYPE_HEADING = R.layout.item_generic_section_header\n        private const val VIEW_TYPE_FILTER = R.layout.item_filter_chip_selectable\n\n        /**\n         * Inserts category headings in a list of [FilterChip]s to make a heterogeneous list.\n         * Assumes the items are already grouped by [FilterChip.categoryLabel], beginning with\n         * categoryLabel == '0'.\n         */\n        private fun insertCategoryHeadings(list: List<FilterChip>?): List<Any> {\n            val newList = mutableListOf<Any>()\n            var previousCategory = 0\n            list?.forEach {\n                val category = it.categoryLabel\n                if (category != previousCategory && category != 0) {\n                    newList += SectionHeader(\n                        titleId = category,\n                        useHorizontalPadding = false\n                    )\n                }\n                newList.add(it)\n                previousCategory = category\n            }\n            return newList\n        }\n    }\n\n    override fun submitList(list: MutableList<Any>?) {\n        exceptionInDebug(\n            RuntimeException(\"call `submitEventFilterList()` instead to add category headings.\")\n        )\n        super.submitList(list)\n    }\n\n    /** Prefer this method over [submitList] to add category headings. */\n    fun submitFilterList(list: List<FilterChip>?) {\n        super.submitList(insertCategoryHeadings(list))\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return when (getItem(position)) {\n            is SectionHeader -> VIEW_TYPE_HEADING\n            is FilterChip -> VIEW_TYPE_FILTER\n            else -> throw IllegalArgumentException(\"Unknown item type\")\n        }\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        return when (viewType) {\n            VIEW_TYPE_HEADING -> createHeadingViewHolder(parent)\n            VIEW_TYPE_FILTER -> createFilterViewHolder(parent)\n            else -> throw IllegalArgumentException(\"Unknown item type\")\n        }\n    }\n\n    private fun createHeadingViewHolder(parent: ViewGroup): HeadingViewHolder {\n        return HeadingViewHolder(\n            ItemGenericSectionHeaderBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            )\n        )\n    }\n\n    private fun createFilterViewHolder(parent: ViewGroup): FilterViewHolder {\n        val binding = ItemFilterChipSelectableBinding.inflate(\n            LayoutInflater.from(parent.context), parent, false\n        ).apply {\n            viewModel = viewModelDelegate\n        }\n        return FilterViewHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: ViewHolder, position: Int) {\n        when (holder) {\n            is HeadingViewHolder -> holder.bind(getItem(position) as SectionHeader)\n            is FilterViewHolder -> holder.bind(getItem(position) as FilterChip)\n        }\n    }\n\n    /** ViewHolder for category heading items. */\n    class HeadingViewHolder(\n        private val binding: ItemGenericSectionHeaderBinding\n    ) : ViewHolder(binding.root) {\n\n        internal fun bind(item: SectionHeader) {\n            binding.sectionHeader = item\n            binding.executePendingBindings()\n        }\n    }\n\n    /** ViewHolder for [FilterChip] items. */\n    class FilterViewHolder(private val binding: ItemFilterChipSelectableBinding) :\n        ViewHolder(binding.root) {\n\n        internal fun bind(item: FilterChip) {\n            binding.filterChip = item\n            binding.executePendingBindings()\n        }\n    }\n}\n\nprivate object FilterChipAndHeadingDiff : DiffUtil.ItemCallback<Any>() {\n    override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean {\n        return when (oldItem) {\n            is FilterChip -> newItem is FilterChip && newItem.filter == oldItem.filter\n            else -> oldItem == newItem // SectionHeader\n        }\n    }\n\n    override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean {\n        return when (oldItem) {\n            is FilterChip -> oldItem.isSelected == (newItem as FilterChip).isSelected\n            else -> true\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/info/EventFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.info\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\nimport androidx.databinding.BindingAdapter\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentInfoEventBinding\nimport com.google.samples.apps.iosched.model.ConferenceWifiInfo\nimport com.google.samples.apps.iosched.shared.di.AssistantAppEnabledFlag\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.messages.setupSnackbarManager\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.widget.FadingSnackbar\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass EventFragment : Fragment() {\n\n    @Inject lateinit var snackbarMessageManager: SnackbarMessageManager\n\n    @Inject\n    @JvmField\n    @AssistantAppEnabledFlag\n    var assistantAppEnabled = false\n\n    private val eventInfoViewModel: EventInfoViewModel by viewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        context ?: return null\n\n        val binding = FragmentInfoEventBinding.inflate(inflater, container, false).apply {\n            viewModel = eventInfoViewModel\n            showAssistantApp = assistantAppEnabled\n            lifecycleOwner = viewLifecycleOwner\n        }\n\n        // Pad the bottom of the content so that it is above the nav bar\n        binding.content.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n\n        val snackbarLayout = requireActivity().findViewById<FadingSnackbar>(R.id.snackbar)\n        setupSnackbarManager(snackbarMessageManager, snackbarLayout)\n\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        launchAndRepeatWithViewLifecycle {\n            eventInfoViewModel.navigationActions.collect { event ->\n                when (event) {\n                    is EventInfoNavigationAction.OpenUrl -> {\n                        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(event.url)))\n                    }\n                }\n            }\n        }\n    }\n}\n\n@BindingAdapter(\"countdownVisibility\")\nfun countdownVisibility(countdown: View, ignored: Boolean?) {\n    // TODO Remove this method since ignored is unused\n    countdown.visibility = if (TimeUtils.conferenceHasStarted()) GONE else VISIBLE\n}\n\n@BindingAdapter(\"wifiInfo\")\nfun bindWifiInfo(textView: TextView, wifiInfo: ConferenceWifiInfo?) {\n    textView.text = if (wifiInfo == null) null else {\n        textView.resources.getString(\n            R.string.wifi_network_and_password, wifiInfo.ssid, wifiInfo.password\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/info/EventInfoViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.info\n\nimport android.net.wifi.WifiConfiguration\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.ConferenceWifiInfo\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.domain.logistics.LoadWifiInfoUseCase\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessage\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport com.google.samples.apps.iosched.util.wifi.WifiInstaller\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.stateIn\nimport javax.inject.Inject\n\n@HiltViewModel\nclass EventInfoViewModel @Inject constructor(\n    loadWifiInfoUseCase: LoadWifiInfoUseCase,\n    private val wifiInstaller: WifiInstaller,\n    private val analyticsHelper: AnalyticsHelper,\n    private val snackbarMessageManager: SnackbarMessageManager\n) : ViewModel() {\n\n    companion object {\n        private const val ASSISTANT_APP_URL =\n            \"https://assistant.google.com/services/invoke/uid/0000009fca77b068\"\n    }\n\n    val wifiConfig: StateFlow<ConferenceWifiInfo?> = flow {\n        emit(loadWifiInfoUseCase(Unit).data)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, null)\n\n    val showWifi: StateFlow<Boolean> = wifiConfig.map {\n        it?.ssid?.isNotBlank() == true && it.password.isNotBlank()\n    }.stateIn(viewModelScope, WhileViewSubscribed, false)\n\n    private val _navigationActions = Channel<EventInfoNavigationAction>(Channel.CONFLATED)\n    val navigationActions = _navigationActions.receiveAsFlow()\n\n    fun onWifiConnect() {\n        val config = wifiConfig.value ?: return\n        val success = wifiInstaller.installConferenceWifi(\n            WifiConfiguration().apply {\n                SSID = config.ssid\n                preSharedKey = config.password\n            }\n        )\n        val snackbarMessage = if (success) {\n            SnackbarMessage(R.string.wifi_install_success)\n        } else {\n            SnackbarMessage(\n                messageId = R.string.wifi_install_clipboard_message, longDuration = true\n            )\n        }\n\n        snackbarMessageManager.addMessage(snackbarMessage)\n        analyticsHelper.logUiEvent(\"Events\", AnalyticsActions.WIFI_CONNECT)\n    }\n\n    fun onClickAssistantApp() {\n        _navigationActions.tryOffer(EventInfoNavigationAction.OpenUrl(ASSISTANT_APP_URL))\n        analyticsHelper.logUiEvent(\"Assistant App\", AnalyticsActions.CLICK)\n    }\n}\n\nsealed class EventInfoNavigationAction {\n    data class OpenUrl(val url: String) : EventInfoNavigationAction()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/info/FaqFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.info\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.Fragment\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass FaqFragment : Fragment() {\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_info_faq, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        // Pad the bottom of the ScrollView so that the content scrolls up past any system bars.\n        view.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/info/InfoFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.info\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback\nimport com.google.android.material.tabs.TabLayoutMediator\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentInfoBinding\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.ui.MainNavigationFragment\nimport com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass InfoFragment : MainNavigationFragment() {\n\n    @Inject lateinit var analyticsHelper: AnalyticsHelper\n\n    private lateinit var binding: FragmentInfoBinding\n\n    private val viewModel: MainActivityViewModel by viewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        binding = FragmentInfoBinding.inflate(inflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n        }\n        binding.viewpager.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        binding.run {\n            toolbar.setupProfileMenuItem(viewModel, viewLifecycleOwner)\n\n            viewpager.offscreenPageLimit = INFO_PAGES.size\n            viewpager.adapter = InfoAdapter(this@InfoFragment)\n\n            TabLayoutMediator(tabs, viewpager) { tab, position ->\n                tab.text = resources.getString(INFO_TITLES[position])\n            }.attach()\n\n            // Analytics. Manually fire once for the loaded tab, then fire on tab change.\n            trackInfoScreenView(0)\n            viewpager.registerOnPageChangeCallback(object : OnPageChangeCallback() {\n                override fun onPageSelected(position: Int) {\n                    trackInfoScreenView(position)\n                }\n            })\n        }\n    }\n\n    private fun trackInfoScreenView(position: Int) {\n        val pageName = getString(INFO_TITLES[position])\n        analyticsHelper.sendScreenView(\"Info - $pageName\", requireActivity())\n    }\n\n    /**\n     * Adapter that builds a page for each info screen.\n     */\n    inner class InfoAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {\n        override fun createFragment(position: Int) = INFO_PAGES[position].invoke()\n\n        override fun getItemCount() = INFO_PAGES.size\n    }\n\n    companion object {\n\n        private val INFO_TITLES = arrayOf(\n            R.string.event_title,\n            R.string.travel_title,\n            R.string.faq_title\n        )\n        private val INFO_PAGES = arrayOf(\n            { EventFragment() },\n            { TravelFragment() },\n            { FaqFragment() }\n            // TODO: Track the InfoPage performance b/130335745\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/info/TravelFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.info\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.Fragment\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass TravelFragment : Fragment() {\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_info_travel, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        // Pad the bottom of the ScrollView so that it scrolls up above the nav bar\n        view.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/LoadGeoJsonFeaturesUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport android.content.Context\nimport android.text.TextUtils\nimport com.google.android.gms.maps.GoogleMap\nimport com.google.maps.android.data.geojson.GeoJsonFeature\nimport com.google.maps.android.data.geojson.GeoJsonLayer\nimport com.google.maps.android.ktx.utils.geojson.geoJsonLayer\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\n/** Parameters for this use case. */\ntypealias LoadGeoJsonParams = Pair<GoogleMap, Int>\n\n/** Data loaded by this use case. */\ndata class GeoJsonData(\n    val geoJsonLayer: GeoJsonLayer,\n    val featureMap: Map<String, GeoJsonFeature>\n)\n\n/** Use case that loads a GeoJsonLayer and its features. */\nclass LoadGeoJsonFeaturesUseCase @Inject constructor(\n    @ApplicationContext private val context: Context,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<LoadGeoJsonParams, GeoJsonData>(dispatcher) {\n\n    override suspend fun execute(parameters: LoadGeoJsonParams): GeoJsonData {\n        val (googleMap, markersRes) = parameters\n        val layer = geoJsonLayer(\n            map = googleMap,\n            resourceId = markersRes,\n            context = context\n        )\n        processGeoJsonLayer(layer, context)\n        return GeoJsonData(layer, buildFeatureMap(layer))\n    }\n\n    private fun buildFeatureMap(layer: GeoJsonLayer): Map<String, GeoJsonFeature> {\n        val featureMap: MutableMap<String, GeoJsonFeature> = mutableMapOf()\n        layer.features.forEach {\n            val id = it.id\n            if (!TextUtils.isEmpty(id)) {\n                // Marker can map to multiple room IDs\n                for (part in id.split(\",\")) {\n                    featureMap[part] = it\n                }\n            }\n        }\n        return featureMap\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport android.Manifest\nimport android.app.Dialog\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport android.text.Html\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewGroup.MarginLayoutParams\nimport androidx.activity.addCallback\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.isVisible\nimport androidx.core.view.marginBottom\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePadding\nimport androidx.core.widget.NestedScrollView\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.gms.maps.MapView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.maps.android.data.geojson.GeoJsonLayer\nimport com.google.maps.android.ktx.awaitMap\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentMapBinding\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.ui.MainNavigationFragment\nimport com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.util.slideOffsetToAlpha\nimport com.google.samples.apps.iosched.widget.BottomSheetBehavior\nimport com.google.samples.apps.iosched.widget.BottomSheetBehavior.BottomSheetCallback\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport org.threeten.bp.Instant\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass MapFragment : MainNavigationFragment() {\n\n    @Inject lateinit var analyticsHelper: AnalyticsHelper\n\n    private val viewModel: MapViewModel by viewModels()\n    private val mainActivityViewModel: MainActivityViewModel by activityViewModels()\n\n    private var mapViewBundle: Bundle? = null\n    private lateinit var mapView: MapView\n\n    private lateinit var binding: FragmentMapBinding\n    private lateinit var bottomSheetBehavior: BottomSheetBehavior<*>\n\n    private var fabBaseMarginBottom = 0\n\n    companion object {\n        private const val FRAGMENT_MY_LOCATION_RATIONALE = \"my_location_rationale\"\n\n        private const val MAPVIEW_BUNDLE_KEY = \"MapViewBundleKey\"\n\n        private const val ARG_FEATURE_ID = \"arg.FEATURE_ID\"\n        private const val ARG_FEATURE_START_TIME = \"arg.FEATURE_START_TIME\"\n\n        private const val REQUEST_LOCATION_PERMISSION = 1\n\n        // Threshold for when the marker description reaches maximum alpha. Should be a value\n        // between 0 and 1, inclusive, coinciding with a point between the bottom sheet's\n        // collapsed (0) and expanded (1) states.\n        private const val ALPHA_TRANSITION_END = 0.5f\n\n        // Threshold for when the marker description reaches minimum alpha. Should be a value\n        // between 0 and 1, inclusive, coinciding with a point between the bottom sheet's\n        // collapsed (0) and expanded (1) states.\n        private const val ALPHA_TRANSITION_START = 0.1f\n\n        fun newInstance(featureId: String, featureStartTime: Long): MapFragment {\n            return MapFragment().apply {\n                arguments = Bundle().apply {\n                    putString(ARG_FEATURE_ID, featureId)\n                    putLong(ARG_FEATURE_START_TIME, featureStartTime)\n                }\n            }\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        if (savedInstanceState != null) {\n            mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY)\n        }\n\n        requireActivity().onBackPressedDispatcher.addCallback(this) {\n            onBackPressed()\n        }\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        binding = FragmentMapBinding.inflate(inflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n            viewModel = this@MapFragment.viewModel\n        }\n\n        mapView = binding.map.apply {\n            onCreate(mapViewBundle)\n        }\n\n        if (savedInstanceState == null) {\n            MapFragmentArgs.fromBundle(arguments ?: Bundle.EMPTY).let { it ->\n                if (!it.featureId.isNullOrEmpty()) {\n                    viewModel.requestHighlightFeature(it.featureId)\n                }\n\n                val variant = when {\n                    it.mapVariant != null -> MapVariant.valueOf(it.mapVariant)\n                    it.startTime > 0L -> MapVariant.forTime(Instant.ofEpochMilli(it.startTime))\n                    else -> MapVariant.forTime()\n                }\n                viewModel.setMapVariant(variant)\n            }\n        }\n\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        fabBaseMarginBottom = binding.mapModeFab.marginBottom\n\n        binding.toolbar.run {\n            setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)\n\n            menu.findItem(R.id.action_my_location)?.let { item ->\n                launchAndRepeatWithViewLifecycle {\n                    viewModel.showMyLocationOption.collect { option ->\n                        item.isVisible = option\n                    }\n                }\n            }\n            setOnMenuItemClickListener { item ->\n                if (item.itemId == R.id.action_my_location) {\n                    enableMyLocation(true)\n                    true\n                } else {\n                    false\n                }\n            }\n        }\n\n        bottomSheetBehavior = BottomSheetBehavior.from(binding.bottomSheet)\n        val bottomSheetCallback = object : BottomSheetCallback {\n            override fun onStateChanged(bottomSheet: View, newState: Int) {\n                // Orient the expand/collapse icon accordingly\n                val rotation = when (newState) {\n                    BottomSheetBehavior.STATE_EXPANDED -> 0f\n                    BottomSheetBehavior.STATE_COLLAPSED -> 180f\n                    BottomSheetBehavior.STATE_HIDDEN -> 180f\n                    else -> return\n                }\n                binding.expandIcon.animate().rotationX(rotation).start()\n\n                // Analytics\n                if (newState == BottomSheetBehavior.STATE_EXPANDED) {\n                    viewModel.logViewedMarkerDetails()\n                }\n            }\n\n            override fun onSlide(bottomSheet: View, slideOffset: Float) {\n                // Due to content being visible beneath the navigation bar, apply a short alpha\n                // transition\n                binding.descriptionScrollview.alpha =\n                    slideOffsetToAlpha(slideOffset, ALPHA_TRANSITION_START, ALPHA_TRANSITION_END)\n\n                if (slideOffset > 0f) {\n                    binding.mapModeFab.hide()\n                } else {\n                    binding.mapModeFab.show()\n                    // Translate FAB to make room for the peeking sheet.\n                    val ty = (bottomSheet.top - fabBaseMarginBottom - binding.mapModeFab.bottom)\n                        .coerceAtMost(0)\n                    binding.mapModeFab.translationY = ty.toFloat()\n                }\n            }\n        }\n        bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)\n        // Trigger the callbacks once on layout to set the state of the sheet content & FAB.\n        binding.bottomSheet.post {\n            val state = bottomSheetBehavior.state\n            val slideOffset = when (state) {\n                BottomSheetBehavior.STATE_EXPANDED -> 1f\n                BottomSheetBehavior.STATE_COLLAPSED -> 0f\n                else -> -1f // BottomSheetBehavior.STATE_HIDDEN\n            }\n            bottomSheetCallback.onStateChanged(binding.bottomSheet, state)\n            bottomSheetCallback.onSlide(binding.bottomSheet, slideOffset)\n        }\n\n        val originalPeekHeight = bottomSheetBehavior.peekHeight\n        binding.root.doOnApplyWindowInsets { _, insets, _ ->\n            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.statusBar.updateLayoutParams<ConstraintLayout.LayoutParams> {\n                height = systemBars.top\n            }\n            binding.statusBar.isVisible = true\n            binding.statusBar.requestLayout()\n\n            // Update the Map padding so that the copyright, etc is not displayed in nav bar\n            viewLifecycleOwner.lifecycleScope.launch {\n                val map = binding.map.awaitMap()\n                map.setPadding(0, 0, 0, systemBars.bottom)\n            }\n\n            binding.mapModeFab.updateLayoutParams<MarginLayoutParams> {\n                bottomMargin = fabBaseMarginBottom + systemBars.bottom\n            }\n\n            binding.descriptionScrollview.updatePadding(bottom = systemBars.bottom)\n\n            // The peek height should use the bottom system gesture inset since it is a scrolling\n            // widget\n            val gestureInsets = insets.getInsets(WindowInsetsCompat.Type.systemGestures())\n            bottomSheetBehavior.peekHeight = gestureInsets.bottom + originalPeekHeight\n        }\n\n        // Make the header clickable.\n        binding.clickable.setOnClickListener {\n            if (bottomSheetBehavior.state == BottomSheetBehavior.STATE_COLLAPSED) {\n                bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED\n            } else {\n                bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED\n            }\n        }\n        // Mimic elevation change by activating header shadow.\n        binding.descriptionScrollview\n            .setOnScrollChangeListener { v: NestedScrollView, _: Int, _: Int, _: Int, _: Int ->\n                binding.sheetHeaderShadow.isActivated = v.canScrollVertically(-1)\n            }\n\n        binding.mapModeFab.setOnClickListener {\n            MapVariantSelectionDialogFragment().show(childFragmentManager, \"MAP_MODE_DIALOG\")\n        }\n\n        // Initialize MapView\n        viewLifecycleOwner.lifecycleScope.launch {\n            mapView.awaitMap().apply {\n                setOnMapClickListener { viewModel.dismissFeatureDetails() }\n                setOnCameraMoveListener {\n                    viewModel.onZoomChanged(cameraPosition.zoom)\n                }\n                enableMyLocation()\n            }\n        }\n\n        launchAndRepeatWithViewLifecycle {\n            launch {\n                // Observe ViewModel data\n                viewModel.mapVariant.collect {\n                    mapView.awaitMap().apply {\n                        clear()\n                        viewModel.loadMapFeatures(this)\n                    }\n                }\n            }\n\n            // Set the center of the map's camera. Call this every time the user selects a marker.\n            launch {\n                viewModel.mapCenterEvent.collect { update ->\n                    mapView.getMapAsync {\n                        it.animateCamera(update)\n                    }\n                }\n            }\n\n            launch {\n                viewModel.bottomSheetStateEvent.collect { event ->\n                    BottomSheetBehavior.from(binding.bottomSheet).state = event\n                }\n            }\n\n            launch {\n                viewModel.geoJsonLayer.collect {\n                    it?.let {\n                        updateMarkers(it)\n                    }\n                }\n            }\n            launch {\n                viewModel.selectedMarkerInfo.collect {\n                    it?.let {\n                        updateInfoSheet(it)\n                    }\n                }\n            }\n        }\n\n        analyticsHelper.sendScreenView(\"Map\", requireActivity())\n    }\n\n    private fun updateInfoSheet(markerInfo: MarkerInfo) {\n        val iconRes = getDrawableResourceForIcon(binding.markerIcon.context, markerInfo.iconName)\n        binding.markerIcon.apply {\n            setImageResource(iconRes)\n            visibility = if (iconRes == 0) View.GONE else View.VISIBLE\n        }\n\n        binding.markerTitle.text = markerInfo.title\n        binding.markerSubtitle.apply {\n            text = markerInfo.subtitle\n            isVisible = !markerInfo.subtitle.isNullOrEmpty()\n        }\n\n        val description = Html.fromHtml(markerInfo.description ?: \"\")\n        val hasDescription = description.isNotEmpty()\n        binding.markerDescription.apply {\n            text = description\n            isVisible = hasDescription\n        }\n\n        // Hide/disable expansion affordances when there is no description.\n        binding.expandIcon.isVisible = hasDescription\n        binding.clickable.isVisible = hasDescription\n    }\n\n    private fun onBackPressed(): Boolean {\n        if (::bottomSheetBehavior.isInitialized &&\n            bottomSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED\n        ) {\n            bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED\n            return true\n        }\n        return false\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        val mapViewBundle = outState.getBundle(MAPVIEW_BUNDLE_KEY)\n            ?: Bundle().apply { putBundle(MAPVIEW_BUNDLE_KEY, this) }\n        mapView.onSaveInstanceState(mapViewBundle)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        mapView.onResume()\n    }\n\n    override fun onStart() {\n        super.onStart()\n        mapView.onStart()\n    }\n\n    override fun onStop() {\n        super.onStop()\n        mapView.onStop()\n    }\n\n    override fun onPause() {\n        super.onPause()\n        mapView.onPause()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        mapView.onDestroy()\n        viewModel.onMapDestroyed()\n    }\n\n    override fun onLowMemory() {\n        super.onLowMemory()\n        mapView.onLowMemory()\n    }\n\n    private fun updateMarkers(geoJsonLayer: GeoJsonLayer) {\n        geoJsonLayer.addLayerToMap()\n        geoJsonLayer.setOnFeatureClickListener { feature ->\n            // Feature ID can be a comma-separated list. In that case use only the first ID.\n            viewModel.requestHighlightFeature(feature.id.split(\",\")[0])\n        }\n    }\n\n    private fun requestLocationPermission() {\n        val context = context ?: return\n        if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) ==\n            PackageManager.PERMISSION_GRANTED\n        ) {\n            return\n        }\n        if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {\n            MyLocationRationaleFragment()\n                .show(childFragmentManager, FRAGMENT_MY_LOCATION_RATIONALE)\n            return\n        }\n        requestPermissions(\n            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),\n            REQUEST_LOCATION_PERMISSION\n        )\n    }\n\n    override fun onRequestPermissionsResult(\n        requestCode: Int,\n        permissions: Array<out String>,\n        grantResults: IntArray\n    ) {\n        if (requestCode == REQUEST_LOCATION_PERMISSION) {\n            if (grantResults.size == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n                enableMyLocation()\n            } else {\n                MyLocationRationaleFragment()\n                    .show(childFragmentManager, FRAGMENT_MY_LOCATION_RATIONALE)\n            }\n        } else {\n            super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        }\n    }\n\n    private fun enableMyLocation(requestPermission: Boolean = false) {\n        val context = context ?: return\n        when {\n            ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) ==\n                PackageManager.PERMISSION_GRANTED -> {\n                lifecycleScope.launch {\n                    val map = mapView.awaitMap()\n                    map.isMyLocationEnabled = true\n                }\n                viewModel.optIntoMyLocation()\n            }\n            requestPermission -> requestLocationPermission()\n            else -> viewModel.optIntoMyLocation(false)\n        }\n    }\n\n    class MyLocationRationaleFragment : DialogFragment() {\n        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n            return MaterialAlertDialogBuilder(requireContext())\n                .setMessage(R.string.my_location_rationale)\n                .setPositiveButton(android.R.string.ok) { _, _ ->\n                    requireParentFragment().requestPermissions(\n                        arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),\n                        REQUEST_LOCATION_PERMISSION\n                    )\n                }\n                .setNegativeButton(android.R.string.cancel, null) // Give up\n                .create()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapTileProvider.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport com.google.android.gms.maps.model.UrlTileProvider\nimport com.google.samples.apps.iosched.BuildConfig\nimport java.net.URL\n\nclass MapTileProvider(\n    private val tileSize: Int,\n    private val variant: MapVariant\n) : UrlTileProvider(tileSize, tileSize) {\n\n    companion object {\n        // Order of format arguments: variant name, tile size, zoom level, tile x, tile y\n        private const val BASE_URL = BuildConfig.MAP_TILE_URL_BASE + \"/%s/%d/%d/%d_%d.png\"\n\n        private const val BASE_TILE_SIZE = 256\n\n        fun forDensity(densityDpi: Float, variant: MapVariant): MapTileProvider {\n            // Choose a size suitable for the given screen density. Adding .3f makes tvdpi (1.3x)\n            // use a higher scale and looks nicer.\n            val scale = Math.round(densityDpi + .3f)\n                .coerceIn(1, 3) // we only support up to 3x the base tile size\n            val tileSize = BASE_TILE_SIZE * scale\n            return MapTileProvider(tileSize, variant)\n        }\n    }\n\n    override fun getTileUrl(x: Int, y: Int, zoom: Int): URL {\n        return URL(BASE_URL.format(variant.mapTilePrefix, tileSize, zoom, x, y))\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapUtils.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport androidx.annotation.DrawableRes\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.core.graphics.drawable.toBitmap\nimport com.google.android.gms.maps.model.BitmapDescriptorFactory\nimport com.google.maps.android.data.geojson.GeoJsonLayer\nimport com.google.maps.android.data.geojson.GeoJsonPointStyle\nimport com.google.maps.android.ui.IconGenerator\nimport com.google.samples.apps.iosched.R\nimport java.util.Locale\n\n/** Process a [GeoJsonLayer] for display on a Map. */\nfun processGeoJsonLayer(layer: GeoJsonLayer, context: Context) {\n    val iconGenerator = getLabelIconGenerator(context)\n    layer.features.forEach { feature ->\n        val icon = feature.getProperty(\"icon\")\n        val label = feature.getProperty(\"label\") ?: feature.getProperty(\"title\")\n\n        val drawableRes = getDrawableResourceForIcon(context, icon)\n        feature.pointStyle = when {\n            drawableRes != 0 -> createIconMarker(context, drawableRes, label)\n            label != null -> createLabelMarker(iconGenerator, label) // Fall back to label\n            else -> GeoJsonPointStyle() // no styling\n        }\n    }\n}\n\n/** Creates a new IconGenerator for labels on the map. */\nprivate fun getLabelIconGenerator(context: Context): IconGenerator {\n    val labelBg = context.getDrawable(R.drawable.map_marker_label_background)\n    return IconGenerator(context).apply {\n        setTextAppearance(context, R.style.TextAppearance_IOSched_Map_MarkerLabel)\n        setBackground(labelBg)\n    }\n}\n\n/**\n * Returns the drawable resource id for an icon marker, or 0 if no resource with this name exists.\n */\n@DrawableRes\nfun getDrawableResourceForIcon(context: Context, iconType: String?): Int {\n    if (iconType == null) {\n        return 0\n    }\n    return context.resources.getIdentifier(\n        iconType.toLowerCase(Locale.US),\n        \"drawable\",\n        context.packageName\n    )\n}\n\n/** Creates a GeoJsonPointStyle for a label. */\nprivate fun createLabelMarker(\n    iconGenerator: IconGenerator,\n    title: String\n): GeoJsonPointStyle {\n    val icon = BitmapDescriptorFactory.fromBitmap(iconGenerator.makeIcon(title))\n    return GeoJsonPointStyle().apply {\n        setAnchor(.5f, .5f)\n        setIcon(icon)\n        // Don't set the title because we don't want to show an InfoWindow, but set the snippet for\n        // accessibility services (TalkBack).\n        snippet = title\n    }\n}\n\n/**\n * Creates a GeoJsonPointStyle for a map icon. The icon is chosen based on the marker type and is\n * anchored at the bottom center of the marker's location.\n */\nprivate fun createIconMarker(\n    context: Context,\n    drawableRes: Int,\n    title: String\n): GeoJsonPointStyle {\n    val bitmap = drawableToBitmap(context, drawableRes)\n    val icon = BitmapDescriptorFactory.fromBitmap(bitmap)\n    return GeoJsonPointStyle().apply {\n        setAnchor(0.5f, 1f)\n        setTitle(title)\n        setIcon(icon)\n    }\n}\n\n/** Convert a drawable resource to a Bitmap. */\nprivate fun drawableToBitmap(context: Context, @DrawableRes resId: Int): Bitmap {\n    return requireNotNull(AppCompatResources.getDrawable(context, resId)).toBitmap()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapVariant.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.RawRes\nimport androidx.annotation.StringRes\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.BuildConfig\nimport org.threeten.bp.Instant\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * A variant of the map UI. Depending on the variant, Map UI may show different markers, tile\n * overlays, etc.\n */\nenum class MapVariant(\n    val start: Instant,\n    val end: Instant,\n    @StringRes val labelResId: Int,\n    @DrawableRes val iconResId: Int,\n    @RawRes val markersResId: Int,\n    @RawRes val styleResId: Int,\n    val mapTilePrefix: String\n) {\n    AFTER_DARK(\n        ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_AFTERHOURS_START).toInstant(),\n        ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_END).toInstant(),\n        R.string.map_variant_after_dark,\n        R.drawable.ic_map_after_dark,\n        R.raw.map_markers_night,\n        R.raw.map_style_night,\n        \"night\"\n    ),\n    CONCERT(\n        ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_CONCERT_START).toInstant(),\n        ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_END).toInstant(),\n        R.string.map_variant_concert,\n        R.drawable.ic_map_concert,\n        R.raw.map_markers_concert,\n        R.raw.map_style_night,\n        \"concert\"\n    ),\n    // Note: must be last to facilitate [forTime]\n    DAY(\n        ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_START).toInstant(),\n        ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY3_END).toInstant(),\n        R.string.map_variant_daytime,\n        R.drawable.ic_map_daytime,\n        R.raw.map_markers_day,\n        R.raw.map_style_day,\n        \"day\"\n    );\n\n    operator fun contains(time: Instant): Boolean {\n        return time in start..end\n    }\n\n    companion object {\n        /** Returns the first variant containing the specified time, or [DAY] if none is found. */\n        fun forTime(time: Instant = Instant.now()): MapVariant {\n            return values().find { variant -> time in variant } ?: DAY\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapVariantAdapter.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport android.os.Build\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.annotation.DrawableRes\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.databinding.BindingAdapter\nimport androidx.recyclerview.widget.RecyclerView.Adapter\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemMapVariantBinding\nimport com.google.samples.apps.iosched.util.executeAfter\n\ninternal class MapVariantAdapter(\n    private val callback: (MapVariant) -> Unit\n) : Adapter<MapVariantViewHolder>() {\n\n    var currentSelection: MapVariant? = null\n        set(value) {\n            if (field == value) {\n                return\n            }\n            val previous = field\n            if (previous != null) {\n                notifyItemChanged(items.indexOf(previous)) // deselect previous selection\n            }\n            field = value\n            if (value != null) {\n                notifyItemChanged(items.indexOf(value)) // select new selection\n            }\n        }\n\n    private val items = MapVariant.values().toMutableList().apply {\n        sortBy { it.start }\n    }\n\n    override fun getItemCount(): Int = items.size\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MapVariantViewHolder {\n        return MapVariantViewHolder(\n            ItemMapVariantBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            )\n        )\n    }\n\n    override fun onBindViewHolder(holder: MapVariantViewHolder, position: Int) {\n        val mapVariant = items[position]\n        holder.bind(mapVariant, mapVariant == currentSelection, callback)\n    }\n}\n\ninternal class MapVariantViewHolder(\n    val binding: ItemMapVariantBinding\n) : ViewHolder(binding.root) {\n\n    fun bind(mapVariant: MapVariant, isSelected: Boolean, callback: (MapVariant) -> Unit) {\n        binding.executeAfter {\n            variant = mapVariant\n            isChecked = isSelected\n        }\n        itemView.setOnClickListener {\n            callback(mapVariant)\n        }\n    }\n}\n\n// This is used instead of drawableStart=\"@{int_value}\" because Databinding interprets the int as a\n// color instead of a drawable resource ID.\n@BindingAdapter(\"variantIcon\")\nfun variantIcon(view: TextView, @DrawableRes iconResId: Int) {\n    val drawable = AppCompatResources.getDrawable(view.context, iconResId)\n    // Below API 23 we need to apply the drawableTint manually.\n    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {\n        drawable?.setTintList(\n            AppCompatResources.getColorStateList(view.context, R.color.map_variant_icon)\n        )\n    }\n    view.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapVariantSelectionDialogFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.view.Gravity\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewGroup.MarginLayoutParams\nimport android.view.WindowManager\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.core.view.updateLayoutParams\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.samples.apps.iosched.R\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass MapVariantSelectionDialogFragment : AppCompatDialogFragment() {\n\n    private val mapViewModel: MapViewModel by viewModels(\n        ownerProducer = { requireParentFragment() }\n    )\n\n    private lateinit var adapter: MapVariantAdapter\n\n    // Normally we would implement onCreateDialog using a MaterialAlertDialogBuilder, but that\n    // doesn't allow the dialog width to wrap its contents, and also doesn't allow positioning\n    // of the dialog. Instead we implement onCreateView and handle the rest later.\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_map_variant_select, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        adapter = MapVariantAdapter(::selectMapVariant)\n        view.findViewById<RecyclerView>(R.id.map_variant_list).adapter = adapter\n\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                mapViewModel.mapVariant.collect {\n                    adapter.currentSelection = it\n                }\n            }\n        }\n    }\n\n    @SuppressLint(\"RtlHardcoded\")\n    override fun onStart() {\n        super.onStart()\n        requireDialog().window?.apply {\n            // Don't dim the screen\n            clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)\n            // Position the window\n            val isRtl = resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL\n            attributes.gravity = Gravity.BOTTOM or if (isRtl) Gravity.LEFT else Gravity.RIGHT\n            // The window decor view's background shows behind the card, so remove it\n            setBackgroundDrawable(null)\n        }\n        // We can't set margins in XML because when shown as a dialog, onCreateView is passed a null\n        // container. LayoutParams are only generated when the view is added to a Dialog later.\n        val margin = resources.getDimensionPixelSize(R.dimen.margin_normal)\n        view?.updateLayoutParams<MarginLayoutParams> {\n            setMargins(margin, margin, margin, margin)\n        }\n    }\n\n    private fun selectMapVariant(mapVariant: MapVariant) {\n        mapViewModel.setMapVariant(mapVariant)\n        dismiss()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapViewBindingAdapters.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport androidx.annotation.DimenRes\nimport androidx.annotation.RawRes\nimport androidx.databinding.BindingAdapter\nimport com.google.android.gms.maps.MapView\nimport com.google.android.gms.maps.model.LatLngBounds\nimport com.google.android.gms.maps.model.MapStyleOptions\nimport com.google.android.gms.maps.model.TileOverlayOptions\nimport com.google.samples.apps.iosched.util.getFloatUsingCompat\n\n@BindingAdapter(\"mapStyle\")\nfun mapStyle(mapView: MapView, @RawRes resId: Int) {\n    if (resId != 0) {\n        mapView.getMapAsync { map ->\n            map.setMapStyle(MapStyleOptions.loadRawResourceStyle(mapView.context, resId))\n        }\n    }\n}\n\n/**\n * Sets the map viewport to a specific rectangle specified by two Latitude/Longitude points.\n */\n@BindingAdapter(\"mapViewport\")\nfun mapViewport(mapView: MapView, bounds: LatLngBounds?) {\n    if (bounds != null) {\n        mapView.getMapAsync {\n            it.setLatLngBoundsForCameraTarget(bounds)\n        }\n    }\n}\n\n/**\n * Sets the minimum zoom level of the map (how far out the user is allowed to zoom).\n */\n@BindingAdapter(\"mapMinZoom\", \"mapMaxZoom\", requireAll = true)\nfun mapZoomLevels(mapView: MapView, @DimenRes minZoomResId: Int, @DimenRes maxZoomResId: Int) {\n    val minZoom = mapView.resources.getFloatUsingCompat(minZoomResId)\n    val maxZoom = mapView.resources.getFloatUsingCompat(maxZoomResId)\n    mapView.getMapAsync {\n        it.setMinZoomPreference(minZoom)\n        it.setMaxZoomPreference(maxZoom)\n    }\n}\n\n@BindingAdapter(\"isIndoorEnabled\")\nfun isIndoorEnabled(mapView: MapView, isIndoorEnabled: Boolean?) {\n    if (isIndoorEnabled != null) {\n        mapView.getMapAsync {\n            it.isIndoorEnabled = isIndoorEnabled\n        }\n    }\n}\n\n@BindingAdapter(\"isMapToolbarEnabled\")\nfun isMapToolbarEnabled(mapView: MapView, isMapToolbarEnabled: Boolean?) {\n    if (isMapToolbarEnabled != null) {\n        mapView.getMapAsync {\n            it.uiSettings.isMapToolbarEnabled = isMapToolbarEnabled\n        }\n    }\n}\n\n@BindingAdapter(\"mapTileProvider\")\nfun mapTileProvider(mapView: MapView, mapVariant: MapVariant?) {\n    mapVariant?.run {\n        val tileProvider =\n            MapTileProvider.forDensity(mapView.resources.displayMetrics.density, mapVariant)\n        mapView.getMapAsync { map ->\n            map.addTileOverlay(\n                TileOverlayOptions()\n                    .tileProvider(tileProvider)\n                    .visible(true)\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.android.gms.maps.CameraUpdate\nimport com.google.android.gms.maps.CameraUpdateFactory\nimport com.google.android.gms.maps.GoogleMap\nimport com.google.android.gms.maps.model.LatLngBounds\nimport com.google.maps.android.data.geojson.GeoJsonFeature\nimport com.google.maps.android.data.geojson.GeoJsonLayer\nimport com.google.maps.android.data.geojson.GeoJsonPoint\nimport com.google.samples.apps.iosched.BuildConfig\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.domain.prefs.MyLocationOptedInUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.OptIntoMyLocationUseCase\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.shared.result.updateOnSuccess\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport com.google.samples.apps.iosched.widget.BottomSheetBehavior\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@HiltViewModel\nclass MapViewModel @Inject constructor(\n    private val loadGeoJsonFeaturesUseCase: LoadGeoJsonFeaturesUseCase,\n    private val analyticsHelper: AnalyticsHelper,\n    private val signInViewModelDelegate: SignInViewModelDelegate,\n    private val optIntoMyLocationUseCase: OptIntoMyLocationUseCase,\n    myLocationOptedInUseCase: MyLocationOptedInUseCase\n) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate {\n\n    /**\n     * Area covered by the venue. Determines the viewport of the map.\n     */\n    val conferenceLocationBounds = LatLngBounds(\n        BuildConfig.MAP_VIEWPORT_BOUND_SW,\n        BuildConfig.MAP_VIEWPORT_BOUND_NE\n    )\n\n    private val _mapVariant = MutableStateFlow<MapVariant?>(null)\n    val mapVariant: StateFlow<MapVariant?> = _mapVariant\n\n    private val _mapCenterEvent = Channel<CameraUpdate>(Channel.CONFLATED)\n    val mapCenterEvent = _mapCenterEvent.receiveAsFlow()\n\n    private val loadGeoJsonResult = MutableStateFlow<GeoJsonData?>(null)\n\n    val geoJsonLayer: StateFlow<GeoJsonLayer?> = loadGeoJsonResult\n        .onEach { data ->\n            if (data != null) {\n                // TODO: Remove side effects and make these reactive\n                hasLoadedFeatures = true\n                setMapFeatures(data.featureMap)\n            }\n        }.map { data ->\n            data?.geoJsonLayer\n        }.stateIn(viewModelScope, WhileViewSubscribed, null)\n\n    private val featureLookup: MutableMap<String, GeoJsonFeature> = mutableMapOf()\n    private var hasLoadedFeatures = false\n    private var requestedFeatureId: String? = null\n\n    private val focusZoomLevel = BuildConfig.MAP_CAMERA_FOCUS_ZOOM\n    private var currentZoomLevel = 16 // min zoom level supported\n\n    private val _bottomSheetStateEvent = Channel<Int>(Channel.CONFLATED)\n    val bottomSheetStateEvent = _bottomSheetStateEvent.receiveAsFlow()\n\n    init {\n        viewModelScope.launch {\n            mapVariant.collect {\n                // When the map variant changes, the selected feature might not be present in the\n                // new variant, so hide the feature detail.\n                it?.let {\n                    dismissFeatureDetails()\n                }\n            }\n        }\n    }\n\n    private val _selectedMarkerInfo = MutableStateFlow<MarkerInfo?>(null)\n    val selectedMarkerInfo: StateFlow<MarkerInfo?> = _selectedMarkerInfo\n\n    private val myLocationOptedIn = MutableStateFlow(false)\n\n    val showMyLocationOption = userInfo.combine(myLocationOptedIn) { info, optedIn ->\n        // Show the button to enable \"My Location\" when the user is an on-site attendee and he/she\n        // is not opted into the feature yet.\n        info != null && info.isRegistered() && !optedIn\n    }\n\n    init {\n        viewModelScope.launch {\n            myLocationOptedIn.value = myLocationOptedInUseCase(Unit).successOr(false)\n        }\n    }\n\n    fun optIntoMyLocation(optIn: Boolean = true) {\n        viewModelScope.launch {\n            optIntoMyLocationUseCase(optIn).updateOnSuccess(myLocationOptedIn)\n        }\n    }\n\n    fun setMapVariant(variant: MapVariant) {\n        _mapVariant.value = variant\n    }\n\n    fun onMapDestroyed() {\n        // The geo json layer is tied to the GoogleMap, so we should release it.\n        hasLoadedFeatures = false\n        featureLookup.clear()\n        loadGeoJsonResult.value = null\n    }\n\n    fun loadMapFeatures(googleMap: GoogleMap) {\n        val variant = _mapVariant.value ?: return\n        // Load markers\n        viewModelScope.launch {\n            loadGeoJsonFeaturesUseCase(\n                LoadGeoJsonParams(googleMap, variant.markersResId)\n            ).updateOnSuccess(loadGeoJsonResult)\n        }\n    }\n\n    private fun setMapFeatures(features: Map<String, GeoJsonFeature>) {\n        featureLookup.clear()\n        featureLookup.putAll(features)\n        updateFeaturesVisibility(currentZoomLevel.toFloat())\n        // if we have a pending request to highlight a feature, resolve it now\n        val featureId = requestedFeatureId ?: return\n        requestedFeatureId = null\n        highlightFeature(featureId)\n    }\n\n    fun onZoomChanged(zoom: Float) {\n        // Truncate the zoom and check if we're in the same level\n        val zoomInt = zoom.toInt()\n        if (currentZoomLevel != zoomInt) {\n            currentZoomLevel = zoomInt\n            updateFeaturesVisibility(zoom)\n        }\n    }\n\n    private fun updateFeaturesVisibility(zoom: Float) {\n        // Don't hide the marker if it's currently being focused on by the user\n        val selectedId = selectedMarkerInfo.value?.id\n        featureLookup.values.forEach { feature ->\n            if (feature.id != selectedId) {\n                val minZoom = feature.getProperty(\"minZoom\")?.toFloatOrNull() ?: 0f\n                feature.pointStyle.isVisible = zoom >= minZoom\n            }\n        }\n    }\n\n    fun requestHighlightFeature(featureId: String) {\n        if (hasLoadedFeatures) {\n            highlightFeature(featureId)\n        } else {\n            // save and re-evaluate when the map features are loaded\n            requestedFeatureId = featureId\n        }\n    }\n\n    private fun highlightFeature(featureId: String) {\n        val feature = featureLookup[featureId] ?: return\n        val geometry = feature.geometry as? GeoJsonPoint ?: return\n        // center map on the requested feature.\n        val update = CameraUpdateFactory.newLatLngZoom(geometry.coordinates, focusZoomLevel)\n        _mapCenterEvent.tryOffer(update)\n\n        // publish feature data\n        val title = feature.getProperty(\"title\")\n        _selectedMarkerInfo.value = MarkerInfo(\n            featureId,\n            title,\n            feature.getProperty(\"subtitle\"),\n            feature.getProperty(\"description\"),\n            feature.getProperty(\"icon\")\n        )\n\n        // bring bottom sheet into view\n        _bottomSheetStateEvent.tryOffer(BottomSheetBehavior.STATE_COLLAPSED)\n\n        // Analytics\n        analyticsHelper.logUiEvent(title, AnalyticsActions.MAP_MARKER_SELECT)\n    }\n\n    fun dismissFeatureDetails() {\n        _bottomSheetStateEvent.tryOffer(BottomSheetBehavior.STATE_HIDDEN)\n        _selectedMarkerInfo.value = null\n    }\n\n    fun logViewedMarkerDetails() {\n        val title = _selectedMarkerInfo.value?.title ?: return\n        analyticsHelper.logUiEvent(title, AnalyticsActions.MAP_MARKER_DETAILS)\n    }\n}\n\ndata class MarkerInfo(\n    val id: String,\n    val title: String,\n    val subtitle: String?,\n    val description: String?,\n    val iconName: String?\n)\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/messages/SnackbarMessage.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.messages\n\nimport com.google.samples.apps.iosched.model.Session\n\ndata class SnackbarMessage(\n    /** Resource string ID of the message to show */\n    val messageId: Int,\n\n    /** Optional resource string ID for the action (example: \"Got it!\") */\n    val actionId: Int? = null,\n\n    /** Set to true for a Snackbar with long duration  */\n    val longDuration: Boolean = false,\n\n    /** Optional change ID to avoid repetition of messages */\n    val requestChangeId: String? = null,\n\n    /** Optional session */\n    val session: Session? = null\n) {\n    override fun toString(): String {\n        return \"Session: ${session?.id}, ${session?.title?.take(30)}. Change: $requestChangeId \"\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensions.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.messages\n\nimport androidx.core.text.HtmlCompat\nimport androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY\nimport androidx.fragment.app.Fragment\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.widget.FadingSnackbar\nimport kotlinx.coroutines.flow.collect\n\n/**\n * An extension for Fragments that sets up a Snackbar with a [SnackbarMessageManager].\n */\nfun Fragment.setupSnackbarManager(\n    snackbarMessageManager: SnackbarMessageManager,\n    fadingSnackbar: FadingSnackbar\n) {\n    launchAndRepeatWithViewLifecycle {\n        snackbarMessageManager.currentSnackbar.collect { message ->\n            if (message == null) { return@collect }\n            val messageText = HtmlCompat.fromHtml(\n                requireContext().getString(message.messageId, message.session?.title),\n                FROM_HTML_MODE_LEGACY\n            )\n            fadingSnackbar.show(\n                messageText = messageText,\n                actionId = message.actionId,\n                longDuration = message.longDuration,\n                actionClick = {\n                    snackbarMessageManager.processDismissedMessage(message)\n                    fadingSnackbar.dismiss()\n                },\n                // When the snackbar is dismissed, ping the snackbar message manager in case there\n                // are pending messages.\n                dismissListener = {\n                    snackbarMessageManager.removeMessageAndLoadNext(message)\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/messages/SnackbarMessageManager.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.messages\n\nimport androidx.annotation.VisibleForTesting\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.domain.prefs.StopSnackbarActionUseCase\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager.Companion.MAX_ITEMS\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * A single source of Snackbar messages related to reservations.\n *\n * Only shows one Snackbar related to one change across all screens\n *\n * Emits new values on request (when a Snackbar is dismissed and ready to show a new message)\n *\n * It keeps a list of [MAX_ITEMS] items, enough to figure out if a message has already been shown,\n * but limited to avoid wasting resources.\n *\n */\n@Singleton\nopen class SnackbarMessageManager @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @ApplicationScope private val coroutineScope: CoroutineScope,\n    private val stopSnackbarActionUseCase: StopSnackbarActionUseCase\n) {\n    companion object {\n        // Keep a fixed number of old items\n        @VisibleForTesting\n        const val MAX_ITEMS = 10\n    }\n\n    private val messages = mutableListOf<SnackbarMessage>()\n\n    private val _currentSnackbar = MutableStateFlow<SnackbarMessage?>(null)\n    val currentSnackbar: StateFlow<SnackbarMessage?> = _currentSnackbar\n\n    fun addMessage(msg: SnackbarMessage) {\n        coroutineScope.launch {\n            if (!shouldSnackbarBeIgnored(msg)) {\n                // Limit amount of pending messages\n                if (messages.size > MAX_ITEMS) {\n                    Timber.e(\"Too many Snackbar messages. Message id: ${msg.messageId}\")\n                    return@launch\n                }\n                // If the new message is about the same change as a pending one, keep the old one. (rare)\n                val sameRequestId = messages.find {\n                    it.requestChangeId == msg.requestChangeId\n                }\n                if (sameRequestId == null) {\n                    messages.add(msg)\n                }\n                loadNext()\n            }\n        }\n    }\n\n    private fun loadNext() {\n        if (_currentSnackbar.value == null) {\n            _currentSnackbar.value = messages.firstOrNull()\n        }\n    }\n\n    fun removeMessageAndLoadNext(shownMsg: SnackbarMessage?) {\n        messages.removeAll { it == shownMsg }\n        if (_currentSnackbar.value == shownMsg) {\n            _currentSnackbar.value = null\n        }\n        loadNext()\n    }\n\n    fun processDismissedMessage(message: SnackbarMessage) {\n        if (message.actionId == R.string.dont_show) {\n            coroutineScope.launch {\n                stopSnackbarActionUseCase(true)\n            }\n        }\n    }\n\n    private suspend fun shouldSnackbarBeIgnored(msg: SnackbarMessage): Boolean {\n        return preferenceStorage.isSnackbarStopped() && msg.actionId == R.string.dont_show\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingActivity.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport android.os.Bundle\nimport android.widget.FrameLayout\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.WindowCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.util.inTransaction\nimport com.google.samples.apps.iosched.ui.signin.SignInDialogFragment\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass OnboardingActivity : AppCompatActivity() {\n\n    private val viewModel: OnboardingViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_onboarding)\n\n        WindowCompat.setDecorFitsSystemWindows(window, false)\n\n        val container: FrameLayout = findViewById(R.id.fragment_container)\n        container.doOnApplyWindowInsets { v, insets, padding ->\n            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())\n            v.updatePadding(top = padding.top + systemBars.top)\n        }\n\n        if (savedInstanceState == null) {\n            supportFragmentManager.inTransaction {\n                add(R.id.fragment_container, OnboardingFragment())\n            }\n        }\n\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                viewModel.navigationActions.collect { action ->\n                    if (action == OnboardingNavigationAction.NavigateToSignInDialog) {\n                        openSignInDialog()\n                    }\n                }\n            }\n        }\n    }\n\n    private fun openSignInDialog() {\n        SignInDialogFragment().show(supportFragmentManager, DIALOG_SIGN_IN)\n    }\n\n    companion object {\n        private const val DIALOG_SIGN_IN = \"dialog_sign_in\"\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.os.Handler\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\nimport androidx.fragment.app.viewModels\nimport com.google.samples.apps.iosched.databinding.FragmentOnboardingBinding\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.MainActivity\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\n\nprivate const val AUTO_ADVANCE_DELAY = 6_000L\nprivate const val INITIAL_ADVANCE_DELAY = 3_000L\n\n/**\n * Contains the pages of the onboarding experience and responds to [OnboardingViewModel] events.\n */\n@AndroidEntryPoint\nclass OnboardingFragment : Fragment() {\n\n    private val onboardingViewModel: OnboardingViewModel by viewModels()\n\n    private lateinit var binding: FragmentOnboardingBinding\n\n    private lateinit var pagerPager: ViewPagerPager\n\n    private val handler = Handler()\n\n    // Auto-advance the view pager to give overview of app benefits\n    private val advancePager: Runnable = object : Runnable {\n        override fun run() {\n            pagerPager.advance()\n            handler.postDelayed(this, AUTO_ADVANCE_DELAY)\n        }\n    }\n\n    @SuppressLint(\"ClickableViewAccessibility\")\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentOnboardingBinding.inflate(inflater, container, false).apply {\n            viewModel = onboardingViewModel\n            lifecycleOwner = viewLifecycleOwner\n            pager.adapter = OnboardingAdapter(childFragmentManager)\n            pagerPager = ViewPagerPager(pager)\n            // If user touches pager then stop auto advance\n            pager.setOnTouchListener { _, _ ->\n                handler.removeCallbacks(advancePager)\n                false\n            }\n        }\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        launchAndRepeatWithViewLifecycle {\n            onboardingViewModel.navigationActions.collect { action ->\n                if (action == OnboardingNavigationAction.NavigateToMainScreen) {\n                    requireActivity().run {\n                        startActivity(Intent(this, MainActivity::class.java))\n                        finish()\n                    }\n                }\n            }\n        }\n    }\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        handler.postDelayed(advancePager, INITIAL_ADVANCE_DELAY)\n    }\n\n    override fun onDetach() {\n        handler.removeCallbacks(advancePager)\n        super.onDetach()\n    }\n}\n\nclass OnboardingAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) {\n\n    // Don't show then countdown fragment if the conference has already started\n    private val fragments = if (!TimeUtils.conferenceHasStarted()) {\n        // Before the conference\n        arrayOf(\n            WelcomePreConferenceFragment(),\n            OnboardingSignInFragment()\n        )\n    } else if (TimeUtils.conferenceHasStarted() && !TimeUtils.conferenceHasEnded()) {\n        // During the conference\n        arrayOf(\n            WelcomeDuringConferenceFragment(),\n            OnboardingSignInFragment()\n        )\n    } else {\n        // Post the conference\n        arrayOf(\n            WelcomePostConferenceFragment()\n        )\n    }\n\n    override fun getItem(position: Int) = fragments[position]\n\n    override fun getCount() = fragments.size\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingSignInFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.samples.apps.iosched.databinding.FragmentOnboardingSigninBinding\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass OnboardingSignInFragment : Fragment() {\n\n    private lateinit var binding: FragmentOnboardingSigninBinding\n\n    private val onboardingViewModel: OnboardingViewModel by activityViewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentOnboardingSigninBinding.inflate(inflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n        }\n        return binding.root\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        binding.activityViewModel = onboardingViewModel\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.shared.domain.prefs.OnboardingCompleteActionUseCase\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n/**\n * Records that onboarding has been completed and navigates user onward.\n */\n@HiltViewModel\nclass OnboardingViewModel @Inject constructor(\n    private val onboardingCompleteActionUseCase: OnboardingCompleteActionUseCase,\n    signInViewModelDelegate: SignInViewModelDelegate\n) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate {\n\n    private val _navigationActions = Channel<OnboardingNavigationAction>(Channel.CONFLATED)\n    // OnboardingViewModel is a shared ViewModel. Therefore, the navigation actions could be\n    // received by multiple collectors at the same time. With `receiveAsFlow`, we make sure only\n    // one collector will process the navigation event to avoid multiple back stack entries.\n    val navigationActions = _navigationActions.receiveAsFlow()\n\n    fun getStartedClick() {\n        viewModelScope.launch {\n            onboardingCompleteActionUseCase(true)\n            _navigationActions.send(OnboardingNavigationAction.NavigateToMainScreen)\n        }\n    }\n\n    fun onSigninClicked() {\n        _navigationActions.tryOffer(OnboardingNavigationAction.NavigateToSignInDialog)\n    }\n}\n\nsealed class OnboardingNavigationAction {\n    object NavigateToMainScreen : OnboardingNavigationAction()\n    object NavigateToSignInDialog : OnboardingNavigationAction()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/ViewPagerPager.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport android.animation.ValueAnimator\nimport android.view.animation.AnimationUtils\nimport androidx.core.animation.addListener\nimport androidx.viewpager.widget.ViewPager\n\n/**\n * Helper class for automatically scrolling pages of a [ViewPager] which does not allow you to\n * customize the speed at which it changes page when directly setting the current page.\n */\nclass ViewPagerPager(private val viewPager: ViewPager) {\n\n    private val fastOutSlowIn =\n        AnimationUtils.loadInterpolator(viewPager.context, android.R.interpolator.fast_out_slow_in)\n\n    fun advance() {\n        if (viewPager.width <= 0) return\n\n        val current = viewPager.currentItem\n        val next = ((current + 1) % requireNotNull(viewPager.adapter).count)\n        val pages = next - current\n        val dragDistance = pages * viewPager.width\n\n        ValueAnimator.ofInt(0, dragDistance).apply {\n            var dragProgress = 0\n            var draggedPages = 0\n            addListener(\n                onStart = { viewPager.beginFakeDrag() },\n                onEnd = { viewPager.endFakeDrag() }\n            )\n            addUpdateListener {\n                if (!viewPager.isFakeDragging) {\n                    // Sometimes onAnimationUpdate is called with initial value before\n                    // onAnimationStart is called.\n                    return@addUpdateListener\n                }\n\n                val dragPoint = (animatedValue as Int)\n                val dragBy = dragPoint - dragProgress\n                viewPager.fakeDragBy(-dragBy.toFloat())\n                dragProgress = dragPoint\n\n                // Fake dragging doesn't let you drag more than one page width. If we want to do\n                // this then need to end and start a new fake drag.\n                val draggedPagesProgress = dragProgress / viewPager.width\n                if (draggedPagesProgress != draggedPages) {\n                    viewPager.endFakeDrag()\n                    viewPager.beginFakeDrag()\n                    draggedPages = draggedPagesProgress\n                }\n            }\n            duration = if (pages == 1) PAGE_CHANGE_DURATION else MULTI_PAGE_CHANGE_DURATION\n            interpolator = fastOutSlowIn\n        }.start()\n    }\n\n    companion object {\n        private const val PAGE_CHANGE_DURATION = 400L\n        private const val MULTI_PAGE_CHANGE_DURATION = 600L\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/WelcomeDuringConferenceFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.doOnLayout\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.samples.apps.iosched.databinding.FragmentOnboardingWelcomeDuringBinding\nimport dagger.hilt.android.AndroidEntryPoint\n\n/**\n * First page of onboarding showing a welcome message during the conference.\n */\n@AndroidEntryPoint\nclass WelcomeDuringConferenceFragment : Fragment() {\n\n    private lateinit var binding: FragmentOnboardingWelcomeDuringBinding\n\n    private val viewModel: OnboardingViewModel by activityViewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentOnboardingWelcomeDuringBinding.inflate(inflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n        }\n        return binding.root\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        binding.activityViewModel = viewModel\n        binding.buttonSignin.doOnLayout {\n            activity?.reportFullyDrawn()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/WelcomePostConferenceFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.doOnLayout\nimport androidx.fragment.app.Fragment\nimport com.google.samples.apps.iosched.R\n\n/**\n * First page of onboarding showing a welcome message post the conference.\n */\nclass WelcomePostConferenceFragment : Fragment() {\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_onboarding_welcome_post, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        view.doOnLayout {\n            activity?.reportFullyDrawn()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/onboarding/WelcomePreConferenceFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.doOnLayout\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.samples.apps.iosched.databinding.FragmentOnboardingWelcomePreBinding\nimport dagger.hilt.android.AndroidEntryPoint\n\n/**\n * First page of onboarding showing a welcome message before the conference.\n */\n@AndroidEntryPoint\nclass WelcomePreConferenceFragment : Fragment() {\n\n    private lateinit var binding: FragmentOnboardingWelcomePreBinding\n\n    private val viewModel: OnboardingViewModel by activityViewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentOnboardingWelcomePreBinding.inflate(inflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n        }\n        return binding.root\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        binding.activityViewModel = viewModel\n        binding.buttonSignin.doOnLayout {\n            activity?.reportFullyDrawn()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/RemoveReservationDialogFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.reservation\n\nimport android.app.Dialog\nimport android.content.res.Resources\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.util.makeBold\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\n\n/**\n * Dialog that confirms the user really wants to cancel their reservation\n */\n@AndroidEntryPoint\nclass RemoveReservationDialogFragment : AppCompatDialogFragment() {\n\n    companion object {\n        const val DIALOG_REMOVE_RESERVATION = \"dialog_remove_reservation\"\n        private const val USER_ID_KEY = \"user_id\"\n        private const val SESSION_ID_KEY = \"session_id\"\n        private const val SESSION_TITLE_KEY = \"session_title\"\n\n        fun newInstance(\n            parameters: RemoveReservationDialogParameters\n        ): RemoveReservationDialogFragment {\n            val bundle = Bundle().apply {\n                putString(USER_ID_KEY, parameters.userId)\n                putString(SESSION_ID_KEY, parameters.sessionId)\n                putString(SESSION_TITLE_KEY, parameters.sessionTitle)\n            }\n            return RemoveReservationDialogFragment().apply { arguments = bundle }\n        }\n    }\n\n    private val viewModel: RemoveReservationViewModel by viewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val context = requireContext()\n        val args = requireNotNull(arguments)\n        val sessionTitle = requireNotNull(args.getString(SESSION_TITLE_KEY))\n\n        return MaterialAlertDialogBuilder(context)\n            .setTitle(R.string.remove_reservation_title)\n            .setMessage(formatRemoveReservationMessage(context.resources, sessionTitle))\n            .setNegativeButton(R.string.cancel, null)\n            .setPositiveButton(R.string.remove) { _, _ ->\n                viewModel.removeReservation()\n            }\n            .create()\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        val sessionId = arguments?.getString(SESSION_ID_KEY)\n        if (sessionId == null) {\n            dismiss()\n        }\n        return super.onCreateView(inflater, container, savedInstanceState)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                viewModel.snackbarMessages.collect {\n                    // Using Toast instead of Snackbar as it's easier for DialogFragment\n                    Toast.makeText(\n                        requireContext(),\n                        it.messageId,\n                        if (it.longDuration) Toast.LENGTH_LONG else Toast.LENGTH_SHORT\n                    ).show()\n                }\n            }\n        }\n    }\n\n    private fun formatRemoveReservationMessage(\n        res: Resources,\n        sessionTitle: String\n    ): CharSequence {\n        val text = res.getString(R.string.remove_reservation_content, sessionTitle)\n        return text.makeBold(sessionTitle)\n    }\n}\n\ndata class RemoveReservationDialogParameters(\n    val userId: String,\n    val sessionId: SessionId,\n    val sessionTitle: String\n)\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/RemoveReservationViewModel.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.reservation\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestParameters\nimport com.google.samples.apps.iosched.shared.result.Result.Error\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessage\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.flow.transform\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@HiltViewModel\nclass RemoveReservationViewModel @Inject constructor(\n    savedStateHandle: SavedStateHandle,\n    signInViewModelDelegate: SignInViewModelDelegate,\n    private val loadUserSessionUseCase: LoadUserSessionUseCase,\n    private val reservationActionUseCase: ReservationActionUseCase\n) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate {\n\n    private val sessionId: SessionId? = savedStateHandle.get<SessionId>(\"session_id\")\n\n    private val userIdStateFlow: StateFlow<String?> =\n        userId.stateIn(viewModelScope, WhileViewSubscribed, null)\n\n    val userSession: StateFlow<UserSession?> = userIdStateFlow.transform { userId ->\n        if (userId != null && sessionId != null) {\n            loadUserSessionUseCase(userId to sessionId).collect { loadResult ->\n                emit(loadResult.data?.userSession)\n            }\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, null)\n\n    private val _snackbarMessages = Channel<SnackbarMessage>(3, BufferOverflow.DROP_LATEST)\n    val snackbarMessages: Flow<SnackbarMessage> =\n        _snackbarMessages.receiveAsFlow().shareIn(viewModelScope, WhileViewSubscribed)\n\n    fun removeReservation() {\n        if (sessionId == null) return\n        val userId = userIdStateFlow.value ?: return\n        val userSession = userSession.value\n\n        viewModelScope.launch {\n            val result = reservationActionUseCase(\n                ReservationRequestParameters(\n                    userId,\n                    sessionId,\n                    ReservationRequestAction.CancelAction(),\n                    userSession\n                )\n            )\n            if (result is Error) {\n                _snackbarMessages.send(\n                    SnackbarMessage(\n                        messageId = R.string.reservation_error,\n                        longDuration = true\n                    )\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/ReservationTextView.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.reservation\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatTextView\nimport com.google.samples.apps.iosched.R\n\n/**\n * An [AppCompatTextView] extension supporting multiple custom states, representing the status\n * of a user's reservation for an event.\n */\nclass ReservationTextView @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = android.R.attr.textViewStyle\n) : AppCompatTextView(context, attrs, defStyleAttr) {\n\n    var status = ReservationViewState.RESERVABLE\n        set(value) {\n            if (value == field) return\n            field = value\n            setText(value.text)\n            refreshDrawableState()\n        }\n\n    init {\n        setText(ReservationViewState.RESERVABLE.text)\n        val drawable = context.getDrawable(R.drawable.asld_reservation)\n        setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null)\n    }\n\n    override fun onCreateDrawableState(extraSpace: Int): IntArray {\n        @Suppress(\"SENSELESS_COMPARISON\") // Status is null during super init\n        if (status == null) return super.onCreateDrawableState(extraSpace)\n        val drawableState = super.onCreateDrawableState(extraSpace + 1)\n        mergeDrawableStates(drawableState, status.state)\n        return drawableState\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/ReservationViewState.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.reservation\n\nimport androidx.annotation.StringRes\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\n\n/**\n * Models the different states of a reservation and a corresponding content description.\n */\nenum class ReservationViewState(\n    val state: IntArray,\n    @StringRes val text: Int,\n    @StringRes val contentDescription: Int\n) {\n    RESERVABLE(\n        intArrayOf(R.attr.state_reservable),\n        R.string.reservation_reservable,\n        R.string.a11y_reservation_available\n    ),\n    WAIT_LIST_AVAILABLE(\n        intArrayOf(R.attr.state_wait_list_available),\n        R.string.reservation_waitlist_available,\n        R.string.a11y_reservation_wait_list_available\n    ),\n    WAIT_LISTED(\n        intArrayOf(R.attr.state_wait_listed),\n        R.string.reservation_waitlisted,\n        R.string.a11y_reservation_wait_listed\n    ),\n    RESERVED(\n        intArrayOf(R.attr.state_reserved),\n        R.string.reservation_reserved,\n        R.string.a11y_reservation_reserved\n    ),\n    RESERVATION_PENDING(\n        intArrayOf(R.attr.state_reservation_pending),\n        R.string.reservation_pending,\n        R.string.a11y_reservation_pending\n    ),\n    RESERVATION_DISABLED(\n        intArrayOf(R.attr.state_reservation_disabled),\n        R.string.reservation_disabled,\n        R.string.a11y_reservation_disabled\n    );\n\n    companion object {\n        fun fromUserEvent(userEvent: UserEvent?, deniedByCutoff: Boolean): ReservationViewState {\n            return when {\n                // Order is significant, e.g. a pending cancellation is also reserved.\n                userEvent?.isReservationPending() == true ||\n                    userEvent?.isCancelPending() == true -> {\n                    // Treat both pending reservations & cancellations the same. This is important\n                    // as the icon animations all expect to do through the same pending state.\n                    RESERVATION_PENDING\n                }\n                userEvent?.isReserved() == true -> RESERVED\n                userEvent?.isWaitlisted() == true -> WAIT_LISTED\n                // TODO ?? -> WAIT_LIST_AVAILABLE\n                deniedByCutoff -> RESERVATION_DISABLED\n                else -> RESERVABLE\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/ReserveButton.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.reservation\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatImageButton\nimport com.google.samples.apps.iosched.R\n\n/**\n * An [AppCompatImageButton] extension supporting multiple custom states, representing the status\n * of a user's reservation for an event.\n */\nclass ReserveButton(context: Context, attrs: AttributeSet) : AppCompatImageButton(context, attrs) {\n\n    var status = ReservationViewState.RESERVATION_DISABLED\n        set(value) {\n            if (value == field) return\n            field = value\n            contentDescription = context.getString(value.contentDescription)\n            refreshDrawableState()\n        }\n\n    init {\n        // Drawable defining drawables for each reservation state\n        setImageResource(R.drawable.ic_reservation)\n        status = ReservationViewState.RESERVABLE\n    }\n\n    override fun onCreateDrawableState(extraSpace: Int): IntArray {\n        @Suppress(\"SENSELESS_COMPARISON\") // Status is null during super init\n        if (status == null) return super.onCreateDrawableState(extraSpace)\n        val drawableState = super.onCreateDrawableState(extraSpace + 1)\n        mergeDrawableStates(drawableState, status.state)\n        return drawableState\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/StarReserveFab.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.reservation\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.widget.Checkable\nimport androidx.annotation.DrawableRes\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.ui.reservation.StarReserveFabMode.RESERVE\nimport com.google.samples.apps.iosched.ui.reservation.StarReserveFabMode.STAR\n\n/**\n * An extension to the [FloatingActionButton] supporting multiple custom states, representing the\n * status of a user's reservation for an event or whether an event is bookmarked (as modelled by\n * the checked state).\n */\nclass StarReserveFab(\n    context: Context,\n    attrs: AttributeSet\n) : FloatingActionButton(context, attrs), Checkable {\n\n    private var mode = RESERVE\n\n    private var _checked = false\n        set(value) {\n            if (field != value || mode != STAR) {\n                field = value\n                currentDrawable = R.drawable.asld_star_event\n                mode = STAR\n                val contentDescRes = if (value) R.string.a11y_starred else R.string.a11y_unstarred\n                contentDescription = context.getString(contentDescRes)\n                refreshDrawableState()\n            }\n        }\n\n    var reservationStatus: ReservationViewState? = null\n        set(value) {\n            if (value != field || mode != RESERVE) {\n                field = value\n                currentDrawable = R.drawable.asld_reservation\n                mode = RESERVE\n                if (value != null) {\n                    contentDescription = context.getString(value.contentDescription)\n                }\n                refreshDrawableState()\n            }\n        }\n\n    @DrawableRes\n    private var currentDrawable = 0\n        set(value) {\n            if (field != value) {\n                field = value\n                setImageResource(value)\n            }\n        }\n\n    override fun isChecked() = _checked\n\n    override fun setChecked(checked: Boolean) {\n        _checked = checked\n    }\n\n    override fun toggle() {\n        _checked = !_checked\n    }\n\n    override fun onCreateDrawableState(extraSpace: Int): IntArray {\n        if (!isShowingStar() && !isShowingReservation()) {\n            return super.onCreateDrawableState(extraSpace)\n        }\n\n        val drawableState = super.onCreateDrawableState(extraSpace + 1)\n        when {\n            isShowingStar() -> {\n                val state = if (_checked) stateChecked else stateUnchecked\n                mergeDrawableStates(drawableState, state)\n            }\n            isShowingReservation() -> {\n                mergeDrawableStates(drawableState, reservationStatus?.state)\n            }\n        }\n        return drawableState\n    }\n\n    private fun isShowingReservation() = currentDrawable == R.drawable.asld_reservation\n\n    private fun isShowingStar() = currentDrawable == R.drawable.asld_star_event\n\n    companion object {\n        private val stateChecked = intArrayOf(android.R.attr.state_checked)\n        private val stateUnchecked = intArrayOf(-android.R.attr.state_checked)\n    }\n}\n\n/**\n * Enum of the mutually exclusive modes [StarReserveFab] can be in.\n */\nprivate enum class StarReserveFabMode {\n    STAR,\n    RESERVE\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/reservation/SwapReservationDialogFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.reservation\n\nimport android.app.Dialog\nimport android.content.res.Resources\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.lifecycle.coroutineScope\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.domain.users.SwapActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestParameters\nimport com.google.samples.apps.iosched.util.makeBold\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n/**\n * Dialog that confirms the user wants to replace their reservations\n */\n@AndroidEntryPoint\nclass SwapReservationDialogFragment : AppCompatDialogFragment() {\n\n    companion object {\n        const val DIALOG_SWAP_RESERVATION = \"dialog_swap_reservation\"\n        private const val USER_ID_KEY = \"user_id\"\n        private const val FROM_ID_KEY = \"from_id\"\n        private const val FROM_TITLE_KEY = \"from_title\"\n        private const val TO_ID_KEY = \"to_id\"\n        private const val TO_TITLE_KEY = \"to_title\"\n\n        fun newInstance(parameters: SwapRequestParameters): SwapReservationDialogFragment {\n            val bundle = Bundle().apply {\n                putString(USER_ID_KEY, parameters.userId)\n                putString(FROM_ID_KEY, parameters.fromId)\n                putString(FROM_TITLE_KEY, parameters.fromTitle)\n                putString(TO_ID_KEY, parameters.toId)\n                putString(TO_TITLE_KEY, parameters.toTitle)\n            }\n            return SwapReservationDialogFragment().apply { arguments = bundle }\n        }\n    }\n\n    @Inject\n    lateinit var swapActionUseCase: SwapActionUseCase\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val context = requireContext()\n        val args = requireNotNull(arguments)\n        val userId = requireNotNull(args.getString(USER_ID_KEY))\n        val fromId = requireNotNull(args.getString(FROM_ID_KEY))\n        val fromTitle = requireNotNull(args.getString(FROM_TITLE_KEY))\n        val toId = requireNotNull(args.getString(TO_ID_KEY))\n        val toTitle = requireNotNull(args.getString(TO_TITLE_KEY))\n\n        return MaterialAlertDialogBuilder(context)\n            .setTitle(R.string.swap_reservation_title)\n            .setMessage(formatSwapReservationMessage(context.resources, fromTitle, toTitle))\n            .setNegativeButton(R.string.cancel, null)\n            .setPositiveButton(R.string.swap) { _, _ ->\n                viewLifecycleOwner.lifecycle.coroutineScope.launch {\n                    swapActionUseCase(\n                        SwapRequestParameters(userId, fromId, fromTitle, toId, toTitle)\n                    )\n                }\n            }\n            .create()\n    }\n\n    private fun formatSwapReservationMessage(\n        res: Resources,\n        fromTitle: String,\n        toTitle: String\n    ): CharSequence {\n        val text = res.getString(R.string.swap_reservation_content, fromTitle, toTitle)\n        return text.makeBold(fromTitle).makeBold(toTitle)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/DayIndicator.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport com.google.samples.apps.iosched.model.ConferenceDay\n\n/** An indicator for days on the Schedule. */\nclass DayIndicator(\n    val day: ConferenceDay,\n    val checked: Boolean = false,\n    val enabled: Boolean = true\n) {\n    // Only the day is used for equality\n    override fun equals(other: Any?): Boolean =\n        this === other || (other is DayIndicator && day == other.day)\n\n    // Only the day is used for equality\n    override fun hashCode(): Int = day.hashCode()\n\n    fun areUiContentsTheSame(other: DayIndicator): Boolean {\n        return checked == other.checked && enabled == other.enabled\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/DayIndicatorAdapter.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.DiffUtil.ItemCallback\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.databinding.ItemScheduleDayIndicatorBinding\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.util.executeAfter\n\nclass DayIndicatorAdapter(\n    private val scheduleViewModel: ScheduleViewModel,\n    private val lifecycleOwner: LifecycleOwner\n) : ListAdapter<DayIndicator, DayIndicatorViewHolder>(IndicatorDiff) {\n\n    init {\n        setHasStableIds(true)\n    }\n\n    override fun getItemId(position: Int): Long {\n        return getItem(position).day.start.toEpochSecond()\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DayIndicatorViewHolder {\n        val binding = ItemScheduleDayIndicatorBinding\n            .inflate(LayoutInflater.from(parent.context), parent, false)\n        return DayIndicatorViewHolder(binding, scheduleViewModel, lifecycleOwner)\n    }\n\n    override fun onBindViewHolder(holder: DayIndicatorViewHolder, position: Int) {\n        holder.bind(getItem(position))\n    }\n}\n\nclass DayIndicatorViewHolder(\n    private val binding: ItemScheduleDayIndicatorBinding,\n    private val scheduleViewModel: ScheduleViewModel,\n    private val lifecycleOwner: LifecycleOwner\n) : ViewHolder(binding.root) {\n\n    fun bind(item: DayIndicator) {\n        binding.executeAfter {\n            indicator = item\n            viewModel = scheduleViewModel\n            lifecycleOwner = this@DayIndicatorViewHolder.lifecycleOwner\n        }\n    }\n}\n\nobject IndicatorDiff : ItemCallback<DayIndicator>() {\n    override fun areItemsTheSame(oldItem: DayIndicator, newItem: DayIndicator) =\n        oldItem == newItem\n\n    override fun areContentsTheSame(oldItem: DayIndicator, newItem: DayIndicator) =\n        oldItem.areUiContentsTheSame(newItem)\n}\n\n@BindingAdapter(\"indicatorText\", \"inConferenceTimeZone\", requireAll = true)\nfun setIndicatorText(\n    view: TextView,\n    dayIndicator: DayIndicator,\n    inConferenceTimeZone: Boolean\n) {\n    view.setText(TimeUtils.getShortLabelResForDay(dayIndicator.day, inConferenceTimeZone))\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/DaySeparatorItemDecoration.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.Rect\nimport android.text.Layout.Alignment.ALIGN_CENTER\nimport android.text.StaticLayout\nimport android.text.TextPaint\nimport android.util.SparseArray\nimport android.view.View\nimport androidx.core.content.res.ResourcesCompat\nimport androidx.core.content.res.getDimensionPixelSizeOrThrow\nimport androidx.core.content.res.getResourceIdOrThrow\nimport androidx.core.graphics.withTranslation\nimport androidx.core.util.containsKey\nimport androidx.core.view.forEach\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.ItemDecoration\nimport androidx.recyclerview.widget.RecyclerView.State\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.domain.sessions.ConferenceDayIndexer\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.util.newStaticLayout\nimport kotlin.math.ceil\nimport org.threeten.bp.ZoneId\n\nclass DaySeparatorItemDecoration(\n    context: Context,\n    indexer: ConferenceDayIndexer,\n    zoneId: ZoneId\n) : ItemDecoration() {\n\n    private val labels: SparseArray<StaticLayout>\n\n    private val paint = TextPaint(Paint.ANTI_ALIAS_FLAG or Paint.SUBPIXEL_TEXT_FLAG)\n\n    private val textWidth: Int\n\n    private val decorHeight: Int\n\n    private val verticalBias: Float\n\n    init {\n        val attrs = context.obtainStyledAttributes(\n            R.style.Widget_IOSched_DaySeparatorDecoration,\n            R.styleable.DaySeparatorDecoration\n        )\n\n        val textSize =\n            attrs.getDimension(R.styleable.DaySeparatorDecoration_android_textSize, paint.textSize)\n        paint.textSize = textSize\n        try {\n            paint.typeface = ResourcesCompat.getFont(\n                context,\n                attrs.getResourceIdOrThrow(R.styleable.DaySeparatorDecoration_android_fontFamily)\n            )\n        } catch (ignored: Exception) {\n        }\n\n        val textColor =\n            attrs.getColor(R.styleable.DaySeparatorDecoration_android_textColor, Color.BLACK)\n        paint.color = textColor\n\n        textWidth =\n            attrs.getDimensionPixelSizeOrThrow(R.styleable.DaySeparatorDecoration_android_width)\n        val height =\n            attrs.getDimensionPixelSizeOrThrow(R.styleable.DaySeparatorDecoration_android_height)\n        val minHeight = ceil(textSize).toInt()\n        decorHeight = Math.max(height, minHeight)\n\n        verticalBias = attrs.getFloat(R.styleable.DaySeparatorDecoration_verticalBias, 0.5f)\n            .coerceIn(0f, 1f)\n\n        attrs.recycle()\n\n        labels = buildLabels(context, indexer, zoneId)\n    }\n\n    private fun buildLabels(\n        context: Context,\n        indexer: ConferenceDayIndexer,\n        zoneId: ZoneId\n    ): SparseArray<StaticLayout> {\n        val isInConferenceZone = TimeUtils.isConferenceTimeZone(zoneId)\n        val sparseArray = SparseArray<StaticLayout>()\n        for (day in indexer.days) {\n            val position = indexer.positionForDay(day)\n            val text = context.getString(TimeUtils.getLabelResForDay(day, isInConferenceZone))\n            val label = newStaticLayout(text, paint, textWidth, ALIGN_CENTER, 1f, 0f, false)\n            sparseArray.put(position, label)\n        }\n        return sparseArray\n    }\n\n    override fun getItemOffsets(outRect: Rect, child: View, parent: RecyclerView, state: State) {\n        val position = parent.getChildAdapterPosition(child)\n        outRect.top = if (labels.containsKey(position)) decorHeight else 0\n    }\n\n    override fun onDraw(canvas: Canvas, parent: RecyclerView, state: State) {\n        val layoutManager = parent.layoutManager ?: return\n        val centerX = parent.width / 2f\n\n        parent.forEach { child ->\n            if (child.top < parent.height && child.bottom > 0) {\n                // Child is visible\n                val layout = labels[parent.getChildAdapterPosition(child)]\n                if (layout != null) {\n                    val dx = centerX - (layout.width / 2)\n                    val dy = layoutManager.getDecoratedTop(child) +\n                        child.translationY +\n                        // offset vertically within the space according to the bias\n                        (decorHeight - layout.height) * verticalBias\n                    canvas.withTranslation(x = dx, y = dy) {\n                        layout.draw(this)\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.doOnNextLayout\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.navigation.fragment.findNavController\nimport androidx.recyclerview.widget.DefaultItemAnimator\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.OnScrollListener\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentScheduleBinding\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.di.SearchScheduleEnabledFlag\nimport com.google.samples.apps.iosched.shared.domain.sessions.ConferenceDayIndexer\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.NavigateToSignInDialogAction\nimport com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.NavigateToSignOutDialogAction\nimport com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.ShowScheduleUiHints\nimport com.google.samples.apps.iosched.ui.sessioncommon.SessionsAdapter\nimport com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment\nimport com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment.Companion.DIALOG_NOTIFICATIONS_PREFERENCE\nimport com.google.samples.apps.iosched.ui.signin.SignInDialogFragment\nimport com.google.samples.apps.iosched.ui.signin.SignInNavigationAction.ShowNotificationPreferencesDialog\nimport com.google.samples.apps.iosched.ui.signin.SignOutDialogFragment\nimport com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem\nimport com.google.samples.apps.iosched.util.clearDecorations\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.executeAfter\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.util.requestApplyInsetsWhenAttached\nimport com.google.samples.apps.iosched.util.setContentMaxWidth\nimport com.google.samples.apps.iosched.widget.BubbleDecoration\nimport com.google.samples.apps.iosched.widget.FadingSnackbar\nimport com.google.samples.apps.iosched.widget.JumpSmoothScroller\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport javax.inject.Named\n\n/**\n * The Schedule page of the top-level Activity.\n */\n@AndroidEntryPoint\nclass ScheduleFragment : Fragment() {\n\n    companion object {\n        private const val DIALOG_NEED_TO_SIGN_IN = \"dialog_need_to_sign_in\"\n        private const val DIALOG_CONFIRM_SIGN_OUT = \"dialog_confirm_sign_out\"\n        private const val DIALOG_SCHEDULE_HINTS = \"dialog_schedule_hints\"\n    }\n\n    @Inject\n    lateinit var analyticsHelper: AnalyticsHelper\n\n    @Inject\n    @Named(\"tagViewPool\")\n    lateinit var tagViewPool: RecycledViewPool\n\n    @Inject\n    @JvmField\n    @SearchScheduleEnabledFlag\n    var searchScheduleFeatureEnabled: Boolean = false\n\n    @Inject\n    lateinit var snackbarMessageManager: SnackbarMessageManager\n\n    private val scheduleViewModel: ScheduleViewModel by viewModels()\n    private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels()\n    private val mainActivityViewModel: MainActivityViewModel by activityViewModels()\n\n    private lateinit var snackbar: FadingSnackbar\n\n    private lateinit var scheduleRecyclerView: RecyclerView\n    private lateinit var sessionsAdapter: SessionsAdapter\n    private lateinit var scheduleScroller: JumpSmoothScroller\n\n    private lateinit var dayIndicatorRecyclerView: RecyclerView\n    private lateinit var dayIndicatorAdapter: DayIndicatorAdapter\n    private lateinit var dayIndicatorItemDecoration: BubbleDecoration\n\n    private lateinit var dayIndexer: ConferenceDayIndexer\n    private var cachedBubbleRange: IntRange? = null\n\n    private lateinit var binding: FragmentScheduleBinding\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentScheduleBinding.inflate(inflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n            viewModel = scheduleViewModel\n        }\n\n        snackbar = binding.snackbar\n        scheduleRecyclerView = binding.recyclerviewSchedule\n        dayIndicatorRecyclerView = binding.dayIndicators\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        // Set up search menu item\n        binding.toolbar.run {\n            inflateMenu(R.menu.schedule_menu)\n            menu.findItem(R.id.search).isVisible = searchScheduleFeatureEnabled\n            setOnMenuItemClickListener { item ->\n                if (item.itemId == R.id.search) {\n                    analyticsHelper.logUiEvent(\"Navigate to Search\", AnalyticsActions.CLICK)\n                    openSearch()\n                    true\n                } else {\n                    false\n                }\n            }\n        }\n\n        binding.toolbar.setupProfileMenuItem(mainActivityViewModel, this)\n\n        // Pad the bottom of the RecyclerView so that the content scrolls up above the nav bar\n        binding.recyclerviewSchedule.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n\n        // Session list configuration\n        sessionsAdapter = SessionsAdapter(\n            tagViewPool,\n            scheduleViewModel.showReservations,\n            scheduleViewModel.timeZoneId,\n            viewLifecycleOwner,\n            scheduleTwoPaneViewModel, // OnSessionClickListener\n            scheduleTwoPaneViewModel // OnSessionStarClickListener\n        )\n        scheduleRecyclerView.apply {\n            adapter = sessionsAdapter\n            (itemAnimator as DefaultItemAnimator).run {\n                supportsChangeAnimations = false\n                addDuration = 160L\n                moveDuration = 160L\n                changeDuration = 160L\n                removeDuration = 120L\n            }\n\n            addOnScrollListener(object : OnScrollListener() {\n                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n                    onScheduleScrolled()\n                }\n\n                override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n                    scheduleViewModel.userHasInteracted = true\n                }\n            })\n        }\n        binding.swipeRefreshLayout.doOnNextLayout {\n            setContentMaxWidth(it)\n        }\n        scheduleScroller = JumpSmoothScroller(view.context)\n\n        dayIndicatorItemDecoration = BubbleDecoration(view.context)\n        dayIndicatorRecyclerView.addItemDecoration(dayIndicatorItemDecoration)\n\n        dayIndicatorAdapter = DayIndicatorAdapter(scheduleViewModel, viewLifecycleOwner)\n        dayIndicatorRecyclerView.adapter = dayIndicatorAdapter\n\n        // Start observing ViewModels\n        launchAndRepeatWithViewLifecycle {\n            launch {\n                scheduleViewModel.scheduleUiData.collect { updateScheduleUi(it) }\n            }\n\n            // During conference, scroll to current event.\n            launch {\n                scheduleViewModel.scrollToEvent.collect { scrollEvent ->\n                    if (scrollEvent.targetPosition != -1) {\n                        scheduleRecyclerView.run {\n                            post {\n                                val lm = layoutManager as LinearLayoutManager\n                                if (scrollEvent.smoothScroll) {\n                                    scheduleScroller.targetPosition = scrollEvent.targetPosition\n                                    lm.startSmoothScroll(scheduleScroller)\n                                } else {\n                                    lm.scrollToPositionWithOffset(scrollEvent.targetPosition, 0)\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n            launch {\n                scheduleViewModel.navigationActions.collect {\n                    when (it) {\n                        is NavigateToSignInDialogAction -> openSignInDialog()\n                        is NavigateToSignOutDialogAction -> openSignOutDialog()\n                        is ShowScheduleUiHints -> openScheduleUiHintsDialog()\n                    }\n                }\n            }\n\n            launch {\n                scheduleViewModel.signInNavigationActions.collect {\n                    if (it == ShowNotificationPreferencesDialog) {\n                        openNotificationsPreferenceDialog()\n                    }\n                }\n            }\n\n            // Show an error message\n            launch {\n                scheduleViewModel.errorMessage.collect { errorMsg ->\n                    Toast.makeText(context, errorMsg, Toast.LENGTH_LONG).show()\n                }\n            }\n        }\n\n        if (savedInstanceState == null) {\n            // VM outlives the UI, so reset this flag when a new Schedule page is shown\n            scheduleViewModel.userHasInteracted = false\n\n            binding.coordinatorLayout.postDelayed(\n                {\n                    binding.coordinatorLayout.requestApplyInsetsWhenAttached()\n                },\n                500\n            )\n        }\n        analyticsHelper.sendScreenView(\"Schedule\", requireActivity())\n    }\n\n    private fun updateScheduleUi(scheduleUiData: ScheduleUiData) {\n        // Require everything to be loaded.\n        val list = scheduleUiData.list ?: return\n        val timeZoneId = scheduleUiData.timeZoneId ?: return\n        val indexer = scheduleUiData.dayIndexer ?: return\n\n        dayIndexer = indexer\n        // Prevent building new indicators until we get scroll information.\n        cachedBubbleRange = null\n        if (indexer.days.isEmpty()) {\n            // Special case: the results are empty, so we won't get valid scroll information.\n            // Set a bogus range to and rebuild the day indicators.\n            cachedBubbleRange = -1..-1\n            rebuildDayIndicators()\n        }\n\n        sessionsAdapter.submitList(list)\n        scheduleRecyclerView.run {\n            // Recreate the decoration used for the sticky time headers\n            clearDecorations()\n            if (list.isNotEmpty()) {\n                addItemDecoration(\n                    ScheduleTimeHeadersDecoration(\n                        context, list.map { it.session }, timeZoneId\n                    )\n                )\n                addItemDecoration(\n                    DaySeparatorItemDecoration(\n                        context, indexer, timeZoneId\n                    )\n                )\n            }\n        }\n\n        binding.executeAfter {\n            isEmpty = list.isEmpty()\n        }\n    }\n\n    private fun rebuildDayIndicators() {\n        // cachedBubbleRange will get set once we have scroll information, so wait until then.\n        val bubbleRange = cachedBubbleRange ?: return\n        val indicators = if (dayIndexer.days.isEmpty()) {\n            TimeUtils.ConferenceDays.map { day: ConferenceDay ->\n                DayIndicator(day = day, enabled = false)\n            }\n        } else {\n            dayIndexer.days.mapIndexed { index: Int, day: ConferenceDay ->\n                DayIndicator(day = day, checked = index in bubbleRange)\n            }\n        }\n\n        dayIndicatorAdapter.submitList(indicators)\n        dayIndicatorItemDecoration.bubbleRange = bubbleRange\n    }\n\n    private fun onScheduleScrolled() {\n        val layoutManager = (scheduleRecyclerView.layoutManager) as LinearLayoutManager\n        val first = layoutManager.findFirstVisibleItemPosition()\n        val last = layoutManager.findLastVisibleItemPosition()\n        if (first < 0 || last < 0) {\n            // When the list is empty, we get -1 for the positions.\n            return\n        }\n\n        val firstDay = dayIndexer.dayForPosition(first) ?: return\n        val lastDay = dayIndexer.dayForPosition(last) ?: return\n        val highlightRange = dayIndexer.days.indexOf(firstDay)..dayIndexer.days.indexOf(lastDay)\n        if (highlightRange != cachedBubbleRange) {\n            cachedBubbleRange = highlightRange\n            rebuildDayIndicators()\n        }\n    }\n\n    private fun openSearch() {\n        findNavController().navigate(ScheduleFragmentDirections.toSearch())\n    }\n\n    private fun openSignInDialog() {\n        val dialog = SignInDialogFragment()\n        dialog.show(requireActivity().supportFragmentManager, DIALOG_NEED_TO_SIGN_IN)\n    }\n\n    private fun openSignOutDialog() {\n        val dialog = SignOutDialogFragment()\n        dialog.show(requireActivity().supportFragmentManager, DIALOG_CONFIRM_SIGN_OUT)\n    }\n\n    private fun openScheduleUiHintsDialog() {\n        val dialog = ScheduleUiHintsDialogFragment()\n        dialog.show(requireActivity().supportFragmentManager, DIALOG_SCHEDULE_HINTS)\n    }\n\n    private fun openNotificationsPreferenceDialog() {\n        val dialog = NotificationsPreferenceDialogFragment()\n        dialog.show(requireActivity().supportFragmentManager, DIALOG_NOTIFICATIONS_PREFERENCE)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleItemBindingAdapter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Room\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.reservation.ReservationTextView\nimport com.google.samples.apps.iosched.ui.reservation.ReservationViewState\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\n\n@BindingAdapter(\n    \"sessionStart\",\n    \"timeZoneId\",\n    \"showTime\",\n    \"sessionRoom\",\n    requireAll = true\n)\nfun sessionDateTimeLocation(\n    textView: TextView,\n    startTime: ZonedDateTime?,\n    zoneId: ZoneId?,\n    showTime: Boolean,\n    room: Room?\n) {\n    startTime ?: return\n    zoneId ?: return\n    val roomName = room?.name ?: \"-\"\n    val localStartTime = TimeUtils.zonedTime(startTime, zoneId)\n\n    // For a11y, always use date, time, and location -> \"May 7, 10:00 AM / Amphitheatre\n    val dateTimeString = TimeUtils.dateTimeString(localStartTime)\n    val contentDescription = textView.resources.getString(\n        R.string.session_duration_location,\n        dateTimeString,\n        roomName\n    )\n    textView.contentDescription = contentDescription\n\n    textView.text = if (showTime) {\n        // Show date, time, and location, so just reuse the content description\n        contentDescription\n    } else if (!TimeUtils.isConferenceTimeZone(zoneId)) {\n        // Show date and location -> \"May 7 / Amphitheatre\"\n        val dateString = TimeUtils.dateString(localStartTime)\n        textView.resources.getString(\n            R.string.session_duration_location,\n            dateString,\n            roomName\n        )\n    } else {\n        // Show location only\n        roomName\n    }\n}\n\n@BindingAdapter(\n    \"reservationStatus\",\n    \"showReservations\",\n    \"isReservable\",\n    requireAll = true\n)\nfun setReservationStatus(\n    textView: ReservationTextView,\n    userEvent: UserEvent?,\n    showReservations: Boolean,\n    isReservable: Boolean\n) {\n    when (isReservable && showReservations) {\n        true -> {\n            val reservationUnavailable = false // TODO determine this condition\n            textView.status = ReservationViewState.fromUserEvent(userEvent, reservationUnavailable)\n            textView.visibility = VISIBLE\n        }\n        false -> {\n            textView.visibility = GONE\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleNavigationAction.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nsealed class ScheduleNavigationAction {\n    object NavigateToSignInDialogAction : ScheduleNavigationAction()\n    object NavigateToSignOutDialogAction : ScheduleNavigationAction()\n    object ShowScheduleUiHints : ScheduleNavigationAction()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleTimeHeadersDecoration.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Paint.ANTI_ALIAS_FLAG\nimport android.graphics.Typeface\nimport android.text.Layout.Alignment.ALIGN_CENTER\nimport android.text.SpannableStringBuilder\nimport android.text.StaticLayout\nimport android.text.TextPaint\nimport android.text.style.AbsoluteSizeSpan\nimport android.text.style.StyleSpan\nimport android.view.View\nimport androidx.core.content.res.ResourcesCompat\nimport androidx.core.content.res.getColorOrThrow\nimport androidx.core.content.res.getDimensionPixelSizeOrThrow\nimport androidx.core.content.res.getResourceIdOrThrow\nimport androidx.core.graphics.withTranslation\nimport androidx.core.text.inSpans\nimport androidx.core.view.isEmpty\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.ItemDecoration\nimport androidx.recyclerview.widget.RecyclerView.State\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.util.isRtl\nimport com.google.samples.apps.iosched.util.newStaticLayout\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\nimport org.threeten.bp.format.DateTimeFormatter\nimport timber.log.Timber\n\n/**\n * A [RecyclerView.ItemDecoration] which draws sticky headers for a given list of sessions.\n */\nclass ScheduleTimeHeadersDecoration(\n    context: Context,\n    sessions: List<Session>,\n    zoneId: ZoneId\n) : ItemDecoration() {\n\n    private val paint: TextPaint\n    private val width: Int\n    private val padding: Int\n    private val timeTextSize: Int\n    private val meridiemTextSize: Int\n    private val timeFormatter = DateTimeFormatter.ofPattern(\"h:mm\")\n    private val meridiemFormatter = DateTimeFormatter.ofPattern(\"a\")\n\n    private val timeTextSizeSpan: AbsoluteSizeSpan\n    private val meridiemTextSizeSpan: AbsoluteSizeSpan\n    private val boldSpan = StyleSpan(Typeface.BOLD)\n\n    init {\n        val attrs = context.obtainStyledAttributes(\n            R.style.Widget_IOSched_TimeHeaders,\n            R.styleable.TimeHeader\n        )\n        paint = TextPaint(ANTI_ALIAS_FLAG).apply {\n            color = attrs.getColorOrThrow(R.styleable.TimeHeader_android_textColor)\n            try {\n                typeface = ResourcesCompat.getFont(\n                    context,\n                    attrs.getResourceIdOrThrow(R.styleable.TimeHeader_android_fontFamily)\n                )\n            } catch (_: Exception) {\n                // ignore\n            }\n        }\n        width = attrs.getDimensionPixelSizeOrThrow(R.styleable.TimeHeader_android_width)\n        padding = attrs.getDimensionPixelSize(R.styleable.TimeHeader_android_padding, 0)\n        timeTextSize = attrs.getDimensionPixelSizeOrThrow(R.styleable.TimeHeader_timeTextSize)\n        meridiemTextSize =\n            attrs.getDimensionPixelSizeOrThrow(R.styleable.TimeHeader_meridiemTextSize)\n        attrs.recycle()\n\n        timeTextSizeSpan = AbsoluteSizeSpan(timeTextSize)\n        meridiemTextSizeSpan = AbsoluteSizeSpan(meridiemTextSize)\n    }\n\n    // Get the sessions index:start time and create header layouts for each\n    private val timeSlots: Map<Int, StaticLayout> =\n        indexSessionHeaders(sessions, zoneId).map {\n            it.first to createHeader(it.second)\n        }.toMap()\n\n    /**\n     * Loop over each child and draw any corresponding headers i.e. items who's position is a key in\n     * [timeSlots]. We also look back to see if there are any headers _before_ the first header we\n     * found i.e. which needs to be sticky.\n     */\n    override fun onDrawOver(c: Canvas, parent: RecyclerView, state: State) {\n        if (timeSlots.isEmpty() || parent.isEmpty()) return\n\n        val isRtl = parent.isRtl()\n        if (isRtl) {\n            c.save()\n            c.translate((parent.width - width).toFloat(), 0f)\n        }\n\n        val parentPadding = parent.paddingTop\n\n        var earliestPosition = Int.MAX_VALUE\n        var previousHeaderPosition = -1\n        var previousHasHeader = false\n        var earliestChild: View? = null\n        for (i in parent.childCount - 1 downTo 0) {\n            val child = parent.getChildAt(i)\n            if (child == null) {\n                // This should not be null, but observed null at times.\n                // Guard against it to avoid crash and log the state.\n                Timber.w(\n                    \"\"\"View is null. Index: $i, childCount: ${parent.childCount},\n                        |RecyclerView.State: $state\"\"\".trimMargin()\n                )\n                continue\n            }\n\n            if (child.y > parent.height || (child.y + child.height) < 0) {\n                // Can't see this child\n                continue\n            }\n\n            val position = parent.getChildAdapterPosition(child)\n            if (position < 0) {\n                continue\n            }\n            if (position < earliestPosition) {\n                earliestPosition = position\n                earliestChild = child\n            }\n\n            val header = timeSlots[position]\n            if (header != null) {\n                drawHeader(c, child, parentPadding, header, child.alpha, previousHasHeader)\n                previousHeaderPosition = position\n                previousHasHeader = true\n            } else {\n                previousHasHeader = false\n            }\n        }\n\n        if (earliestChild != null && earliestPosition != previousHeaderPosition) {\n            // This child needs a sicky header\n            findHeaderBeforePosition(earliestPosition)?.let { stickyHeader ->\n                previousHasHeader = previousHeaderPosition - earliestPosition == 1\n                drawHeader(c, earliestChild, parentPadding, stickyHeader, 1f, previousHasHeader)\n            }\n        }\n\n        if (isRtl) {\n            c.restore()\n        }\n    }\n\n    private fun findHeaderBeforePosition(position: Int): StaticLayout? {\n        for (headerPos in timeSlots.keys.reversed()) {\n            if (headerPos < position) {\n                return timeSlots[headerPos]\n            }\n        }\n        return null\n    }\n\n    private fun drawHeader(\n        canvas: Canvas,\n        child: View,\n        parentPadding: Int,\n        header: StaticLayout,\n        headerAlpha: Float,\n        previousHasHeader: Boolean\n    ) {\n        val childTop = child.y.toInt()\n        val childBottom = childTop + child.height\n        var top = (childTop + padding).coerceAtLeast(parentPadding)\n        if (previousHasHeader) {\n            top = top.coerceAtMost(childBottom - header.height - padding)\n        }\n        paint.alpha = (headerAlpha * 255).toInt()\n        canvas.withTranslation(y = top.toFloat()) {\n            header.draw(canvas)\n        }\n    }\n\n    /**\n     * Create a header layout for the given [startTime].\n     */\n    private fun createHeader(startTime: ZonedDateTime): StaticLayout {\n        val text = SpannableStringBuilder().apply {\n            inSpans(timeTextSizeSpan) {\n                append(timeFormatter.format(startTime))\n            }\n            append(System.lineSeparator())\n            inSpans(meridiemTextSizeSpan, boldSpan) {\n                append(meridiemFormatter.format(startTime).toUpperCase())\n            }\n        }\n        return newStaticLayout(text, paint, width, ALIGN_CENTER, 1f, 0f, false)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneFragment.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.activity.OnBackPressedCallback\nimport androidx.core.view.doOnNextLayout\nimport androidx.fragment.app.activityViewModels\nimport androidx.navigation.NavController\nimport androidx.navigation.NavDestination\nimport androidx.navigation.fragment.NavHostFragment\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.ScheduleDetailNavGraphDirections\nimport com.google.samples.apps.iosched.databinding.FragmentScheduleTwoPaneBinding\nimport com.google.samples.apps.iosched.ui.MainNavigationFragment\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.messages.setupSnackbarManager\nimport com.google.samples.apps.iosched.ui.signin.SignInDialogFragment\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass ScheduleTwoPaneFragment : MainNavigationFragment() {\n\n    @Inject\n    lateinit var snackbarMessageManager: SnackbarMessageManager\n\n    private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels()\n\n    private lateinit var binding: FragmentScheduleTwoPaneBinding\n\n    private lateinit var listPaneNavController: NavController\n    private lateinit var detailPaneNavController: NavController\n\n    private val backPressHandler = BackPressHandler()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        binding = FragmentScheduleTwoPaneBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        setupSnackbarManager(snackbarMessageManager, binding.snackbar)\n\n        binding.slidingPaneLayout.apply {\n            // Disable dragging the detail pane.\n            lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED\n            // Listen for movement of the detail pane.\n            addPanelSlideListener(backPressHandler)\n        }\n\n        childFragmentManager.run {\n            listPaneNavController =\n                (findFragmentById(R.id.list_pane) as NavHostFragment).navController\n            detailPaneNavController =\n                (findFragmentById(R.id.detail_pane) as NavHostFragment).navController\n            listPaneNavController.addOnDestinationChangedListener(backPressHandler)\n            detailPaneNavController.addOnDestinationChangedListener(backPressHandler)\n        }\n\n        binding.slidingPaneLayout.doOnNextLayout {\n            scheduleTwoPaneViewModel.setIsTwoPane(!binding.slidingPaneLayout.isSlideable)\n        }\n\n        launchAndRepeatWithViewLifecycle {\n            launch {\n                scheduleTwoPaneViewModel.selectSessionEvents.collect { sessionId ->\n                    detailPaneNavController.navigate(\n                        ScheduleDetailNavGraphDirections.toSessionDetail(sessionId)\n                    )\n                    // On narrow screens, slide the detail pane over the list pane if it isn't already\n                    // on top. If both panes are visible, this will have no effect.\n                    binding.slidingPaneLayout.open()\n                }\n            }\n            launch {\n                scheduleTwoPaneViewModel.navigateToSignInDialogEvents.collect {\n                    openSignInDialog()\n                }\n            }\n            launch {\n                scheduleTwoPaneViewModel.returnToListPaneEvents.collect {\n                    binding.slidingPaneLayout.close()\n                }\n            }\n        }\n\n        requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backPressHandler)\n    }\n\n    // TODO convert this to a dialog destination in the nav graph\n    private fun openSignInDialog() {\n        val dialog = SignInDialogFragment()\n        dialog.show(requireActivity().supportFragmentManager, SignInDialogFragment.DIALOG_SIGN_IN)\n    }\n\n    /** Handles back button press while this fragment is on screen. */\n    inner class BackPressHandler :\n        OnBackPressedCallback(false),\n        SlidingPaneLayout.PanelSlideListener,\n        NavController.OnDestinationChangedListener {\n\n        override fun handleOnBackPressed() {\n            // Back press can have three possible effects that we check for in order.\n            // 1. In the detail pane, go back from Speaker Detail to Session Detail.\n            val listDestination = listPaneNavController.currentDestination?.id\n            val detailDestination = detailPaneNavController.currentDestination?.id\n            var done = false\n            if (detailDestination == R.id.navigation_speaker_detail) {\n                done = detailPaneNavController.popBackStack()\n            }\n            // 2. On narrow screens, if the detail pane is in front, \"go back\" by sliding it away.\n            if (!done) {\n                done = binding.slidingPaneLayout.closePane()\n            }\n            // 3. Try to pop the list pane, e.g. back from Search to Schedule.\n            if (!done && listDestination == R.id.navigation_schedule_search) {\n                listPaneNavController.popBackStack()\n            }\n\n            syncEnabledState()\n        }\n\n        override fun onPanelSlide(panel: View, slideOffset: Float) {\n            // noop\n        }\n\n        override fun onPanelOpened(panel: View) {\n            syncEnabledState()\n        }\n\n        override fun onPanelClosed(panel: View) {\n            syncEnabledState()\n        }\n\n        override fun onDestinationChanged(\n            controller: NavController,\n            destination: NavDestination,\n            arguments: Bundle?\n        ) {\n            syncEnabledState()\n        }\n\n        private fun syncEnabledState() {\n            val listDestination = listPaneNavController.currentDestination?.id\n            val detailDestination = detailPaneNavController.currentDestination?.id\n            isEnabled = listDestination == R.id.navigation_schedule_search ||\n                detailDestination == R.id.navigation_speaker_detail ||\n                (binding.slidingPaneLayout.isSlideable && binding.slidingPaneLayout.isOpen)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleTwoPaneViewModel.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport androidx.lifecycle.ViewModel\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport javax.inject.Inject\n\n// Note: clients should obtain this from the Activity.\n@HiltViewModel\nclass ScheduleTwoPaneViewModel @Inject constructor(\n    onSessionStarClickDelegate: OnSessionStarClickDelegate\n) : ViewModel(),\n    OnSessionClickListener,\n    OnSessionStarClickDelegate by onSessionStarClickDelegate {\n\n    private val _isTwoPane = MutableStateFlow(false)\n    val isTwoPane: StateFlow<Boolean> = _isTwoPane\n\n    private val _returnToListPaneEvents = Channel<Unit>(capacity = Channel.CONFLATED)\n    val returnToListPaneEvents = _returnToListPaneEvents.receiveAsFlow()\n\n    private val _selectSessionEvents = Channel<SessionId>(capacity = Channel.CONFLATED)\n    val selectSessionEvents = _selectSessionEvents.receiveAsFlow()\n\n    fun setIsTwoPane(isTwoPane: Boolean) {\n        _isTwoPane.value = isTwoPane\n    }\n\n    fun returnToListPane() {\n        _returnToListPaneEvents.tryOffer(Unit)\n    }\n\n    override fun openEventDetail(id: SessionId) {\n        _selectSessionEvents.tryOffer(id)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleUiHintsDialogFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport android.app.Dialog\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.domain.prefs.MarkScheduleUiHintsShownUseCase\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n/**\n * Dialog that shows the hints for the schedule.\n */\n@AndroidEntryPoint\nclass ScheduleUiHintsDialogFragment : AppCompatDialogFragment() {\n\n    @Inject\n    lateinit var markScheduleUiHintsShownUseCase: MarkScheduleUiHintsShownUseCase\n\n    @Inject\n    @ApplicationScope\n    lateinit var applicationScope: CoroutineScope\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.schedule_hint_title)\n            .setView(R.layout.dialog_schedule_hints)\n            .setPositiveButton(R.string.got_it, null)\n            .create()\n    }\n\n    override fun onDismiss(dialog: DialogInterface) {\n        applicationScope.launch {\n            markScheduleUiHintsShownUseCase(Unit)\n        }\n        super.onDismiss(dialog)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.domain.RefreshConferenceDataUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.ScheduleUiHintsShownUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.ConferenceDayIndexer\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsParameters\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsResult\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.ObserveConferenceDataUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.fcm.TopicSubscriber\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Error\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessage\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.ShowScheduleUiHints\nimport com.google.samples.apps.iosched.ui.sessioncommon.stringRes\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.BufferOverflow.DROP_LATEST\nimport kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.SharingStarted.Companion.Lazily\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.combineTransform\nimport kotlinx.coroutines.flow.emitAll\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.mapLatest\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport org.threeten.bp.ZoneId\nimport javax.inject.Inject\n\n/**\n * Loads data and exposes it to the view.\n * By annotating the constructor with [@Inject], Dagger will use that constructor when needing to\n * create the object, so defining a [@Provides] method for this class won't be needed.\n */\n@HiltViewModel\nclass ScheduleViewModel @Inject constructor(\n    private val loadScheduleUserSessionsUseCase: LoadScheduleUserSessionsUseCase,\n    signInViewModelDelegate: SignInViewModelDelegate,\n    scheduleUiHintsShownUseCase: ScheduleUiHintsShownUseCase,\n    topicSubscriber: TopicSubscriber,\n    private val snackbarMessageManager: SnackbarMessageManager,\n    getTimeZoneUseCase: GetTimeZoneUseCase,\n    private val refreshConferenceDataUseCase: RefreshConferenceDataUseCase,\n    observeConferenceDataUseCase: ObserveConferenceDataUseCase\n) : ViewModel(),\n    SignInViewModelDelegate by signInViewModelDelegate {\n\n    // Exposed to the view as a StateFlow but it's a one-shot operation.\n    val timeZoneId = flow<ZoneId> {\n        if (getTimeZoneUseCase(Unit).successOr(true)) {\n            emit(TimeUtils.CONFERENCE_TIMEZONE)\n        } else {\n            emit(ZoneId.systemDefault())\n        }\n    }.stateIn(viewModelScope, Lazily, TimeUtils.CONFERENCE_TIMEZONE)\n\n    val isConferenceTimeZone: StateFlow<Boolean> = timeZoneId.mapLatest { zoneId ->\n        TimeUtils.isConferenceTimeZone(zoneId)\n    }.stateIn(viewModelScope, Lazily, true)\n\n    private lateinit var dayIndexer: ConferenceDayIndexer\n\n    // Used to re-run flows on command\n    private val refreshSignal = MutableSharedFlow<Unit>()\n    // Used to run flows on init and also on command\n    private val loadDataSignal: Flow<Unit> = flow {\n        emit(Unit)\n        emitAll(refreshSignal)\n    }\n\n    // Event coming from repository indicating data should be refreshed\n    init {\n        viewModelScope.launch {\n            observeConferenceDataUseCase(Unit).collect {\n                refreshUserSessions()\n            }\n        }\n    }\n\n    // Latest user ID\n    private val currentUserId = userId.stateIn(viewModelScope, WhileViewSubscribed, null)\n\n    // Refresh sessions when needed and when the user changes\n    private val loadSessionsResult: StateFlow<Result<LoadScheduleUserSessionsResult>> =\n        loadDataSignal.combineTransform(currentUserId) { _, userId ->\n            emitAll(\n                loadScheduleUserSessionsUseCase(\n                    LoadScheduleUserSessionsParameters(userId)\n                )\n            )\n        }\n            .onEach {\n                // Side effect: show error messages coming from LoadScheduleUserSessionsUseCase\n                if (it is Error) {\n                    _errorMessage.tryOffer(it.exception.message ?: \"Error\")\n                }\n                // Side effect: show snackbar if the result contains a message\n                if (it is Success) {\n                    it.data.userMessage?.type?.stringRes()?.let { messageId ->\n                        // There is a message to display:\n                        snackbarMessageManager.addMessage(\n                            SnackbarMessage(\n                                messageId = messageId,\n                                longDuration = true,\n                                session = it.data.userMessageSession,\n                                requestChangeId = it.data.userMessage?.changeRequestId\n                            )\n                        )\n                    }\n                }\n            }\n            .stateIn(viewModelScope, WhileViewSubscribed, Result.Loading)\n\n    val isLoading: StateFlow<Boolean> = loadSessionsResult.mapLatest {\n        it == Result.Loading\n    }.stateIn(viewModelScope, WhileViewSubscribed, true)\n\n    // Expose new UI data when loadSessionsResult changes\n    val scheduleUiData: StateFlow<ScheduleUiData> =\n        loadSessionsResult.combineTransform(timeZoneId) { sessions, timeZone ->\n            sessions.data?.let { data ->\n                dayIndexer = data.dayIndexer\n                emit(\n                    ScheduleUiData(\n                        list = data.userSessions,\n                        dayIndexer = data.dayIndexer,\n                        timeZoneId = timeZone\n                    )\n                )\n            }\n        }.stateIn(viewModelScope, WhileViewSubscribed, ScheduleUiData())\n\n    private val _swipeRefreshing = MutableStateFlow(false)\n    val swipeRefreshing: StateFlow<Boolean> = _swipeRefreshing\n\n    /** Flows for Actions and Events **/\n\n    // SIDE EFFECTS: Error messages\n    // Guard against too many error messages by limiting to 3, keeping the oldest.\n    private val _errorMessage = Channel<String>(1, DROP_LATEST)\n    val errorMessage: Flow<String> =\n        _errorMessage.receiveAsFlow().shareIn(viewModelScope, WhileViewSubscribed)\n\n    // SIDE EFFECTS: Navigation actions\n    private val _navigationActions = Channel<ScheduleNavigationAction>(capacity = Channel.CONFLATED)\n    // Exposed with receiveAsFlow to make sure that only one observer receives updates.\n    val navigationActions = _navigationActions.receiveAsFlow()\n\n    /** Show hints for the schedule if they haven't been shown yet */\n    init {\n        viewModelScope.launch {\n            scheduleUiHintsShownUseCase(Unit).successOr(false).let { scheduleHintsShown ->\n                if (!scheduleHintsShown) {\n                    _navigationActions.tryOffer(ShowScheduleUiHints)\n                }\n            }\n        }\n    }\n\n    // Flags used to indicate if the \"scroll to now\" feature has been used already.\n    var userHasInteracted = false\n\n    // Flow describing which item to scroll to automatically.\n    // Using a MutableSharedFlow so a new value can be emitted from a user event and so\n    // the values are not replayed.\n    private val currentEventIndex = MutableSharedFlow<Int>(\n        extraBufferCapacity = 1,\n        onBufferOverflow = DROP_OLDEST\n    )\n    val scrollToEvent: SharedFlow<ScheduleScrollEvent> =\n        loadSessionsResult.combineTransform(currentEventIndex) { result, currentEventIndex ->\n            if (userHasInteracted) {\n                // Setting smoothScroll to false as it's an unnecessary delay.\n                emit(ScheduleScrollEvent(currentEventIndex, smoothScroll = false))\n            } else {\n                val index = result.data?.firstUnfinishedSessionIndex ?: return@combineTransform\n                if (index != -1) {\n                    // User hasn't interacted yet and conference is happening\n                    emit(ScheduleScrollEvent(index))\n                } else {\n                    // User hasn't interacted but conference not in progress, scroll to first event\n                    emit(ScheduleScrollEvent(currentEventIndex))\n                }\n            }\n        }.shareIn(viewModelScope, WhileViewSubscribed, replay = 0) // Don't replay on rotation\n\n    init {\n        // Subscribe user to schedule updates\n        topicSubscriber.subscribeToScheduleUpdates()\n    }\n\n    fun onSwipeRefresh() {\n        viewModelScope.launch {\n            // Ask repository to fetch new data\n            _swipeRefreshing.emit(true)\n            refreshConferenceDataUseCase(Any())\n            _swipeRefreshing.emit(false)\n        }\n    }\n\n    private fun refreshUserSessions() {\n        refreshSignal.tryEmit(Unit)\n    }\n\n    fun scrollToStartOfDay(day: ConferenceDay) {\n        currentEventIndex.tryEmit(dayIndexer.positionForDay(day))\n    }\n}\n\ndata class ScheduleUiData(\n    val list: List<UserSession>? = null,\n    val timeZoneId: ZoneId? = null,\n    val dayIndexer: ConferenceDayIndexer? = null\n)\n\ndata class ScheduleScrollEvent(val targetPosition: Int, val smoothScroll: Boolean = false)\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/SessionHeaderIndexer.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\nimport org.threeten.bp.temporal.ChronoUnit\n\n/**\n * Find the first session at each start time (rounded down to nearest minute) and return pairs of\n * index to start time. Assumes that [sessions] are sorted by ascending start time.\n */\n\nfun indexSessionHeaders(sessions: List<Session>, zoneId: ZoneId): List<Pair<Int, ZonedDateTime>> {\n    return sessions\n        .mapIndexed { index, session ->\n            index to TimeUtils.zonedTime(session.startTime, zoneId)\n        }\n        .distinctBy { it.second.truncatedTo(ChronoUnit.MINUTES) }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/search/SearchFilterFragment.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.search\n\nimport androidx.fragment.app.viewModels\nimport com.google.samples.apps.iosched.ui.filters.FiltersFragment\nimport com.google.samples.apps.iosched.ui.filters.FiltersViewModelDelegate\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass SearchFilterFragment : FiltersFragment() {\n\n    private val viewModel: SearchViewModel by viewModels(\n        ownerProducer = { requireParentFragment() }\n    )\n    override fun resolveViewModelDelegate(): FiltersViewModelDelegate {\n        return viewModel\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/search/SearchFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.search\n\nimport android.os.Bundle\nimport android.view.ContextThemeWrapper\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.SearchView\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.doOnNextLayout\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentSearchBinding\nimport com.google.samples.apps.iosched.databinding.SearchActiveFiltersNarrowBinding\nimport com.google.samples.apps.iosched.databinding.SearchActiveFiltersWideBinding\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneViewModel\nimport com.google.samples.apps.iosched.ui.sessioncommon.SessionsAdapter\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.util.setContentMaxWidth\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport javax.inject.Inject\nimport javax.inject.Named\n\n@AndroidEntryPoint\nclass SearchFragment : Fragment() {\n\n    @Inject\n    lateinit var analyticsHelper: AnalyticsHelper\n\n    @Inject\n    @Named(\"tagViewPool\")\n    lateinit var tagViewPool: RecycledViewPool\n\n    private lateinit var binding: FragmentSearchBinding\n\n    private val viewModel: SearchViewModel by viewModels()\n    private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels()\n\n    private lateinit var sessionsAdapter: SessionsAdapter\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        val themedInflater =\n            inflater.cloneInContext(ContextThemeWrapper(requireActivity(), R.style.AppTheme_Detail))\n        binding = FragmentSearchBinding.inflate(themedInflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n        }\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        binding.viewModel = viewModel\n\n        binding.toolbar.apply {\n            inflateMenu(R.menu.search_menu)\n            setOnMenuItemClickListener {\n                if (it.itemId == R.id.action_open_filters) {\n                    findFiltersFragment().showFiltersSheet()\n                    true\n                } else {\n                    false\n                }\n            }\n        }\n\n        binding.searchView.apply {\n            setOnQueryTextListener(object : SearchView.OnQueryTextListener {\n                override fun onQueryTextSubmit(query: String): Boolean {\n                    dismissKeyboard(this@apply)\n                    return true\n                }\n\n                override fun onQueryTextChange(newText: String): Boolean {\n                    viewModel.onSearchQueryChanged(newText)\n                    return true\n                }\n            })\n\n            // Set focus on the SearchView and open the keyboard\n            setOnQueryTextFocusChangeListener { view, hasFocus ->\n                if (hasFocus) {\n                    showKeyboard(view.findFocus())\n                }\n            }\n            requestFocus()\n        }\n\n        sessionsAdapter = SessionsAdapter(\n            tagViewPool,\n            viewModel.showReservations,\n            viewModel.timeZoneId,\n            viewLifecycleOwner,\n            scheduleTwoPaneViewModel, // OnSessionClickListener\n            scheduleTwoPaneViewModel // OnSessionStarClickListener\n        )\n        binding.recyclerView.apply {\n            adapter = sessionsAdapter\n            doOnApplyWindowInsets { v, insets, padding ->\n                val systemInsets = insets.getInsets(\n                    WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n                )\n                v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n            }\n            doOnNextLayout {\n                setContentMaxWidth(this)\n            }\n        }\n\n        launchAndRepeatWithViewLifecycle {\n            viewModel.searchResults.collect {\n                sessionsAdapter.submitList(it)\n            }\n        }\n\n        /* The active filters on Search can appear in one of two places:\n         *   - In the toolbar next to the search field (on wide screens)\n         *   - In the app bar below the toolbar (on narrow screens)\n         *\n         * Normally this could be handled by a resource with a width qualifier, e.g. layout-w720dp.\n         * However, Search can appear in the list pane of a two pane layout. When both panes are\n         * visible, a resource qualifier like the above will give us the \"wide\" state (based on the\n         * device width) when we actually want the \"narrow\" state (based on the list pane width).\n         * Instead we check the toolbar width after first layout and inflate one of two ViewStubs.\n         */\n        binding.toolbar.doOnNextLayout { toolbar ->\n            val threshold =\n                resources.getDimensionPixelSize(R.dimen.active_filters_in_toolbar_threshold)\n            if (toolbar.width >= threshold) {\n                binding.activeFiltersWideStub.viewStub?.apply {\n                    setOnInflateListener { _, inflated ->\n                        SearchActiveFiltersWideBinding.bind(inflated).apply {\n                            viewModel = this@SearchFragment.viewModel\n                            lifecycleOwner = viewLifecycleOwner\n                        }\n                    }\n                    inflate()\n                }\n            } else {\n                binding.activeFiltersNarrowStub.viewStub?.apply {\n                    setOnInflateListener { _, inflated ->\n                        SearchActiveFiltersNarrowBinding.bind(inflated).apply {\n                            viewModel = this@SearchFragment.viewModel\n                            lifecycleOwner = viewLifecycleOwner\n                        }\n                    }\n                    inflate()\n                }\n            }\n        }\n\n        if (savedInstanceState == null) {\n            // On first entry, show the filters.\n            findFiltersFragment().showFiltersSheet()\n        }\n        analyticsHelper.sendScreenView(\"Search\", requireActivity())\n    }\n\n    override fun onPause() {\n        dismissKeyboard(binding.searchView)\n        super.onPause()\n    }\n\n    private fun showKeyboard(view: View) {\n        ViewCompat.getWindowInsetsController(view)?.show(WindowInsetsCompat.Type.ime())\n    }\n\n    private fun dismissKeyboard(view: View) {\n        ViewCompat.getWindowInsetsController(view)?.hide(WindowInsetsCompat.Type.ime())\n    }\n\n    private fun findFiltersFragment(): SearchFilterFragment {\n        return childFragmentManager.findFragmentById(R.id.filter_sheet) as SearchFilterFragment\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/search/SearchViewModel.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.search\n\nimport androidx.core.os.trace\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.domain.search.LoadSearchFiltersUseCase\nimport com.google.samples.apps.iosched.shared.domain.search.SessionSearchUseCase\nimport com.google.samples.apps.iosched.shared.domain.search.SessionSearchUseCaseParams\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.filters.FiltersViewModelDelegate\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport org.threeten.bp.ZoneId\nimport javax.inject.Inject\n\n@HiltViewModel\nclass SearchViewModel @Inject constructor(\n    private val analyticsHelper: AnalyticsHelper,\n    private val searchUseCase: SessionSearchUseCase,\n    getTimeZoneUseCase: GetTimeZoneUseCase,\n    loadFiltersUseCase: LoadSearchFiltersUseCase,\n    signInViewModelDelegate: SignInViewModelDelegate,\n    filtersViewModelDelegate: FiltersViewModelDelegate\n) : ViewModel(),\n    SignInViewModelDelegate by signInViewModelDelegate,\n    FiltersViewModelDelegate by filtersViewModelDelegate {\n\n    private val _searchResults = MutableStateFlow<List<UserSession>>(emptyList())\n    val searchResults: StateFlow<List<UserSession>> = _searchResults\n\n    private val _isEmpty = MutableStateFlow(true)\n    val isEmpty: StateFlow<Boolean> = _isEmpty\n\n    private var searchJob: Job? = null\n\n    val timeZoneId: StateFlow<ZoneId> = flow {\n        if (getTimeZoneUseCase(Unit).successOr(true)) {\n            emit(TimeUtils.CONFERENCE_TIMEZONE)\n        } else {\n            emit(ZoneId.systemDefault())\n        }\n    }.stateIn(viewModelScope, SharingStarted.Lazily, ZoneId.systemDefault())\n\n    private var textQuery = \"\"\n\n    // Override because we also want to show result count when there's a text query.\n    private val _showResultCount = MutableStateFlow(false)\n    override val showResultCount: StateFlow<Boolean> = _showResultCount\n\n    init {\n        // Load filters\n        viewModelScope.launch {\n            setSupportedFilters(loadFiltersUseCase(Unit).successOr(emptyList()))\n        }\n\n        // Re-execute search when selected filters change\n        viewModelScope.launch {\n            selectedFilters.collect {\n                executeSearch()\n            }\n        }\n\n        // Re-execute search when signed in user changes.\n        // Required because we show star / reservation status.\n        viewModelScope.launch {\n            userInfo.collect {\n                executeSearch()\n            }\n        }\n    }\n\n    fun onSearchQueryChanged(query: String) {\n        val newQuery = query.trim().takeIf { it.length >= 2 } ?: \"\"\n        if (textQuery != newQuery) {\n            textQuery = newQuery\n            analyticsHelper.logUiEvent(\"Query: $newQuery\", AnalyticsActions.SEARCH_QUERY_SUBMIT)\n            executeSearch()\n        }\n    }\n\n    private fun executeSearch() {\n        // Cancel any in-flight searches\n        searchJob?.cancel()\n\n        val filters = selectedFilters.value\n        if (textQuery.isEmpty() && filters.isEmpty()) {\n            clearSearchResults()\n            return\n        }\n\n        searchJob = viewModelScope.launch {\n            // The user could be typing or toggling filters rapidly. Giving the search job\n            // a slight delay and cancelling it on each call to this method effectively debounces.\n            delay(500)\n            trace(\"search-path-viewmodel\") {\n                searchUseCase(\n                    SessionSearchUseCaseParams(userIdValue, textQuery, filters)\n                ).collect {\n                    processSearchResult(it)\n                }\n            }\n        }\n    }\n\n    private fun clearSearchResults() {\n        _searchResults.value = emptyList()\n        // Explicitly set false to not show the \"No results\" state\n        _isEmpty.value = false\n        _showResultCount.value = false\n        resultCount.value = 0\n    }\n\n    private fun processSearchResult(searchResult: Result<List<UserSession>>) {\n        if (searchResult is Loading) {\n            return // avoids UI flickering\n        }\n        val sessions = searchResult.successOr(emptyList())\n        _searchResults.value = sessions\n        _isEmpty.value = sessions.isEmpty()\n        _showResultCount.value = true\n        resultCount.value = sessions.size\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/EventActions.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\n\n/**\n * Actions that can be performed on events.\n */\ninterface OnSessionClickListener {\n    fun openEventDetail(id: SessionId)\n}\n\ninterface OnSessionStarClickListener {\n    fun onStarClicked(userSession: UserSession)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegate.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport com.google.samples.apps.iosched.shared.domain.users.StarEventAndNotifyUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.StarEventParameter\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessage\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport java.util.UUID\nimport javax.inject.Inject\n\n/**\n * A delegate providing common functionality for starring events.\n */\n\ninterface OnSessionStarClickDelegate : OnSessionStarClickListener {\n    val navigateToSignInDialogEvents: Flow<Unit>\n}\n\nclass DefaultOnSessionStarClickDelegate @Inject constructor(\n    signInViewModelDelegate: SignInViewModelDelegate,\n    private val starEventUseCase: StarEventAndNotifyUseCase,\n    private val snackbarMessageManager: SnackbarMessageManager,\n    private val analyticsHelper: AnalyticsHelper,\n    @ApplicationScope private val externalScope: CoroutineScope,\n    @MainDispatcher private val mainDispatcher: CoroutineDispatcher\n) : OnSessionStarClickDelegate, SignInViewModelDelegate by signInViewModelDelegate {\n\n    private val _navigateToSignInDialogEvents = Channel<Unit>(capacity = Channel.CONFLATED)\n    override val navigateToSignInDialogEvents = _navigateToSignInDialogEvents.receiveAsFlow()\n\n    override fun onStarClicked(userSession: UserSession) {\n        if (!isUserSignedInValue) {\n            Timber.d(\"Showing Sign-in dialog after star click\")\n            _navigateToSignInDialogEvents.tryOffer(Unit)\n            return\n        }\n        val newIsStarredState = !userSession.userEvent.isStarred\n\n        // Update the snackbar message optimistically.\n        val stringResId = if (newIsStarredState) {\n            R.string.event_starred\n        } else {\n            R.string.event_unstarred\n        }\n        snackbarMessageManager.addMessage(\n            SnackbarMessage(\n                messageId = stringResId,\n                actionId = R.string.dont_show,\n                requestChangeId = UUID.randomUUID().toString()\n            )\n        )\n        if (newIsStarredState) {\n            analyticsHelper.logUiEvent(userSession.session.title, AnalyticsActions.STARRED)\n        }\n\n        externalScope.launch(mainDispatcher) {\n            userIdValue?.let {\n                val result = starEventUseCase(\n                    StarEventParameter(\n                        it,\n                        userSession.copy(\n                            userEvent = userSession.userEvent.copy(isStarred = newIsStarredState)\n                        )\n                    )\n                )\n                // Show an error message if a star request fails\n                if (result is Result.Error) {\n                    snackbarMessageManager.addMessage(SnackbarMessage(R.string.event_star_error))\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegateModule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport com.google.samples.apps.iosched.shared.domain.users.StarEventAndNotifyUseCase\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ViewModelComponent\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\n\n/**\n * Provides a default implementation of [OnSessionStarClickDelegate].\n */\n@InstallIn(ViewModelComponent::class)\n@Module\ninternal class OnSessionStarClickDelegateModule {\n\n    @Provides\n    fun provideOnSessionStarClickDelegate(\n        signInViewModelDelegate: SignInViewModelDelegate,\n        starEventUseCase: StarEventAndNotifyUseCase,\n        snackbarMessageManager: SnackbarMessageManager,\n        analyticsHelper: AnalyticsHelper,\n        @ApplicationScope applicationScope: CoroutineScope,\n        @MainDispatcher mainDispatcher: CoroutineDispatcher\n    ): OnSessionStarClickDelegate {\n        return DefaultOnSessionStarClickDelegate(\n            signInViewModelDelegate,\n            starEventUseCase,\n            snackbarMessageManager,\n            analyticsHelper,\n            applicationScope,\n            mainDispatcher\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/SessionCommonExtensions.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CANCELLATION_DENIED_CUTOFF\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CANCELLATION_DENIED_UNKNOWN\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CHANGES_IN_RESERVATIONS\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CHANGES_IN_WAITLIST\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATIONS_REPLACED\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_CANCELED\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_CLASH\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_CUTOFF\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_UNKNOWN\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.WAITLIST_CANCELED\n\nfun UserEventMessageChangeType.stringRes(): Int {\n    return when (this) {\n        CHANGES_IN_RESERVATIONS -> R.string.reservation_new\n        RESERVATIONS_REPLACED -> R.string.reservation_replaced\n        CHANGES_IN_WAITLIST -> R.string.waitlist_new\n        RESERVATION_CANCELED -> R.string.reservation_cancel_succeeded\n        WAITLIST_CANCELED -> R.string.waitlist_cancel_succeeded\n        RESERVATION_DENIED_CUTOFF -> R.string.reservation_denied_cutoff\n        RESERVATION_DENIED_CLASH -> R.string.reservation_denied_clash\n        RESERVATION_DENIED_UNKNOWN -> R.string.reservation_denied_unknown\n        CANCELLATION_DENIED_CUTOFF -> R.string.cancellation_denied_cutoff\n        CANCELLATION_DENIED_UNKNOWN -> R.string.cancellation_denied_unknown\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/SessionViewPoolModule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport androidx.recyclerview.widget.RecyclerView\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.FragmentComponent\nimport dagger.hilt.android.scopes.FragmentScoped\nimport javax.inject.Named\n\n/**\n * Provides [RecyclerView.RecycledViewPool]s to share views between [RecyclerView]s.\n * E.g. Between different days of the schedule.\n */\n@InstallIn(FragmentComponent::class)\n@Module\ninternal class SessionViewPoolModule {\n\n    @FragmentScoped\n    @Provides\n    @Named(\"sessionViewPool\")\n    fun providesSessionViewPool(): RecyclerView.RecycledViewPool = RecyclerView.RecycledViewPool()\n\n    @FragmentScoped\n    @Provides\n    @Named(\"tagViewPool\")\n    fun providesTagViewPool(): RecyclerView.RecycledViewPool = RecyclerView.RecycledViewPool()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/SessionsAdapter.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.android.flexbox.FlexboxLayoutManager\nimport com.google.samples.apps.iosched.databinding.ItemSessionBinding\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport kotlinx.coroutines.flow.StateFlow\nimport org.threeten.bp.ZoneId\n\nclass SessionsAdapter(\n    private val tagViewPool: RecycledViewPool,\n    private val showReservations: StateFlow<Boolean>,\n    private val timeZoneId: StateFlow<ZoneId>,\n    private val lifecycleOwner: LifecycleOwner,\n    private val onSessionClickListener: OnSessionClickListener,\n    private val onSessionStarClickListener: OnSessionStarClickListener\n) : ListAdapter<UserSession, SessionViewHolder>(SessionDiff) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SessionViewHolder {\n        val binding = ItemSessionBinding.inflate(\n            LayoutInflater.from(parent.context), parent, false\n        ).apply {\n            tags.apply {\n                setRecycledViewPool(tagViewPool)\n                layoutManager = FlexboxLayoutManager(parent.context).apply {\n                    recycleChildrenOnDetach = true\n                }\n            }\n            showReservations = this@SessionsAdapter.showReservations\n            timeZoneId = this@SessionsAdapter.timeZoneId\n            showTime = false\n            lifecycleOwner = this@SessionsAdapter.lifecycleOwner\n            sessionClickListener = onSessionClickListener\n            sessionStarClickListener = onSessionStarClickListener\n        }\n        return SessionViewHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: SessionViewHolder, position: Int) {\n        holder.binding.userSession = getItem(position)\n        holder.binding.executePendingBindings()\n    }\n}\n\nclass SessionViewHolder(\n    internal val binding: ItemSessionBinding\n) : ViewHolder(binding.root)\n\nobject SessionDiff : DiffUtil.ItemCallback<UserSession>() {\n    override fun areItemsTheSame(oldItem: UserSession, newItem: UserSession): Boolean {\n        // We don't have to compare the userEvent id because it matches the session id.\n        return oldItem.session.id == newItem.session.id\n    }\n\n    override fun areContentsTheSame(oldItem: UserSession, newItem: UserSession): Boolean {\n        return oldItem == newItem\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/TagAdapter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder\nimport com.google.samples.apps.iosched.databinding.ItemInlineTagBinding\nimport com.google.samples.apps.iosched.model.Tag\n\nclass TagAdapter : RecyclerView.Adapter<TagViewHolder>() {\n\n    var tags = emptyList<Tag>()\n\n    override fun getItemCount() = tags.size\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TagViewHolder {\n        return TagViewHolder(\n            ItemInlineTagBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        )\n    }\n\n    override fun onBindViewHolder(holder: TagViewHolder, position: Int) {\n        holder.bind(tags[position])\n    }\n}\n\nclass TagViewHolder(private val binding: ItemInlineTagBinding) : ViewHolder(binding.root) {\n    fun bind(tag: Tag) {\n        binding.tag = tag\n        binding.executePendingBindings()\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessioncommon/TagBindingAdapters.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport android.content.Context\nimport android.graphics.Color.TRANSPARENT\nimport android.graphics.drawable.GradientDrawable\nimport android.widget.TextView\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.isGone\nimport androidx.core.view.isVisible\nimport androidx.databinding.BindingAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Tag\n\n@BindingAdapter(\"topicTags\")\nfun topicTags(recyclerView: RecyclerView, topicTags: List<Tag>?) {\n    if (topicTags?.isNotEmpty() == true) {\n        recyclerView.isVisible = true\n        recyclerView.adapter = (recyclerView.adapter as? TagAdapter ?: TagAdapter())\n            .apply {\n                tags = topicTags\n            }\n    } else {\n        recyclerView.isGone = true\n    }\n}\n\n@BindingAdapter(\"tagTint\")\nfun tagTint(textView: TextView, color: Int) {\n    // Tint the colored dot\n    (textView.compoundDrawablesRelative[0] as? GradientDrawable)?.setColor(\n        tagTintOrDefault(\n            color,\n            textView.context\n        )\n    )\n}\n\nfun tagTintOrDefault(color: Int, context: Context): Int {\n    return if (color != TRANSPARENT) {\n        color\n    } else {\n        ContextCompat.getColor(context, R.color.default_tag_color)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailAdapter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport android.annotation.SuppressLint\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.AsyncListDiffer\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemGenericSectionHeaderBinding\nimport com.google.samples.apps.iosched.databinding.ItemSessionBinding\nimport com.google.samples.apps.iosched.databinding.ItemSessionInfoBinding\nimport com.google.samples.apps.iosched.databinding.ItemSpeakerBinding\nimport com.google.samples.apps.iosched.model.Speaker\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.ui.SectionHeader\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder.HeaderViewHolder\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder.RelatedViewHolder\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder.SessionInfoViewHolder\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewHolder.SpeakerViewHolder\nimport com.google.samples.apps.iosched.util.executeAfter\n\n/**\n * [RecyclerView.Adapter] for presenting a session details, composed of information about the\n * session, any speakers plus any related events.\n */\nclass SessionDetailAdapter(\n    private val lifecycleOwner: LifecycleOwner,\n    private val sessionDetailViewModel: SessionDetailViewModel,\n    private val onSessionClickListener: OnSessionClickListener,\n    private val tagRecycledViewPool: RecycledViewPool\n) : RecyclerView.Adapter<SessionDetailViewHolder>() {\n\n    private val differ = AsyncListDiffer<Any>(this, DiffCallback)\n\n    var speakers: List<Speaker> = emptyList()\n        set(value) {\n            field = value\n            differ.submitList(buildMergedList(sessionSpeakers = value))\n        }\n\n    var related: List<UserSession> = emptyList()\n        set(value) {\n            field = value\n            differ.submitList(buildMergedList(relatedSessions = value))\n        }\n\n    init {\n        differ.submitList(buildMergedList())\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SessionDetailViewHolder {\n        val inflater = LayoutInflater.from(parent.context)\n        return when (viewType) {\n            R.layout.item_session_info -> SessionInfoViewHolder(\n                ItemSessionInfoBinding.inflate(inflater, parent, false)\n            )\n            R.layout.item_speaker -> SpeakerViewHolder(\n                ItemSpeakerBinding.inflate(inflater, parent, false)\n            )\n            R.layout.item_session -> RelatedViewHolder(\n                ItemSessionBinding.inflate(inflater, parent, false).apply {\n                    tags.setRecycledViewPool(tagRecycledViewPool)\n                }\n            )\n            R.layout.item_generic_section_header -> HeaderViewHolder(\n                ItemGenericSectionHeaderBinding.inflate(inflater, parent, false)\n            )\n            else -> throw IllegalStateException(\"Unknown viewType $viewType\")\n        }\n    }\n\n    override fun onBindViewHolder(holder: SessionDetailViewHolder, position: Int) {\n        when (holder) {\n            is SessionInfoViewHolder -> holder.binding.executeAfter {\n                viewModel = sessionDetailViewModel\n                tagViewPool = tagRecycledViewPool\n                lifecycleOwner = this@SessionDetailAdapter.lifecycleOwner\n            }\n            is SpeakerViewHolder -> holder.binding.executeAfter {\n                val presenter = differ.currentList[position] as Speaker\n                speaker = presenter\n                eventListener = sessionDetailViewModel\n                lifecycleOwner = this@SessionDetailAdapter.lifecycleOwner\n                root.setTag(R.id.tag_speaker_id, presenter.id) // Used to identify clicked view\n            }\n            is RelatedViewHolder -> holder.binding.executeAfter {\n                userSession = differ.currentList[position] as UserSession\n                sessionClickListener = onSessionClickListener\n                sessionStarClickListener = sessionDetailViewModel\n                timeZoneId = sessionDetailViewModel.timeZoneId\n                showTime = true\n                lifecycleOwner = this@SessionDetailAdapter.lifecycleOwner\n            }\n            is HeaderViewHolder -> holder.binding.executeAfter {\n                sectionHeader = differ.currentList[position] as SectionHeader\n            }\n        }\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return when (differ.currentList[position]) {\n            is SessionItem -> R.layout.item_session_info\n            is Speaker -> R.layout.item_speaker\n            is UserSession -> R.layout.item_session\n            is SectionHeader -> R.layout.item_generic_section_header\n            else -> throw IllegalStateException(\"Unknown view type at position $position\")\n        }\n    }\n\n    override fun getItemCount() = differ.currentList.size\n\n    /**\n     * This adapter displays heterogeneous data types but `RecyclerView` & `AsyncListDiffer` deal in\n     * a single list of items. We therefore combine them into a merged list, using marker objects\n     * for static items. We still hold separate lists of [speakers] and [related] sessions so that\n     * we can provide them individually, as they're loaded.\n     */\n    private fun buildMergedList(\n        sessionSpeakers: List<Speaker> = speakers,\n        relatedSessions: List<UserSession> = related\n    ): List<Any> {\n        val merged = mutableListOf<Any>(SessionItem)\n        if (sessionSpeakers.isNotEmpty()) {\n            merged += SectionHeader(R.string.session_detail_speakers_header)\n            merged.addAll(sessionSpeakers)\n        }\n        if (relatedSessions.isNotEmpty()) {\n            merged += SectionHeader(R.string.session_detail_related_header)\n            merged.addAll(relatedSessions)\n        }\n        return merged\n    }\n}\n\n// Marker object for use in our merged representation.\n\nobject SessionItem\n\n/**\n * Diff items presented by this adapter.\n */\nobject DiffCallback : DiffUtil.ItemCallback<Any>() {\n\n    override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean {\n        return when {\n            oldItem === SessionItem && newItem === SessionItem -> true\n            oldItem is SectionHeader && newItem is SectionHeader -> oldItem == newItem\n            oldItem is Speaker && newItem is Speaker -> oldItem.id == newItem.id\n            oldItem is UserSession && newItem is UserSession ->\n                oldItem.session.id == newItem.session.id\n            else -> false\n        }\n    }\n\n    @SuppressLint(\"DiffUtilEquals\")\n    // Workaround of https://issuetracker.google.com/issues/122928037\n    override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean {\n        return when {\n            oldItem is Speaker && newItem is Speaker -> oldItem == newItem\n            oldItem is UserSession && newItem is UserSession -> oldItem == newItem\n            else -> true\n        }\n    }\n}\n\n/**\n * [RecyclerView.ViewHolder] types used by this adapter.\n */\nsealed class SessionDetailViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {\n\n    class SessionInfoViewHolder(\n        val binding: ItemSessionInfoBinding\n    ) : SessionDetailViewHolder(binding.root)\n\n    class SpeakerViewHolder(\n        val binding: ItemSpeakerBinding\n    ) : SessionDetailViewHolder(binding.root)\n\n    class RelatedViewHolder(\n        val binding: ItemSessionBinding\n    ) : SessionDetailViewHolder(binding.root)\n\n    class HeaderViewHolder(\n        val binding: ItemGenericSectionHeaderBinding\n    ) : SessionDetailViewHolder(binding.root)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailDataBindingAdapters.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionType.AFTER_DARK\nimport com.google.samples.apps.iosched.model.SessionType.APP_REVIEW\nimport com.google.samples.apps.iosched.model.SessionType.GAME_REVIEW\nimport com.google.samples.apps.iosched.model.SessionType.KEYNOTE\nimport com.google.samples.apps.iosched.model.SessionType.OFFICE_HOURS\nimport com.google.samples.apps.iosched.model.SessionType.SESSION\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.reservation.ReservationViewState\nimport com.google.samples.apps.iosched.ui.reservation.ReservationViewState.RESERVABLE\nimport com.google.samples.apps.iosched.ui.reservation.StarReserveFab\nimport org.threeten.bp.Duration\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\n\n/* Narrow headers used for events that have neither a photo nor video url. */\n@BindingAdapter(\"eventNarrowHeader\")\nfun eventNarrowHeaderImage(imageView: ImageView, session: Session?) {\n    session ?: return\n\n    val resId = when (session.type) {\n        KEYNOTE -> R.drawable.event_narrow_keynote\n        // For the next few types, we choose a random image, but we should use the same image for a\n        // given event, so use the id to pick.\n        SESSION -> when (session.id.hashCode() % 4) {\n            0 -> R.drawable.event_narrow_session1\n            1 -> R.drawable.event_narrow_session2\n            2 -> R.drawable.event_narrow_session3\n            else -> R.drawable.event_narrow_session4\n        }\n        OFFICE_HOURS -> when (session.id.hashCode() % 3) {\n            0 -> R.drawable.event_narrow_office_hours1\n            1 -> R.drawable.event_narrow_office_hours2\n            else -> R.drawable.event_narrow_office_hours3\n        }\n        APP_REVIEW -> when (session.id.hashCode() % 3) {\n            0 -> R.drawable.event_narrow_app_reviews1\n            1 -> R.drawable.event_narrow_app_reviews2\n            else -> R.drawable.event_narrow_app_reviews3\n        }\n        GAME_REVIEW -> when (session.id.hashCode() % 3) {\n            0 -> R.drawable.event_narrow_game_reviews1\n            1 -> R.drawable.event_narrow_game_reviews2\n            else -> R.drawable.event_narrow_game_reviews3\n        }\n        AFTER_DARK -> R.drawable.event_narrow_afterhours\n        else -> R.drawable.event_narrow_other\n    }\n    imageView.setImageResource(resId)\n}\n\n/* Photos are used if the event has a photo and/or a video url. */\n@BindingAdapter(\"eventPhoto\")\nfun eventPhoto(imageView: ImageView, session: Session?) {\n    session ?: return\n\n    val resId = when (session.type) {\n        KEYNOTE -> R.drawable.event_placeholder_keynote\n        // Choose a random image, but we should use the same image for a given session, so use ID to\n        // pick.\n        SESSION -> when (session.id.hashCode() % 4) {\n            0 -> R.drawable.event_placeholder_session1\n            1 -> R.drawable.event_placeholder_session2\n            2 -> R.drawable.event_placeholder_session3\n            else -> R.drawable.event_placeholder_session4\n        }\n        // Other event types probably won't have photos or video, but just in case...\n        else -> R.drawable.event_placeholder_keynote\n    }\n\n    if (session.hasPhoto) {\n        Glide.with(imageView)\n            .load(session.photoUrl)\n            .apply(RequestOptions().placeholder(resId))\n            .into(imageView)\n    } else {\n        imageView.setImageResource(resId)\n    }\n}\n\n@BindingAdapter(\n    value = [\"sessionDetailStartTime\", \"sessionDetailEndTime\", \"timeZoneId\"], requireAll = true\n)\nfun timeString(\n    view: TextView,\n    sessionDetailStartTime: ZonedDateTime?,\n    sessionDetailEndTime: ZonedDateTime?,\n    timeZoneId: ZoneId?\n) {\n    if (sessionDetailStartTime == null || sessionDetailEndTime == null || timeZoneId == null) {\n        view.text = \"\"\n    } else {\n        view.text = TimeUtils.timeString(\n            TimeUtils.zonedTime(sessionDetailStartTime, timeZoneId),\n            TimeUtils.zonedTime(sessionDetailEndTime, timeZoneId)\n        )\n    }\n}\n\n@BindingAdapter(\"sessionStartCountdown\")\nfun sessionStartCountdown(view: TextView, timeUntilStart: Duration?) {\n    if (timeUntilStart == null) {\n        view.visibility = GONE\n    } else {\n        view.visibility = VISIBLE\n        val minutes = timeUntilStart.toMinutes()\n        view.text = view.context.resources.getQuantityString(\n            R.plurals.session_starting_in, minutes.toInt(), minutes.toString()\n        )\n    }\n}\n\n@BindingAdapter(\n    \"userSession\",\n    \"isSignedIn\",\n    \"isRegistered\",\n    \"isReservable\",\n    \"isReservationDeniedByCutoff\",\n    \"eventListener\",\n    requireAll = true\n)\nfun assignFab(\n    fab: StarReserveFab,\n    userSession: UserSession?,\n    isSignedIn: Boolean,\n    isRegistered: Boolean,\n    isReservable: Boolean,\n    isReservationDeniedByCutoff: Boolean,\n    eventListener: SessionDetailEventListener\n) {\n    userSession ?: return\n    when {\n        !isSignedIn -> {\n            if (isReservable) {\n                fab.reservationStatus = RESERVABLE\n            } else {\n                fab.isChecked = false\n            }\n            fab.setOnClickListener { eventListener.onLoginClicked() }\n        }\n        isRegistered && isReservable -> {\n            fab.reservationStatus = ReservationViewState.fromUserEvent(\n                userSession.userEvent,\n                isReservationDeniedByCutoff\n            )\n            fab.setOnClickListener { eventListener.onReservationClicked() }\n        }\n        else -> {\n            fab.isChecked = userSession.userEvent.isStarred\n            fab.setOnClickListener { eventListener.onStarClicked(userSession) }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.provider.CalendarContract\nimport android.view.ContextThemeWrapper\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.core.app.ShareCompat\nimport androidx.core.net.toUri\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.doOnLayout\nimport androidx.core.view.doOnNextLayout\nimport androidx.core.view.forEach\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.navigation.fragment.FragmentNavigatorExtras\nimport androidx.navigation.fragment.findNavController\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport androidx.transition.TransitionInflater\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.R.style\nimport com.google.samples.apps.iosched.databinding.FragmentSessionDetailBinding\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SpeakerId\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.di.MapFeatureEnabledFlag\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestParameters\nimport com.google.samples.apps.iosched.shared.notifications.AlarmBroadcastReceiver\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.shared.util.toEpochMilli\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogFragment\nimport com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogFragment.Companion.DIALOG_REMOVE_RESERVATION\nimport com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogParameters\nimport com.google.samples.apps.iosched.ui.reservation.SwapReservationDialogFragment\nimport com.google.samples.apps.iosched.ui.reservation.SwapReservationDialogFragment.Companion.DIALOG_SWAP_RESERVATION\nimport com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneViewModel\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSessionFeedback\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSignInDialogAction\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSpeakerDetail\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSwapReservationDialogAction\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToYoutube\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.RemoveReservationDialogAction\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.ShowNotificationsPrefAction\nimport com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment\nimport com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment.Companion.DIALOG_NOTIFICATIONS_PREFERENCE\nimport com.google.samples.apps.iosched.ui.signin.SignInDialogFragment\nimport com.google.samples.apps.iosched.ui.signin.SignInDialogFragment.Companion.DIALOG_SIGN_IN\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.util.openWebsiteUrl\nimport com.google.samples.apps.iosched.util.setContentMaxWidth\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport javax.inject.Named\n\n@AndroidEntryPoint\nclass SessionDetailFragment : Fragment(), SessionFeedbackFragment.Listener {\n\n    private var shareString = \"\"\n\n    @Inject\n    lateinit var snackbarMessageManager: SnackbarMessageManager\n\n    private val sessionDetailViewModel: SessionDetailViewModel by viewModels()\n    private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels()\n\n    @Inject\n    lateinit var analyticsHelper: AnalyticsHelper\n\n    @Inject\n    @Named(\"tagViewPool\")\n    lateinit var tagRecycledViewPool: RecycledViewPool\n\n    @Inject\n    @JvmField\n    @MapFeatureEnabledFlag\n    var isMapEnabled: Boolean = false\n\n    private var session: Session? = null\n\n    private lateinit var sessionTitle: String\n\n    private lateinit var binding: FragmentSessionDetailBinding\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        sharedElementReturnTransition = TransitionInflater.from(requireContext())\n            .inflateTransition(R.transition.speaker_shared_enter)\n        // Delay the enter transition until speaker image has loaded.\n        postponeEnterTransition(500L, TimeUnit.MILLISECONDS)\n\n        val themedInflater =\n            inflater.cloneInContext(ContextThemeWrapper(requireActivity(), style.AppTheme_Detail))\n        binding = FragmentSessionDetailBinding.inflate(themedInflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        binding.viewModel = sessionDetailViewModel\n        binding.lifecycleOwner = viewLifecycleOwner\n\n        binding.sessionDetailBottomAppBar.run {\n            inflateMenu(R.menu.session_detail_menu)\n            menu.findItem(R.id.menu_item_map)?.isVisible = isMapEnabled\n\n            setOnMenuItemClickListener { item ->\n                when (item.itemId) {\n                    R.id.menu_item_share -> {\n                        ShareCompat.IntentBuilder.from(requireActivity())\n                            .setType(\"text/plain\")\n                            .setText(shareString)\n                            .setChooserTitle(R.string.intent_chooser_session_detail)\n                            .startChooser()\n                    }\n                    R.id.menu_item_star -> {\n                        sessionDetailViewModel.userSession.value?.let(\n                            scheduleTwoPaneViewModel::onStarClicked\n                        )\n                    }\n                    R.id.menu_item_map -> {\n                        // TODO support opening Map\n                    }\n                    R.id.menu_item_ask_question -> {\n                        sessionDetailViewModel.session.value?.let { session ->\n                            openWebsiteUrl(requireContext(), session.doryLink)\n                        }\n                    }\n                    R.id.menu_item_calendar -> {\n                        sessionDetailViewModel.session.value?.let(::addToCalendar)\n                    }\n                }\n                true\n            }\n        }\n\n        val detailsAdapter = SessionDetailAdapter(\n            viewLifecycleOwner,\n            sessionDetailViewModel,\n            scheduleTwoPaneViewModel,\n            tagRecycledViewPool\n        )\n        binding.sessionDetailRecyclerView.run {\n            adapter = detailsAdapter\n            itemAnimator?.run {\n                addDuration = 120L\n                moveDuration = 120L\n                changeDuration = 120L\n                removeDuration = 100L\n            }\n            doOnApplyWindowInsets { view, insets, padding ->\n                val systemInsets = insets.getInsets(\n                    WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n                )\n                view.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n                // CollapsingToolbarLayout's default scrim visible trigger height is a bit large.\n                // Choose something smaller so that the content stays visible longer.\n                binding.collapsingToolbar.scrimVisibleHeightTrigger = systemInsets.top * 2\n            }\n            doOnNextLayout {\n                setContentMaxWidth(this)\n            }\n        }\n\n        launchAndRepeatWithViewLifecycle {\n            observeViewModel()\n        }\n    }\n\n    private fun CoroutineScope.observeViewModel() {\n        val menu = binding.sessionDetailBottomAppBar.menu\n        val starMenu = menu.findItem(R.id.menu_item_star)\n        launch {\n            sessionDetailViewModel.shouldShowStarInBottomNav.collect { showStar ->\n                starMenu.isVisible = showStar\n            }\n        }\n\n        launch {\n            sessionDetailViewModel.userEvent.collect { userEvent ->\n                userEvent?.let {\n                    if (it.isStarred) {\n                        starMenu.setIcon(R.drawable.ic_star)\n                    } else {\n                        starMenu.setIcon(R.drawable.ic_star_border)\n                    }\n                }\n            }\n        }\n\n        launch {\n            sessionDetailViewModel.session.collect {\n                if (it != null) {\n                    sessionTitle = it.title\n                    activity?.let { activity ->\n                        analyticsHelper.sendScreenView(\n                            \"Session Details: $sessionTitle\", activity\n                        )\n                    }\n                }\n            }\n        }\n\n        // Navigation\n        launch {\n            sessionDetailViewModel.navigationActions.collect { action ->\n                when (action) {\n                    is NavigateToSessionFeedback -> openFeedbackDialog(action.sessionId)\n                    NavigateToSignInDialogAction -> openSignInDialog(requireActivity())\n                    is NavigateToSpeakerDetail -> {\n                        val sharedElement = findSpeakerHeadshot(\n                            binding.sessionDetailRecyclerView,\n                            action.speakerId\n                        )\n                        findNavController().navigate(\n                            SessionDetailFragmentDirections.toSpeakerDetail(action.speakerId),\n                            FragmentNavigatorExtras(\n                                sharedElement to sharedElement.transitionName\n                            )\n                        )\n                    }\n                    is NavigateToSwapReservationDialogAction ->\n                        openSwapReservationDialog(requireActivity(), action.params)\n                    is NavigateToYoutube -> openYoutubeUrl(action.videoId)\n                    is RemoveReservationDialogAction -> openRemoveReservationDialog(\n                        requireActivity(), action.params\n                    )\n                    ShowNotificationsPrefAction -> openNotificationsPreferenceDialog()\n                }\n            }\n        }\n\n        launch {\n            sessionDetailViewModel.session.collect { session ->\n                shareString = if (session == null) {\n                    \"\"\n                } else {\n                    getString(\n                        R.string.share_text_session_detail, session.title, session.sessionUrl\n                    )\n                }\n                (binding.sessionDetailRecyclerView.adapter as SessionDetailAdapter)\n                    .speakers = session?.speakers?.toList() ?: emptyList()\n                // ViewBinding is binding the session so we should wait until after the session\n                // has been laid out to report fully drawn. Note that we are *not* waiting for the\n                // speaker images to be downloaded and displayed because we are showing a\n                // placeholder image. Thus the screen appears fully drawn to the user. In terms of\n                // performance, this allows us to obtain a stable start up times by not including\n                // the network call to download images, which can vary greatly based on\n                // uncontrollable factors, mainly network speed.\n                binding.sessionDetailRecyclerView.doOnLayout {\n                    // If this activity was launched from a deeplink, then the logcat statement is\n                    // printed. Otherwise, SessionDetailFragment is started from the MainActivity\n                    // which would have already reported fully drawn to the framework.\n                    activity?.reportFullyDrawn()\n                }\n            }\n        }\n\n        launch {\n            sessionDetailViewModel.relatedUserSessions.collect {\n                (binding.sessionDetailRecyclerView.adapter as SessionDetailAdapter)\n                    .related = it.successOr(emptyList())\n            }\n        }\n\n        launch {\n            sessionDetailViewModel.showFeedbackButton.collect { showFeedbackButton ->\n                // When opened from the post session notification, open the feedback dialog\n                arguments?.let {\n                    val sessionId = SessionDetailFragmentArgs.fromBundle(it).sessionId\n                    val openRateSession =\n                        arguments?.getBoolean(AlarmBroadcastReceiver.EXTRA_SHOW_RATE_SESSION_FLAG)\n                            ?: false\n\n                    if (showFeedbackButton && openRateSession) {\n                        openFeedbackDialog(sessionId)\n                    }\n                }\n            }\n        }\n\n        launch {\n            // Only show the back/up arrow in the toolbar in single-pane configurations.\n            scheduleTwoPaneViewModel.isTwoPane.collect { isTwoPane ->\n                if (isTwoPane) {\n                    binding.toolbar.navigationIcon = null\n                    binding.toolbar.setNavigationOnClickListener(null)\n                } else {\n                    binding.toolbar.navigationIcon =\n                        AppCompatResources.getDrawable(requireContext(), R.drawable.ic_arrow_back)\n                    binding.toolbar.setNavigationOnClickListener {\n                        scheduleTwoPaneViewModel.returnToListPane()\n                    }\n                }\n            }\n        }\n\n        launch {\n            sessionDetailViewModel.session.collect { session ->\n                menu.findItem(R.id.menu_item_ask_question).isVisible =\n                    session?.doryLink?.isNotBlank() == true\n            }\n        }\n    }\n\n    override fun onFeedbackSubmitted() {\n        binding.snackbar.show(R.string.feedback_thank_you)\n    }\n\n    private fun openYoutubeUrl(youtubeUrl: String) {\n        analyticsHelper.logUiEvent(sessionTitle, AnalyticsActions.YOUTUBE_LINK)\n        startActivity(Intent(Intent.ACTION_VIEW, youtubeUrl.toUri()))\n    }\n\n    private fun openSignInDialog(activity: FragmentActivity) {\n        SignInDialogFragment().show(activity.supportFragmentManager, DIALOG_SIGN_IN)\n    }\n\n    private fun openNotificationsPreferenceDialog() {\n        NotificationsPreferenceDialogFragment()\n            .show(requireActivity().supportFragmentManager, DIALOG_NOTIFICATIONS_PREFERENCE)\n    }\n\n    private fun openRemoveReservationDialog(\n        activity: FragmentActivity,\n        parameters: RemoveReservationDialogParameters\n    ) {\n        RemoveReservationDialogFragment.newInstance(parameters)\n            .show(activity.supportFragmentManager, DIALOG_REMOVE_RESERVATION)\n    }\n\n    private fun openSwapReservationDialog(\n        activity: FragmentActivity,\n        parameters: SwapRequestParameters\n    ) {\n        SwapReservationDialogFragment.newInstance(parameters)\n            .show(activity.supportFragmentManager, DIALOG_SWAP_RESERVATION)\n    }\n\n    private fun findSpeakerHeadshot(speakers: ViewGroup, speakerId: SpeakerId): View {\n        speakers.forEach {\n            if (it.getTag(R.id.tag_speaker_id) == speakerId) {\n                return it.findViewById(R.id.speaker_item_headshot)\n            }\n        }\n        Timber.e(\"Could not find view for speaker id $speakerId\")\n        return speakers\n    }\n\n    private fun addToCalendar(session: Session) {\n        val intent = Intent(Intent.ACTION_INSERT)\n            .setData(CalendarContract.Events.CONTENT_URI)\n            .putExtra(CalendarContract.Events.TITLE, session.title)\n            .putExtra(CalendarContract.Events.EVENT_LOCATION, session.room?.name)\n            .putExtra(\n                CalendarContract.Events.DESCRIPTION,\n                session.getCalendarDescription(\n                    getString(R.string.paragraph_delimiter),\n                    getString(R.string.speaker_delimiter)\n                )\n            )\n            .putExtra(\n                CalendarContract.EXTRA_EVENT_BEGIN_TIME,\n                session.startTime.toEpochMilli()\n            )\n            .putExtra(\n                CalendarContract.EXTRA_EVENT_END_TIME,\n                session.endTime.toEpochMilli()\n            )\n        if (intent.resolveActivity(requireContext().packageManager) != null) {\n            startActivity(intent)\n        }\n    }\n\n    private fun openFeedbackDialog(sessionId: String) {\n        SessionFeedbackFragment.createInstance(sessionId)\n            .show(childFragmentManager, FRAGMENT_SESSION_FEEDBACK)\n    }\n\n    companion object {\n        private const val FRAGMENT_SESSION_FEEDBACK = \"feedback\"\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailNavigationAction.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.SpeakerId\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestParameters\nimport com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogParameters\n\nsealed class SessionDetailNavigationAction {\n    object NavigateToSignInDialogAction : SessionDetailNavigationAction()\n    object ShowNotificationsPrefAction : SessionDetailNavigationAction()\n    class NavigateToYoutube(val videoId: String) : SessionDetailNavigationAction()\n    class RemoveReservationDialogAction(val params: RemoveReservationDialogParameters) :\n        SessionDetailNavigationAction()\n    class NavigateToSwapReservationDialogAction(val params: SwapRequestParameters) :\n        SessionDetailNavigationAction()\n    class NavigateToSessionFeedback(val sessionId: SessionId) : SessionDetailNavigationAction()\n    class NavigateToSpeakerDetail(val speakerId: SpeakerId) : SessionDetailNavigationAction()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.asLiveData\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.SessionType\nimport com.google.samples.apps.iosched.model.SpeakerId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.di.ReservationEnabledFlag\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionsUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.SwapAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestParameters\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Error\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport com.google.samples.apps.iosched.shared.util.NetworkUtils\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessage\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogParameters\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickListener\nimport com.google.samples.apps.iosched.ui.sessioncommon.stringRes\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSessionFeedback\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSignInDialogAction\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSpeakerDetail\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSwapReservationDialogAction\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToYoutube\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.Channel.Factory.CONFLATED\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.SharingStarted.Companion.Eagerly\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.combineTransform\nimport kotlinx.coroutines.flow.emitAll\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapLatest\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.flow.transform\nimport kotlinx.coroutines.flow.transformLatest\nimport kotlinx.coroutines.launch\nimport org.threeten.bp.Duration\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\nimport timber.log.Timber\nimport java.util.UUID\nimport javax.inject.Inject\n\nprivate const val TEN_SECONDS = 10_000L\nprivate const val SIXTY_SECONDS = 60_000L\n\n/**\n * Loads [Session] data and exposes it to the session detail view.\n */\n@HiltViewModel\nclass SessionDetailViewModel @Inject constructor(\n    savedStateHandle: SavedStateHandle,\n    private val signInViewModelDelegate: SignInViewModelDelegate,\n    private val loadUserSessionUseCase: LoadUserSessionUseCase,\n    private val loadRelatedSessionUseCase: LoadUserSessionsUseCase,\n    private val reservationActionUseCase: ReservationActionUseCase,\n    getTimeZoneUseCase: GetTimeZoneUseCase,\n    private val timeProvider: TimeProvider,\n    private val networkUtils: NetworkUtils,\n    private val analyticsHelper: AnalyticsHelper,\n    private val snackbarMessageManager: SnackbarMessageManager,\n    onSessionStarClickDelegate: OnSessionStarClickDelegate,\n    @ReservationEnabledFlag val isReservationEnabledByRemoteConfig: Boolean\n) : ViewModel(),\n    SessionDetailEventListener,\n    OnSessionStarClickListener by onSessionStarClickDelegate,\n    SignInViewModelDelegate by signInViewModelDelegate {\n\n    // TODO: remove hardcoded string when https://issuetracker.google.com/136967621 is available\n    private val sessionId = savedStateHandle.get<SessionId>(\"session_id\")\n\n    // Start observing the user ID right away from the SignInViewModelDelegate\n    private val userIdFlow: StateFlow<Result<String?>> = userId.map { Success(it) }\n        .stateIn(viewModelScope, started = Eagerly, initialValue = Loading)\n\n    // Session & UserData are updated with new user IDs\n    private val sessionUserData = userIdFlow.transformLatest { userId ->\n        if (sessionId != null) {\n            emitAll(loadUserSessionUseCase(userId.data to sessionId))\n        } else {\n            Timber.e(\"Session ID is null\")\n            emit(Error(Exception(\"Session not found\")))\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, Loading)\n    // WhileViewSubscribed cancels the subscription to loadUserSessionUseCase when it's not needed.\n\n    init {\n        // SIDE EFFECTS: show Snackbar when there's a message in user data\n        sessionUserData.onEach { result ->\n            result.data?.let { userData ->\n                userData.userMessage?.type?.stringRes()?.let { messageId ->\n                    snackbarMessageManager.addMessage(\n                        SnackbarMessage(\n                            messageId = messageId,\n                            longDuration = true,\n                            session = userData.userSession.session,\n                            requestChangeId = userData.userMessage?.changeRequestId\n                        )\n                    )\n                }\n            }\n        }.launchIn(viewModelScope)\n    }\n\n    // UserSession is exposed as a StateFlow to the view. It's extracted from sessionUserData.\n    val userSession: StateFlow<UserSession?> = sessionUserData.transformLatest { result ->\n        result.data?.userSession?.let { emit(it) }\n    }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = null)\n\n    val userEvent: StateFlow<UserEvent?> = userSession.transform { userSession ->\n        userSession?.userEvent?.let { emit(it) }\n    }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = null)\n\n    val session: StateFlow<Session?> = userSession.transform { userSession ->\n        userSession?.session?.let { emit(it) }\n    }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = null)\n\n    // Related user sessions are exposed as a StateFlow and depend on the current session\n    // and user (for favorites).\n    val relatedUserSessions: StateFlow<Result<List<UserSession>>> =\n        session.combineTransform(userIdFlow) { session, userId ->\n            session?.relatedSessions?.let { related ->\n                emitAll(loadRelatedSessionUseCase(userId.data to related))\n            }\n        }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = Loading)\n\n    // Exposed to the view to decide whether the feedback button should be visible or not.\n    val showFeedbackButton: StateFlow<Boolean> =\n        sessionUserData.mapLatest { sessionUser ->\n            val currentSession = sessionUser.data?.userSession?.session\n            val userEvent = sessionUser.data?.userSession?.userEvent\n            isUserSignedInValue &&\n                userEvent?.isReviewed == false &&\n                currentSession?.type == SessionType.SESSION &&\n                (\n                    TimeUtils.getSessionState(currentSession, ZonedDateTime.now()) ==\n                        TimeUtils.SessionRelativeTimeState.AFTER\n                    )\n        }.stateIn(viewModelScope, started = WhileViewSubscribed, initialValue = false)\n\n    // Exposed to the view to show the  Duration until session start, if applicable.\n    val timeUntilStart: LiveData<Duration?> = session.transformLatest { session ->\n        while (true) { // Emit periodically\n            session?.startTime?.let { startTime ->\n                val duration = Duration.between(timeProvider.now(), startTime)\n                when (duration.toMinutes()) {\n                    in 1..5 -> emit(duration)\n                    else -> emit(null)\n                }\n            }\n            delay(TEN_SECONDS)\n        }\n    }.asLiveData() // TODO: Used by Data Binding https://issuetracker.google.com/184935697\n\n    // Exposed to the view to prevent reservations.\n    val isReservationDeniedByCutoff = session.transformLatest { session ->\n        while (true) { // Emit periodically\n            // Only allow reservations if the sessions starts more than an hour from now\n            checkReservationDeniedByCutoff(session)?.let { isDisabled ->\n                emit(isDisabled)\n            }\n            delay(SIXTY_SECONDS)\n        }\n    }.asLiveData() // TODO: Used by Data Binding https://issuetracker.google.com/184935697\n\n    private fun checkReservationDeniedByCutoff(session: Session?): Boolean? {\n        return session?.startTime?.let { startTime ->\n            Duration.between(timeProvider.now(), startTime).toMinutes() <= 60\n        }\n    }\n\n    // Show the star in bottom nav instead of the FAB if the FAB shows the reservation button.\n    val shouldShowStarInBottomNav = session.combine(isUserRegistered) { session, isRegistered ->\n        isRegistered && session?.isReservable == true\n    }\n\n    // Exposed to the view to indicate whether the session can be reserved.\n    val isReservable: StateFlow<Boolean> = session.map {\n        it?.isReservable == true && isReservationEnabledByRemoteConfig\n    }.stateIn(viewModelScope, WhileViewSubscribed, false)\n\n    // Exposed to the view as a StateFlow but it's a one-shot operation.\n    val timeZoneId = flow<ZoneId> {\n        if (getTimeZoneUseCase(Unit).successOr(true)) {\n            emit(TimeUtils.CONFERENCE_TIMEZONE)\n        } else {\n            emit(ZoneId.systemDefault())\n        }\n    }.stateIn(viewModelScope, WhileViewSubscribed, TimeUtils.CONFERENCE_TIMEZONE)\n\n    // SIDE EFFECTS: Navigation actions\n    private val _navigationActions = Channel<SessionDetailNavigationAction>(capacity = CONFLATED)\n    // Exposed with receiveAsFlow to make sure that only one observer receives updates.\n    val navigationActions = _navigationActions.receiveAsFlow()\n\n    /**\n     * Methods called by the UI\n     */\n\n    fun onPlayVideo() {\n        session.value?.let {\n            if (it.hasVideo) {\n                _navigationActions.tryOffer(NavigateToYoutube(it.youTubeUrl))\n            }\n        }\n    }\n\n    override fun onReservationClicked() {\n        if (!networkUtils.hasNetworkConnection()) {\n            Timber.d(\"No network connection, ignoring reserve click.\")\n            snackbarMessageManager.addMessage(\n                SnackbarMessage(\n                    messageId = R.string.no_network_connection,\n                    requestChangeId = UUID.randomUUID().toString()\n                )\n            )\n            return\n        }\n        if (!isUserSignedInValue) {\n            Timber.d(\"Showing Sign-in dialog after reserve click\")\n            _navigationActions.tryOffer(NavigateToSignInDialogAction)\n            return\n        }\n\n        val userEventSnapshot = userEvent.value ?: return\n        val sessionSnapshot = session.value ?: return\n        val isReservationDeniedByCutoffSnapshot =\n            checkReservationDeniedByCutoff(sessionSnapshot) ?: return\n\n        val userId = userIdFlow.value.data ?: return\n\n        if (userEventSnapshot.isReserved() ||\n            userEventSnapshot.isWaitlisted() ||\n            userEventSnapshot.isReservationPending() ||\n            userEventSnapshot.isCancelPending() // Just in case\n        ) {\n            if (isReservationDeniedByCutoffSnapshot) {\n                snackbarMessageManager.addMessage(\n                    SnackbarMessage(R.string.cancellation_denied_cutoff, longDuration = true)\n                )\n                analyticsHelper.logUiEvent(\n                    sessionSnapshot.title, AnalyticsActions.RES_CANCEL_FAILED\n                )\n            } else {\n                // Open the dialog to confirm if the user really wants to remove their reservation\n                _navigationActions.tryOffer(\n                    SessionDetailNavigationAction.RemoveReservationDialogAction(\n                        RemoveReservationDialogParameters(\n                            userId,\n                            sessionSnapshot.id,\n                            sessionSnapshot.title\n                        )\n                    )\n                )\n                analyticsHelper.logUiEvent(sessionSnapshot.title, AnalyticsActions.RES_CANCEL)\n            }\n            return\n        }\n        if (isReservationDeniedByCutoffSnapshot) {\n            snackbarMessageManager.addMessage(\n                SnackbarMessage(R.string.reservation_denied_cutoff, longDuration = true)\n            )\n            analyticsHelper.logUiEvent(sessionSnapshot.title, AnalyticsActions.RESERVE_FAILED)\n        } else {\n            // New reservation\n\n            val userSession = UserSession(sessionSnapshot, userEventSnapshot)\n\n            viewModelScope.launch {\n                val result = reservationActionUseCase(\n                    ReservationRequestParameters(\n                        userId,\n                        sessionSnapshot.id,\n                        RequestAction(),\n                        userSession\n                    )\n                )\n                when (result) {\n                    is Success -> {\n                        val reservationActionResult = result.data\n                        if (reservationActionResult is SwapAction) {\n                            _navigationActions.tryOffer(\n                                NavigateToSwapReservationDialogAction(\n                                    reservationActionResult.parameters\n                                )\n                            )\n                        }\n                    }\n                    is Error -> {\n                        snackbarMessageManager.addMessage(\n                            SnackbarMessage(R.string.reservation_error, longDuration = true)\n                        )\n                    }\n                    Loading -> throw IllegalStateException()\n                }\n            }\n            analyticsHelper.logUiEvent(sessionSnapshot.title, AnalyticsActions.RESERVE)\n        }\n    }\n\n    override fun onLoginClicked() {\n        if (!isUserSignedInValue) {\n            Timber.d(\"Showing Sign-in dialog\")\n            _navigationActions.tryOffer(NavigateToSignInDialogAction)\n        }\n    }\n\n    override fun onSpeakerClicked(speakerId: SpeakerId) {\n        _navigationActions.tryOffer(NavigateToSpeakerDetail(speakerId))\n    }\n\n    override fun onFeedbackClicked() {\n        session.value?.id?.let { sessionId ->\n            _navigationActions.tryOffer(NavigateToSessionFeedback(sessionId))\n        }\n    }\n}\n\ninterface SessionDetailEventListener : OnSessionStarClickListener {\n\n    fun onReservationClicked()\n\n    fun onLoginClicked()\n\n    fun onSpeakerClicked(speakerId: SpeakerId)\n\n    fun onFeedbackClicked()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionFeedbackFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.viewModels\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentSessionFeedbackBinding\nimport com.google.samples.apps.iosched.databinding.ItemQuestionBinding\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.widget.SimpleRatingBar\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.collect\n\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass SessionFeedbackFragment : AppCompatDialogFragment() {\n\n    private val viewModel: SessionFeedbackViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val sessionId = arguments?.getString(ARG_SESSION_ID)\n        if (sessionId == null) {\n            dismiss()\n        } else {\n            viewModel.setSessionId(sessionId)\n        }\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val binding = FragmentSessionFeedbackBinding.inflate(LayoutInflater.from(context))\n        val questionAdapter = QuestionAdapter()\n        binding.questions.run {\n            layoutManager = LinearLayoutManager(context)\n            adapter = questionAdapter\n        }\n\n        questionAdapter.submitList(viewModel.questions)\n\n        launchAndRepeatWithViewLifecycle {\n            viewModel.userSession.collect {\n                it.data?.let {\n                    dialog?.setTitle(it.session.title)\n                }\n            }\n        }\n        return MaterialAlertDialogBuilder(requireContext())\n            // The actual title is set asynchronously, but there has to be some title to\n            // initialize the view first.\n            .setTitle(\"-\")\n            .setView(binding.root)\n            .setPositiveButton(R.string.feedback_submit) { _, _ ->\n                viewModel.submit(questionAdapter.feedbackUpdates)\n                (parentFragment as Listener).onFeedbackSubmitted()\n            }\n            .setNegativeButton(android.R.string.cancel, /* ignore */ null)\n            .create()\n    }\n\n    internal interface Listener {\n        fun onFeedbackSubmitted()\n    }\n\n    companion object {\n        private const val ARG_SESSION_ID = \"session_id\"\n\n        fun createInstance(sessionId: SessionId) = SessionFeedbackFragment().apply {\n            arguments = Bundle().apply {\n                putString(ARG_SESSION_ID, sessionId)\n            }\n        }\n    }\n}\n\nclass QuestionViewHolder(val binding: ItemQuestionBinding) : RecyclerView.ViewHolder(binding.root)\n\nclass QuestionAdapter : ListAdapter<Question, QuestionViewHolder>(DIFF_CALLBACK) {\n\n    val feedbackUpdates = mutableMapOf<String, Int>()\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuestionViewHolder {\n        return QuestionViewHolder(\n            ItemQuestionBinding.inflate(\n                LayoutInflater.from(parent.context), parent, false\n            )\n        )\n    }\n\n    override fun onBindViewHolder(holder: QuestionViewHolder, position: Int) {\n        val question = getItem(position)\n        holder.binding.question = feedbackUpdates[question.key]?.let {\n            question.copy(currentRating = it)\n        } ?: question\n        holder.binding.rating.setOnRateListener(object : SimpleRatingBar.OnRateListener {\n            override fun onRate(rate: Int) {\n                feedbackUpdates[question.key] = rate\n            }\n        })\n    }\n\n    companion object {\n        val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Question>() {\n            override fun areItemsTheSame(oldItem: Question, newItem: Question): Boolean {\n                return oldItem.key == newItem.key\n            }\n\n            override fun areContentsTheSame(oldItem: Question, newItem: Question): Boolean {\n                return oldItem == newItem\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionFeedbackViewModel.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport androidx.annotation.IntRange\nimport androidx.annotation.StringRes\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.FeedbackParameter\nimport com.google.samples.apps.iosched.shared.domain.users.FeedbackUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.util.cancelIfActive\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@HiltViewModel\nclass SessionFeedbackViewModel @Inject constructor(\n    private val signInViewModelDelegate: SignInViewModelDelegate,\n    private val loadUserSessionUseCase: LoadUserSessionUseCase,\n    private val feedbackUseCase: FeedbackUseCase\n) : ViewModel(),\n    SignInViewModelDelegate by signInViewModelDelegate {\n\n    companion object {\n        val MESSAGES = mapOf(\n            \"q1\" to Triple(\n                R.string.feedback_q1_text,\n                R.string.feedback_q1_label_start,\n                R.string.feedback_q1_label_end\n            ),\n            \"q2\" to Triple(\n                R.string.feedback_q2_text,\n                R.string.feedback_q2_label_start,\n                R.string.feedback_q2_label_end\n            ),\n            \"q3\" to Triple(\n                R.string.feedback_q3_text,\n                R.string.feedback_q3_label_start,\n                R.string.feedback_q3_label_end\n            ),\n            \"q4\" to Triple(\n                R.string.feedback_q4_text,\n                R.string.feedback_q4_label_start,\n                R.string.feedback_q4_label_end\n            )\n        )\n    }\n\n    private var loadUserSessionJob: Job? = null\n\n    private var _sessionId: SessionId? = null\n\n    private val _userSession = MutableStateFlow<Result<UserSession>>(Result.Loading)\n    val userSession: StateFlow<Result<UserSession>> = _userSession\n\n    val questions =\n        MESSAGES.map { (key, value) ->\n            val (text, start, end) = value\n            Question(key, text, 0, start, end)\n        }\n\n    fun setSessionId(sessionId: SessionId) {\n        _sessionId = sessionId\n        loadUserSessionJob.cancelIfActive()\n        loadUserSessionJob = viewModelScope.launch {\n            loadUserSessionUseCase(userIdValue to sessionId).collect { result ->\n                result.data?.userSession?.let { success ->\n                    _userSession.value = Success(success)\n                }\n            }\n        }\n    }\n\n    fun submit(feedbackUpdates: Map<String, Int>) {\n        val sessionId = _sessionId ?: return\n        val userId = userIdValue\n        val userEvent = _userSession.value.data?.userEvent\n        if (userId != null && userEvent != null) {\n            viewModelScope.launch {\n                feedbackUseCase(\n                    FeedbackParameter(\n                        userId,\n                        userEvent,\n                        sessionId,\n                        feedbackUpdates\n                    )\n                )\n            }\n        }\n    }\n}\n\n/**\n * Data model for the list.\n */\ndata class Question(\n    val key: String,\n    @StringRes\n    val text: Int,\n    /** 0 means unrated. Actual ratings are 1-5. */\n    @IntRange(from = 0, to = 5)\n    val currentRating: Int,\n    @StringRes\n    val labelStart: Int,\n    @StringRes\n    val labelEnd: Int\n)\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/settings/SettingsFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.settings\n\nimport android.app.AlertDialog\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.webkit.WebView\nimport android.widget.TextView\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\nimport androidx.databinding.BindingAdapter\nimport androidx.fragment.app.viewModels\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentSettingsBinding\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.ui.MainNavigationFragment\nimport com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\n\n@AndroidEntryPoint\nclass SettingsFragment : MainNavigationFragment() {\n\n    private val viewModel: SettingsViewModel by viewModels()\n    private val mainActivityViewModel: MainActivityViewModel by viewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n\n        launchAndRepeatWithViewLifecycle {\n            viewModel.navigationActions.collect {\n                if (it is SettingsNavigationAction.NavigateToThemeSelector) {\n                    ThemeSettingDialogFragment.newInstance()\n                        .show(parentFragmentManager, null)\n                }\n            }\n        }\n        val binding = FragmentSettingsBinding.inflate(inflater, container, false)\n        binding.viewModel = viewModel\n        binding.lifecycleOwner = viewLifecycleOwner\n\n        binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)\n\n        binding.settingsScroll.doOnApplyWindowInsets { v, insets, padding ->\n            val systemInsets = insets.getInsets(\n                WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n            )\n            v.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n        }\n\n        return binding.root\n    }\n}\n\n@BindingAdapter(value = [\"dialogTitle\", \"fileLink\"], requireAll = true)\nfun createDialogForFile(button: View, dialogTitle: String, fileLink: String) {\n    val context = button.context\n    button.setOnClickListener {\n        val webView = WebView(context).apply { loadUrl(fileLink) }\n        webView.settings.useWideViewPort = true\n        webView.settings.loadWithOverviewMode = true\n        AlertDialog.Builder(context)\n            .setTitle(dialogTitle)\n            .setView(webView)\n            .create()\n            .show()\n    }\n}\n\n@BindingAdapter(\"versionName\")\nfun setVersionName(view: TextView, versionName: String) {\n    view.text = view.resources.getString(R.string.version_name, versionName)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/settings/SettingsViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.settings\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefSaveActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetAnalyticsSettingUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetAvailableThemesUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetNotificationsSettingUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetThemeUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.SetAnalyticsSettingUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.SetThemeUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.SetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.emitAll\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.mapLatest\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@HiltViewModel\nclass SettingsViewModel @Inject constructor(\n    val setTimeZoneUseCase: SetTimeZoneUseCase,\n    getTimeZoneUseCase: GetTimeZoneUseCase,\n    val notificationsPrefSaveActionUseCase: NotificationsPrefSaveActionUseCase,\n    getNotificationsSettingUseCase: GetNotificationsSettingUseCase,\n    val setAnalyticsSettingUseCase: SetAnalyticsSettingUseCase,\n    getAnalyticsSettingUseCase: GetAnalyticsSettingUseCase,\n    val setThemeUseCase: SetThemeUseCase,\n    getThemeUseCase: GetThemeUseCase,\n    getAvailableThemesUseCase: GetAvailableThemesUseCase\n) : ViewModel() {\n\n    // Used to re-run flows on command\n    private val refreshSignal = MutableSharedFlow<Unit>()\n    // Used to run flows on init and also on command\n    private val loadDataSignal: Flow<Unit> = flow {\n        emit(Unit)\n        emitAll(refreshSignal)\n    }\n\n    // Time Zone setting\n    val preferConferenceTimeZone: StateFlow<Boolean> = loadDataSignal.mapLatest {\n        getTimeZoneUseCase(Unit).data ?: true\n    }.stateIn(viewModelScope, WhileViewSubscribed, true)\n\n    val enableNotifications: StateFlow<Boolean> = loadDataSignal.mapLatest {\n        getNotificationsSettingUseCase(Unit).data ?: true\n    }.stateIn(viewModelScope, WhileViewSubscribed, true)\n\n    // Analytics setting\n    val sendUsageStatistics =\n        loadDataSignal.combine(getAnalyticsSettingUseCase(Unit)) { _, result ->\n            result.data ?: false\n        }.stateIn(viewModelScope, WhileViewSubscribed, false)\n\n    // Theme setting\n    val theme: StateFlow<Theme> = loadDataSignal.mapLatest {\n        getThemeUseCase(Unit).data ?: Theme.SYSTEM\n    }.stateIn(viewModelScope, WhileViewSubscribed, Theme.SYSTEM)\n\n    // Theme setting\n    val availableThemes: StateFlow<List<Theme>> = loadDataSignal.mapLatest {\n        getAvailableThemesUseCase(Unit).data ?: listOf<Theme>()\n    }.stateIn(viewModelScope, WhileViewSubscribed, listOf())\n\n    // SIDE EFFECTS: Navigation actions\n    private val _navigationActions = Channel<SettingsNavigationAction>(capacity = Channel.CONFLATED)\n    // Exposed with receiveAsFlow to make sure that only one observer receives updates.\n    val navigationActions = _navigationActions.receiveAsFlow()\n\n    private suspend fun refreshData() {\n        refreshSignal.emit(Unit)\n    }\n\n    fun toggleTimeZone() {\n        viewModelScope.launch {\n            setTimeZoneUseCase(!preferConferenceTimeZone.value)\n            refreshData()\n        }\n    }\n\n    fun toggleEnableNotifications() {\n        viewModelScope.launch {\n            notificationsPrefSaveActionUseCase(!enableNotifications.value)\n            refreshData()\n        }\n    }\n\n    fun toggleSendUsageStatistics() {\n        viewModelScope.launch {\n            setAnalyticsSettingUseCase(!sendUsageStatistics.value)\n            refreshData()\n        }\n    }\n\n    fun setTheme(theme: Theme) {\n        viewModelScope.launch {\n            setThemeUseCase(theme)\n        }\n    }\n\n    fun onThemeSettingClicked() {\n        _navigationActions.tryOffer(SettingsNavigationAction.NavigateToThemeSelector)\n    }\n}\n\nsealed class SettingsNavigationAction {\n    object NavigateToThemeSelector : SettingsNavigationAction()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/settings/ThemeSettingDialogFragment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.settings\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.widget.ArrayAdapter\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Theme\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ThemeSettingDialogFragment : AppCompatDialogFragment() {\n\n    private val viewModel: SettingsViewModel by viewModels()\n\n    private lateinit var listAdapter: ArrayAdapter<ThemeHolder>\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n\n        listAdapter = ArrayAdapter(\n            requireContext(),\n            android.R.layout.simple_list_item_single_choice\n        )\n\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.settings_theme_title)\n            .setSingleChoiceItems(listAdapter, 0) { dialog, position ->\n                listAdapter.getItem(position)?.theme?.let {\n                    viewModel.setTheme(it)\n                }\n                dialog.dismiss()\n            }\n            .create()\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        // Note you don't need to use viewLifecycleOwner in DialogFragment.\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                viewModel.availableThemes.collect { themes ->\n                    listAdapter.clear()\n                    listAdapter.addAll(\n                        themes.map { theme ->\n                            ThemeHolder(theme, getTitleForTheme(theme))\n                        }\n                    )\n\n                    updateSelectedItem(viewModel.theme.value)\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                viewModel.theme.collect { updateSelectedItem(it) }\n            }\n        }\n    }\n\n    private fun updateSelectedItem(selected: Theme?) {\n        val selectedPosition = (0 until listAdapter.count).indexOfFirst { index ->\n            listAdapter.getItem(index)?.theme == selected\n        }\n        (dialog as AlertDialog).listView.setItemChecked(selectedPosition, true)\n    }\n\n    private fun getTitleForTheme(theme: Theme) = when (theme) {\n        Theme.LIGHT -> getString(R.string.settings_theme_light)\n        Theme.DARK -> getString(R.string.settings_theme_dark)\n        Theme.SYSTEM -> getString(R.string.settings_theme_system)\n        Theme.BATTERY_SAVER -> getString(R.string.settings_theme_battery)\n    }\n\n    companion object {\n        fun newInstance() = ThemeSettingDialogFragment()\n    }\n\n    private data class ThemeHolder(val theme: Theme, val title: String) {\n        override fun toString(): String = title\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/NotificationsPreferenceDialogFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport android.app.Dialog\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefSaveActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefShownActionUseCase\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n/**\n * Dialog that asks for the user's notifications preference.\n */\n@AndroidEntryPoint\nclass NotificationsPreferenceDialogFragment : AppCompatDialogFragment() {\n\n    @Inject\n    lateinit var notificationsPrefSaveActionUseCase: NotificationsPrefSaveActionUseCase\n\n    @Inject\n    lateinit var notificationsPrefShownActionUseCase: NotificationsPrefShownActionUseCase\n\n    @Inject\n    @ApplicationScope\n    lateinit var applicationScope: CoroutineScope\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.notifications_preference_dialog_title)\n            .setMessage(R.string.notifications_preference_dialog_content)\n            .setNegativeButton(R.string.no) { _, _ ->\n                lifecycleScope.launch {\n                    notificationsPrefSaveActionUseCase(false)\n                }\n            }\n            .setPositiveButton(R.string.yes) { _, _ ->\n                lifecycleScope.launch {\n                    notificationsPrefSaveActionUseCase(true)\n                }\n            }\n            .create()\n    }\n\n    override fun onDismiss(dialog: DialogInterface) {\n        applicationScope.launch {\n            notificationsPrefShownActionUseCase(true)\n        }\n        super.onDismiss(dialog)\n    }\n\n    companion object {\n        const val DIALOG_NOTIFICATIONS_PREFERENCE = \"dialog_notifications_preference\"\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInDialogFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.samples.apps.iosched.databinding.DialogSignInBinding\nimport com.google.samples.apps.iosched.ui.signin.SignInNavigationAction.RequestSignIn\nimport com.google.samples.apps.iosched.util.executeAfter\nimport com.google.samples.apps.iosched.util.signin.SignInHandler\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n/**\n * Dialog that tells the user to sign in to continue the operation.\n */\n@AndroidEntryPoint\nclass SignInDialogFragment : AppCompatDialogFragment() {\n\n    @Inject\n    lateinit var signInHandler: SignInHandler\n\n    private val signInViewModel: SignInViewModel by viewModels()\n\n    private lateinit var binding: DialogSignInBinding\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        // We want to create a dialog, but we also want to use DataBinding for the content view.\n        // We can do that by making an empty dialog and adding the content later.\n        return MaterialAlertDialogBuilder(requireContext()).create()\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        // In case we are showing as a dialog, use getLayoutInflater() instead.\n        binding = DialogSignInBinding.inflate(layoutInflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                signInViewModel.signInNavigationActions.collect { action ->\n                    if (action == RequestSignIn) {\n                        activity?.startActivityForResult(\n                            signInHandler.makeSignInIntent(),\n                            REQUEST_CODE_SIGN_IN\n                        )\n                        dismiss()\n                    }\n                }\n            }\n        }\n\n        binding.executeAfter {\n            viewModel = signInViewModel\n            lifecycleOwner = viewLifecycleOwner\n        }\n\n        if (showsDialog) {\n            (requireDialog() as AlertDialog).setView(binding.root)\n        }\n    }\n\n    companion object {\n        const val DIALOG_SIGN_IN = \"dialog_sign_in\"\n        const val REQUEST_CODE_SIGN_IN = 42\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInViewExtensions.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport android.content.Context\nimport android.content.res.Resources\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport android.view.MenuItem\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.view.MenuItemCompat\nimport androidx.lifecycle.Lifecycle.State.STARTED\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\nimport com.bumptech.glide.request.target.Target\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo\nimport com.google.samples.apps.iosched.ui.MainActivityViewModel\nimport com.google.samples.apps.iosched.util.asGlideTarget\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\n\nfun Toolbar.setupProfileMenuItem(\n    viewModel: MainActivityViewModel,\n    lifecycleOwner: LifecycleOwner\n) {\n    inflateMenu(R.menu.profile)\n    val profileItem = menu.findItem(R.id.action_profile) ?: return\n    profileItem.setOnMenuItemClickListener {\n        viewModel.onProfileClicked()\n        true\n    }\n    lifecycleOwner.lifecycleScope.launch {\n        lifecycleOwner.lifecycle.repeatOnLifecycle(STARTED) {\n            viewModel.userInfo.collect {\n                setProfileContentDescription(profileItem, resources, it)\n            }\n        }\n    }\n\n    val avatarSize = resources.getDimensionPixelSize(R.dimen.nav_account_image_size)\n    val target = profileItem.asGlideTarget(avatarSize)\n    lifecycleOwner.lifecycleScope.launch {\n        lifecycleOwner.lifecycle.repeatOnLifecycle(STARTED) {\n            viewModel.currentUserImageUri.collect {\n                setProfileAvatar(context, target, it)\n            }\n        }\n    }\n}\n\nfun setProfileContentDescription(item: MenuItem, res: Resources, user: AuthenticatedUserInfo?) {\n    val description = if (user?.isSignedIn() == true) {\n        res.getString(R.string.a11y_signed_in_content_description, user.getDisplayName())\n    } else {\n        res.getString(R.string.a11y_signed_out_content_description)\n    }\n    MenuItemCompat.setContentDescription(item, description)\n}\n\nfun setProfileAvatar(\n    context: Context,\n    target: Target<Drawable>,\n    imageUri: Uri?,\n    placeholder: Int = R.drawable.ic_default_profile_avatar\n) {\n    // Inflate the drawable for proper tinting\n    val placeholderDrawable = AppCompatResources.getDrawable(context, placeholder)\n    when (imageUri) {\n        null -> {\n            Glide.with(context)\n                .load(placeholderDrawable)\n                .apply(RequestOptions.circleCropTransform())\n                .into(target)\n        }\n        else -> {\n            Glide.with(context)\n                .load(imageUri)\n                .apply(RequestOptions.placeholderOf(placeholderDrawable).circleCrop())\n                .into(target)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport javax.inject.Inject\n\n/**\n * ViewModel for *both* the sign in & sign out dialogs.\n */\n@HiltViewModel\nclass SignInViewModel @Inject constructor(\n    signInViewModelDelegate: SignInViewModelDelegate\n) : ViewModel(), SignInViewModelDelegate by signInViewModelDelegate {\n\n    fun onSignIn() {\n        viewModelScope.launch {\n            Timber.d(\"Sign in requested\")\n            emitSignInRequest()\n        }\n    }\n\n    fun onSignOut() {\n        viewModelScope.launch {\n            Timber.d(\"Sign out requested\")\n            emitSignOutRequest()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInViewModelDelegate.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport android.net.Uri\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport com.google.samples.apps.iosched.shared.di.ReservationEnabledFlag\nimport com.google.samples.apps.iosched.shared.domain.auth.ObserveUserAuthStateUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefIsShownUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport com.google.samples.apps.iosched.ui.signin.SignInNavigationAction.ShowNotificationPreferencesDialog\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapLatest\nimport kotlinx.coroutines.flow.receiveAsFlow\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport timber.log.Timber\nimport javax.inject.Inject\n\nenum class SignInNavigationAction {\n    RequestSignIn, RequestSignOut, ShowNotificationPreferencesDialog\n}\n\n/**\n * Interface to implement sign-in functionality in a ViewModel.\n *\n * You can inject a implementation of this via Dagger2, then use the implementation as an interface\n * delegate to add sign in functionality without writing any code\n *\n * Example usage\n *\n * ```\n * class MyViewModel @Inject constructor(\n *     signInViewModelComponent: SignInViewModelDelegate\n * ) : ViewModel(), SignInViewModelDelegate by signInViewModelComponent {\n * ```\n */\ninterface SignInViewModelDelegate {\n    /**\n     * Live updated value of the current firebase user\n     */\n    val userInfo: StateFlow<AuthenticatedUserInfo?>\n\n    /**\n     * Live updated value of the current firebase users image url\n     */\n    val currentUserImageUri: StateFlow<Uri?>\n\n    /**\n     * Emits Events when a sign-in event should be attempted or a dialog shown\n     */\n    val signInNavigationActions: Flow<SignInNavigationAction>\n\n    /**\n     * Emits whether or not to show reservations for the current user\n     */\n    val showReservations: StateFlow<Boolean>\n\n    /**\n     * Emit an Event on performSignInEvent to request sign-in\n     */\n    suspend fun emitSignInRequest()\n\n    /**\n     * Emit an Event on performSignInEvent to request sign-out\n     */\n    suspend fun emitSignOutRequest()\n\n    val userId: Flow<String?>\n\n    /**\n     * Returns the current user ID or null if not available.\n     */\n    val userIdValue: String?\n\n    val isUserSignedIn: StateFlow<Boolean>\n\n    val isUserSignedInValue: Boolean\n\n    val isUserRegistered: StateFlow<Boolean>\n\n    val isUserRegisteredValue: Boolean\n}\n\n/**\n * Implementation of SignInViewModelDelegate that uses Firebase's auth mechanisms.\n */\ninternal class FirebaseSignInViewModelDelegate @Inject constructor(\n    observeUserAuthStateUseCase: ObserveUserAuthStateUseCase,\n    private val notificationsPrefIsShownUseCase: NotificationsPrefIsShownUseCase,\n    @IoDispatcher private val ioDispatcher: CoroutineDispatcher,\n    @MainDispatcher private val mainDispatcher: CoroutineDispatcher,\n    @ReservationEnabledFlag val isReservationEnabledByRemoteConfig: Boolean,\n    @ApplicationScope val applicationScope: CoroutineScope\n) : SignInViewModelDelegate {\n\n    private val _signInNavigationActions = Channel<SignInNavigationAction>(Channel.CONFLATED)\n    override val signInNavigationActions = _signInNavigationActions.receiveAsFlow()\n\n    private val currentFirebaseUser: Flow<Result<AuthenticatedUserInfo?>> =\n        observeUserAuthStateUseCase(Any()).map {\n            if (it is Result.Error) {\n                Timber.e(it.exception)\n            }\n            it\n        }\n\n    override val userInfo: StateFlow<AuthenticatedUserInfo?> = currentFirebaseUser.map {\n        (it as? Success)?.data\n    }.stateIn(applicationScope, WhileViewSubscribed, null)\n\n    override val currentUserImageUri: StateFlow<Uri?> = userInfo.map {\n        it?.getPhotoUrl()\n    }.stateIn(applicationScope, WhileViewSubscribed, null)\n\n    override val isUserSignedIn: StateFlow<Boolean> = userInfo.map {\n        it?.isSignedIn() ?: false\n    }.stateIn(applicationScope, WhileViewSubscribed, false)\n\n    override val isUserRegistered: StateFlow<Boolean> = userInfo.map {\n        it?.isRegistered() ?: false\n    }.stateIn(applicationScope, WhileViewSubscribed, false)\n\n    init {\n        applicationScope.launch {\n            userInfo.collect {\n                if (notificationsPrefIsShownUseCase(Unit).data == false && isUserSignedInValue) {\n                    _signInNavigationActions.tryOffer(ShowNotificationPreferencesDialog)\n                }\n            }\n        }\n    }\n\n    override val showReservations: StateFlow<Boolean> = userInfo.map {\n        (isUserRegisteredValue || !isUserSignedInValue) &&\n            isReservationEnabledByRemoteConfig\n    }.stateIn(applicationScope, WhileViewSubscribed, false)\n\n    override suspend fun emitSignInRequest(): Unit = withContext(ioDispatcher) {\n        // Refresh the notificationsPrefIsShown because it's used to indicate if the\n        // notifications preference dialog should be shown\n        notificationsPrefIsShownUseCase(Unit)\n        _signInNavigationActions.tryOffer(SignInNavigationAction.RequestSignIn)\n    }\n\n    override suspend fun emitSignOutRequest(): Unit = withContext(mainDispatcher) {\n        _signInNavigationActions.tryOffer(SignInNavigationAction.RequestSignOut)\n    }\n\n    override val isUserSignedInValue: Boolean\n        get() = isUserSignedIn.value\n\n    override val isUserRegisteredValue: Boolean\n        get() = isUserRegistered.value\n\n    override val userIdValue: String?\n        get() = userInfo.value?.getUid()\n\n    override val userId: StateFlow<String?>\n        get() = userInfo.mapLatest { it?.getUid() }\n            .stateIn(applicationScope, WhileViewSubscribed, null)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignInViewModelDelegateModule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport com.google.samples.apps.iosched.shared.di.ReservationEnabledFlag\nimport com.google.samples.apps.iosched.shared.domain.auth.ObserveUserAuthStateUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefIsShownUseCase\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nclass SignInViewModelDelegateModule {\n\n    @Singleton\n    @Provides\n    fun provideSignInViewModelDelegate(\n        dataSource: ObserveUserAuthStateUseCase,\n        notificationsPrefIsShownUseCase: NotificationsPrefIsShownUseCase,\n        @IoDispatcher ioDispatcher: CoroutineDispatcher,\n        @MainDispatcher mainDispatcher: CoroutineDispatcher,\n        @ReservationEnabledFlag isReservationEnabledByRemoteConfig: Boolean,\n        @ApplicationScope applicationScope: CoroutineScope\n    ): SignInViewModelDelegate {\n        return FirebaseSignInViewModelDelegate(\n            observeUserAuthStateUseCase = dataSource,\n            notificationsPrefIsShownUseCase = notificationsPrefIsShownUseCase,\n            ioDispatcher = ioDispatcher,\n            mainDispatcher = mainDispatcher,\n            isReservationEnabledByRemoteConfig = isReservationEnabledByRemoteConfig,\n            applicationScope = applicationScope\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/signin/SignOutDialogFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.core.view.isGone\nimport androidx.databinding.BindingAdapter\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.samples.apps.iosched.databinding.DialogSignOutBinding\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo\nimport com.google.samples.apps.iosched.ui.signin.SignInNavigationAction.RequestSignOut\nimport com.google.samples.apps.iosched.util.executeAfter\nimport com.google.samples.apps.iosched.util.signin.SignInHandler\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n/**\n * Dialog that confirms that a user wishes to sign out.\n */\n@AndroidEntryPoint\nclass SignOutDialogFragment : AppCompatDialogFragment() {\n\n    @Inject\n    lateinit var signInHandler: SignInHandler\n\n    private val signInViewModel: SignInViewModel by viewModels()\n\n    private lateinit var binding: DialogSignOutBinding\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        // We want to create a dialog, but we also want to use DataBinding for the content view.\n        // We can do that by making an empty dialog and adding the content later.\n        return MaterialAlertDialogBuilder(requireContext()).create()\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        // In case we are showing as a dialog, use getLayoutInflater() instead.\n        binding = DialogSignOutBinding.inflate(layoutInflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        lifecycleScope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                signInViewModel.signInNavigationActions.collect { action ->\n                    if (action == RequestSignOut) {\n                        signInHandler.signOut(requireContext())\n                        dismiss()\n                    }\n                }\n            }\n        }\n\n        binding.executeAfter {\n            viewModel = signInViewModel\n            lifecycleOwner = viewLifecycleOwner\n        }\n\n        if (showsDialog) {\n            (requireDialog() as AlertDialog).setView(binding.root)\n        }\n    }\n}\n\n@BindingAdapter(\"username\")\nfun setUsername(textView: TextView, userInfo: AuthenticatedUserInfo?) {\n    val displayName = userInfo?.getDisplayName()\n    textView.text = displayName\n    textView.isGone = displayName.isNullOrEmpty()\n}\n\n@BindingAdapter(\"userEmail\")\nfun setUserEmail(textView: TextView, userInfo: AuthenticatedUserInfo?) {\n    val email = userInfo?.getEmail()\n    textView.text = email\n    textView.isGone = email.isNullOrEmpty()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerAdapter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.speaker\n\nimport android.annotation.SuppressLint\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.AsyncListDiffer\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.ItemGenericSectionHeaderBinding\nimport com.google.samples.apps.iosched.databinding.ItemSessionBinding\nimport com.google.samples.apps.iosched.databinding.ItemSpeakerInfoBinding\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.ui.SectionHeader\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener\nimport com.google.samples.apps.iosched.ui.speaker.SpeakerViewHolder.HeaderViewHolder\nimport com.google.samples.apps.iosched.ui.speaker.SpeakerViewHolder.SpeakerInfoViewHolder\nimport com.google.samples.apps.iosched.ui.speaker.SpeakerViewHolder.SpeakerSessionViewHolder\nimport com.google.samples.apps.iosched.util.executeAfter\nimport java.util.Collections.emptyList\n\n/**\n * [RecyclerView.Adapter] for presenting a speaker details, composed of information about the\n * speaker and any sessions that the speaker presents.\n */\nclass SpeakerAdapter(\n    private val lifecycleOwner: LifecycleOwner,\n    private val speakerViewModel: SpeakerViewModel,\n    private val onSessionClickListener: OnSessionClickListener,\n    private val tagRecycledViewPool: RecycledViewPool\n) : RecyclerView.Adapter<SpeakerViewHolder>() {\n\n    private val differ = AsyncListDiffer(this, DiffCallback)\n\n    var speakerSessions: List<UserSession> = emptyList()\n        set(value) {\n            field = value\n            differ.submitList(buildMergedList(sessions = value))\n        }\n\n    init {\n        differ.submitList(buildMergedList())\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SpeakerViewHolder {\n        val inflater = LayoutInflater.from(parent.context)\n        return when (viewType) {\n            R.layout.item_speaker_info -> SpeakerInfoViewHolder(\n                ItemSpeakerInfoBinding.inflate(inflater, parent, false)\n            )\n            R.layout.item_session -> SpeakerSessionViewHolder(\n                ItemSessionBinding.inflate(inflater, parent, false).apply {\n                    tags.setRecycledViewPool(tagRecycledViewPool)\n                }\n            )\n            R.layout.item_generic_section_header -> HeaderViewHolder(\n                ItemGenericSectionHeaderBinding.inflate(inflater, parent, false)\n            )\n            else -> throw IllegalStateException(\"Unknown viewType $viewType\")\n        }\n    }\n\n    override fun onBindViewHolder(holder: SpeakerViewHolder, position: Int) {\n        when (holder) {\n            is SpeakerInfoViewHolder -> holder.binding.executeAfter {\n                viewModel = speakerViewModel\n                lifecycleOwner = this@SpeakerAdapter.lifecycleOwner\n            }\n            is SpeakerSessionViewHolder -> holder.binding.executeAfter {\n                userSession = differ.currentList[position] as UserSession\n                timeZoneId = speakerViewModel.timeZoneId\n                sessionClickListener = onSessionClickListener\n                sessionStarClickListener = speakerViewModel\n                showTime = true\n                lifecycleOwner = this@SpeakerAdapter.lifecycleOwner\n            }\n            is HeaderViewHolder -> holder.binding.executeAfter {\n                sectionHeader = differ.currentList[position] as SectionHeader\n            }\n        }\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return when (differ.currentList[position]) {\n            SpeakerItem -> R.layout.item_speaker_info\n            is UserSession -> R.layout.item_session\n            is SectionHeader -> R.layout.item_generic_section_header\n            else -> throw IllegalStateException(\"Unknown view type at position $position\")\n        }\n    }\n\n    override fun getItemCount() = differ.currentList.size\n\n    /**\n     * This adapter displays heterogeneous data types but `RecyclerView` & `AsyncListDiffer` deal in\n     * a single list of items. We therefore combine them into a merged list, using marker objects\n     * for static items. We still hold separate lists of [speakerSessions] so that\n     * we can provide them individually, as they're loaded.\n     */\n    private fun buildMergedList(\n        sessions: List<UserSession> = speakerSessions\n    ): List<Any> {\n        val merged = mutableListOf<Any>(SpeakerItem)\n        if (sessions.isNotEmpty()) {\n            merged += SectionHeader(R.string.speaker_events_subhead)\n            merged.addAll(sessions)\n        }\n        return merged\n    }\n}\n\n// Marker object for use in our merged representation.\nobject SpeakerItem\n\n/**\n * Diff items presented by this adapter.\n */\nobject DiffCallback : DiffUtil.ItemCallback<Any>() {\n\n    override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean {\n        return when {\n            oldItem === SpeakerItem && newItem === SpeakerItem -> true\n            oldItem is SectionHeader && newItem is SectionHeader -> oldItem == newItem\n            oldItem is UserSession && newItem is UserSession ->\n                oldItem.session.id == newItem.session.id\n            else -> false\n        }\n    }\n\n    @SuppressLint(\"DiffUtilEquals\")\n    // Workaround of https://issuetracker.google.com/issues/122928037\n    override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean {\n        return when {\n            oldItem is UserSession && newItem is UserSession -> oldItem == newItem\n            else -> true\n        }\n    }\n}\n\n/**\n * [RecyclerView.ViewHolder] types used by this adapter.\n */\nsealed class SpeakerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {\n\n    class SpeakerInfoViewHolder(\n        val binding: ItemSpeakerInfoBinding\n    ) : SpeakerViewHolder(binding.root)\n\n    class SpeakerSessionViewHolder(\n        val binding: ItemSessionBinding\n    ) : SpeakerViewHolder(binding.root)\n\n    class HeaderViewHolder(\n        val binding: ItemGenericSectionHeaderBinding\n    ) : SpeakerViewHolder(binding.root)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerBindingAdapters.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.speaker\n\nimport android.annotation.SuppressLint\nimport android.graphics.drawable.Drawable\nimport android.widget.ImageView\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.DataSource\nimport com.bumptech.glide.load.engine.GlideException\nimport com.bumptech.glide.request.RequestListener\nimport com.bumptech.glide.request.RequestOptions\nimport com.bumptech.glide.request.target.Target\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Speaker\n\n/**\n * Loads a [Speaker]'s photo or picks a default avatar if no photo is specified.\n */\n@SuppressLint(\"CheckResult\")\n@BindingAdapter(value = [\"speakerImage\", \"listener\"], requireAll = false)\nfun speakerImage(\n    imageView: ImageView,\n    speaker: Speaker?,\n    listener: ImageLoadListener?\n) {\n    speaker ?: return\n\n    // Want a 'random' default avatar but should be stable as used on both session details &\n    // speaker detail screens (as a shared element transition), so use id to pick.\n    val placeholderId = when (speaker.id.hashCode() % 3) {\n        0 -> R.drawable.ic_default_avatar_1\n        1 -> R.drawable.ic_default_avatar_2\n        else -> R.drawable.ic_default_avatar_3\n    }\n\n    if (speaker.imageUrl.isBlank()) {\n        imageView.setImageResource(placeholderId)\n    } else {\n        val imageLoad = Glide.with(imageView)\n            .load(speaker.imageUrl)\n            .apply(\n                RequestOptions()\n                    .placeholder(placeholderId)\n                    .circleCrop()\n            )\n        if (listener != null) {\n            imageLoad.listener(object : RequestListener<Drawable> {\n                override fun onResourceReady(\n                    resource: Drawable?,\n                    model: Any?,\n                    target: Target<Drawable>?,\n                    dataSource: DataSource?,\n                    isFirstResource: Boolean\n                ): Boolean {\n                    listener.onImageLoaded()\n                    return false\n                }\n\n                override fun onLoadFailed(\n                    e: GlideException?,\n                    model: Any?,\n                    target: Target<Drawable>?,\n                    isFirstResource: Boolean\n                ): Boolean {\n                    listener.onImageLoadFailed()\n                    return false\n                }\n            })\n        }\n        imageLoad.into(imageView)\n    }\n}\n\n/**\n * An interface for responding to image loading completion.\n */\ninterface ImageLoadListener {\n    fun onImageLoaded()\n    fun onImageLoadFailed()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerFragment.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.speaker\n\nimport android.os.Bundle\nimport android.view.ContextThemeWrapper\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.doOnNextLayout\nimport androidx.core.view.updatePadding\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.navigation.fragment.findNavController\nimport androidx.recyclerview.widget.RecyclerView.RecycledViewPool\nimport androidx.transition.TransitionInflater\nimport com.google.android.material.appbar.AppBarLayout\nimport com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.databinding.FragmentSpeakerBinding\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneViewModel\nimport com.google.samples.apps.iosched.util.doOnApplyWindowInsets\nimport com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle\nimport com.google.samples.apps.iosched.util.setContentMaxWidth\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport javax.inject.Named\n\n/**\n * Fragment displaying speaker details and their events.\n */\n@AndroidEntryPoint\nclass SpeakerFragment : Fragment(), OnOffsetChangedListener {\n\n    @Inject lateinit var snackbarMessageManager: SnackbarMessageManager\n\n    @Inject lateinit var analyticsHelper: AnalyticsHelper\n\n    @Inject\n    @Named(\"tagViewPool\")\n    lateinit var tagRecycledViewPool: RecycledViewPool\n\n    private val speakerViewModel: SpeakerViewModel by viewModels()\n    private val scheduleTwoPaneViewModel: ScheduleTwoPaneViewModel by activityViewModels()\n\n    private lateinit var binding: FragmentSpeakerBinding\n\n    private var toolbarCollapsed = false\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n\n        sharedElementEnterTransition = TransitionInflater.from(requireContext())\n            .inflateTransition(R.transition.speaker_shared_enter)\n        // Delay the enter transition until speaker image has loaded.\n        postponeEnterTransition(500L, TimeUnit.MILLISECONDS)\n\n        val imageLoadListener = object : ImageLoadListener {\n            override fun onImageLoaded() {\n                startPostponedEnterTransition()\n            }\n\n            override fun onImageLoadFailed() {\n                startPostponedEnterTransition()\n            }\n        }\n\n        val themedInflater =\n            inflater.cloneInContext(ContextThemeWrapper(requireActivity(), R.style.AppTheme_Detail))\n        binding = FragmentSpeakerBinding.inflate(themedInflater, container, false).apply {\n            lifecycleOwner = viewLifecycleOwner\n            headshotLoadListener = imageLoadListener\n            viewModel = speakerViewModel\n        }\n\n        val speakerAdapter = SpeakerAdapter(\n            viewLifecycleOwner,\n            speakerViewModel,\n            scheduleTwoPaneViewModel,\n            tagRecycledViewPool\n        )\n        binding.speakerDetailRecyclerView.run {\n            adapter = speakerAdapter\n            itemAnimator?.run {\n                addDuration = 120L\n                moveDuration = 120L\n                changeDuration = 120L\n                removeDuration = 100L\n            }\n            doOnApplyWindowInsets { view, insets, padding ->\n                val systemInsets = insets.getInsets(\n                    WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()\n                )\n                view.updatePadding(bottom = padding.bottom + systemInsets.bottom)\n                // CollapsingToolbarLayout's default scrim visible trigger height is a bit large.\n                // Choose something smaller so that the content stays visible longer.\n                binding.collapsingToolbar.scrimVisibleHeightTrigger = systemInsets.top * 2\n            }\n            doOnNextLayout {\n                setContentMaxWidth(this)\n            }\n        }\n\n        binding.toolbar.setNavigationOnClickListener {\n            findNavController().navigateUp()\n        }\n\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        launchAndRepeatWithViewLifecycle {\n            launch {\n                speakerViewModel.speaker.collect {\n                    if (it != null) {\n                        val pageName = \"Speaker Details: ${it.name}\"\n                        analyticsHelper.sendScreenView(pageName, requireActivity())\n                    }\n                }\n            }\n\n            launch {\n                speakerViewModel.speakerUserSessions.collect {\n                    (binding.speakerDetailRecyclerView.adapter as SpeakerAdapter)\n                        .speakerSessions = it\n                }\n            }\n\n            // If speaker does not have a profile image to load, we need to resume.\n            launch {\n                speakerViewModel.hasNoProfileImage.collect {\n                    if (it) {\n                        startPostponedEnterTransition()\n                    }\n                }\n            }\n        }\n    }\n\n    override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {\n        val collapsed = (-verticalOffset >= appBarLayout.totalScrollRange)\n        if (collapsed != toolbarCollapsed) {\n            toolbarCollapsed = collapsed\n            // We have transparent status bar, so we don't use CollapsingToolbarLayout's\n            // statusBarScrim. Instead fade out the views when collapsed.\n            val alpha = if (collapsed) 0f else 1f\n            binding.toolbar.animate().alpha(alpha).start()\n            binding.speakerImage.animate().alpha(alpha).start()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerViewModel.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.speaker\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.model.Speaker\nimport com.google.samples.apps.iosched.model.SpeakerId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionsUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.domain.speakers.LoadSpeakerUseCase\nimport com.google.samples.apps.iosched.shared.domain.speakers.LoadSpeakerUseCaseResult\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.util.WhileViewSubscribed\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.mapLatest\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.flow.transformLatest\nimport org.threeten.bp.ZoneId\nimport javax.inject.Inject\n\n/**\n * Loads a [Speaker] and their sessions, handles event actions.\n */\n@HiltViewModel\nclass SpeakerViewModel @Inject constructor(\n    savedStateHandle: SavedStateHandle,\n    private val loadSpeakerUseCase: LoadSpeakerUseCase,\n    private val loadSpeakerSessionsUseCase: LoadUserSessionsUseCase,\n    getTimeZoneUseCase: GetTimeZoneUseCase,\n    signInViewModelDelegate: SignInViewModelDelegate,\n    private val onSessionStarClickDelegate: OnSessionStarClickDelegate\n) : ViewModel(),\n    SignInViewModelDelegate by signInViewModelDelegate,\n    OnSessionStarClickDelegate by onSessionStarClickDelegate {\n\n    // TODO: remove hardcoded string when https://issuetracker.google.com/136967621 is available\n    private val speakerId: SpeakerId? = savedStateHandle.get<SpeakerId>(\"speaker_id\")\n\n    private val loadSpeakerUseCaseResult: StateFlow<Result<LoadSpeakerUseCaseResult>> =\n        flow {\n            speakerId?.let { emit(loadSpeakerUseCase(speakerId)) }\n        }.stateIn(viewModelScope, SharingStarted.Eagerly, Loading)\n\n    val speakerUserSessions: StateFlow<List<UserSession>> =\n        loadSpeakerUseCaseResult.transformLatest { speaker ->\n            speaker.data?.let {\n                loadSpeakerSessionsUseCase(it.speaker.id to it.sessionIds).collect {\n                    it.data?.let { data ->\n                        emit(data)\n                    }\n                }\n            }\n        }.stateIn(viewModelScope, WhileViewSubscribed, emptyList())\n\n    val speaker: StateFlow<Speaker?> = loadSpeakerUseCaseResult.mapLatest {\n        it.data?.speaker\n    }.stateIn(viewModelScope, WhileViewSubscribed, null)\n\n    val hasNoProfileImage: StateFlow<Boolean> = loadSpeakerUseCaseResult.mapLatest {\n        it.data?.speaker?.imageUrl.isNullOrEmpty()\n    }.stateIn(viewModelScope, WhileViewSubscribed, true)\n\n    // Exposed to the view as a StateFlow but it's a one-shot operation.\n    val timeZoneId = flow<ZoneId> {\n        if (getTimeZoneUseCase(Unit).successOr(true)) {\n            emit(TimeUtils.CONFERENCE_TIMEZONE)\n        } else {\n            emit(ZoneId.systemDefault())\n        }\n    }.stateIn(viewModelScope, SharingStarted.Lazily, TimeUtils.CONFERENCE_TIMEZONE)\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/theme/ThemeViewModel.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.theme\n\nimport androidx.lifecycle.ViewModel\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\n\n/**\n * Thin ViewModel for themed Activities that don't have another ViewModel to use with\n * [ThemedActivityDelegate].\n */\n@HiltViewModel\nclass ThemeViewModel @Inject constructor(\n    themedActivityDelegate: ThemedActivityDelegate\n) : ViewModel(), ThemedActivityDelegate by themedActivityDelegate\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/theme/ThemedActivityDelegate.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.theme\n\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.domain.settings.GetThemeUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.ObserveThemeModeUseCase\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.runBlocking\nimport javax.inject.Inject\n\n/**\n * Interface to implement activity theming via a ViewModel.\n *\n * You can inject a implementation of this via Dagger2, then use the implementation as an interface\n * delegate to add the functionality without writing any code\n *\n * Example usage:\n * ```\n * class MyViewModel @Inject constructor(\n *     themedActivityDelegate: ThemedActivityDelegate\n * ) : ViewModel(), ThemedActivityDelegate by themedActivityDelegate {\n * ```\n */\ninterface ThemedActivityDelegate {\n    /**\n     * Allows observing of the current theme\n     */\n    val theme: StateFlow<Theme>\n\n    /**\n     * Allows querying of the current theme synchronously\n     */\n    val currentTheme: Theme\n}\n\nclass ThemedActivityDelegateImpl @Inject constructor(\n    @ApplicationScope externalScope: CoroutineScope,\n    observeThemeUseCase: ObserveThemeModeUseCase,\n    private val getThemeUseCase: GetThemeUseCase\n) : ThemedActivityDelegate {\n\n    override val theme: StateFlow<Theme> = observeThemeUseCase(Unit).map {\n        it.successOr(Theme.SYSTEM)\n    }.stateIn(externalScope, SharingStarted.Eagerly, Theme.SYSTEM)\n\n    override val currentTheme: Theme\n        get() = runBlocking { // Using runBlocking to execute this coroutine synchronously\n            getThemeUseCase(Unit).let {\n                if (it is Success) it.data else Theme.SYSTEM\n            }\n        }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/ui/theme/ThemedActivityDelegateModule.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.theme\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\n@Suppress(\"UNUSED\")\nabstract class ThemedActivityDelegateModule {\n\n    @Singleton\n    @Binds\n    abstract fun provideThemedActivityDelegate(\n        impl: ThemedActivityDelegateImpl\n    ): ThemedActivityDelegate\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/CircularOutlineProvider.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.graphics.Outline\nimport android.view.View\nimport android.view.ViewOutlineProvider\n\nobject CircularOutlineProvider : ViewOutlineProvider() {\n    override fun getOutline(view: View, outline: Outline) {\n        outline.setOval(\n            view.paddingLeft,\n            view.paddingTop,\n            view.width - view.paddingRight,\n            view.height - view.paddingBottom\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/CrashlyticsTree.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.util.Log\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport timber.log.Timber\n\nclass CrashlyticsTree : Timber.Tree() {\n\n    override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {\n        if (priority == Log.VERBOSE || priority == Log.DEBUG || priority == Log.INFO) {\n            return\n        }\n        val crashlytics = FirebaseCrashlytics.getInstance()\n        crashlytics.setCustomKey(CRASHLYTICS_KEY_PRIORITY, priority)\n        crashlytics.setCustomKey(CRASHLYTICS_KEY_TAG, tag ?: \"\")\n        crashlytics.setCustomKey(CRASHLYTICS_KEY_MESSAGE, message)\n\n        if (t == null) {\n            crashlytics.recordException(Exception(message))\n        } else {\n            crashlytics.recordException(t)\n        }\n    }\n\n    companion object {\n        private const val CRASHLYTICS_KEY_PRIORITY = \"priority\"\n        private const val CRASHLYTICS_KEY_TAG = \"tag\"\n        private const val CRASHLYTICS_KEY_MESSAGE = \"message\"\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/Extensions.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.res.Resources\nimport android.content.res.TypedArray\nimport android.graphics.Typeface\nimport android.net.wifi.WifiConfiguration\nimport android.os.Build\nimport android.text.Layout.Alignment\nimport android.text.Spannable\nimport android.text.SpannableString\nimport android.text.Spanned\nimport android.text.StaticLayout\nimport android.text.TextPaint\nimport android.text.style.StyleSpan\nimport android.util.TypedValue\nimport android.view.View\nimport android.view.View.OnAttachStateChangeListener\nimport androidx.annotation.ColorInt\nimport androidx.annotation.DimenRes\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.app.AppCompatDelegate\nimport androidx.core.content.res.ResourcesCompat\nimport androidx.core.os.BuildCompat\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.databinding.ObservableBoolean\nimport androidx.databinding.ViewDataBinding\nimport androidx.drawerlayout.widget.DrawerLayout\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MediatorLiveData\nimport com.google.samples.apps.iosched.model.Theme\n\nfun ObservableBoolean.hasSameValue(other: ObservableBoolean) = get() == other.get()\n\nfun Int.isEven() = this % 2 == 0\n\nfun View.isRtl() = layoutDirection == View.LAYOUT_DIRECTION_RTL\n\ninline fun <T : ViewDataBinding> T.executeAfter(block: T.() -> Unit) {\n    block()\n    executePendingBindings()\n}\n\n/**\n * Calculated the widest line in a [StaticLayout].\n */\nfun StaticLayout.textWidth(): Int {\n    var width = 0f\n    for (i in 0 until lineCount) {\n        width = width.coerceAtLeast(getLineWidth(i))\n    }\n    return width.toInt()\n}\n\nfun newStaticLayout(\n    source: CharSequence,\n    paint: TextPaint,\n    width: Int,\n    alignment: Alignment,\n    spacingmult: Float,\n    spacingadd: Float,\n    includepad: Boolean\n): StaticLayout {\n    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n        StaticLayout.Builder.obtain(source, 0, source.length, paint, width).apply {\n            setAlignment(alignment)\n            setLineSpacing(spacingadd, spacingmult)\n            setIncludePad(includepad)\n        }.build()\n    } else {\n        @Suppress(\"DEPRECATION\")\n        StaticLayout(source, paint, width, alignment, spacingmult, spacingadd, includepad)\n    }\n}\n\n/**\n * Linearly interpolate between two values.\n */\nfun lerp(a: Float, b: Float, t: Float): Float {\n    return a + (b - a) * t\n}\n\n/**\n * Alternative to Resources.getDimension() for values that are TYPE_FLOAT.\n */\nfun Resources.getFloatUsingCompat(@DimenRes resId: Int): Float {\n    return ResourcesCompat.getFloat(this, resId)\n}\n\n/**\n * Return the Wifi config wrapped in quotes.\n */\nfun WifiConfiguration.quoteSsidAndPassword(): WifiConfiguration {\n    return WifiConfiguration().apply {\n        SSID = this@quoteSsidAndPassword.SSID.wrapInQuotes()\n        preSharedKey = this@quoteSsidAndPassword.preSharedKey.wrapInQuotes()\n    }\n}\n\n/**\n * Return the Wifi config without quotes.\n */\nfun WifiConfiguration.unquoteSsidAndPassword(): WifiConfiguration {\n    return WifiConfiguration().apply {\n        SSID = this@unquoteSsidAndPassword.SSID.unwrapQuotes()\n        preSharedKey = this@unquoteSsidAndPassword.preSharedKey.unwrapQuotes()\n    }\n}\n\nfun String.wrapInQuotes(): String {\n    var formattedConfigString: String = this\n    if (!startsWith(\"\\\"\")) {\n        formattedConfigString = \"\\\"$formattedConfigString\"\n    }\n    if (!endsWith(\"\\\"\")) {\n        formattedConfigString = \"$formattedConfigString\\\"\"\n    }\n    return formattedConfigString\n}\n\nfun String.unwrapQuotes(): String {\n    var formattedConfigString: String = this\n    if (formattedConfigString.startsWith(\"\\\"\")) {\n        if (formattedConfigString.length > 1) {\n            formattedConfigString = formattedConfigString.substring(1)\n        } else {\n            formattedConfigString = \"\"\n        }\n    }\n    if (formattedConfigString.endsWith(\"\\\"\")) {\n        if (formattedConfigString.length > 1) {\n            formattedConfigString =\n                formattedConfigString.substring(0, formattedConfigString.length - 1)\n        } else {\n            formattedConfigString = \"\"\n        }\n    }\n    return formattedConfigString\n}\n\n/** Make the first instance of [boldText] in a CharSequece bold. */\nfun CharSequence.makeBold(boldText: String): CharSequence {\n    val start = indexOf(boldText)\n    val end = start + boldText.length\n    val span = StyleSpan(Typeface.BOLD)\n    return if (this is Spannable) {\n        setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)\n        this\n    } else {\n        SpannableString(this).apply {\n            setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)\n        }\n    }\n}\n\n/**\n * Having to suppress lint. Bug raised: 128789886\n */\n@SuppressLint(\"WrongConstant\")\nfun AppCompatActivity.updateForTheme(theme: Theme) = when (theme) {\n    Theme.DARK -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES\n    Theme.LIGHT -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_NO\n    Theme.SYSTEM -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM\n    Theme.BATTERY_SAVER -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY\n}\n\n/**\n * Combines this [LiveData] with another [LiveData] using the specified [combiner] and returns the\n * result as a [LiveData].\n */\nfun <A, B, Result> LiveData<A>.combine(\n    other: LiveData<B>,\n    combiner: (A, B) -> Result\n): LiveData<Result> {\n    val result = MediatorLiveData<Result>()\n    result.addSource(this) { a ->\n        val b = other.value\n        if (b != null) {\n            result.postValue(combiner(a, b))\n        }\n    }\n    result.addSource(other) { b ->\n        val a = this@combine.value\n        if (a != null) {\n            result.postValue(combiner(a, b))\n        }\n    }\n    return result\n}\n\n/**\n * Combines this [LiveData] with other two [LiveData]s using the specified [combiner] and returns\n * the result as a [LiveData].\n */\nfun <A, B, C, Result> LiveData<A>.combine(\n    other1: LiveData<B>,\n    other2: LiveData<C>,\n    combiner: (A, B, C) -> Result\n): LiveData<Result> {\n    val result = MediatorLiveData<Result>()\n    result.addSource(this) { a ->\n        val b = other1.value\n        val c = other2.value\n        if (b != null && c != null) {\n            result.postValue(combiner(a, b, c))\n        }\n    }\n    result.addSource(other1) { b ->\n        val a = this@combine.value\n        val c = other2.value\n        if (a != null && c != null) {\n            result.postValue(combiner(a, b, c))\n        }\n    }\n    result.addSource(other2) { c ->\n        val a = this@combine.value\n        val b = other1.value\n        if (a != null && b != null) {\n            result.postValue(combiner(a, b, c))\n        }\n    }\n    return result\n}\n\nfun View.doOnApplyWindowInsets(f: (View, WindowInsetsCompat, ViewPaddingState) -> Unit) {\n    // Create a snapshot of the view's padding state\n    val paddingState = createStateForView(this)\n    ViewCompat.setOnApplyWindowInsetsListener(this) { v, insets ->\n        f(v, insets, paddingState)\n        insets\n    }\n    requestApplyInsetsWhenAttached()\n}\n\n/**\n * Call [View.requestApplyInsets] in a safe away. If we're attached it calls it straight-away.\n * If not it sets an [View.OnAttachStateChangeListener] and waits to be attached before calling\n * [View.requestApplyInsets].\n */\nfun View.requestApplyInsetsWhenAttached() {\n    if (isAttachedToWindow) {\n        requestApplyInsets()\n    } else {\n        addOnAttachStateChangeListener(object : OnAttachStateChangeListener {\n            override fun onViewAttachedToWindow(v: View) {\n                v.requestApplyInsets()\n            }\n\n            override fun onViewDetachedFromWindow(v: View) = Unit\n        })\n    }\n}\n\nprivate fun createStateForView(view: View) = ViewPaddingState(\n    view.paddingLeft,\n    view.paddingTop,\n    view.paddingRight,\n    view.paddingBottom,\n    view.paddingStart,\n    view.paddingEnd\n)\n\ndata class ViewPaddingState(\n    val left: Int,\n    val top: Int,\n    val right: Int,\n    val bottom: Int,\n    val start: Int,\n    val end: Int\n)\n\n@SuppressLint(\"NewApi\") // Lint does not understand isAtLeastQ currently\nfun DrawerLayout.shouldCloseDrawerFromBackPress(): Boolean {\n    if (BuildCompat.isAtLeastQ()) {\n        // If we're running on Q, and this call to closeDrawers is from a key event\n        // (for back handling), we should only honor it IF the device is not currently\n        // in gesture mode. We approximate that by checking the system gesture insets\n        return rootWindowInsets?.let {\n            val systemGestureInsets = it.systemGestureInsets\n            return systemGestureInsets.left == 0 && systemGestureInsets.right == 0\n        } ?: false\n    }\n    // On P and earlier, always close the drawer\n    return true\n}\n\n/** Compatibility removeIf since it was added in API 24 */\nfun <T> MutableCollection<T>.compatRemoveIf(predicate: (T) -> Boolean): Boolean {\n    val it = iterator()\n    var removed = false\n    while (it.hasNext()) {\n        if (predicate(it.next())) {\n            it.remove()\n            removed = true\n        }\n    }\n    return removed\n}\n\n/** Reads the color attribute from the theme for given [colorAttributeId] */\nfun Context.getColorFromTheme(colorAttributeId: Int): Int {\n    val typedValue = TypedValue()\n    val typedArray: TypedArray =\n        this.obtainStyledAttributes(\n            typedValue.data, intArrayOf(colorAttributeId)\n        )\n    @ColorInt val color = typedArray.getColor(0, 0)\n    typedArray.recycle()\n    return color\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/FirebaseAnalyticsHelper.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.app.Activity\nimport com.google.firebase.analytics.FirebaseAnalytics\nimport com.google.firebase.analytics.ktx.analytics\nimport com.google.firebase.analytics.ktx.logEvent\nimport com.google.firebase.ktx.Firebase\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsActions\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_CODELABS_INFO_SHOWN\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_CONFERENCE_TIME_ZONE\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_MY_LOCATION_OPTED_IN\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_NOTIFICATIONS_SHOWN\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_ONBOARDING\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_RECEIVE_NOTIFICATIONS\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_SEND_USAGE_STATISTICS\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.flattenMerge\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\n\n/**\n * Firebase Analytics implementation of AnalyticsHelper\n */\nclass FirebaseAnalyticsHelper(\n    @ApplicationScope private val externalScope: CoroutineScope,\n    signInViewModelDelegate: SignInViewModelDelegate,\n    private val preferenceStorage: PreferenceStorage\n) : AnalyticsHelper {\n\n    private var firebaseAnalytics = Firebase.analytics\n\n    private var analyticsEnabled: Flow<Boolean> = preferenceStorage.sendUsageStatistics\n\n    /**\n     * Initialize Analytics tracker.  If the user has permitted tracking and has already signed TOS,\n     * (possible except on first run), initialize analytics Immediately.\n     */\n    init {\n        externalScope.launch { // Prevent access to preferences on main thread\n            analyticsEnabled.collect {\n                Timber.d(\"Setting Analytics enabled: $it\")\n                firebaseAnalytics.setAnalyticsCollectionEnabled(it)\n            }\n            // The listener will initialize Analytics when the TOS is signed, or enable/disable\n            // Analytics based on the \"anonymous data collection\" setting.\n            logSendUsageStatsFlagChanges()\n        }\n\n        externalScope.launch {\n            // The listener will initialize Analytics when the TOS is signed, or enable/disable\n            // Analytics based on the \"anonymous data collection\" setting.\n            logSendUsageStatsFlagChanges()\n        }\n\n        externalScope.launch {\n            signInViewModelDelegate.isUserSignedIn.collect { signedIn ->\n                setUserSignedIn(signedIn)\n                Timber.d(\"Updated user signed in to $signedIn\")\n            }\n        }\n        externalScope.launch {\n            signInViewModelDelegate.isUserRegistered.collect { registered ->\n                setUserRegistered(registered)\n                Timber.d(\"Updated user registered to $registered\")\n            }\n        }\n    }\n\n    override fun sendScreenView(screenName: String, activity: Activity) {\n        firebaseAnalytics.run {\n            setCurrentScreen(activity, screenName, null)\n            logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {\n                param(FirebaseAnalytics.Param.ITEM_ID, screenName)\n                param(FirebaseAnalytics.Param.CONTENT_TYPE, FA_CONTENT_TYPE_SCREENVIEW)\n            }\n            Timber.d(\"Screen View recorded: $screenName\")\n        }\n    }\n\n    override fun logUiEvent(itemId: String, action: String) {\n        firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {\n            param(FirebaseAnalytics.Param.ITEM_ID, itemId)\n            param(FirebaseAnalytics.Param.CONTENT_TYPE, FA_CONTENT_TYPE_UI_EVENT)\n            param(FA_KEY_UI_ACTION, action)\n        }\n        Timber.d(\"Event recorded for $itemId, $action\")\n    }\n\n    override fun setUserSignedIn(isSignedIn: Boolean) {\n        // todo(alexlucas) : Set up user properties in both dev and prod\n        firebaseAnalytics.setUserProperty(UPROP_USER_SIGNED_IN, isSignedIn.toString())\n    }\n\n    override fun setUserRegistered(isRegistered: Boolean) {\n        // todo(alexlucas) : Set up user properties in both dev and prod\n        firebaseAnalytics.setUserProperty(UPROP_USER_REGISTERED, isRegistered.toString())\n    }\n\n    /**\n     * Set up a listener for preference changes.\n     */\n    private suspend fun logSendUsageStatsFlagChanges() {\n        // not logged: showScheduleUiHints, selectedFilters, selectedTheme\n        flowOf(\n            preferenceStorage.codelabsInfoShown.map { PREF_CODELABS_INFO_SHOWN.name to it },\n            preferenceStorage.myLocationOptedIn.map { PREF_MY_LOCATION_OPTED_IN.name to it },\n            preferenceStorage.notificationsPreferenceShown.map {\n                PREF_NOTIFICATIONS_SHOWN.name to it\n            },\n            preferenceStorage.onboardingCompleted.map { PREF_ONBOARDING.name to it },\n            preferenceStorage.preferConferenceTimeZone.map { PREF_CONFERENCE_TIME_ZONE.name to it },\n            preferenceStorage.preferToReceiveNotifications.map {\n                PREF_RECEIVE_NOTIFICATIONS.name to it\n            },\n            preferenceStorage.sendUsageStatistics.map { PREF_SEND_USAGE_STATISTICS.name to it }\n        ).flattenMerge().collect { (key, value) ->\n            val action = if (value) AnalyticsActions.ENABLE else AnalyticsActions.DISABLE\n            logUiEvent(\"Preference: $key\", action)\n        }\n    }\n\n    companion object {\n        private const val UPROP_USER_SIGNED_IN = \"user_signed_in\"\n        private const val UPROP_USER_REGISTERED = \"user_registered\"\n\n        /**\n         * Log a specific screen view under the `screenName` string.\n         */\n        private const val FA_CONTENT_TYPE_SCREENVIEW = \"screen\"\n        private const val FA_KEY_UI_ACTION = \"ui_action\"\n        private const val FA_CONTENT_TYPE_UI_EVENT = \"ui event\"\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/GlideTargets.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.graphics.drawable.Drawable\nimport android.view.MenuItem\nimport com.bumptech.glide.request.target.BaseTarget\nimport com.bumptech.glide.request.target.SizeReadyCallback\nimport com.bumptech.glide.request.target.Target\nimport com.bumptech.glide.request.transition.Transition\n\nfun MenuItem.asGlideTarget(size: Int): Target<Drawable> = object : BaseTarget<Drawable>() {\n\n    override fun getSize(cb: SizeReadyCallback) {\n        cb.onSizeReady(size, size)\n    }\n\n    override fun removeCallback(cb: SizeReadyCallback) {}\n\n    override fun onLoadStarted(placeholder: Drawable?) {\n        icon = placeholder\n    }\n\n    override fun onLoadFailed(errorDrawable: Drawable?) {\n        icon = errorDrawable\n    }\n\n    override fun onLoadCleared(placeholder: Drawable?) {\n        icon = placeholder\n    }\n\n    override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {\n        icon = resource\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/NavigationBarScrimBehavior.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport androidx.annotation.Keep\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport androidx.core.view.WindowInsetsCompat\nimport com.google.android.material.bottomappbar.BottomAppBar\n\n@Keep\n@Suppress(\"UNUSED\")\nclass NavigationBarScrimBehavior(\n    context: Context,\n    attrs: AttributeSet\n) : CoordinatorLayout.Behavior<View>(context, attrs) {\n    override fun onLayoutChild(\n        parent: CoordinatorLayout,\n        child: View,\n        layoutDirection: Int\n    ): Boolean {\n        child.setOnApplyWindowInsetsListener(NoopWindowInsetsListener)\n        // Return false so that the child is laid out by the parent\n        return false\n    }\n\n    override fun layoutDependsOn(\n        parent: CoordinatorLayout,\n        child: View,\n        dependency: View\n    ): Boolean {\n        if (dependency is BottomAppBar) {\n            // Copy over the elevation value\n            child.elevation = dependency.elevation\n            return true\n        }\n        return false\n    }\n\n    override fun onDependentViewChanged(\n        parent: CoordinatorLayout,\n        child: View,\n        dependency: View\n    ): Boolean {\n        child.elevation = dependency.elevation\n        return false\n    }\n\n    override fun onApplyWindowInsets(\n        parent: CoordinatorLayout,\n        child: View,\n        insets: WindowInsetsCompat\n    ): WindowInsetsCompat {\n        child.layoutParams.height = insets.systemWindowInsetBottom\n        child.requestLayout()\n        return insets\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/RecyclerViewExtensions.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport androidx.recyclerview.widget.RecyclerView\n\nfun RecyclerView.clearDecorations() {\n    if (itemDecorationCount > 0) {\n        for (i in itemDecorationCount - 1 downTo 0) {\n            removeItemDecorationAt(i)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/SharingStartedViews.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport kotlinx.coroutines.flow.SharingStarted\n\nprivate const val StopTimeoutMillis: Long = 5000\n\n/**\n * A [SharingStarted] meant to be used with a [StateFlow] to expose data to a view.\n *\n * When the view stops observing, upstream flows stay active for some time to allow the system to\n * come back from a short-lived configuration change (such as rotations). If the view stops\n * observing for longer, the cache is kept but the upstream flows are stopped. When the view comes\n * back, the latest value is replayed and the upstream flows are executed again. This is done to\n * save resources when the app is in the background but let users switch between apps quickly.\n */\nval WhileViewSubscribed: SharingStarted = SharingStarted.WhileSubscribed(StopTimeoutMillis)\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/StatusBarScrimBehavior.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport androidx.annotation.Keep\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport androidx.core.view.WindowInsetsCompat\nimport com.google.android.material.appbar.AppBarLayout\n\n@Keep\n@Suppress(\"UNUSED\")\nclass StatusBarScrimBehavior(\n    context: Context,\n    attrs: AttributeSet\n) : CoordinatorLayout.Behavior<View>(context, attrs) {\n    override fun onLayoutChild(\n        parent: CoordinatorLayout,\n        child: View,\n        layoutDirection: Int\n    ): Boolean {\n        child.setOnApplyWindowInsetsListener(NoopWindowInsetsListener)\n        // Return false so that the child is laid out by the parent\n        return false\n    }\n\n    override fun layoutDependsOn(\n        parent: CoordinatorLayout,\n        child: View,\n        dependency: View\n    ): Boolean {\n        if (dependency is AppBarLayout) {\n            // Jump the drawable state in case the elevation is animating\n            dependency.jumpDrawablesToCurrentState()\n            // Copy over the elevation value\n            child.elevation = dependency.elevation\n            return true\n        }\n        return false\n    }\n\n    override fun onDependentViewChanged(\n        parent: CoordinatorLayout,\n        child: View,\n        dependency: View\n    ): Boolean {\n        child.elevation = dependency.elevation\n        return false\n    }\n\n    override fun onApplyWindowInsets(\n        parent: CoordinatorLayout,\n        child: View,\n        insets: WindowInsetsCompat\n    ): WindowInsetsCompat {\n        child.layoutParams.height = insets.systemWindowInsetTop\n        child.requestLayout()\n        return insets\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/UiUtils.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.content.Context\nimport android.graphics.drawable.Drawable\nimport android.view.View\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.core.graphics.drawable.DrawableCompat\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.samples.apps.iosched.R\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\n\nfun navigationItemBackground(context: Context): Drawable? {\n    // Need to inflate the drawable and CSL via AppCompatResources to work on Lollipop\n    var background =\n        AppCompatResources.getDrawable(context, R.drawable.navigation_item_background)\n    if (background != null) {\n        val tint = AppCompatResources.getColorStateList(\n            context, R.color.navigation_item_background_tint\n        )\n        background = DrawableCompat.wrap(background.mutate())\n        background.setTintList(tint)\n    }\n    return background\n}\n\n/**\n * Map a slideOffset (in the range `[-1, 1]`) to an alpha value based on the desired range.\n * For example, `slideOffsetToAlpha(0.5, 0.25, 1) = 0.33` because 0.5 is 1/3 of the way between\n * 0.25 and 1. The result value is additionally clamped to the range `[0, 1]`.\n */\nfun slideOffsetToAlpha(value: Float, rangeMin: Float, rangeMax: Float): Float {\n    return ((value - rangeMin) / (rangeMax - rangeMin)).coerceIn(0f, 1f)\n}\n\n/**\n * Launches a new coroutine and repeats `block` every time the Fragment's viewLifecycleOwner\n * is in and out of `minActiveState` lifecycle state.\n */\ninline fun Fragment.launchAndRepeatWithViewLifecycle(\n    minActiveState: Lifecycle.State = Lifecycle.State.STARTED,\n    crossinline block: suspend CoroutineScope.() -> Unit\n) {\n    viewLifecycleOwner.lifecycleScope.launch {\n        viewLifecycleOwner.lifecycle.repeatOnLifecycle(minActiveState) {\n            block()\n        }\n    }\n}\n\n/**\n * Set the maximum width the view should take as a percent of its parent. The view must a direct\n * child of a ConstraintLayout.\n */\nfun setContentMaxWidth(view: View) {\n    val parent = view.parent as? ConstraintLayout ?: return\n    val layoutParams = view.layoutParams as ConstraintLayout.LayoutParams\n    val screenDensity = view.resources.displayMetrics.density\n    val widthDp = parent.width / screenDensity\n    val widthPercent = getContextMaxWidthPercent(widthDp.toInt())\n    layoutParams.matchConstraintPercentWidth = widthPercent\n    view.requestLayout()\n}\n\nprivate fun getContextMaxWidthPercent(maxWidthDp: Int): Float {\n    // These match @dimen/content_max_width_percent.\n    return when {\n        maxWidthDp >= 1024 -> 0.6f\n        maxWidthDp >= 840 -> 0.7f\n        maxWidthDp >= 600 -> 0.8f\n        else -> 1f\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/ViewBindingAdapters.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport android.view.View\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.annotation.StringRes\nimport androidx.browser.customtabs.CustomTabsIntent\nimport androidx.browser.customtabs.CustomTabsService\nimport androidx.core.net.toUri\nimport androidx.core.view.isVisible\nimport androidx.databinding.BindingAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.viewpager2.widget.MarginPageTransformer\nimport androidx.viewpager2.widget.ViewPager2\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.RequestOptions\nimport com.google.android.material.color.MaterialColors\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.model.Theme.DARK\nimport com.google.samples.apps.iosched.widget.CustomSwipeRefreshLayout\nimport com.google.samples.apps.iosched.widget.SpaceDecoration\nimport timber.log.Timber\n\n@BindingAdapter(\"goneUnless\")\nfun goneUnless(view: View, visible: Boolean) {\n    view.visibility = if (visible) VISIBLE else GONE\n}\n\n@BindingAdapter(\"fabVisibility\")\nfun fabVisibility(fab: FloatingActionButton, visible: Boolean) {\n    if (visible) fab.show() else fab.hide()\n}\n\n@BindingAdapter(\"pageMargin\")\nfun pageMargin(viewPager: ViewPager2, pageMargin: Float) {\n    viewPager.setPageTransformer(MarginPageTransformer(pageMargin.toInt()))\n}\n\n@BindingAdapter(\"clipToCircle\")\nfun clipToCircle(view: View, clip: Boolean) {\n    view.clipToOutline = clip\n    view.outlineProvider = if (clip) CircularOutlineProvider else null\n}\n\n@BindingAdapter(\n    value = [\n        \"momentImageUrl\",\n        \"momentImageUrlDarkTheme\",\n        \"momentTheme\"\n    ],\n    requireAll = false\n)\nfun momentImageUrl(\n    imageView: ImageView,\n    momentImageUrl: String?,\n    momentImageUrlDarkTheme: String?,\n    momentTheme: Theme?\n) {\n    when (momentTheme) {\n        DARK -> imageUri(imageView, momentImageUrlDarkTheme?.toUri(), null)\n        else -> imageUri(imageView, momentImageUrl?.toUri(), null)\n    }\n}\n\n@BindingAdapter(value = [\"imageUri\", \"placeholder\"], requireAll = false)\nfun imageUri(imageView: ImageView, imageUri: Uri?, placeholder: Drawable?) {\n    when (imageUri) {\n        null -> {\n            Timber.d(\"Unsetting image url\")\n            Glide.with(imageView)\n                .load(placeholder)\n                .into(imageView)\n        }\n        else -> {\n            Glide.with(imageView)\n                .load(imageUri)\n                .apply(RequestOptions().placeholder(placeholder))\n                .into(imageView)\n        }\n    }\n}\n\n@BindingAdapter(value = [\"imageUrl\", \"placeholder\"], requireAll = false)\nfun imageUrl(imageView: ImageView, imageUrl: String?, placeholder: Drawable?) {\n    imageUri(imageView, imageUrl?.toUri(), placeholder)\n}\n\n/**\n * Sets the colors of the [CustomSwipeRefreshLayout] loading indicator.\n */\n@BindingAdapter(\"swipeRefreshColors\")\nfun setSwipeRefreshColors(swipeRefreshLayout: CustomSwipeRefreshLayout, colorResIds: IntArray) {\n    swipeRefreshLayout.setColorSchemeColors(*colorResIds)\n}\n\n/** Set text on a [TextView] from a string resource. */\n@BindingAdapter(\"android:text\")\nfun setText(view: TextView, @StringRes resId: Int) {\n    if (resId == 0) {\n        view.text = null\n    } else {\n        view.setText(resId)\n    }\n}\n\n@BindingAdapter(\"itemSpacing\")\nfun itemSpacing(view: RecyclerView, dimen: Float) {\n    val space = dimen.toInt()\n    if (space > 0) {\n        view.addItemDecoration(SpaceDecoration(space, space, space, space))\n    }\n}\n\nprivate const val CHROME_PACKAGE = \"com.android.chrome\"\n\n@BindingAdapter(\"websiteLink\", \"hideWhenEmpty\", requireAll = false)\nfun websiteLink(\n    button: View,\n    url: String?,\n    hideWhenEmpty: Boolean = false\n) {\n    if (url.isNullOrEmpty()) {\n        if (hideWhenEmpty) {\n            button.isVisible = false\n        } else {\n            button.isClickable = false\n        }\n        return\n    }\n    button.isVisible = true\n    button.setOnClickListener {\n        openWebsiteUrl(it.context, url)\n    }\n}\n\nfun openWebsiteUrl(context: Context, url: String) {\n    if (url.isBlank()) {\n        return\n    }\n    openWebsiteUri(context, Uri.parse(url))\n}\n\nfun openWebsiteUri(context: Context, uri: Uri) {\n    if (context.isChromeCustomTabsSupported()) {\n        CustomTabsIntent.Builder()\n            .setToolbarColor(\n                MaterialColors.getColor(context, R.attr.colorPrimary, null)\n            )\n            .setSecondaryToolbarColor(\n                MaterialColors.getColor(context, R.attr.colorPrimaryVariant, null)\n            )\n            .build()\n            .launchUrl(context, uri)\n    } else {\n        context.startActivity(Intent(Intent.ACTION_VIEW, uri))\n    }\n}\n\nprivate fun Context.isChromeCustomTabsSupported(): Boolean {\n    val serviceIntent = Intent(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION)\n    serviceIntent.setPackage(CHROME_PACKAGE)\n    val resolveInfos = packageManager.queryIntentServices(serviceIntent, 0)\n    return !resolveInfos.isNullOrEmpty()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/WindowInsetsListeners.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport android.view.View\nimport android.view.WindowInsets\n\nobject NoopWindowInsetsListener : View.OnApplyWindowInsetsListener {\n    override fun onApplyWindowInsets(v: View, insets: WindowInsets): WindowInsets {\n        return insets\n    }\n}\n\nobject HeightTopWindowInsetsListener : View.OnApplyWindowInsetsListener {\n    override fun onApplyWindowInsets(v: View, insets: WindowInsets): WindowInsets {\n        val topInset = insets.systemWindowInsetTop\n        if (v.layoutParams.height != topInset) {\n            v.layoutParams.height = topInset\n            v.requestLayout()\n        }\n        return insets\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/initializers/AndroidThreeTenInitializer.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util.initializers\n\nimport android.content.Context\nimport androidx.startup.Initializer\nimport com.jakewharton.threetenabp.AndroidThreeTen\n\nclass AndroidThreeTenInitializer : Initializer<Unit> {\n\n    override fun create(context: Context) {\n        AndroidThreeTen.init(context)\n    }\n\n    override fun dependencies(): List<Class<out Initializer<*>>> = emptyList()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/initializers/StrictModeInitializer.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util.initializers\n\nimport android.content.Context\nimport android.os.StrictMode\nimport android.os.StrictMode.ThreadPolicy\nimport androidx.startup.Initializer\n\nclass StrictModeInitializer : Initializer<Unit> {\n\n    override fun create(context: Context) {\n        StrictMode.setThreadPolicy(\n            ThreadPolicy.Builder()\n                .detectDiskReads()\n                .detectDiskWrites()\n                .detectNetwork()\n                .penaltyLog()\n                .build()\n        )\n    }\n\n    override fun dependencies(): List<Class<out Initializer<*>>> = emptyList()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/initializers/TimberInitializer.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util.initializers\n\nimport android.content.Context\nimport androidx.startup.Initializer\nimport com.google.samples.apps.iosched.BuildConfig\nimport com.google.samples.apps.iosched.util.CrashlyticsTree\nimport timber.log.Timber\n\nclass TimberInitializer : Initializer<Unit> {\n\n    override fun create(context: Context) {\n        if (BuildConfig.DEBUG) {\n            Timber.plant(Timber.DebugTree())\n        } else {\n            Timber.plant(CrashlyticsTree())\n        }\n    }\n\n    override fun dependencies(): List<Class<out Initializer<*>>> = emptyList()\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/signin/FirebaseAuthErrorCodeConverter.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util.signin\n\nimport com.firebase.ui.auth.ErrorCodes\nimport com.google.samples.apps.iosched.R\nimport timber.log.Timber\n\n/**\n * Converts [ErrorCodes] from firebase to translatable strings.\n */\nobject FirebaseAuthErrorCodeConverter {\n\n    fun convert(code: Int): Int {\n        return when (code) {\n            ErrorCodes.NO_NETWORK -> {\n                Timber.e(\"FirebaseAuth error: no_network\")\n                R.string.firebase_auth_no_network_connection\n            }\n            ErrorCodes.DEVELOPER_ERROR -> {\n                Timber.e(\"FirebaseAuth error: developer_error\")\n                R.string.firebase_auth_unknown_error\n            }\n            ErrorCodes.PLAY_SERVICES_UPDATE_CANCELLED -> {\n                Timber.e(\"FirebaseAuth error: play_services_update_cancelled\")\n                R.string.firebase_auth_unknown_error\n            }\n            ErrorCodes.PROVIDER_ERROR -> {\n                Timber.e(\"FirebaseAuth error: provider_error\")\n                R.string.firebase_auth_unknown_error\n            }\n            else -> {\n                Timber.e(\"FirebaseAuth error: unknown_error\")\n                R.string.firebase_auth_unknown_error\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/signin/SignInHandler.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util.signin\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport com.firebase.ui.auth.AuthUI\nimport com.firebase.ui.auth.IdpResponse\nimport com.google.android.gms.auth.api.signin.GoogleSignInOptions\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.withContext\n\n/**\n * Element in the presentation layer that interacts with the Auth provider (Firebase in this case).\n *\n * This class is used from the activities or fragments.\n */\ninterface SignInHandler {\n\n    suspend fun makeSignInIntent(): Intent\n\n    fun signIn(resultCode: Int, data: Intent?, onComplete: (SignInResult) -> Unit)\n\n    fun signOut(context: Context, onComplete: () -> Unit = {})\n}\n\n/**\n * Implementation of [SignInHandler] that interacts with Firebase Auth.\n */\nclass FirebaseAuthSignInHandler(private val externalScope: CoroutineScope) : SignInHandler {\n\n    /**\n     * Request a sign in intent.\n     *\n     * To observe the result you must pass this to startActivityForResult.\n     */\n    override suspend fun makeSignInIntent(): Intent {\n        return withContext(externalScope.coroutineContext) {\n            val providers = mutableListOf(\n                AuthUI.IdpConfig.GoogleBuilder().setSignInOptions(\n                    GoogleSignInOptions.Builder()\n                        .requestId()\n                        .requestEmail()\n                        .build()\n                ).build()\n            )\n\n            AuthUI.getInstance()\n                .createSignInIntentBuilder()\n                .setAvailableProviders(providers)\n                .build()\n        }\n    }\n\n    /**\n     * Parse the response from a sign in request, helper to call from onActivityResult.\n     *\n     * ```\n     * signIn(resultCode, data) { result ->\n     *    return when(result) {\n     *        is SignInSuccess -> // all good\n     *        is SignInFailed -> result?.error // access FirebaseUiException - can be null\n     *                                         // (e.g. canceled)\n     *    }\n     * }\n     * ```\n     *\n     * @param resultCode activity result code\n     * @param data activity result intent\n     * @param onComplete pass parsed result of either [SignInSuccess] or [SignInFailed]\n     */\n    @SuppressWarnings(\"unused\")\n    override fun signIn(\n        resultCode: Int,\n        data: Intent?,\n        onComplete: (SignInResult) -> Unit\n    ) {\n        when (resultCode) {\n            Activity.RESULT_OK -> onComplete(SignInSuccess)\n            else -> onComplete(SignInFailed(IdpResponse.fromResultIntent(data)?.error))\n        }\n    }\n\n    /**\n     * Attempt to sign the current user out.\n     *\n     * @param context any context\n     * @param onComplete used to notify of signOut completion.\n     */\n    override fun signOut(context: Context, onComplete: () -> Unit) {\n        AuthUI.getInstance()\n            .signOut(context)\n            .addOnCompleteListener { onComplete() }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/signin/SignInResult.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util.signin\n\nimport com.firebase.ui.auth.FirebaseUiException\n\nsealed class SignInResult\nobject SignInSuccess : SignInResult()\ndata class SignInFailed(val error: FirebaseUiException?) : SignInResult()\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/util/wifi/WifiInstaller.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util.wifi\n\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.net.wifi.WifiConfiguration\nimport android.net.wifi.WifiManager\nimport com.google.samples.apps.iosched.util.quoteSsidAndPassword\nimport com.google.samples.apps.iosched.util.unquoteSsidAndPassword\nimport javax.inject.Inject\n\n/**\n * Installs WiFi on device given a WiFi configuration.\n */\nclass WifiInstaller @Inject constructor(\n    private val wifiManager: WifiManager,\n    private val clipboardManager: ClipboardManager\n) {\n    fun installConferenceWifi(rawWifiConfig: WifiConfiguration): Boolean {\n        val conferenceWifiConfig = rawWifiConfig.quoteSsidAndPassword()\n        if (!wifiManager.isWifiEnabled) {\n            wifiManager.isWifiEnabled = true\n        }\n        var success = false\n        val netId = wifiManager.addNetwork(conferenceWifiConfig)\n        if (netId != -1) {\n            wifiManager.enableNetwork(netId, false)\n            success = true\n        } else {\n            val clip: ClipData =\n                ClipData.newPlainText(\n                    \"wifi_password\",\n                    conferenceWifiConfig.unquoteSsidAndPassword().preSharedKey\n                )\n            clipboardManager.setPrimaryClip(clip)\n        }\n        return success\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/BottomSheetBehavior.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.os.Bundle\nimport android.os.Parcel\nimport android.os.Parcelable\nimport android.util.AttributeSet\nimport android.view.MotionEvent\nimport android.view.VelocityTracker\nimport android.view.View\nimport android.view.ViewConfiguration\nimport android.view.ViewGroup\nimport androidx.annotation.IntDef\nimport androidx.annotation.VisibleForTesting\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior\nimport androidx.core.view.ViewCompat\nimport androidx.customview.view.AbsSavedState\nimport androidx.customview.widget.ViewDragHelper\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.util.readBooleanUsingCompat\nimport com.google.samples.apps.iosched.shared.util.writeBooleanUsingCompat\nimport java.lang.ref.WeakReference\nimport kotlin.math.absoluteValue\n\n/**\n * Copy of material lib's BottomSheetBehavior that includes some bug fixes.\n */\n// TODO remove when a fixed version in material lib is released.\nclass BottomSheetBehavior<V : View> : Behavior<V> {\n\n    companion object {\n        /** The bottom sheet is dragging. */\n        const val STATE_DRAGGING = 1\n        /** The bottom sheet is settling. */\n        const val STATE_SETTLING = 2\n        /** The bottom sheet is expanded. */\n        const val STATE_EXPANDED = 3\n        /** The bottom sheet is collapsed. */\n        const val STATE_COLLAPSED = 4\n        /** The bottom sheet is hidden. */\n        const val STATE_HIDDEN = 5\n        /** The bottom sheet is half-expanded (used when behavior_fitToContents is false). */\n        const val STATE_HALF_EXPANDED = 6\n\n        /**\n         * Peek at the 16:9 ratio keyline of its parent. This can be used as a parameter for\n         * [setPeekHeight(Int)]. [getPeekHeight()] will return this when the value is set.\n         */\n        const val PEEK_HEIGHT_AUTO = -1\n\n        private const val HIDE_THRESHOLD = 0.5f\n        private const val HIDE_FRICTION = 0.1f\n\n        @IntDef(\n            value = [\n                STATE_DRAGGING,\n                STATE_SETTLING,\n                STATE_EXPANDED,\n                STATE_COLLAPSED,\n                STATE_HIDDEN,\n                STATE_HALF_EXPANDED\n            ]\n        )\n        @Retention(AnnotationRetention.SOURCE)\n        annotation class State\n\n        /** Utility to get the [BottomSheetBehavior] from a [view]. */\n        @JvmStatic\n        fun from(view: View): BottomSheetBehavior<*> {\n            val lp = view.layoutParams as? CoordinatorLayout.LayoutParams\n                ?: throw IllegalArgumentException(\"view is not a child of CoordinatorLayout\")\n            return lp.behavior as? BottomSheetBehavior\n                ?: throw IllegalArgumentException(\"view not associated with this behavior\")\n        }\n    }\n\n    /** Callback for monitoring events about bottom sheets. */\n    interface BottomSheetCallback {\n        /**\n         * Called when the bottom sheet changes its state.\n         *\n         * @param bottomSheet The bottom sheet view.\n         * @param newState The new state. This will be one of link [STATE_DRAGGING],\n         * [STATE_SETTLING], [STATE_EXPANDED], [STATE_COLLAPSED], [STATE_HIDDEN], or\n         * [STATE_HALF_EXPANDED].\n         */\n        fun onStateChanged(bottomSheet: View, newState: Int) {}\n\n        /**\n         * Called when the bottom sheet is being dragged.\n         *\n         * @param bottomSheet The bottom sheet view.\n         * @param slideOffset The new offset of this bottom sheet within [-1,1] range. Offset\n         * increases as this bottom sheet is moving upward. From 0 to 1 the sheet is between\n         * collapsed and expanded states and from -1 to 0 it is between hidden and collapsed states.\n         */\n        fun onSlide(bottomSheet: View, slideOffset: Float) {}\n    }\n\n    /** The current state of the bottom sheet, backing property */\n    private var _state = STATE_COLLAPSED\n    /** The current state of the bottom sheet */\n    @State\n    var state\n        get() = _state\n        set(@State value) {\n            if (_state == value) {\n                return\n            }\n            if (viewRef == null) {\n                // Child is not laid out yet. Set our state and let onLayoutChild() handle it later.\n                if (value == STATE_COLLAPSED ||\n                    value == STATE_EXPANDED ||\n                    value == STATE_HALF_EXPANDED ||\n                    (isHideable && value == STATE_HIDDEN)\n                ) {\n                    _state = value\n                }\n                return\n            }\n\n            viewRef?.get()?.apply {\n                // Start the animation; wait until a pending layout if there is one.\n                if (parent != null && parent.isLayoutRequested && isAttachedToWindow) {\n                    post {\n                        startSettlingAnimation(this, value)\n                    }\n                } else {\n                    startSettlingAnimation(this, value)\n                }\n            }\n        }\n\n    /** Whether to fit to contents. If false, the behavior will include [STATE_HALF_EXPANDED]. */\n    var isFitToContents = true\n        set(value) {\n            if (field != value) {\n                field = value\n                // If sheet is already laid out, recalculate the collapsed offset.\n                // Otherwise onLayoutChild will handle this later.\n                if (viewRef != null) {\n                    collapsedOffset = calculateCollapsedOffset()\n                }\n                // Fix incorrect expanded settings.\n                setStateInternal(\n                    if (field && state == STATE_HALF_EXPANDED) STATE_EXPANDED else state\n                )\n            }\n        }\n\n    /** Real peek height in pixels */\n    private var _peekHeight = 0\n    /** Peek height in pixels, or [PEEK_HEIGHT_AUTO] */\n    var peekHeight\n        get() = if (peekHeightAuto) PEEK_HEIGHT_AUTO else _peekHeight\n        set(value) {\n            var needLayout = false\n            if (value == PEEK_HEIGHT_AUTO) {\n                if (!peekHeightAuto) {\n                    peekHeightAuto = true\n                    needLayout = true\n                }\n            } else if (peekHeightAuto || _peekHeight != value) {\n                peekHeightAuto = false\n                _peekHeight = Math.max(0, value)\n                collapsedOffset = parentHeight - value\n                needLayout = true\n            }\n            if (needLayout && (state == STATE_COLLAPSED || state == STATE_HIDDEN)) {\n                viewRef?.get()?.requestLayout()\n            }\n        }\n\n    /** Whether the bottom sheet can be hidden. */\n    var isHideable = false\n        set(value) {\n            if (field != value) {\n                field = value\n                if (!value && state == STATE_HIDDEN) {\n                    // Fix invalid state by moving to collapsed\n                    state = STATE_COLLAPSED\n                }\n            }\n        }\n\n    /** Whether the bottom sheet can be dragged or not. */\n    var isDraggable = true\n\n    /** Whether the bottom sheet should skip collapsed state after being expanded once. */\n    var skipCollapsed = false\n\n    /** Whether animations should be disabled, to be used from UI tests. */\n    @VisibleForTesting\n    var isAnimationDisabled = false\n\n    /** Whether or not to use automatic peek height */\n    private var peekHeightAuto = false\n    /** Minimum peek height allowed */\n    private var peekHeightMin = 0\n    /** The last peek height calculated in onLayoutChild */\n    private var lastPeekHeight = 0\n\n    private var parentHeight = 0\n    /** Bottom sheet's top offset in [STATE_EXPANDED] state. */\n    private var fitToContentsOffset = 0\n    /** Bottom sheet's top offset in [STATE_HALF_EXPANDED] state. */\n    private var halfExpandedOffset = 0\n    /** Bottom sheet's top offset in [STATE_COLLAPSED] state. */\n    private var collapsedOffset = 0\n\n    /** Keeps reference to the bottom sheet outside of Behavior callbacks */\n    private var viewRef: WeakReference<View>? = null\n    /** Controls movement of the bottom sheet */\n    private lateinit var dragHelper: ViewDragHelper\n\n    // Touch event handling, etc\n    private var lastTouchX = 0\n    private var lastTouchY = 0\n    private var initialTouchY = 0\n    private var activePointerId = MotionEvent.INVALID_POINTER_ID\n    private var acceptTouches = true\n\n    private var minimumVelocity = 0\n    private var maximumVelocity = 0\n    private var velocityTracker: VelocityTracker? = null\n\n    private var nestedScrolled = false\n    private var nestedScrollingChildRef: WeakReference<View>? = null\n\n    private val callbacks: MutableSet<BottomSheetCallback> = mutableSetOf()\n\n    constructor() : super()\n\n    @SuppressLint(\"PrivateResource\")\n    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {\n        // Re-use BottomSheetBehavior's attrs\n        val a = context.obtainStyledAttributes(attrs, R.styleable.BottomSheetBehavior_Layout)\n        val value = a.peekValue(R.styleable.BottomSheetBehavior_Layout_behavior_peekHeight)\n        peekHeight = if (value != null && value.data == PEEK_HEIGHT_AUTO) {\n            value.data\n        } else {\n            a.getDimensionPixelSize(\n                R.styleable.BottomSheetBehavior_Layout_behavior_peekHeight, PEEK_HEIGHT_AUTO\n            )\n        }\n        isHideable = a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_hideable, false)\n        isFitToContents =\n            a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_fitToContents, true)\n        skipCollapsed =\n            a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_skipCollapsed, false)\n        a.recycle()\n        val configuration = ViewConfiguration.get(context)\n        minimumVelocity = configuration.scaledMinimumFlingVelocity\n        maximumVelocity = configuration.scaledMaximumFlingVelocity\n    }\n\n    override fun onSaveInstanceState(parent: CoordinatorLayout, child: V): Parcelable {\n        return SavedState(\n            super.onSaveInstanceState(parent, child) ?: Bundle.EMPTY,\n            state,\n            peekHeight,\n            isFitToContents,\n            isHideable,\n            skipCollapsed,\n            isDraggable\n        )\n    }\n\n    override fun onRestoreInstanceState(parent: CoordinatorLayout, child: V, state: Parcelable) {\n        val ss = state as SavedState\n        super.onRestoreInstanceState(parent, child, ss.superState ?: Bundle.EMPTY)\n\n        isDraggable = ss.isDraggable\n        peekHeight = ss.peekHeight\n        isFitToContents = ss.isFitToContents\n        isHideable = ss.isHideable\n        skipCollapsed = ss.skipCollapsed\n\n        // Set state last. Intermediate states are restored as collapsed state.\n        _state = if (ss.state == STATE_DRAGGING || ss.state == STATE_SETTLING) {\n            STATE_COLLAPSED\n        } else {\n            ss.state\n        }\n    }\n\n    fun addBottomSheetCallback(callback: BottomSheetCallback) {\n        callbacks.add(callback)\n    }\n\n    fun removeBottomSheetCallback(callback: BottomSheetCallback) {\n        callbacks.remove(callback)\n    }\n\n    private fun setStateInternal(@State state: Int) {\n        if (_state != state) {\n            _state = state\n            viewRef?.get()?.let { view ->\n                callbacks.forEach { callback ->\n                    callback.onStateChanged(view, state)\n                }\n            }\n        }\n    }\n\n    // -- Layout\n\n    override fun onLayoutChild(\n        parent: CoordinatorLayout,\n        child: V,\n        layoutDirection: Int\n    ): Boolean {\n        if (parent.fitsSystemWindows && !child.fitsSystemWindows) {\n            child.fitsSystemWindows = true\n        }\n        val savedTop = child.top\n        // First let the parent lay it out\n        parent.onLayoutChild(child, layoutDirection)\n        parentHeight = parent.height\n\n        // Calculate peek and offsets\n        if (peekHeightAuto) {\n            if (peekHeightMin == 0) {\n                // init peekHeightMin\n                @SuppressLint(\"PrivateResource\")\n                peekHeightMin = parent.resources.getDimensionPixelSize(\n                    R.dimen.design_bottom_sheet_peek_height_min\n                )\n            }\n            lastPeekHeight = Math.max(peekHeightMin, parentHeight - parent.width * 9 / 16)\n        } else {\n            lastPeekHeight = _peekHeight\n        }\n        fitToContentsOffset = Math.max(0, parentHeight - child.height)\n        halfExpandedOffset = parentHeight / 2\n        collapsedOffset = calculateCollapsedOffset()\n\n        // Offset the bottom sheet\n        when (state) {\n            STATE_EXPANDED -> ViewCompat.offsetTopAndBottom(child, getExpandedOffset())\n            STATE_HALF_EXPANDED -> ViewCompat.offsetTopAndBottom(child, halfExpandedOffset)\n            STATE_HIDDEN -> ViewCompat.offsetTopAndBottom(child, parentHeight)\n            STATE_COLLAPSED -> ViewCompat.offsetTopAndBottom(child, collapsedOffset)\n            STATE_DRAGGING, STATE_SETTLING -> ViewCompat.offsetTopAndBottom(\n                child, savedTop - child.top\n            )\n        }\n\n        // Init these for later\n        viewRef = WeakReference(child)\n        if (!::dragHelper.isInitialized) {\n            dragHelper = ViewDragHelper.create(parent, dragCallback)\n        }\n        return true\n    }\n\n    private fun calculateCollapsedOffset(): Int {\n        return if (isFitToContents) {\n            Math.max(parentHeight - lastPeekHeight, fitToContentsOffset)\n        } else {\n            parentHeight - lastPeekHeight\n        }\n    }\n\n    private fun getExpandedOffset() = if (isFitToContents) fitToContentsOffset else 0\n\n    // -- Touch events and scrolling\n\n    override fun onInterceptTouchEvent(\n        parent: CoordinatorLayout,\n        child: V,\n        event: MotionEvent\n    ): Boolean {\n        if (!isDraggable || !child.isShown) {\n            acceptTouches = false\n            return false\n        }\n\n        val action = event.actionMasked\n        lastTouchX = event.x.toInt()\n        lastTouchY = event.y.toInt()\n\n        // Record velocity\n        if (action == MotionEvent.ACTION_DOWN) {\n            resetVelocityTracker()\n        }\n        if (velocityTracker == null) {\n            velocityTracker = VelocityTracker.obtain()\n        }\n        velocityTracker?.addMovement(event)\n\n        when (action) {\n            MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {\n                activePointerId = MotionEvent.INVALID_POINTER_ID\n                if (!acceptTouches) {\n                    acceptTouches = true\n                    return false\n                }\n            }\n\n            MotionEvent.ACTION_DOWN -> {\n                activePointerId = event.getPointerId(event.actionIndex)\n                initialTouchY = event.y.toInt()\n\n                clearNestedScroll()\n\n                if (!parent.isPointInChildBounds(child, lastTouchX, initialTouchY)) {\n                    // Not touching the sheet\n                    acceptTouches = false\n                }\n            }\n        }\n\n        return acceptTouches &&\n            // CoordinatorLayout can call us before the view is laid out. >_<\n            ::dragHelper.isInitialized &&\n            dragHelper.shouldInterceptTouchEvent(event)\n    }\n\n    override fun onTouchEvent(\n        parent: CoordinatorLayout,\n        child: V,\n        event: MotionEvent\n    ): Boolean {\n        if (!isDraggable || !child.isShown) {\n            return false\n        }\n\n        val action = event.actionMasked\n        if (action == MotionEvent.ACTION_DOWN && state == STATE_DRAGGING) {\n            return true\n        }\n\n        lastTouchX = event.x.toInt()\n        lastTouchY = event.y.toInt()\n\n        // Record velocity\n        if (action == MotionEvent.ACTION_DOWN) {\n            resetVelocityTracker()\n        }\n        if (velocityTracker == null) {\n            velocityTracker = VelocityTracker.obtain()\n        }\n        velocityTracker?.addMovement(event)\n\n        // CoordinatorLayout can call us before the view is laid out. >_<\n        if (::dragHelper.isInitialized) {\n            dragHelper.processTouchEvent(event)\n        }\n\n        if (acceptTouches &&\n            action == MotionEvent.ACTION_MOVE &&\n            exceedsTouchSlop(initialTouchY, lastTouchY)\n        ) {\n            // Manually capture the sheet since nothing beneath us is scrolling.\n            dragHelper.captureChildView(child, event.getPointerId(event.actionIndex))\n        }\n\n        return acceptTouches\n    }\n\n    private fun resetVelocityTracker() {\n        activePointerId = MotionEvent.INVALID_POINTER_ID\n        velocityTracker?.recycle()\n        velocityTracker = null\n    }\n\n    private fun exceedsTouchSlop(p1: Int, p2: Int) = Math.abs(p1 - p2) >= dragHelper.touchSlop\n\n    // Nested scrolling\n\n    override fun onStartNestedScroll(\n        coordinatorLayout: CoordinatorLayout,\n        child: V,\n        directTargetChild: View,\n        target: View,\n        axes: Int,\n        type: Int\n    ): Boolean {\n        nestedScrolled = false\n        if (isDraggable &&\n            viewRef?.get() == directTargetChild &&\n            (axes and ViewCompat.SCROLL_AXIS_VERTICAL) != 0\n        ) {\n            // Scrolling view is a descendent of the sheet and scrolling vertically.\n            // Let's follow along!\n            nestedScrollingChildRef = WeakReference(target)\n            return true\n        }\n        return false\n    }\n\n    override fun onNestedPreScroll(\n        coordinatorLayout: CoordinatorLayout,\n        child: V,\n        target: View,\n        dx: Int,\n        dy: Int,\n        consumed: IntArray,\n        type: Int\n    ) {\n        if (type == ViewCompat.TYPE_NON_TOUCH) {\n            return // Ignore fling here\n        }\n        if (target != nestedScrollingChildRef?.get()) {\n            return\n        }\n\n        val currentTop = child.top\n        val newTop = currentTop - dy\n        if (dy > 0) { // Upward\n            if (newTop < getExpandedOffset()) {\n                consumed[1] = currentTop - getExpandedOffset()\n                ViewCompat.offsetTopAndBottom(child, -consumed[1])\n                setStateInternal(STATE_EXPANDED)\n            } else {\n                consumed[1] = dy\n                ViewCompat.offsetTopAndBottom(child, -dy)\n                setStateInternal(STATE_DRAGGING)\n            }\n        } else if (dy < 0) { // Downward\n            if (!target.canScrollVertically(-1)) {\n                if (newTop <= collapsedOffset || isHideable) {\n                    consumed[1] = dy\n                    ViewCompat.offsetTopAndBottom(child, -dy)\n                    setStateInternal(STATE_DRAGGING)\n                } else {\n                    consumed[1] = currentTop - collapsedOffset\n                    ViewCompat.offsetTopAndBottom(child, -consumed[1])\n                    setStateInternal(STATE_COLLAPSED)\n                }\n            }\n        }\n        dispatchOnSlide(child.top)\n        nestedScrolled = true\n    }\n\n    override fun onStopNestedScroll(\n        coordinatorLayout: CoordinatorLayout,\n        child: V,\n        target: View,\n        type: Int\n    ) {\n        if (child.top == getExpandedOffset()) {\n            setStateInternal(STATE_EXPANDED)\n            return\n        }\n        if (target != nestedScrollingChildRef?.get() || !nestedScrolled) {\n            return\n        }\n\n        settleBottomSheet(child, getYVelocity(), true)\n        clearNestedScroll()\n    }\n\n    override fun onNestedPreFling(\n        coordinatorLayout: CoordinatorLayout,\n        child: V,\n        target: View,\n        velocityX: Float,\n        velocityY: Float\n    ): Boolean {\n        return isDraggable &&\n            target == nestedScrollingChildRef?.get() &&\n            (\n                state != STATE_EXPANDED || super.onNestedPreFling(\n                    coordinatorLayout, child, target, velocityX, velocityY\n                )\n                )\n    }\n\n    private fun clearNestedScroll() {\n        nestedScrolled = false\n        nestedScrollingChildRef = null\n    }\n\n    // Settling\n\n    private fun getYVelocity(): Float {\n        return velocityTracker?.run {\n            computeCurrentVelocity(1000, maximumVelocity.toFloat())\n            getYVelocity(activePointerId)\n        } ?: 0f\n    }\n\n    private fun settleBottomSheet(sheet: View, yVelocity: Float, isNestedScroll: Boolean) {\n        val top: Int\n        @State val targetState: Int\n\n        val flinging = yVelocity.absoluteValue > minimumVelocity\n        if (flinging && yVelocity < 0) { // Moving up\n            if (isFitToContents) {\n                top = fitToContentsOffset\n                targetState = STATE_EXPANDED\n            } else {\n                if (sheet.top > halfExpandedOffset) {\n                    top = halfExpandedOffset\n                    targetState = STATE_HALF_EXPANDED\n                } else {\n                    top = 0\n                    targetState = STATE_EXPANDED\n                }\n            }\n        } else if (isHideable && shouldHide(sheet, yVelocity)) {\n            top = parentHeight\n            targetState = STATE_HIDDEN\n        } else if (flinging && yVelocity > 0) { // Moving down\n            top = collapsedOffset\n            targetState = STATE_COLLAPSED\n        } else {\n            val currentTop = sheet.top\n            if (isFitToContents) {\n                if (Math.abs(currentTop - fitToContentsOffset)\n                    < Math.abs(currentTop - collapsedOffset)\n                ) {\n                    top = fitToContentsOffset\n                    targetState = STATE_EXPANDED\n                } else {\n                    top = collapsedOffset\n                    targetState = STATE_COLLAPSED\n                }\n            } else {\n                if (currentTop < halfExpandedOffset) {\n                    if (currentTop < Math.abs(currentTop - collapsedOffset)) {\n                        top = 0\n                        targetState = STATE_EXPANDED\n                    } else {\n                        top = halfExpandedOffset\n                        targetState = STATE_HALF_EXPANDED\n                    }\n                } else {\n                    if (Math.abs(currentTop - halfExpandedOffset)\n                        < Math.abs(currentTop - collapsedOffset)\n                    ) {\n                        top = halfExpandedOffset\n                        targetState = STATE_HALF_EXPANDED\n                    } else {\n                        top = collapsedOffset\n                        targetState = STATE_COLLAPSED\n                    }\n                }\n            }\n        }\n\n        val startedSettling = if (isNestedScroll) {\n            dragHelper.smoothSlideViewTo(sheet, sheet.left, top)\n        } else {\n            dragHelper.settleCapturedViewAt(sheet.left, top)\n        }\n\n        if (startedSettling) {\n            setStateInternal(STATE_SETTLING)\n            ViewCompat.postOnAnimation(sheet, SettleRunnable(sheet, targetState))\n        } else {\n            setStateInternal(targetState)\n        }\n    }\n\n    private fun shouldHide(child: View, yVelocity: Float): Boolean {\n        if (skipCollapsed) {\n            return true\n        }\n        if (child.top < collapsedOffset) {\n            return false // it should not hide, but collapse.\n        }\n        val newTop = child.top + yVelocity * HIDE_FRICTION\n        return Math.abs(newTop - collapsedOffset) / _peekHeight.toFloat() > HIDE_THRESHOLD\n    }\n\n    private fun startSettlingAnimation(child: View, state: Int) {\n        var top: Int\n        var finalState = state\n\n        when {\n            state == STATE_COLLAPSED -> top = collapsedOffset\n            state == STATE_EXPANDED -> top = getExpandedOffset()\n            state == STATE_HALF_EXPANDED -> {\n                top = halfExpandedOffset\n                // Skip to expanded state if we would scroll past the height of the contents.\n                if (isFitToContents && top <= fitToContentsOffset) {\n                    finalState = STATE_EXPANDED\n                    top = fitToContentsOffset\n                }\n            }\n            state == STATE_HIDDEN && isHideable -> top = parentHeight\n            else -> throw IllegalArgumentException(\"Invalid state: \" + state)\n        }\n\n        if (isAnimationDisabled) {\n            // Prevent animations\n            ViewCompat.offsetTopAndBottom(child, top - child.top)\n        }\n\n        if (dragHelper.smoothSlideViewTo(child, child.left, top)) {\n            setStateInternal(STATE_SETTLING)\n            ViewCompat.postOnAnimation(child, SettleRunnable(child, finalState))\n        } else {\n            setStateInternal(finalState)\n        }\n    }\n\n    private fun dispatchOnSlide(top: Int) {\n        viewRef?.get()?.let { sheet ->\n            val denom = if (top > collapsedOffset) {\n                parentHeight - collapsedOffset\n            } else {\n                collapsedOffset - getExpandedOffset()\n            }\n            callbacks.forEach { callback ->\n                callback.onSlide(sheet, (collapsedOffset - top).toFloat() / denom)\n            }\n        }\n    }\n\n    private inner class SettleRunnable(\n        private val view: View,\n        @State private val state: Int\n    ) : Runnable {\n        override fun run() {\n            if (dragHelper.continueSettling(true)) {\n                view.postOnAnimation(this)\n            } else {\n                setStateInternal(state)\n            }\n        }\n    }\n\n    private val dragCallback: ViewDragHelper.Callback = object : ViewDragHelper.Callback() {\n\n        override fun tryCaptureView(child: View, pointerId: Int): Boolean {\n            when {\n                // Sanity check\n                state == STATE_DRAGGING -> return false\n                // recapture a settling sheet\n                dragHelper.viewDragState == ViewDragHelper.STATE_SETTLING -> return true\n                // let nested scroll handle this\n                nestedScrollingChildRef?.get() != null -> return false\n            }\n\n            val dy = lastTouchY - initialTouchY\n            if (dy == 0) {\n                // ViewDragHelper tries to capture in onTouch for the ACTION_DOWN event, but there's\n                // really no way to check for a scrolling child without a direction, so wait.\n                return false\n            }\n\n            if (state == STATE_COLLAPSED) {\n                if (isHideable) {\n                    // Any drag should capture in order to expand or hide the sheet\n                    return true\n                }\n                if (dy < 0) {\n                    // Expand on upward movement, even if there's scrolling content underneath\n                    return true\n                }\n            }\n\n            // Check for scrolling content underneath the touch point that can scroll in the\n            // appropriate direction.\n            val scrollingChild = findScrollingChildUnder(child, lastTouchX, lastTouchY, -dy)\n            return scrollingChild == null\n        }\n\n        private fun findScrollingChildUnder(view: View, x: Int, y: Int, direction: Int): View? {\n            if (view.visibility == View.VISIBLE && dragHelper.isViewUnder(view, x, y)) {\n                if (view.canScrollVertically(direction)) {\n                    return view\n                }\n                if (view is ViewGroup) {\n                    // TODO this doesn't account for elevation or child drawing order.\n                    for (i in (view.childCount - 1) downTo 0) {\n                        val child = view.getChildAt(i)\n                        val found =\n                            findScrollingChildUnder(child, x - child.left, y - child.top, direction)\n                        if (found != null) {\n                            return found\n                        }\n                    }\n                }\n            }\n            return null\n        }\n\n        override fun getViewVerticalDragRange(child: View): Int {\n            return if (isHideable) parentHeight else collapsedOffset\n        }\n\n        override fun clampViewPositionVertical(child: View, top: Int, dy: Int): Int {\n            val maxOffset = if (isHideable) parentHeight else collapsedOffset\n            return top.coerceIn(getExpandedOffset(), maxOffset)\n        }\n\n        override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int) = child.left\n\n        override fun onViewDragStateChanged(state: Int) {\n            if (state == ViewDragHelper.STATE_DRAGGING) {\n                setStateInternal(STATE_DRAGGING)\n            }\n        }\n\n        override fun onViewPositionChanged(child: View, left: Int, top: Int, dx: Int, dy: Int) {\n            dispatchOnSlide(top)\n        }\n\n        override fun onViewReleased(releasedChild: View, xvel: Float, yvel: Float) {\n            settleBottomSheet(releasedChild, yvel, false)\n        }\n    }\n\n    /** SavedState implementation */\n    internal class SavedState : AbsSavedState {\n\n        @State internal val state: Int\n        internal val peekHeight: Int\n        internal val isFitToContents: Boolean\n        internal val isHideable: Boolean\n        internal val skipCollapsed: Boolean\n        internal val isDraggable: Boolean\n\n        constructor(source: Parcel) : this(source, null)\n\n        constructor(source: Parcel, loader: ClassLoader?) : super(source, loader) {\n            state = source.readInt()\n            peekHeight = source.readInt()\n            isFitToContents = source.readBooleanUsingCompat()\n            isHideable = source.readBooleanUsingCompat()\n            skipCollapsed = source.readBooleanUsingCompat()\n            isDraggable = source.readBooleanUsingCompat()\n        }\n\n        constructor(\n            superState: Parcelable,\n            @State state: Int,\n            peekHeight: Int,\n            isFitToContents: Boolean,\n            isHideable: Boolean,\n            skipCollapsed: Boolean,\n            isDraggable: Boolean\n        ) : super(superState) {\n            this.state = state\n            this.peekHeight = peekHeight\n            this.isFitToContents = isFitToContents\n            this.isHideable = isHideable\n            this.skipCollapsed = skipCollapsed\n            this.isDraggable = isDraggable\n        }\n\n        override fun writeToParcel(dest: Parcel, flags: Int) {\n            super.writeToParcel(dest, flags)\n            dest.apply {\n                writeInt(state)\n                writeInt(peekHeight)\n                writeBooleanUsingCompat(isFitToContents)\n                writeBooleanUsingCompat(isHideable)\n                writeBooleanUsingCompat(skipCollapsed)\n                writeBooleanUsingCompat(isDraggable)\n            }\n        }\n\n        companion object {\n            @JvmField\n            val CREATOR: Parcelable.Creator<SavedState> =\n                object : Parcelable.ClassLoaderCreator<SavedState> {\n                    override fun createFromParcel(source: Parcel): SavedState {\n                        return SavedState(source, null)\n                    }\n\n                    override fun createFromParcel(source: Parcel, loader: ClassLoader): SavedState {\n                        return SavedState(source, loader)\n                    }\n\n                    override fun newArray(size: Int): Array<SavedState?> {\n                        return arrayOfNulls(size)\n                    }\n                }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/BubbleDecoration.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.graphics.Paint.Style.FILL\nimport android.graphics.RectF\nimport androidx.core.view.forEach\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.ItemDecoration\nimport androidx.recyclerview.widget.RecyclerView.State\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.util.lerp\nimport kotlin.math.max\nimport kotlin.math.min\n\n/**\n * ItemDecoration that draws a bubble background around items in a specified range.\n */\nclass BubbleDecoration(context: Context) : ItemDecoration() {\n\n    private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n        style = FILL\n    }\n\n    private val insetHorizontal: Float\n    private val insetVertical: Float\n\n    private val currentRect = RectF()\n    private val previousRect = RectF()\n    private val temp = RectF() // to avoid object allocations\n\n    private var animator: ValueAnimator? = null\n    private var pendingAnimation = false\n\n    private var progress = 1f\n\n    /** The adapter positions to decorate. */\n    var bubbleRange: IntRange = -1..-1\n        set(value) {\n            field = value\n            pendingAnimation = true\n        }\n\n    init {\n        val attrs = context.obtainStyledAttributes(\n            R.style.Widget_IOSched_DayIndicatorDecoration,\n            R.styleable.DayIndicatorDecoration\n        )\n        paint.color = attrs.getColor(R.styleable.DayIndicatorDecoration_android_color, 0)\n        insetHorizontal = attrs.getDimension(R.styleable.DayIndicatorDecoration_insetHorizontal, 0f)\n        insetVertical = attrs.getDimension(R.styleable.DayIndicatorDecoration_insetVertical, 0f)\n        attrs.recycle()\n    }\n\n    override fun onDraw(canvas: Canvas, parent: RecyclerView, state: State) {\n        if (pendingAnimation) {\n            pendingAnimation = false\n\n            animator?.cancel()\n\n            // Update rects\n            computeTargetRect(parent, state, bubbleRange, temp)\n            previousRect.set(currentRect)\n            currentRect.set(temp)\n\n            startAnimatorIfNeeded(previousRect, currentRect, parent)\n        }\n\n        val rect = getDrawingRect(previousRect, currentRect)\n        drawBubble(rect, canvas)\n    }\n\n    private fun drawBubble(rect: RectF, canvas: Canvas) {\n        if (rect.isEmpty) return\n\n        val radius = min(rect.width(), rect.height()) / 2\n        canvas.drawRoundRect(rect, radius, radius, paint)\n    }\n\n    private fun getDrawingRect(initial: RectF, target: RectF): RectF {\n        when {\n            initial.isEmpty -> computeScalingRect(target, progress)\n            target.isEmpty -> computeScalingRect(initial, progress)\n            else -> computeMovingRect(initial, target, progress)\n        }\n        return temp\n    }\n\n    private fun computeScalingRect(rect: RectF, progress: Float) {\n        // Create the effect of growing/shrinking from the center.\n        val dx = rect.width() * progress / 2\n        val dy = rect.height() * progress / 2\n        temp.set(\n            rect.centerX() - dx,\n            rect.centerY() - dy,\n            rect.centerX() + dx,\n            rect.centerY() + dy\n        )\n    }\n\n    private fun computeMovingRect(initial: RectF, target: RectF, progress: Float) {\n        temp.set(\n            lerp(initial.left, target.left, progress),\n            lerp(initial.top, target.top, progress),\n            lerp(initial.right, target.right, progress),\n            lerp(initial.bottom, target.bottom, progress)\n        )\n    }\n\n    private fun computeTargetRect(\n        parent: RecyclerView,\n        state: State,\n        range: IntRange,\n        outRectF: RectF\n    ) {\n        if (state.itemCount < 1 || range.isEmpty()) {\n            outRectF.setEmpty()\n            return\n        }\n\n        var minLeft = parent.width.toFloat()\n        var minTop = parent.height.toFloat()\n        var maxRight = 0f\n        var maxBottom = 0f\n\n        // Compose the rect using views whose adapter positions are in range. There may be extra\n        // views due to item animations, so only use the first view found for each position.\n        val seenPositions = hashSetOf<Int>()\n        parent.forEach { view ->\n            val position = parent.getChildViewHolder(view).adapterPosition\n            if (position != -1 && position in range && seenPositions.add(position)) {\n                minLeft = min(minLeft, view.left.toFloat())\n                minTop = min(minTop, view.top.toFloat())\n                maxRight = max(maxRight, view.right.toFloat())\n                maxBottom = max(maxBottom, view.bottom.toFloat())\n            }\n        }\n\n        outRectF.set(minLeft, minTop, maxRight, maxBottom)\n        outRectF.inset(insetHorizontal, insetVertical)\n    }\n\n    private fun startAnimatorIfNeeded(initial: RectF, target: RectF, parent: RecyclerView) {\n        if ((initial.isEmpty && target.isEmpty) || initial == target) {\n            return\n        }\n\n        animator = if (target.isEmpty) {\n            ValueAnimator.ofFloat(1f, 0f) // disappearing animation\n        } else {\n            ValueAnimator.ofFloat(0f, 1f) // appearing or moving animation\n        }.apply {\n            addListener(object : AnimatorListenerAdapter() {\n                override fun onAnimationEnd(animation: Animator?) {\n                    animator = null\n                }\n            })\n            addUpdateListener {\n                progress = animatedValue as Float\n                // Invalidate so we get to draw on the next frame.\n                parent.invalidateItemDecorations()\n            }\n\n            start()\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/CollapsibleCard.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.os.Parcel\nimport android.os.Parcelable\nimport android.text.method.LinkMovementMethod\nimport android.transition.Transition\nimport android.transition.TransitionInflater\nimport android.transition.TransitionManager\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.core.text.HtmlCompat\nimport com.google.samples.apps.iosched.R\n\n/**\n * Collapsible card, description of which can be HTML.\n * In that case, the text specified as \"cardDescription\" needs to be wrapped with <![CDATA[ ... ]]>\n */\nclass CollapsibleCard @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : FrameLayout(context, attrs, defStyleAttr) {\n\n    private var expanded = false\n    private val cardTitleView: TextView\n    private lateinit var cardDescriptionView: TextView\n    private val expandIcon: ImageView\n    private val titleContainer: View\n    private val toggle: Transition\n    private val root: View\n    private val cardTitle: String?\n\n    init {\n        val arr = context.obtainStyledAttributes(attrs, R.styleable.CollapsibleCard, 0, 0)\n        cardTitle = arr.getString(R.styleable.CollapsibleCard_cardTitle)\n        val cardDescription = arr.getString(R.styleable.CollapsibleCard_cardDescription)\n        arr.recycle()\n        root = LayoutInflater.from(context)\n            .inflate(R.layout.collapsible_card_content, this, true)\n\n        titleContainer = root.findViewById(R.id.title_container)\n        cardTitleView = root.findViewById<TextView>(R.id.card_title).apply {\n            text = cardTitle\n        }\n        setTitleContentDescription(cardTitle)\n        cardDescription?.let {\n            cardDescriptionView = root.findViewById<TextView>(R.id.card_description).apply {\n                text = HtmlCompat.fromHtml(it, HtmlCompat.FROM_HTML_MODE_COMPACT)\n                movementMethod = LinkMovementMethod.getInstance()\n            }\n        }\n\n        expandIcon = root.findViewById(R.id.expand_icon)\n        toggle = TransitionInflater.from(context)\n            .inflateTransition(R.transition.info_card_toggle)\n        titleContainer.setOnClickListener {\n            toggleExpanded()\n        }\n    }\n\n    private fun setTitleContentDescription(cardTitle: String?) {\n        val res = resources\n        cardTitleView.contentDescription = \"$cardTitle, \" + if (expanded) {\n            res.getString(R.string.expanded)\n        } else {\n            res.getString(R.string.collapsed)\n        }\n    }\n\n    private fun toggleExpanded() {\n        expanded = !expanded\n        toggle.duration = if (expanded) 300L else 200L\n        TransitionManager.beginDelayedTransition(root.parent as ViewGroup, toggle)\n        cardDescriptionView.visibility = if (expanded) View.VISIBLE else View.GONE\n        expandIcon.rotationX = if (expanded) 180f else 0f\n        setTitleContentDescription(cardTitle)\n    }\n\n    override fun onSaveInstanceState(): Parcelable {\n        val savedState = SavedState(super.onSaveInstanceState()!!)\n        savedState.expanded = expanded\n        return savedState\n    }\n\n    override fun onRestoreInstanceState(state: Parcelable?) {\n        if (state is SavedState) {\n            super.onRestoreInstanceState(state.superState)\n            if (expanded != state.expanded) {\n                toggleExpanded()\n            }\n        } else {\n            super.onRestoreInstanceState(state)\n        }\n    }\n\n    internal class SavedState : BaseSavedState {\n        var expanded = false\n\n        constructor(source: Parcel) : super(source) {\n            expanded = source.readByte().toInt() != 0\n        }\n\n        constructor(superState: Parcelable) : super(superState)\n\n        override fun writeToParcel(out: Parcel, flags: Int) {\n            super.writeToParcel(out, flags)\n            out.writeByte((if (expanded) 1 else 0).toByte())\n        }\n\n        companion object {\n            @JvmField\n            val CREATOR = object : Parcelable.Creator<SavedState> {\n                override fun createFromParcel(source: Parcel): SavedState {\n                    return SavedState(source)\n                }\n\n                override fun newArray(size: Int): Array<SavedState?> {\n                    return arrayOfNulls(size)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/CountdownView.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.accessibility.AccessibilityEvent\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.core.view.AccessibilityDelegateCompat\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.postDelayed\nimport com.airbnb.lottie.LottieAnimationView\nimport com.airbnb.lottie.LottieComposition\nimport com.airbnb.lottie.LottieCompositionFactory\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport kotlin.properties.ObservableProperty\nimport kotlin.reflect.KProperty\nimport org.threeten.bp.Duration\nimport org.threeten.bp.ZonedDateTime\nimport timber.log.Timber\n\nclass CountdownView @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : ConstraintLayout(context, attrs, defStyleAttr) {\n\n    private val compositions = CompositionSet()\n\n    private val root: View = LayoutInflater.from(context).inflate(R.layout.countdown, this, true)\n    private var days1 by AnimateDigitDelegate(compositions) {\n        root.findViewById(R.id.countdown_days_1)\n    }\n    private var days2 by AnimateDigitDelegate(compositions) {\n        root.findViewById(R.id.countdown_days_2)\n    }\n    private var hours1 by AnimateDigitDelegate(compositions) {\n        root.findViewById(R.id.countdown_hours_1)\n    }\n    private var hours2 by AnimateDigitDelegate(compositions) {\n        root.findViewById(R.id.countdown_hours_2)\n    }\n    private var mins1 by AnimateDigitDelegate(compositions) {\n        root.findViewById(R.id.countdown_mins_1)\n    }\n    private var mins2 by AnimateDigitDelegate(compositions) {\n        root.findViewById(R.id.countdown_mins_2)\n    }\n    private var secs1 by AnimateDigitDelegate(compositions) {\n        root.findViewById(R.id.countdown_secs_1)\n    }\n    private var secs2 by AnimateDigitDelegate(compositions) {\n        root.findViewById(R.id.countdown_secs_2)\n    }\n\n    private val conferenceStart = TimeUtils.ConferenceDays.first().start.plusHours(3L)\n\n    data class Countdown(\n        val days: Int,\n        val hours: Int,\n        val minutes: Int,\n        val seconds: Int\n    ) {\n        companion object {\n            fun until(time: ZonedDateTime): Countdown? {\n                var duration = Duration.between(ZonedDateTime.now(), time)\n                if (duration.isNegative) {\n                    return null\n                }\n                val days = duration.toDays()\n                duration = duration.minusDays(days)\n                val hours = duration.toHours()\n                duration = duration.minusHours(hours)\n                val mins = duration.toMinutes()\n                duration = duration.minusMinutes(mins)\n                val secs = duration.seconds\n                return Countdown(days.toInt(), hours.toInt(), mins.toInt(), secs.toInt())\n            }\n        }\n    }\n\n    init {\n        isFocusableInTouchMode = true\n        ViewCompat.setAccessibilityDelegate(\n            this,\n            object : AccessibilityDelegateCompat() {\n                override fun dispatchPopulateAccessibilityEvent(\n                    host: View?,\n                    event: AccessibilityEvent?\n                ): Boolean {\n                    return if (event != null) {\n                        val countdown = Countdown.until(conferenceStart)\n                        if (countdown != null) {\n                            val res = context.resources\n                            event.text.add(\n                                res.getQuantityString(\n                                    R.plurals.duration_days, countdown.days, countdown.days\n                                )\n                            )\n                            event.text.add(\n                                res.getQuantityString(\n                                    R.plurals.duration_hours, countdown.hours, countdown.hours\n                                )\n                            )\n                            event.text.add(\n                                res.getQuantityString(\n                                    R.plurals.duration_minutes, countdown.minutes, countdown.minutes\n                                )\n                            )\n                            event.text.add(\n                                res.getQuantityString(\n                                    R.plurals.duration_seconds, countdown.seconds, countdown.seconds\n                                )\n                            )\n                        }\n                        true\n                    } else {\n                        super.dispatchPopulateAccessibilityEvent(host, event)\n                    }\n                }\n            }\n        )\n    }\n\n    private val updateTime: Runnable = object : Runnable {\n\n        override fun run() {\n            val countdown = Countdown.until(conferenceStart) ?: return\n\n            compositions.doOnReady {\n                days1 = (countdown.days / 10)\n                days2 = (countdown.days % 10)\n\n                hours1 = (countdown.hours / 10)\n                hours2 = (countdown.hours % 10)\n\n                mins1 = (countdown.minutes / 10)\n                mins2 = (countdown.minutes % 10)\n\n                secs1 = (countdown.seconds / 10)\n                secs2 = (countdown.seconds % 10)\n\n                handler?.postDelayed(this, 1_000L) // Run self every second\n            }\n        }\n    }\n\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        Timber.d(\"Starting countdown\")\n        handler?.post(updateTime)\n        compositions.load(context)\n    }\n\n    override fun onDetachedFromWindow() {\n        super.onDetachedFromWindow()\n        Timber.d(\"Stopping countdown\")\n        handler?.removeCallbacks(updateTime)\n        compositions.clear()\n    }\n\n    /**\n     * A delegate who upon receiving a new value, runs animations on a view obtained from\n     * [viewProvider]\n     */\n    private class AnimateDigitDelegate(\n        private val compositions: CompositionSet,\n        private val viewProvider: () -> LottieAnimationView\n    ) : ObservableProperty<Int>(-1) {\n        override fun afterChange(property: KProperty<*>, oldValue: Int, newValue: Int) {\n            // Sanity check, `newValue` should always be in range [0–9]\n            if (newValue < 0 || newValue > 9) {\n                Timber.e(\"Trying to animate to digit: $newValue\")\n                return\n            }\n\n            if (oldValue != newValue) {\n                val view = viewProvider()\n                if (oldValue != -1) {\n                    // Animate out the prev digit i.e play the second half of it's comp\n                    compositions[oldValue]?.let { view.setComposition(it) }\n                    view.setMinAndMaxProgress(0.5f, 1f)\n                    // Some issues scheduling & playing 2 * 500ms comps every 1s. Speed up the\n                    // outward anim slightly to give us some headroom ¯\\_(ツ)_/¯\n                    view.speed = 1.1f\n                    view.playAnimation()\n\n                    view.postDelayed(500L) {\n                        compositions[newValue]?.let { view.setComposition(it) }\n                        view.setMinAndMaxProgress(0f, 0.5f)\n                        view.speed = 1f\n                        view.playAnimation()\n                    }\n                } else {\n                    // Initial show, just animate in the desired digit\n                    compositions[newValue]?.let { view.setComposition(it) }\n                    view.setMinAndMaxProgress(0f, 0.5f)\n                    view.playAnimation()\n                }\n            }\n        }\n    }\n}\n\nprivate class CompositionSet {\n\n    private val _compositions = arrayOfNulls<LottieComposition?>(10)\n\n    private var doOnReadyCallback: (() -> Unit)? = null\n\n    val ready: Boolean\n        get() = _compositions.all { it != null }\n\n    fun load(context: Context) {\n        for (i in 0..9) {\n            LottieCompositionFactory.fromAsset(context, \"anim/$i.json\").addListener { composition ->\n                _compositions[i] = composition\n                if (ready) {\n                    doOnReadyCallback?.let {\n                        it()\n                        doOnReadyCallback = null\n                    }\n                }\n            }\n        }\n    }\n\n    fun doOnReady(body: () -> Unit) {\n        if (ready) {\n            body()\n        } else {\n            doOnReadyCallback = body\n        }\n    }\n\n    fun clear() {\n        for (i in 0..9) {\n            _compositions[i] = null\n        }\n    }\n\n    operator fun get(i: Int): LottieComposition? {\n        return _compositions[i]\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/CustomSwipeRefreshLayout.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.MotionEvent\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n\nclass CustomSwipeRefreshLayout : SwipeRefreshLayout {\n    private var startGestureX: Float = 0f\n    private var startGestureY: Float = 0f\n\n    constructor(context: Context) : super(context)\n\n    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)\n\n    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {\n        when (event.action) {\n            MotionEvent.ACTION_DOWN -> {\n                startGestureX = event.x\n                startGestureY = event.y\n            }\n\n            MotionEvent.ACTION_MOVE -> {\n                if (Math.abs(event.x - startGestureX) > Math.abs(event.y - startGestureY)) {\n                    return false\n                }\n            }\n        }\n\n        return super.onInterceptTouchEvent(event)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/EventCardView.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.widget.ImageView\nimport android.widget.TextView\nimport com.google.android.material.card.MaterialCardView\nimport com.google.samples.apps.iosched.R\n\nclass EventCardView @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : MaterialCardView(context, attrs, defStyleAttr) {\n\n    init {\n        val arr = context.obtainStyledAttributes(\n            attrs, R.styleable.EventCardView, defStyleAttr, R.style.Widget_IOSched_EventCardView\n        )\n        val eventTitle = arr.getString(R.styleable.EventCardView_eventTitle)\n        val eventDescription = arr.getString(R.styleable.EventCardView_eventDescription)\n        val eventTypeLogo = arr.getDrawable(R.styleable.EventCardView_eventTypeLogo)\n        val eventTypeLogoBg = arr.getDrawable(R.styleable.EventCardView_eventTypeLogoBackground)\n        arr.recycle()\n\n        LayoutInflater.from(context).inflate(R.layout.event_card_content, this, true)\n\n        findViewById<ImageView>(R.id.header_image).apply {\n            background = eventTypeLogoBg\n            setImageDrawable(eventTypeLogo)\n        }\n\n        findViewById<TextView>(R.id.event_title).apply {\n            text = eventTitle\n        }\n        findViewById<TextView>(R.id.event_description).apply {\n            text = eventDescription\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/FadingSnackbar.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.widget.Button\nimport android.widget.FrameLayout\nimport android.widget.TextView\nimport androidx.annotation.StringRes\nimport androidx.core.view.postDelayed\nimport com.google.samples.apps.iosched.R\n\n/**\n * A custom snackbar implementation allowing more control over placement and entry/exit animations.\n */\nclass FadingSnackbar(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) {\n\n    private val message: TextView\n    private val action: Button\n\n    init {\n        val view = LayoutInflater.from(context).inflate(R.layout.fading_snackbar_layout, this, true)\n        message = view.findViewById(R.id.snackbar_text)\n        action = view.findViewById(R.id.snackbar_action)\n    }\n\n    fun dismiss() {\n        if (visibility == VISIBLE && alpha == 1f) {\n            animate()\n                .alpha(0f)\n                .withEndAction { visibility = GONE }\n                .duration = EXIT_DURATION\n        }\n    }\n\n    fun show(\n        @StringRes messageId: Int = 0,\n        messageText: CharSequence? = null,\n        @StringRes actionId: Int? = null,\n        longDuration: Boolean = true,\n        actionClick: () -> Unit = { dismiss() },\n        dismissListener: () -> Unit = { }\n    ) {\n        message.text = messageText ?: context.getString(messageId)\n        if (actionId != null) {\n            action.run {\n                visibility = VISIBLE\n                text = context.getString(actionId)\n                setOnClickListener {\n                    actionClick()\n                }\n            }\n        } else {\n            action.visibility = GONE\n        }\n        alpha = 0f\n        visibility = VISIBLE\n        animate()\n            .alpha(1f)\n            .duration = ENTER_DURATION\n        val showDuration = ENTER_DURATION + if (longDuration) LONG_DURATION else SHORT_DURATION\n        postDelayed(showDuration) {\n            dismiss()\n            dismissListener()\n        }\n    }\n\n    companion object {\n        private const val ENTER_DURATION = 300L\n        private const val EXIT_DURATION = 200L\n        private const val SHORT_DURATION = 1_500L\n        private const val LONG_DURATION = 2_750L\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/HashtagIoDecoration.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Rect\nimport android.graphics.drawable.Drawable\nimport android.view.View\nimport androidx.core.graphics.withTranslation\nimport androidx.core.view.forEach\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.ItemDecoration\nimport androidx.recyclerview.widget.RecyclerView.State\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.util.isRtl\nimport kotlin.math.max\nimport kotlin.math.roundToInt\n\nclass HashtagIoDecoration(context: Context) : ItemDecoration() {\n\n    private val drawable: Drawable?\n    private val margin: Int\n\n    private var decorBottom = 0\n\n    init {\n        val attrs = context.obtainStyledAttributes(\n            R.style.Widget_IOSched_HashtagIoDecoration,\n            R.styleable.HashtagIoDecoration\n        )\n        drawable = attrs.getDrawable(R.styleable.HashtagIoDecoration_android_drawable)?.apply {\n            setBounds(0, 0, intrinsicWidth, intrinsicHeight)\n        }\n        margin = attrs.getDimensionPixelSize(R.styleable.HashtagIoDecoration_margin, 0)\n        attrs.recycle()\n\n        decorBottom = 2 * margin + (drawable?.intrinsicHeight ?: 0)\n    }\n\n    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: State) {\n        // Decorate the last child only.\n        if (drawable == null || parent.getChildAdapterPosition(view) != state.itemCount - 1) {\n            super.getItemOffsets(outRect, view, parent, state)\n        } else {\n            outRect.set(0, 0, 0, decorBottom)\n        }\n    }\n\n    override fun onDraw(canvas: Canvas, parent: RecyclerView, state: State) {\n        if (drawable == null) {\n            return\n        }\n\n        val x = if (parent.isRtl()) {\n            parent.paddingEnd + margin\n        } else {\n            parent.width - parent.paddingEnd - margin - drawable.intrinsicWidth\n        }\n\n        val yFromParentBottom =\n            parent.height - parent.paddingBottom - margin - drawable.intrinsicHeight\n        if (state.itemCount < 1) {\n            // No children. Just draw at the bottom of the parent.\n            drawDecoration(canvas, x, yFromParentBottom)\n            return\n        }\n\n        // Find the decorated view or bust.\n        val child = findTargetChild(parent, state.itemCount - 1) ?: return\n        val yFromChildBottom = child.bottom + child.translationY.roundToInt() + margin\n        if (yFromChildBottom > parent.height) {\n            // There's no room below the child, so the decoration is not visible.\n            return\n        }\n\n        // Pin the decoration to the bottom of the parent if there's excess space.\n        val y = max(yFromChildBottom, yFromParentBottom)\n        drawDecoration(canvas, x, y)\n    }\n\n    private fun findTargetChild(parent: RecyclerView, adapterPosition: Int): View? {\n        parent.forEach { child ->\n            if (parent.getChildAdapterPosition(child) == adapterPosition) {\n                return child\n            }\n        }\n        return null\n    }\n\n    private fun drawDecoration(canvas: Canvas, x: Int, y: Int) {\n        canvas.withTranslation(x = x.toFloat(), y = y.toFloat()) {\n            drawable?.draw(canvas)\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/IoSlidingPaneLayout.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.slidingpanelayout.widget.SlidingPaneLayout\n\n// TODO(b/187348546) Remove when SlidingPaneLayout can support all MeasureSpec modes.\nclass IoSlidingPaneLayout @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : SlidingPaneLayout(context, attrs, defStyleAttr) {\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        val widthSpec = if (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY) {\n            // SlidingPaneLayout throws an exception when widthMode is not EXACTLY, so change to\n            // EXACTLY and continue measuring.\n            val widthSize = MeasureSpec.getSize(widthMeasureSpec)\n            MeasureSpec.makeMeasureSpec(\n                if (widthSize > 0) widthSize else 500,\n                MeasureSpec.EXACTLY\n            )\n        } else {\n            widthMeasureSpec\n        }\n\n        val heightSpec = if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) {\n            // SlidingPaneLayout throws an exception when heightMode is UNSPECIFIED, so change\n            // to AT_MOST and continue measuring.\n            val heightSize = MeasureSpec.getSize(widthMeasureSpec)\n            MeasureSpec.makeMeasureSpec(\n                if (heightSize > 0) heightSize else 500,\n                MeasureSpec.AT_MOST\n            )\n        } else {\n            heightMeasureSpec\n        }\n        super.onMeasure(widthSpec, heightSpec)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/JumpSmoothScroller.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.LinearSmoothScroller\nimport androidx.recyclerview.widget.RecyclerView.State\n\n/**\n * [LinearSmoothScroller] implementation that first jumps closer to the target position if necessary\n * in order to avoid really long scrolling animations.\n */\nclass JumpSmoothScroller(\n    context: Context,\n    /** Maximum position difference to scroll normally without jumping first. */\n    private val maxDifference: Int = 5\n) : LinearSmoothScroller(context) {\n\n    override fun getVerticalSnapPreference() = SNAP_TO_START\n\n    override fun getHorizontalSnapPreference() = SNAP_TO_START\n\n    override fun onSeekTargetStep(dx: Int, dy: Int, state: State, action: Action) {\n        val layoutManager = layoutManager as? LinearLayoutManager\n        if (layoutManager != null) {\n            // If we're far enough away from the target position, jump closer before scrolling\n            if (targetPosition + maxDifference < layoutManager.findFirstVisibleItemPosition()) {\n                action.jumpTo(targetPosition + maxDifference)\n                return\n            }\n            if (targetPosition - maxDifference > layoutManager.findLastVisibleItemPosition()) {\n                action.jumpTo(targetPosition - maxDifference)\n                return\n            }\n        }\n        // Otherwise let superclass handle scrolling normally.\n        super.onSeekTargetStep(dx, dy, state, action)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/NavigationBarContentFrameLayout.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.drawable.ColorDrawable\nimport android.util.AttributeSet\nimport android.view.Window\nimport android.view.WindowInsets\nimport android.widget.FrameLayout\nimport com.google.samples.apps.iosched.R\nimport kotlin.LazyThreadSafetyMode.NONE\n\n/**\n * A [FrameLayout] which will draw a divider on the edge of the navigation bar. Similar in\n * functionality to what [Window.setNavigationBarDividerColor] provides, but works with translucent\n * navigation bar colors.\n */\nclass NavigationBarContentFrameLayout @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : FrameLayout(context, attrs, defStyleAttr) {\n\n    var navigationBarDividerColor: Int = 0\n        set(value) {\n            field = value\n            dividerDrawable.color = value\n        }\n\n    var navigationBarDividerSize: Int = 0\n        set(value) {\n            field = value\n            updateDividerBounds()\n        }\n\n    private var lastInsets: WindowInsets? = null\n\n    private val dividerDrawable by lazy(NONE) {\n        ColorDrawable(navigationBarDividerColor).apply {\n            callback = this@NavigationBarContentFrameLayout\n            alpha = 255\n        }\n    }\n\n    init {\n        val a = context.obtainStyledAttributes(\n            attrs,\n            R.styleable.NavigationBarContentFrameLayout,\n            defStyleAttr,\n            R.style.Widget_IOSched_NavigationBarContentFrameLayout\n        )\n\n        navigationBarDividerColor = a.getColor(\n            R.styleable.NavigationBarContentFrameLayout_navigationBarBorderColor,\n            Color.MAGENTA\n        )\n        navigationBarDividerSize = a.getDimensionPixelSize(\n            R.styleable.NavigationBarContentFrameLayout_navigationBarBorderSize,\n            0\n        )\n\n        a.recycle()\n    }\n\n    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {\n        super.onSizeChanged(w, h, oldw, oldh)\n        updateDividerBounds()\n    }\n\n    override fun draw(canvas: Canvas) {\n        super.draw(canvas)\n\n        val d = dividerDrawable\n        if (!d.bounds.isEmpty) {\n            d.draw(canvas)\n        }\n    }\n\n    override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets {\n        lastInsets = insets\n        updateDividerBounds()\n        return insets\n    }\n\n    private fun updateDividerBounds() {\n        val d = dividerDrawable\n        val insets = lastInsets\n\n        val bottomInset = insets?.systemWindowInsetBottom ?: 0\n        val leftInset = insets?.systemWindowInsetLeft ?: 0\n        val rightInset = insets?.systemWindowInsetRight ?: 0\n\n        when {\n            bottomInset > 0 -> {\n                // Display divider above bottom inset\n                d.setBounds(\n                    left,\n                    bottom - bottomInset,\n                    right,\n                    bottom + navigationBarDividerSize - bottomInset\n                )\n            }\n            leftInset > 0 -> {\n                // Display divider to the right of the left inset\n                d.setBounds(\n                    leftInset - navigationBarDividerSize,\n                    top,\n                    leftInset,\n                    bottom\n                )\n            }\n            rightInset > 0 -> {\n                // Display divider to the left of the right inset\n                d.setBounds(\n                    right - rightInset,\n                    top,\n                    right + navigationBarDividerSize - rightInset,\n                    bottom\n                )\n            }\n            else -> {\n                // Set an empty size which will remove the drawable\n                d.setBounds(0, 0, 0, 0)\n            }\n        }\n\n        // Update our will-not-draw flag\n        setWillNotDraw(d.bounds.isEmpty)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/NoTouchRecyclerView.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.MotionEvent\nimport androidx.recyclerview.widget.RecyclerView\n\n/**\n * RecyclerView that rejects all touch events. This is useful for preventing a nested RecyclerView\n * from absorbing clicks or initiating unwanted scrolls.\n */\nclass NoTouchRecyclerView @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : RecyclerView(context, attrs, defStyleAttr) {\n\n    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean = false\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/SimpleRatingBar.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.widget.SeekBar\nimport androidx.appcompat.widget.AppCompatSeekBar\nimport androidx.core.content.res.ResourcesCompat\nimport com.google.samples.apps.iosched.R\n\n/**\n * This is like [android.widget.RatingBar],  but looks like SeekBar.\n */\nclass SimpleRatingBar @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : AppCompatSeekBar(context, attrs, defStyleAttr) {\n\n    private val rated = thumb\n    private val unrated = ResourcesCompat.getDrawable(\n        resources,\n        R.drawable.unrated_thumb,\n        context.theme\n    )\n\n    private var isRated: Boolean = false\n\n    private var onRateListener: OnRateListener? = null\n\n    init {\n        super.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {\n            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {\n                if (fromUser) {\n                    onRateListener?.onRate(progress + 1)\n                }\n            }\n\n            override fun onStopTrackingTouch(seekBar: SeekBar?) {\n                // Do nothing\n            }\n\n            override fun onStartTrackingTouch(seekBar: SeekBar?) {\n                thumb = rated\n            }\n        })\n    }\n\n    override fun setProgress(progress: Int) {\n        super.setProgress(progress)\n        updateIndicator(progress)\n    }\n\n    override fun setProgress(progress: Int, animate: Boolean) {\n        super.setProgress(progress, animate)\n        updateIndicator(progress)\n    }\n\n    override fun setOnSeekBarChangeListener(l: OnSeekBarChangeListener?) {\n        throw UnsupportedOperationException(\"Use setOnRateListener\")\n    }\n\n    fun setOnRateListener(listener: OnRateListener) {\n        onRateListener = listener\n    }\n\n    private fun updateIndicator(progress: Int) {\n        thumb = if (progress == -1) {\n            isRated = false\n            unrated\n        } else {\n            isRated = true\n            rated\n        }\n    }\n\n    interface OnRateListener {\n        fun onRate(rate: Int)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/SpaceDecoration.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget\n\nimport android.graphics.Rect\nimport android.view.View\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.ItemDecoration\nimport androidx.recyclerview.widget.RecyclerView.State\nimport com.google.samples.apps.iosched.util.isRtl\n\n/** ItemDecoration that adds space around items. */\nclass SpaceDecoration(\n    private val start: Int = 0,\n    private val top: Int = 0,\n    private val end: Int = 0,\n    private val bottom: Int = 0\n) : ItemDecoration() {\n\n    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: State) {\n        val isRtl = parent.isRtl()\n        outRect.set(\n            if (isRtl) end else start,\n            top,\n            if (isRtl) start else end,\n            bottom\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/java/com/google/samples/apps/iosched/widget/transition/RotateX.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.widget.transition\n\nimport android.animation.Animator\nimport android.animation.ObjectAnimator\nimport android.content.Context\nimport android.transition.Transition\nimport android.transition.TransitionValues\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.Keep\n\n/**\n * A [Transition] which animates the rotation of a [View].\n */\nclass RotateX : Transition {\n\n    @Keep\n    constructor() : super()\n\n    @Keep\n    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)\n\n    override fun getTransitionProperties(): Array<String> {\n        return TRANSITION_PROPERTIES\n    }\n\n    override fun captureStartValues(transitionValues: TransitionValues) {\n        captureValues(transitionValues)\n    }\n\n    override fun captureEndValues(transitionValues: TransitionValues) {\n        captureValues(transitionValues)\n    }\n\n    override fun createAnimator(\n        sceneRoot: ViewGroup,\n        startValues: TransitionValues?,\n        endValues: TransitionValues?\n    ): Animator? {\n        if (startValues == null || endValues == null) return null\n\n        val startRotation = startValues.values[PROP_ROTATION] as Float\n        val endRotation = endValues.values[PROP_ROTATION] as Float\n        if (startRotation == endRotation) return null\n\n        val view = endValues.view\n        // ensure the pivot is set\n        view.pivotX = view.width / 2f\n        view.pivotY = view.height / 2f\n        return ObjectAnimator.ofFloat(view, View.ROTATION_X, startRotation, endRotation)\n    }\n\n    private fun captureValues(transitionValues: TransitionValues) {\n        val view = transitionValues.view\n        if (view == null || view.width <= 0 || view.height <= 0) return\n        transitionValues.values[PROP_ROTATION] = view.rotationX\n    }\n\n    companion object {\n\n        private const val PROP_ROTATION = \"iosched:rotate:rotation\"\n        private val TRANSITION_PROPERTIES = arrayOf(PROP_ROTATION)\n    }\n}\n"
  },
  {
    "path": "mobile/src/main/res/animator/active_alpha.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:state_activated=\"true\">\n        <objectAnimator\n            android:duration=\"200\"\n            android:propertyName=\"alpha\"\n            android:valueTo=\"1\" />\n    </item>\n\n    <item>\n        <objectAnimator\n            android:duration=\"160\"\n            android:propertyName=\"alpha\"\n            android:valueTo=\"0\" />\n    </item>\n\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/color/chip_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- 20% opacity -->\n    <item android:alpha=\"@dimen/chip_bg_alpha_checked\" android:color=\"?attr/colorPrimary\" android:state_enabled=\"true\" android:state_selected=\"true\" />\n    <item android:alpha=\"@dimen/chip_bg_alpha_checked\" android:color=\"?attr/colorPrimary\" android:state_checked=\"true\" android:state_enabled=\"true\" />\n\n    <item android:color=\"@android:color/transparent\" />\n\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/color/chip_stroke.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- Transparent so that the chip bg goes to the edge. -->\n    <item android:color=\"@android:color/transparent\" android:state_enabled=\"true\" android:state_selected=\"true\" />\n    <item android:color=\"@android:color/transparent\" android:state_enabled=\"true\" android:state_checked=\"true\" />\n    <!-- 30% of 87% opacity -->\n    <item android:alpha=\"0.30\" android:color=\"?attr/colorOnSurface\" android:state_enabled=\"true\" />\n    <!-- 12% of 87% opacity -->\n    <item android:alpha=\"0.12\" android:color=\"?attr/colorOnSurface\" />\n\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/color/map_variant_icon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"?colorPrimary\" android:state_checked=\"true\" />\n    <item android:color=\"?colorControlNormal\" />\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/color/map_variant_text.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"?colorPrimary\" android:state_checked=\"true\" />\n    <item android:color=\"?android:textColorPrimary\" />\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/color/navigation_item_background_tint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"?attr/colorSecondary\" android:alpha=\"0.12\" android:state_checked=\"true\" />\n    <item android:color=\"@color/transparent\" />\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/color/schedule_day_indicator_text.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"?android:textColorPrimaryInverse\" android:state_checked=\"true\" />\n    <item android:color=\"?android:textColorPrimary\" android:state_enabled=\"true\" />\n    <item android:color=\"?android:textColorSecondary\" />\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/arcore_gray.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"200dp\"\n    android:height=\"200dp\"\n    android:viewportWidth=\"287\"\n    android:viewportHeight=\"287\">\n\n    <path\n        android:fillColor=\"#EDEDED\"\n        android:pathData=\"M21.844,114.503C69.223,114.503 107.632,150.497 107.632,194.898C107.632,239.3 69.223,275.295 21.844,275.295L21.844,114.503Z\" />\n    <path\n        android:fillColor=\"#E0E0E0\"\n        android:pathData=\"M92.395,135.935l165.881,0l0,-84.705l-67.058,24.705l0,-63.529l-98.823,45.883z\" />\n    <path\n        android:fillColor=\"#EDEDED\"\n        android:pathData=\"M143.914,271.407l120.564,0l0,-83.383l-120.564,0z\" />\n    <path\n        android:fillColor=\"#C1C1C1\"\n        android:pathData=\"M212.36,192.546L172.96,169.702C167.145,179.72 156.336,186.461 143.914,186.461L143.881,186.461L137.022,209.304L143.881,236.955C145.78,236.955 147.73,236.467 149.427,235.476L212.411,198.967C212.427,198.949 212.444,198.949 212.46,198.933C214.881,197.505 214.781,193.941 212.36,192.546\" />\n    <path\n        android:fillColor=\"#AAAAAA\"\n        android:pathData=\"M114.868,169.702L90.646,175.838L71.384,194.916C72.342,196.564 73.72,197.975 75.418,198.966L138.401,235.475C140.099,236.467 141.965,236.955 143.88,236.955L143.88,186.461C131.475,186.461 120.684,179.703 114.868,169.702\" />\n    <path\n        android:fillColor=\"#C1C1C1\"\n        android:pathData=\"M143.914,119.259L159.008,93.39L143.914,68.766C142.015,68.766 140.116,69.253 138.401,70.245L75.435,106.77C73.737,107.762 72.359,109.173 71.4,110.821L87.789,132.908L114.885,136.034C120.684,126.017 131.508,119.259 143.914,119.259\" />\n    <path\n        android:fillColor=\"#AAAAAA\"\n        android:pathData=\"M212.461,106.787C212.443,106.77 212.427,106.77 212.41,106.753L149.427,70.261C147.729,69.27 145.813,68.782 143.914,68.782L143.914,119.276C156.337,119.276 167.144,126.034 172.96,136.035L212.36,113.191C214.781,111.779 214.882,108.216 212.461,106.787\" />\n    <path\n        android:fillColor=\"#E0E0E0\"\n        android:pathData=\"M110.313,152.86C110.313,146.708 111.994,140.976 114.868,136.017L71.401,110.804C70.442,112.468 69.921,114.368 69.921,116.351L69.921,189.37C69.921,191.353 70.442,193.252 71.401,194.899L114.868,169.686C111.994,164.743 110.313,159.012 110.313,152.86\" />\n    <path\n        android:fillColor=\"#E0E0E0\"\n        android:pathData=\"M150.134,149.28L172.943,136.034C167.127,126 156.303,119.242 143.881,119.242C131.459,119.242 120.634,126 114.818,136.018L137.779,149.262C141.594,151.498 146.318,151.498 150.134,149.28\" />\n    <path\n        android:fillColor=\"#F2F2F2\"\n        android:pathData=\"M172.96,136.035L150.151,149.28C146.318,151.499 141.611,151.499 137.779,149.28L114.818,136.035C111.944,140.976 110.263,146.725 110.263,152.86C110.263,171.435 125.307,186.478 143.881,186.478C162.454,186.478 177.498,171.435 177.498,152.86C177.498,146.725 175.834,140.993 172.96,136.035\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/asld_chip_icon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<animated-selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/chip_check\"\n        android:drawable=\"@drawable/chip_check\"\n        android:state_checked=\"true\" />\n    <item\n        android:id=\"@+id/chip_dot\"\n        android:drawable=\"@drawable/chip_dot\" />\n\n    <transition\n        android:fromId=\"@id/chip_dot\"\n        android:toId=\"@id/chip_check\"\n        android:drawable=\"@drawable/avd_chip_dot_to_check\" />\n    <transition\n        android:fromId=\"@id/chip_check\"\n        android:toId=\"@id/chip_dot\"\n        android:drawable=\"@drawable/avd_chip_check_to_dot\" />\n</animated-selector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/asld_reservation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-selector\n    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/reserved\"\n        android:drawable=\"@drawable/ic_reserved\"\n        app:state_reserved=\"true\" />\n\n    <item\n        android:id=\"@+id/wait_listed\"\n        android:drawable=\"@drawable/ic_waitlisted\"\n        app:state_wait_listed=\"true\" />\n\n    <item\n        android:id=\"@+id/wait_list_available\"\n        android:drawable=\"@drawable/ic_waitlist_available\"\n        app:state_wait_list_available=\"true\" />\n\n    <item\n        android:id=\"@+id/reservation_pending\"\n        android:drawable=\"@drawable/ic_reservation_pending\"\n        app:state_reservation_pending=\"true\" />\n\n    <item\n        android:id=\"@+id/reservation_disabled\"\n        android:drawable=\"@drawable/ic_reservation_disabled\"\n        app:state_reservation_disabled=\"true\" />\n\n    <item\n        android:id=\"@+id/reservable\"\n        android:drawable=\"@drawable/ic_reservable\" />\n\n    <transition\n        android:drawable=\"@drawable/avd_reservable_to_pending\"\n        android:fromId=\"@id/reservable\"\n        android:toId=\"@id/reservation_pending\" />\n\n    <transition\n        android:drawable=\"@drawable/avd_pending_to_reservable\"\n        android:fromId=\"@id/reservation_pending\"\n        android:toId=\"@id/reservable\" />\n\n    <transition\n        android:drawable=\"@drawable/avd_pending_to_reserved\"\n        android:fromId=\"@id/reservation_pending\"\n        android:toId=\"@id/reserved\" />\n\n    <transition\n        android:drawable=\"@drawable/avd_reserved_to_pending\"\n        android:fromId=\"@id/reserved\"\n        android:toId=\"@id/reservation_pending\" />\n\n    <transition\n        android:drawable=\"@drawable/avd_pending_to_waitlisted\"\n        android:fromId=\"@id/reservation_pending\"\n        android:toId=\"@id/wait_listed\" />\n\n    <transition\n        android:drawable=\"@drawable/avd_waitlisted_to_pending\"\n        android:fromId=\"@id/wait_listed\"\n        android:toId=\"@id/reservation_pending\" />\n\n</animated-selector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/asld_star_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/starred\"\n        android:drawable=\"@drawable/ic_star\"\n        android:state_checked=\"true\" />\n\n    <item\n        android:id=\"@+id/unstarred\"\n        android:drawable=\"@drawable/ic_star_border\" />\n\n    <transition\n        android:drawable=\"@drawable/avd_star_event\"\n        android:fromId=\"@id/unstarred\"\n        android:toId=\"@id/starred\" />\n\n    <transition\n        android:drawable=\"@drawable/avd_unstar_event\"\n        android:fromId=\"@id/starred\"\n        android:toId=\"@id/unstarred\" />\n\n</animated-selector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_chip_check_to_dot.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<animated-vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:drawable=\"@drawable/chip_check\">\n\n    <target android:name=\"icon_path\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:duration=\"300\"\n                android:propertyName=\"pathData\"\n                android:valueFrom=\"@string/chip_check_path\"\n                android:valueTo=\"@string/chip_dot_path\"\n                android:valueType=\"pathType\" />\n        </aapt:attr>\n    </target>\n\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_chip_dot_to_check.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<animated-vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:drawable=\"@drawable/chip_dot\">\n\n    <target android:name=\"icon_path\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:duration=\"300\"\n                android:propertyName=\"pathData\"\n                android:valueFrom=\"@string/chip_dot_path\"\n                android:valueTo=\"@string/chip_check_path\"\n                android:valueType=\"pathType\" />\n        </aapt:attr>\n    </target>\n\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_pending_to_reservable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:width=\"24dp\"\n            android:height=\"24dp\"\n            android:viewportWidth=\"24\"\n            android:viewportHeight=\"24\">\n            <group\n                android:name=\"star_group\"\n                android:pivotX=\"12\"\n                android:pivotY=\"13\"\n                android:scaleX=\"0\"\n                android:scaleY=\"0\">\n                <path\n                    android:name=\"star\"\n                    android:fillColor=\"?colorControlNormal\"\n                    android:pathData=\"M 14.39 15.5 L 11.95 13.93 L 9.51 15.5 L 10.24 12.69 L 8 10.86 L 10.89 10.69 L 11.95 8 L 13 10.69 L 15.89 10.86 L 13.65 12.7 Z\" />\n            </group>\n            <path\n                android:name=\"outline\"\n                android:pathData=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                android:strokeColor=\"?colorControlNormal\"\n                android:strokeWidth=\"2\" />\n        </vector>\n    </aapt:attr>\n    <target android:name=\"outline\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:duration=\"400\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"\n                android:propertyName=\"pathData\"\n                android:startOffset=\"100\"\n                android:valueFrom=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                android:valueTo=\"M 11.925 18 L 21.17 18 C 21.63 18 22 17.65 22 17.25 L 22 14.57 C 20.912 14.181 20.182 13.155 20.17 12 C 20.17 10.82 20.93 9.82 22 9.43 L 22 9.43 L 22 6.75 C 22 6.35 21.63 6 21.17 6 L 2.83 6 C 2.37 6 2.01 6.35 2.01 6.75 L 2.01 9.43 C 3.07 9.83 3.83 10.82 3.83 12 C 3.83 13.18 3.07 14.18 2 14.57 L 2 17.25 C 2 17.65 2.37 18 2.83 18 L 11.925 18\"\n                android:valueType=\"pathType\" />\n        </aapt:attr>\n    </target>\n    <target android:name=\"star_group\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"250\"\n                    android:interpolator=\"@android:interpolator/linear_out_slow_in\"\n                    android:propertyName=\"scaleX\"\n                    android:startOffset=\"250\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n                <objectAnimator\n                    android:duration=\"250\"\n                    android:interpolator=\"@android:interpolator/linear_out_slow_in\"\n                    android:propertyName=\"scaleY\"\n                    android:startOffset=\"250\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n            </set>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_pending_to_reserved.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:width=\"24dp\"\n            android:height=\"24dp\"\n            android:viewportWidth=\"24\"\n            android:viewportHeight=\"24\">\n            <path\n                android:name=\"outline\"\n                android:fillAlpha=\"0\"\n                android:fillColor=\"?colorPrimary\"\n                android:pathData=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                android:strokeColor=\"?colorControlNormal\"\n                android:strokeWidth=\"2\" />\n            <group\n                android:name=\"star_group\"\n                android:pivotX=\"12\"\n                android:pivotY=\"13\"\n                android:scaleX=\"0\"\n                android:scaleY=\"0\">\n                <path\n                    android:name=\"star\"\n                    android:fillColor=\"?colorSurface\"\n                    android:pathData=\"M 15.1 16 L 14.16 12.46 L 17 10.13 L 13.34 9.91 L 12 6.5 L 10.65 9.9 L 6.99 10.12 L 9.83 12.45 L 8.91 16 L 12.01 14 L 15.1 16 Z\" />\n            </group>\n        </vector>\n    </aapt:attr>\n    <target android:name=\"outline\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"400\"\n                    android:interpolator=\"@android:interpolator/fast_out_slow_in\"\n                    android:propertyName=\"pathData\"\n                    android:startOffset=\"100\"\n                    android:valueFrom=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                    android:valueTo=\"M 11.925 18 L 21.17 18 C 21.63 18 22 17.65 22 17.25 L 22 14.57 C 20.912 14.181 20.182 13.155 20.17 12 C 20.17 10.82 20.93 9.82 22 9.43 L 22 9.43 L 22 6.75 C 22 6.35 21.63 6 21.17 6 L 2.83 6 C 2.37 6 2.01 6.35 2.01 6.75 L 2.01 9.43 C 3.07 9.83 3.83 10.82 3.83 12 C 3.83 13.18 3.07 14.18 2 14.57 L 2 17.25 C 2 17.65 2.37 18 2.83 18 L 11.925 18\"\n                    android:valueType=\"pathType\" />\n                <objectAnimator\n                    android:duration=\"400\"\n                    android:interpolator=\"@android:interpolator/fast_out_slow_in\"\n                    android:propertyName=\"fillAlpha\"\n                    android:startOffset=\"100\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n                <objectAnimator\n                    android:duration=\"400\"\n                    android:interpolator=\"@android:interpolator/fast_out_slow_in\"\n                    android:propertyName=\"strokeColor\"\n                    android:startOffset=\"100\"\n                    android:valueFrom=\"#747474\"\n                    android:valueTo=\"?colorPrimary\"\n                    android:valueType=\"colorType\" />\n            </set>\n        </aapt:attr>\n    </target>\n    <target android:name=\"star_group\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"200\"\n                    android:interpolator=\"@android:anim/overshoot_interpolator\"\n                    android:propertyName=\"scaleX\"\n                    android:startOffset=\"300\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n                <objectAnimator\n                    android:duration=\"200\"\n                    android:interpolator=\"@android:anim/overshoot_interpolator\"\n                    android:propertyName=\"scaleY\"\n                    android:startOffset=\"300\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n            </set>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_pending_to_waitlisted.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:width=\"24dp\"\n            android:height=\"24dp\"\n            android:viewportWidth=\"24\"\n            android:viewportHeight=\"24\">\n            <path\n                android:pathData=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                android:strokeColor=\"?colorControlNormal\"\n                android:strokeWidth=\"2\" />\n            <group android:name=\"group\">\n                <clip-path\n                    android:name=\"filled_mask\"\n                    android:pathData=\"M 0 21 L 24 21 L 24 21 L 0 21 Z\" />\n                <path\n                    android:fillColor=\"?colorPrimary\"\n                    android:pathData=\"M 7 4 L 7 9 L 10.33 12.33 L 7 15.67 L 7 20.67 L 17 20.67 L 17 15.68 L 13.67 12.33 L 17 9.01 L 17 4 Z\" />\n            </group>\n        </vector>\n    </aapt:attr>\n    <target android:name=\"filled_mask\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:duration=\"400\"\n                android:interpolator=\"@android:interpolator/fast_out_slow_in\"\n                android:propertyName=\"pathData\"\n                android:startOffset=\"100\"\n                android:valueFrom=\"M 0 21 L 24 21 L 24 21 L 0 21 Z\"\n                android:valueTo=\"M 0 4 L 24 4 L 24 21 L 0 21 Z\"\n                android:valueType=\"pathType\" />\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_reservable_to_pending.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:width=\"24dp\"\n            android:height=\"24dp\"\n            android:viewportWidth=\"24\"\n            android:viewportHeight=\"24\">\n            <group\n                android:name=\"star_group\"\n                android:pivotX=\"12\"\n                android:pivotY=\"14\">\n                <path\n                    android:name=\"star\"\n                    android:fillColor=\"?colorControlNormal\"\n                    android:pathData=\"M 14.39 15.5 L 11.95 13.93 L 9.51 15.5 L 10.24 12.69 L 8 10.86 L 10.89 10.69 L 11.95 8 L 13 10.69 L 15.89 10.86 L 13.65 12.7 Z\" />\n            </group>\n            <path\n                android:name=\"outline\"\n                android:pathData=\"M 22 9.43 L 22 6.75 C 22 6.35 21.63 6 21.17 6 L 2.83 6 C 2.37 6 2.01 6.35 2.01 6.75 L 2.01 9.43 C 3.07 9.83 3.83 10.82 3.83 12 C 3.83 13.18 3.07 14.18 2 14.57 L 2 17.25 C 2 17.65 2.37 18 2.83 18 L 21.17 18 C 21.63 18 22 17.65 22 17.25 L 22 14.57 C 20.912 14.181 20.182 13.155 20.17 12 C 20.17 10.82 20.93 9.82 22 9.43 Z\"\n                android:strokeColor=\"?colorControlNormal\"\n                android:strokeWidth=\"2\" />\n            <path\n                android:name=\"progress\"\n                android:pathData=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                android:strokeAlpha=\"0\"\n                android:strokeColor=\"?colorControlNormal\"\n                android:strokeWidth=\"2\"\n                android:trimPathEnd=\"0.03\"\n                android:trimPathOffset=\"0\"\n                android:trimPathStart=\"0\" />\n        </vector>\n    </aapt:attr>\n    <target android:name=\"outline\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"400\"\n                    android:interpolator=\"@android:interpolator/fast_out_slow_in\"\n                    android:propertyName=\"pathData\"\n                    android:valueFrom=\"M 11.925 18 L 21.17 18 C 21.63 18 22 17.65 22 17.25 L 22 14.57 C 20.912 14.181 20.182 13.155 20.17 12 C 20.17 10.82 20.93 9.82 22 9.43 L 22 9.43 L 22 6.75 C 22 6.35 21.63 6 21.17 6 L 2.83 6 C 2.37 6 2.01 6.35 2.01 6.75 L 2.01 9.43 C 3.07 9.83 3.83 10.82 3.83 12 C 3.83 13.18 3.07 14.18 2 14.57 L 2 17.25 C 2 17.65 2.37 18 2.83 18 L 11.925 18\"\n                    android:valueTo=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                    android:valueType=\"pathType\" />\n                <objectAnimator\n                    android:duration=\"400\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"strokeColor\"\n                    android:valueFrom=\"#8a8a8a\"\n                    android:valueTo=\"#dadce0\"\n                    android:valueType=\"colorType\" />\n            </set>\n        </aapt:attr>\n    </target>\n    <target android:name=\"star_group\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"150\"\n                    android:interpolator=\"@android:interpolator/fast_out_linear_in\"\n                    android:propertyName=\"scaleX\"\n                    android:valueFrom=\"1\"\n                    android:valueTo=\"0\" />\n                <objectAnimator\n                    android:duration=\"150\"\n                    android:interpolator=\"@android:interpolator/fast_out_linear_in\"\n                    android:propertyName=\"scaleY\"\n                    android:valueFrom=\"1\"\n                    android:valueTo=\"0\" />\n            </set>\n        </aapt:attr>\n    </target>\n    <target android:name=\"progress\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"500\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"strokeAlpha\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:propertyName=\"trimPathStart\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"0.75\"\n                    android:valueType=\"floatType\">\n                    <aapt:attr name=\"android:interpolator\">\n                        <pathInterpolator\n                            android:pathData=\"L0.5,0 C 0.7,0 0.6,1 1,1\" />\n                    </aapt:attr>\n                </objectAnimator>\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:propertyName=\"trimPathEnd\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0.03\"\n                    android:valueTo=\"0.78\"\n                    android:valueType=\"floatType\">\n                    <aapt:attr name=\"android:interpolator\">\n                        <pathInterpolator\n                            android:pathData=\"C0.2,0 0.1,1 0.5,0.96 C 0.96666666666,0.96 0.99333333333,1 1,1\" />\n                    </aapt:attr>\n                </objectAnimator>\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"trimPathOffset\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"0.25\"\n                    android:valueType=\"floatType\" />\n            </set>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_reserved_to_pending.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:width=\"24dp\"\n            android:height=\"24dp\"\n            android:viewportWidth=\"24\"\n            android:viewportHeight=\"24\">\n            <path\n                android:name=\"outline\"\n                android:fillColor=\"?colorPrimary\"\n                android:pathData=\"M 11.925 18 L 21.17 18 C 21.63 18 22 17.65 22 17.25 L 22 14.57 C 20.912 14.181 20.182 13.155 20.17 12 C 20.17 10.82 20.93 9.82 22 9.43 L 22 9.43 L 22 6.75 C 22 6.35 21.63 6 21.17 6 L 2.83 6 C 2.37 6 2.01 6.35 2.01 6.75 L 2.01 9.43 C 3.07 9.83 3.83 10.82 3.83 12 C 3.83 13.18 3.07 14.18 2 14.57 L 2 17.25 C 2 17.65 2.37 18 2.83 18 L 11.925 18\"\n                android:strokeColor=\"?colorPrimary\"\n                android:strokeWidth=\"2\" />\n            <group\n                android:name=\"star_group\"\n                android:pivotX=\"12\"\n                android:pivotY=\"13\">\n                <path\n                    android:fillColor=\"?colorSurface\"\n                    android:pathData=\"M 15.1 16 L 14.16 12.46 L 17 10.13 L 13.34 9.91 L 12 6.5 L 10.65 9.9 L 6.99 10.12 L 9.83 12.45 L 8.91 16 L 12.01 14 L 15.1 16 Z\" />\n            </group>\n            <path\n                android:name=\"progress\"\n                android:pathData=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                android:strokeAlpha=\"0\"\n                android:strokeColor=\"?colorControlNormal\"\n                android:strokeWidth=\"2\"\n                android:trimPathEnd=\"0.03\"\n                android:trimPathOffset=\"0\"\n                android:trimPathStart=\"0\" />\n        </vector>\n    </aapt:attr>\n    <target android:name=\"outline\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"450\"\n                    android:interpolator=\"@android:interpolator/fast_out_slow_in\"\n                    android:propertyName=\"pathData\"\n                    android:startOffset=\"50\"\n                    android:valueFrom=\"M 11.925 18 L 21.17 18 C 21.63 18 22 17.65 22 17.25 L 22 14.57 C 20.912 14.181 20.182 13.155 20.17 12 C 20.17 10.82 20.93 9.82 22 9.43 L 22 9.43 L 22 6.75 C 22 6.35 21.63 6 21.17 6 L 2.83 6 C 2.37 6 2.01 6.35 2.01 6.75 L 2.01 9.43 C 3.07 9.83 3.83 10.82 3.83 12 C 3.83 13.18 3.07 14.18 2 14.57 L 2 17.25 C 2 17.65 2.37 18 2.83 18 L 11.925 18\"\n                    android:valueTo=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                    android:valueType=\"pathType\" />\n                <objectAnimator\n                    android:duration=\"450\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"fillAlpha\"\n                    android:startOffset=\"50\"\n                    android:valueFrom=\"1\"\n                    android:valueTo=\"0\"\n                    android:valueType=\"floatType\" />\n                <objectAnimator\n                    android:duration=\"450\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"strokeColor\"\n                    android:startOffset=\"50\"\n                    android:valueFrom=\"?colorPrimary\"\n                    android:valueTo=\"#dadce0\"\n                    android:valueType=\"colorType\" />\n            </set>\n        </aapt:attr>\n    </target>\n    <target android:name=\"star_group\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"250\"\n                    android:interpolator=\"@android:anim/anticipate_interpolator\"\n                    android:propertyName=\"scaleX\"\n                    android:valueFrom=\"1\"\n                    android:valueTo=\"0\" />\n                <objectAnimator\n                    android:duration=\"250\"\n                    android:interpolator=\"@android:anim/anticipate_interpolator\"\n                    android:propertyName=\"scaleY\"\n                    android:valueFrom=\"1\"\n                    android:valueTo=\"0\" />\n            </set>\n        </aapt:attr>\n    </target>\n    <target android:name=\"progress\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"500\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"strokeAlpha\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:propertyName=\"trimPathStart\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"0.75\"\n                    android:valueType=\"floatType\">\n                    <aapt:attr name=\"android:interpolator\">\n                        <pathInterpolator\n                            android:pathData=\"L0.5,0 C 0.7,0 0.6,1 1,1\" />\n                    </aapt:attr>\n                </objectAnimator>\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:propertyName=\"trimPathEnd\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0.03\"\n                    android:valueTo=\"0.78\"\n                    android:valueType=\"floatType\">\n                    <aapt:attr name=\"android:interpolator\">\n                        <pathInterpolator\n                            android:pathData=\"C0.2,0 0.1,1 0.5,0.96 C 0.96666666666,0.96 0.99333333333,1 1,1\" />\n                    </aapt:attr>\n                </objectAnimator>\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"trimPathOffset\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"0.25\"\n                    android:valueType=\"floatType\" />\n            </set>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_star_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:width=\"24dp\"\n            android:height=\"24dp\"\n            android:viewportWidth=\"24\"\n            android:viewportHeight=\"24\">\n            <path\n                android:fillColor=\"?colorControlNormal\"\n                android:pathData=\"M 22 9.24 L 14.81 8.62 L 12 2 L 9.19 8.63 L 2 9.24 L 7.46 13.97 L 5.82 21 L 12 17.27 L 18.18 21 L 16.55 13.97 L 22 9.24 Z M 12 15.089 L 8.574 17.157 L 9.485 13.257 L 6.46 10.632 L 10.451 10.286 L 12.001 6.614 L 13.559 10.295 L 17.55 10.642 L 14.525 13.266 L 15.435 17.166 L 12 15.09 Z\" />\n            <group\n                android:name=\"filled_group\"\n                android:pivotX=\"12\"\n                android:pivotY=\"12\"\n                android:scaleX=\"0\"\n                android:scaleY=\"0\">\n                <path\n                    android:fillColor=\"?colorPrimary\"\n                    android:pathData=\"M 22 9.24 L 14.81 8.62 L 12 2 L 9.19 8.63 L 2 9.24 L 7.46 13.97 L 5.82 21 L 12 17.27 L 18.18 21 L 16.55 13.97 Z\" />\n            </group>\n        </vector>\n    </aapt:attr>\n    <target android:name=\"filled_group\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"300\"\n                    android:interpolator=\"@android:anim/overshoot_interpolator\"\n                    android:propertyName=\"scaleX\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n                <objectAnimator\n                    android:duration=\"300\"\n                    android:interpolator=\"@android:anim/overshoot_interpolator\"\n                    android:propertyName=\"scaleY\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n            </set>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_unstar_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:width=\"24dp\"\n            android:height=\"24dp\"\n            android:viewportWidth=\"24\"\n            android:viewportHeight=\"24\">\n            <path\n                android:fillColor=\"?colorControlNormal\"\n                android:pathData=\"M 22 9.24 L 14.81 8.62 L 12 2 L 9.19 8.63 L 2 9.24 L 7.46 13.97 L 5.82 21 L 12 17.27 L 18.18 21 L 16.55 13.97 L 22 9.24 Z M 12 15.089 L 8.574 17.157 L 9.485 13.257 L 6.46 10.632 L 10.451 10.286 L 12.001 6.614 L 13.559 10.295 L 17.55 10.642 L 14.525 13.266 L 15.435 17.166 L 12 15.09 Z\" />\n            <group\n                android:name=\"filled_group\"\n                android:pivotX=\"12\"\n                android:pivotY=\"12\">\n                <path\n                    android:fillColor=\"?colorPrimary\"\n                    android:pathData=\"M 22 9.24 L 14.81 8.62 L 12 2 L 9.19 8.63 L 2 9.24 L 7.46 13.97 L 5.82 21 L 12 17.27 L 18.18 21 L 16.55 13.97 Z\" />\n            </group>\n        </vector>\n    </aapt:attr>\n    <target android:name=\"filled_group\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"250\"\n                    android:interpolator=\"@android:anim/anticipate_interpolator\"\n                    android:propertyName=\"scaleX\"\n                    android:valueFrom=\"1\"\n                    android:valueTo=\"0\" />\n                <objectAnimator\n                    android:duration=\"250\"\n                    android:interpolator=\"@android:anim/anticipate_interpolator\"\n                    android:propertyName=\"scaleY\"\n                    android:valueFrom=\"1\"\n                    android:valueTo=\"0\" />\n            </set>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/avd_waitlisted_to_pending.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<animated-vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\">\n    <aapt:attr name=\"android:drawable\">\n        <vector\n            android:width=\"24dp\"\n            android:height=\"24dp\"\n            android:viewportWidth=\"24\"\n            android:viewportHeight=\"24\">\n            <path\n                android:name=\"stroked_hour_glass\"\n                android:pathData=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                android:strokeColor=\"?android:textColorTertiary\"\n                android:strokeWidth=\"2\" />\n            <path\n                android:name=\"progress\"\n                android:pathData=\"M 12.075 19.67 L 16 19.67 C 16 18.477 16 17.283 16 16.09 L 14.125 14.21 C 13.5 13.583 12.875 12.957 12.25 12.33 C 12.875 11.707 13.5 11.083 14.125 10.46 L 16 8.59 L 16 6.795 C 16 6.197 16 5.598 16 5 L 8 5 C 8 5.598 8 6.197 8 6.795 L 8 8.59 C 9.25 9.837 10.5 11.083 11.75 12.33 C 11.125 12.955 10.5 13.58 9.875 14.205 L 8 16.08 C 8 17.277 8 18.473 8 19.67 L 12.075 19.67\"\n                android:strokeAlpha=\"0\"\n                android:strokeColor=\"?colorControlNormal\"\n                android:strokeWidth=\"2\"\n                android:trimPathEnd=\"0.03\"\n                android:trimPathOffset=\"0\"\n                android:trimPathStart=\"0\" />\n            <group>\n                <clip-path\n                    android:name=\"filled_mask\"\n                    android:pathData=\"M 0 4 L 24 4 L 24 21 L 0 21 Z\" />\n                <path\n                    android:fillColor=\"?colorPrimary\"\n                    android:pathData=\"M 7 4 L 7 9 L 10.33 12.33 L 7 15.67 L 7 20.67 L 17 20.67 L 17 15.68 L 13.67 12.33 L 17 9.01 L 17 4 Z\" />\n            </group>\n        </vector>\n    </aapt:attr>\n    <target android:name=\"filled_mask\">\n        <aapt:attr name=\"android:animation\">\n            <objectAnimator\n                android:duration=\"250\"\n                android:interpolator=\"@android:interpolator/fast_out_linear_in\"\n                android:propertyName=\"pathData\"\n                android:valueFrom=\"M 0 4 L 24 4 L 24 21 L 0 21 Z\"\n                android:valueTo=\"M 0 21 L 24 21 L 24 21 L 0 21 Z\"\n                android:valueType=\"pathType\" />\n        </aapt:attr>\n    </target>\n    <target android:name=\"progress\">\n        <aapt:attr name=\"android:animation\">\n            <set>\n                <objectAnimator\n                    android:duration=\"500\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"strokeAlpha\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"1\" />\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:propertyName=\"trimPathStart\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"0.75\"\n                    android:valueType=\"floatType\">\n                    <aapt:attr name=\"android:interpolator\">\n                        <pathInterpolator\n                            android:pathData=\"L0.5,0 C 0.7,0 0.6,1 1,1\" />\n                    </aapt:attr>\n                </objectAnimator>\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:propertyName=\"trimPathEnd\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0.03\"\n                    android:valueTo=\"0.78\"\n                    android:valueType=\"floatType\">\n                    <aapt:attr name=\"android:interpolator\">\n                        <pathInterpolator\n                            android:pathData=\"C0.2,0 0.1,1 0.5,0.96 C 0.96666666666,0.96 0.99333333333,1 1,1\" />\n                    </aapt:attr>\n                </objectAnimator>\n                <objectAnimator\n                    android:duration=\"1333\"\n                    android:interpolator=\"@android:anim/linear_interpolator\"\n                    android:propertyName=\"trimPathOffset\"\n                    android:repeatCount=\"-1\"\n                    android:valueFrom=\"0\"\n                    android:valueTo=\"0.25\"\n                    android:valueType=\"floatType\" />\n            </set>\n        </aapt:attr>\n    </target>\n</animated-vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/bullet_small.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"?colorControlNormal\" />\n    <size\n        android:width=\"4dp\"\n        android:height=\"4dp\" />\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/chip_check.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<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:name=\"icon_path\"\n        android:fillColor=\"#000\"\n        android:pathData=\"@string/chip_check_path\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/chip_dot.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<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:name=\"icon_path\"\n        android:fillColor=\"#000\"\n        android:pathData=\"@string/chip_dot_path\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/divider_empty_margin_normal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <size\n        android:width=\"@dimen/margin_normal\"\n        android:height=\"@dimen/margin_normal\" />\n    <solid android:color=\"@color/transparent\" />\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/divider_empty_margin_small.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <size\n        android:width=\"@dimen/margin_small\"\n        android:height=\"@dimen/margin_small\" />\n    <solid android:color=\"@color/transparent\" />\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/divider_slash.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"4dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"4\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n\n    <path\n        android:strokeColor=\"#000\"\n        android:pathData=\"M 2.9 7.5 L 1.1 16.5 Z\"\n        android:strokeWidth=\"2\" />\n\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_header_afterhours.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"164dp\"\n    android:height=\"100dp\"\n    android:viewportWidth=\"328\"\n    android:viewportHeight=\"200\">\n    <path\n        android:fillColor=\"#FBBC04\"\n        android:pathData=\"M83.892,201m83,0a83,83 0,1 0,-166 0a83,83 0,1 0,166 0\" />\n    <path\n        android:pathData=\"M169.5,2.5v195h156v-101.23h-48.16v-50.73h-51.7v-43.04h-56.13z\"\n        android:strokeColor=\"#AF5CF7\"\n        android:strokeWidth=\"5\" />\n    <path\n        android:pathData=\"M1.72,2.5v113h76.8z\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"5\" />\n    <path\n        android:fillColor=\"#78D9EC\"\n        android:pathData=\"M82.231,0v118h84.756z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_header_codelabs.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"164dp\"\n    android:height=\"100dp\"\n    android:viewportWidth=\"328\"\n    android:viewportHeight=\"200\">\n    <path\n        android:fillColor=\"#FAD2CF\"\n        android:pathData=\"M165,100v100h167v-44.13h-40.93v-16.33h-35.07v-20.67h-40.4v-18.87z\" />\n    <path\n        android:fillColor=\"#FAD2CF\"\n        android:pathData=\"M0,48h116v-5h-116zM111,93h5v-50h-5zM111,146h5v-48h-5zM0,43h5v-43h-5z\" />\n    <path\n        android:fillColor=\"#FCE8E6\"\n        android:pathData=\"M0,5h62v-5h-62zM0,151h160v-5h-160zM0,200h165v-5h-165zM0,201h5v-103h-5zM57,93h5v-93h-5z\" />\n    <path\n        android:fillColor=\"#E5443F\"\n        android:pathData=\"M165,0v100h167v-44.13h-40.93v-16.33h-35.07v-20.67h-40.39v-18.87z\" />\n    <path\n        android:fillColor=\"#EE675C\"\n        android:pathData=\"M0,98h165v-5h-165zM160,195h5v-102h-5zM0,93h5v-45h-5z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_header_meals.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"192dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"288\"\n    android:viewportHeight=\"162\">\n    <!-- Pasta -->\n    <path\n        android:pathData=\"M145.13,64.9C145.13,64.9 156.06,83.37 156.06,83.37\"\n        android:strokeColor=\"#e5443f\"\n        android:strokeWidth=\"5\" />\n    <path\n        android:pathData=\"M150.59,81.59C154.88,69.04 173.04,66.23 179.4,81.74M169.5,82.04C177.03,61.65 204.8,63.13 210.71,82.33M197.56,82.33C209.23,66.82 234.63,67.56 245.27,82.92M253.98,82.33C245.42,41.57 195.2,45.11 192.1,82.78M208.34,82.33C223.85,58.7 252.36,62.54 262.7,82.04M165.81,82.18C166.25,57.22 212.78,43.19 223.7,82.04\"\n        android:strokeColor=\"#fbbc04\"\n        android:strokeWidth=\"3.5\" />\n    <path\n        android:pathData=\"M156.35,56.04C156.35,56.04 163,82.18 163,82.18\"\n        android:strokeColor=\"#e5443f\"\n        android:strokeWidth=\"5\" />\n    <path\n        android:pathData=\"M258.86,57.67C258.86,57.67 249.85,82.18 249.85,82.18M264.03,63.13C264.03,63.13 248.96,82.04 248.96,82.04\"\n        android:strokeColor=\"#34a853\"\n        android:strokeWidth=\"4\" />\n    <path\n        android:pathData=\"M273.04,71.99C273.04,71.99 261.66,87.65 261.66,87.65\"\n        android:strokeColor=\"#fde293\"\n        android:strokeWidth=\"13\" />\n    <path\n        android:fillColor=\"#cbf0f8\"\n        android:pathData=\"M283.97,79.53C284.26,123.69 249.76,155 211.15,155 172.54,155 138.48,123.84 138.48,79.38 138.48,79.38 283.97,79.53 283.97,79.53Z\" />\n\n    <!--pizza-->\n    <path\n        android:pathData=\"M7.12,70.39 l64.51,-62.6c0.84,-0.81 2.25,-0.26 2.34,0.91L125.64,127.67 7.19,72.11c-0.41,-0.18 -0.59,-1.1 -0.08,-1.72z\"\n        android:fillColor=\"#fde293\" />\n    <path\n        android:pathData=\"M18.24,74.62 L76.01,18.56 121.03,123.23Z\"\n        android:strokeWidth=\"4.70893478\"\n        android:strokeColor=\"#ee675c\" />\n    <path\n        android:pathData=\"M67.86,79.01a8.42,8.4 106,1 1,-4.64 16.18a8.42,8.4 106,1 1,4.64 -16.18z\"\n        android:fillColor=\"#ffffff\"/>\n    <path\n        android:pathData=\"M48.75,61.86a8.42,8.4 106,1 1,-4.64 16.18a8.42,8.4 106,1 1,4.64 -16.18z\"\n        android:fillColor=\"#ffffff\"/>\n    <path\n        android:pathData=\"M100.26,85.38a8.42,8.4 106,1 1,-4.64 16.18a8.42,8.4 106,1 1,4.64 -16.18z\"\n        android:fillColor=\"#ffffff\"/>\n    <path\n        android:pathData=\"M69.57,29.89a8.42,8.4 106,1 1,-4.64 16.18a8.42,8.4 106,1 1,4.64 -16.18z\"\n        android:fillColor=\"#ffffff\"/>\n    <path\n        android:pathData=\"M85.77,62.26a8.42,8.4 106,1 1,-4.64 16.18a8.42,8.4 106,1 1,4.64 -16.18z\"\n        android:fillColor=\"#ffffff\"/>\n    <path\n        android:pathData=\"M68.95,43.81c-0.95,-3.55 1.31,-7.25 5.05,-8.25l3.44,12.87c-3.74,1 -7.53,-1.06 -8.48,-4.62\"\n        android:fillColor=\"#34a853\"/>\n    <path\n        android:pathData=\"M39.35,76.17c-3.33,1.56 -7.35,-0.03 -8.99,-3.54l12.06,-5.64c1.63,3.51 0.26,7.62 -3.07,9.17z\"\n        android:fillColor=\"#34a853\"/>\n    <path\n        android:pathData=\"M71.8,63.81c3.45,-1.26 7.32,0.67 8.64,4.31l-12.5,4.56c-1.32,-3.64 0.41,-7.61 3.86,-8.87z\"\n        android:fillColor=\"#34a853\"/>\n    <path\n        android:pathData=\"M69.14,91.59c2.31,-2.86 6.62,-3.21 9.63,-0.77l-8.38,10.36c-3,-2.44 -3.56,-6.73 -1.25,-9.59z\"\n        android:fillColor=\"#34a853\"/>\n    <path\n        android:pathData=\"M94.46,103.85c-0.38,-3.66 2.43,-7 6.27,-7.36l1.38,13.25c-3.85,0.41 -7.27,-2.23 -7.66,-5.89z\"\n        android:fillColor=\"#34a853\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_header_office_hours.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"164dp\"\n    android:height=\"100dp\"\n    android:viewportWidth=\"328\"\n    android:viewportHeight=\"200\">\n    <path\n        android:fillColor=\"#CEEAD6\"\n        android:pathData=\"M164,126v74h104c1.4,0,2.36,-1.47,1.87,-2.84l-25.62,-71.16z\" />\n    <path\n        android:fillColor=\"#34A853\"\n        android:pathData=\"M328.4,125.88l-57.93,-125.72h-106.46v128.29h162.76c1.32,0,2.19,-1.37,1.64,-2.56\" />\n    <path\n        android:pathData=\"M42.79,61.5h-40.29v136h104.254l-63.97,-136z\"\n        android:strokeColor=\"#5BB974\"\n        android:strokeWidth=\"5\" />\n    <path\n        android:pathData=\"M70.97,33.61h-68.44v110.07h133.68l-65.24,-110.07z\"\n        android:strokeColor=\"#B1DFBD\"\n        android:strokeWidth=\"5\" />\n    <path\n        android:pathData=\"M2.5,2.5v60.02h0.03v27.74h157.9l-59.53,-87.75h-98.39z\"\n        android:strokeColor=\"#D4EDDB\"\n        android:strokeWidth=\"5\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_header_sandbox.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"164dp\"\n    android:height=\"100dp\"\n    android:viewportWidth=\"328\"\n    android:viewportHeight=\"200\">\n  <path\n      android:pathData=\"M0,129.82v70.72h95.17c1.6,0,2.2,-2.157,0.84,-3.03l-96,-67.69zm4.34,8.47l81.95,57.78h-81.95v-57.78z\"\n      android:fillColor=\"#4285F4\" />\n  <path\n      android:pathData=\"M0,55.21v102.7h128.56c2.16,0,2.97,-2.91,1.14,-4.09l-129.7,-98.61zm4.34,8.85l117.56,89.38h-117.56v-89.38z\"\n      android:fillColor=\"#AECBF7\"/>\n  <path\n      android:pathData=\"M1.54,0c-0.81,0,-1.55,0.66,-1.55,1.59v106.02h164.7c2.16,0,2.97,-2.91,1.14,-4.09l-163.48,-103.29c-0.26,-0.16,-0.54,-0.24,-0.81,-0.24m2.79,6.73l152.6,96.41h-152.6v-96.41z\"\n      android:fillColor=\"#D2E3FC\"/>\n  <path\n      android:pathData=\"M324.59,199h-160.59v-115.31h0.14l161.98,109.46c2.49,1.68,1.39,5.85,-1.54,5.85z\"\n      android:fillColor=\"#D2E3FC\"/>\n  <path\n      android:pathData=\"M206.7,122h118.38c2.94,0,4.04,-4.48,1.54,-6.28l-159.45,-115.37c-1.32,-0.95,-3.03,0.15,-3.03,1.95l-0.14,119.7z\"\n      android:fillColor=\"#4285F4\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_header_sessions.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"164dp\"\n    android:height=\"100dp\"\n    android:viewportHeight=\"200\"\n    android:viewportWidth=\"328\">\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M0,127.9v72.84h89.49c0,-38.86 -46.77,-70.63 -89.49,-72.84m4.18,4.48c35.64,3.62 76.18,27.8 80.93,64.22h-80.93v-64.22z\" />\n    <path\n        android:fillColor=\"#fde293\"\n        android:pathData=\"M0,47.82v108.79h127.01c0,-55.16 -58.04,-107.3 -127.01,-108.81m4.18,4.33c56.37,4.78 110.18,39.14 118.53,100.34h-118.53v-100.34z\" />\n    <path\n        android:fillColor=\"#fdedc5\"\n        android:pathData=\"M71.4,0ch-71.4v96.27h164.68c0,-51.37 -43.01,-94.39 -93.28,-96.27m-0.08,4.15c43.77,1.98 85.59,39.07 89.08,87.97h-156.22v-87.97h67.14z\" />\n    <path\n        android:fillColor=\"#fde293\"\n        android:pathData=\"M279.91,200c0,-50.88 -60.58,-92.47 -115.91,-95.37v95.37h115.91z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M328.67,142.62c0,-72.23 -75.25,-140.51 -164.67,-142.46v142.46h164.67z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_afterhours.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"90dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"90\"\n    android:viewportHeight=\"20\">\n    <path\n        android:pathData=\"M11.44,13.8h3.7v-7.63h-3.7z\"\n        android:strokeColor=\"#AECBF7\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M18.57,4.795l-2.45,10.86\"\n        android:strokeColor=\"#AECBF7\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M22.94,6.24a3.84,3.84 0 1,1 0,7.68a3.84,3.84 0 1,1 0,-7.68\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M28.7,13.8h3.7v-7.63h-3.7z\"\n        android:strokeColor=\"#FAD2CF\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M35.91,4.795l-2.45,10.86\"\n        android:strokeColor=\"#FAD2CF\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M40.28,6.24a3.84,3.84 0 1,1 0,7.68a3.84,3.84 0 1,1 0,-7.68\"\n        android:strokeColor=\"#E5443F\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M46.04,13.8h3.7v-7.63h-3.7z\"\n        android:strokeColor=\"#FDE293\"\n        android:strokeWidth=\".4\" />\n    <path\n        android:pathData=\"M53.25,4.795l-2.45,10.86\"\n        android:strokeColor=\"#FDE293\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M57.62,6.24a3.84,3.84 0 1,1 0,7.68a3.84,3.84 0 1,1 0,-7.68\"\n        android:strokeColor=\"#FBBC04\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M63.38,13.8h3.7v-7.63h-3.7z\"\n        android:strokeColor=\"#A8DAB5\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M70.59,4.795l-2.45,10.86\"\n        android:strokeColor=\"#A8DAB5\"\n        android:strokeWidth=\"0.4\" />\n    <path\n        android:pathData=\"M74.96,6.24a3.84,3.84 0 1,1 0,7.68a3.84,3.84 0 1,1 0,-7.68\"\n        android:strokeColor=\"#5BB974\"\n        android:strokeWidth=\"0.4\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_app_reviews1.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M46.2,16V5.69H79.34V16\"\n        android:strokeColor=\"#A8DAB5\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M58.08,0v16M23.19,-8.8c0.24,6.46,3.98,12.72,10.33,17.8l1.47,1.18l-26.99,0c0.17,7.94,3.55,15.91,9.53,22.83\"\n        android:strokeColor=\"#5BB974\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_app_reviews2.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M26.18,34.1a28.16,28.16 0,1 1,56.32 0\"\n        android:strokeColor=\"#E4F7FB\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M12.54,8.72a20.59,20.59 0,1 0,41.18 0a20.59,20.59 0,1 0,-41.18 0\"\n        android:strokeColor=\"#78D9EC\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M40.7,0v28.2h-37.4c0.22,-7.28,4.32,-15.18,11.24,-21.28c7.07,-6.24,16.41,-10.05,26.15,-10.42\"\n        android:strokeColor=\"#CBF0F8\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_app_reviews3.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M0.62,31.35a27.28,27.28 0,0 0,54.56 0a27.28,27.28 0,0 0,-54.56 0\"\n        android:strokeColor=\"#FAD2CF\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M47.76,-0.11a13.53,13.53 0,0 0,27.06 0a13.53,13.53 0,0 0,-27.06 0\"\n        android:strokeColor=\"#D93025\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M19.51,0v16\"\n        android:strokeColor=\"#EE675C\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_game_reviews1.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M7.48,-10.34a21.78,21.78 0,0 0,43.56 0a21.78,21.78 0,0 0,-43.56 0\"\n        android:strokeColor=\"#AF5CF7\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M-7.24,43.01a37.39,37.39 0,0 0,74.78 0a37.39,37.39 0,0 0,-74.78 0\"\n        android:strokeColor=\"#E9D2FD\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M50.36,20.54v-8.59h6.95v-8.38h8.19v-7.81\"\n        android:strokeColor=\"#AF5CF7\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_game_reviews2.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M0.66,16V7.68H61.54V16\"\n        android:strokeColor=\"#FDE293\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M48.62,0V11.88H79.34V0\"\n        android:strokeColor=\"#E37400\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M26.84,24.31c0,-15.73,-12.8,-28.49,-28.6,-28.49\"\n        android:strokeColor=\"#F9AB00\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_game_reviews3.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M0.66,8.9h52l-52,40.19z\"\n        android:strokeColor=\"#78D9EC\"\n        android:strokeWidth=\"1.32\" />\n\n    <path\n        android:pathData=\"M63.14,16V4.84H79.34V80\"\n        android:strokeColor=\"#E4F7FB\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M9.68,-7.7L9.68,27.87L55.21,-7.7L9.68,-7.7Z\"\n        android:strokeColor=\"#CBF0F8\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_keynote.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M55.77,37.73v-31.21l-39.67,31.21\"\n        android:strokeColor=\"#FBBC04\"\n        android:strokeWidth=\"1.1\" />\n    <path\n        android:pathData=\"M66.22,0V9.35H79.45V0\"\n        android:strokeColor=\"#EE675C\"\n        android:strokeWidth=\"1.1\" />\n    <path\n        android:pathData=\"M25.85,-0.77a8.47,8.58 0,1 0,16.94 0\"\n        android:strokeColor=\"#5BB974\"\n        android:strokeWidth=\"1.1\" />\n    <path\n        android:pathData=\"M21.1,16v-4.05h-6.85v-7.09h-7.34v-4.86\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"1.1\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_office_hours1.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M34.77,16v-4.85l36,-16.2\"\n        android:strokeColor=\"#5BB974\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M23.33,0v16M71.73,0v16\"\n        android:strokeColor=\"#A8DAB5\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M9.91,0v16M49.07,0v16\"\n        android:strokeColor=\"#CEEAD6\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_office_hours2.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M40.48,32.4l29.26,0l0,-35.86c-15.61,0,-28.37,18.74,-29.26,35.86\"\n        android:strokeColor=\"#F9AB00\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M50.49,32.29v-50.6c-22.42,0,-43.62,23.12,-44.22,50.6h44.22\"\n        android:strokeColor=\"#FDE293\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M25.7,0v16\"\n        android:strokeColor=\"#FEEFC3\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_office_hours3.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M54.56,34.41l27.28,-40.04v40.04z\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M21.23,34.52l42.02,-57.64v57.64z\"\n        android:strokeColor=\"#AECBFA\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M-6.49,34.74l45.76,-74.58v74.58h-45.76\"\n        android:strokeColor=\"#D2E3FC\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_other.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M17.76,0v16\"\n        android:strokeColor=\"#AECBFA\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M0.66,16V6.16H72V16\"\n        android:strokeColor=\"#D2E3FC\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M10.34,0v16M45.5,29.6l-9.38,-17.78h16.34l-14.86,-22.06\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_session1.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:fillColor=\"#1A73E8\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M61.60,-32.45a39.45,39.45 0,0.1 0.1,-78.9 0\" />\n    <path\n        android:pathData=\"M42.55,3.25m30.69,0a30.69,30.69 0,0.1 0.1,-61.38 0a30.69,30.69 0,0.1 0.1,61.38 0\"\n        android:strokeColor=\"#EE675C\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M78.9,-1c-14.28,12.62,-33.23,20.27,-52.94,20.86V0\"\n        android:strokeColor=\"#A8DAB5\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_session2.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:fillColor=\"#FDE293\"\n        android:strokeLineJoin=\"round\"\n        android:pathData=\"M52.8,-70L52.8,11.6L151.29,-67.84Z\" />\n    <path\n        android:pathData=\"M76.04,35.4a31.04,30.99 9,0.1 0,-61.98 0\"\n        android:strokeColor=\"#EE675C\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M36.27,16v-5.73h-25.61v-10.27\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_session3.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:pathData=\"M2,-1.44c7.47,8.52,12.02,19.79,12.43,31.54\"\n        android:strokeColor=\"#EE675C\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:fillColor=\"#CBF0F8\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M62,-3.38h-28.34c0,4.72,2,9.33,5.35,13.21h-13.75c0,11.19,9.6,20.56,20.81,20.97h15.93z\" />\n    <path\n        android:pathData=\"M50.6,0V11.02H79.34V0\"\n        android:strokeColor=\"#174EA6\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_narrow_session4.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"16\">\n    <path\n        android:fillColor=\"#FDE293\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M21.12,11.44h37.18V16h-37.18z\"\n        />\n    <path\n        android:pathData=\"M71.94,-103.18v114.65c0,0.9,-1.21,1.42,-2,0.8l-145.43,-113.58\"\n        android:strokeColor=\"#174EA6\"\n        android:strokeWidth=\"1.32\" />\n    <path\n        android:pathData=\"M56.44,35.81c0,-17.32,-14.04,-31.36,-31.35,-31.36c-17.31,0,-31.35,14.04,-31.35,31.36\"\n        android:strokeColor=\"#5BB974\"\n        android:strokeWidth=\"1.32\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_placeholder_keynote.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"96dp\"\n    android:height=\"54dp\"\n    android:viewportWidth=\"192\"\n    android:viewportHeight=\"108\">\n    <path\n        android:pathData=\"M139,108V38L45,112\"\n        android:strokeColor=\"#FBBC04\"\n        android:strokeWidth=\"3.3\" />\n    <path\n        android:pathData=\"M172,0V46.55H192\"\n        android:strokeColor=\"#EE675C\"\n        android:strokeWidth=\"3.3\" />\n    <path\n        android:pathData=\"M49.31,16.19a25.41,25.74 0,1 0,50.82 0a25.41,25.74 0,1 0,-50.82 0z\"\n        android:strokeColor=\"#5BB974\"\n        android:strokeWidth=\"3.3\" />\n    <path\n        android:pathData=\"M0,95.5H35V54.5H14.5V33H-7.5\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"3.3\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_placeholder_session1.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"96dp\"\n    android:height=\"54dp\"\n    android:viewportWidth=\"192\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#FDE293\"\n        android:pathData=\"M150,-182.5v244.81c0,3.12,3.69,4.82,6.11,2.81l289.37,-241.14z\" />\n    <path\n        android:pathData=\"M219.72,133.71a93.13,92.97,9,1,0,-185.94,0\"\n        android:strokeColor=\"#EE675C\"\n        android:strokeWidth=\"3.96\" />\n    <path\n        android:pathData=\"M23,0V58.5H100,V108\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"3.96\" />\n\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_placeholder_session2.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"96dp\"\n    android:height=\"54dp\"\n    android:viewportWidth=\"192\"\n    android:viewportHeight=\"108\">\n    <path\n        android:pathData=\"M-56.32,-11.36C-27.88,-10.7 0.54,4.13 22.5,29.18C44.9,54.73 58.55,88.55 59.79,123.79\"\n        android:strokeColor=\"#EE675C\"\n        android:strokeWidth=\"3.96\" />\n    <path\n        android:fillColor=\"#CBF0F8\"\n        android:pathData=\"M192,125.9V-8.08H131.95C131.95,3.97 139,14.98 149.47,23.37H106.84C106.84,37.51 112.82,51.35 122.88,63H81.63C81.63,96.56 110.41,124.67 144.06,125.9Z\" />\n    <path\n        android:pathData=\"M146.97,0V66.56H192\"\n        android:strokeColor=\"#174EA6\"\n        android:strokeWidth=\"3.96\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_placeholder_session3.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"96dp\"\n    android:height=\"54dp\"\n    android:viewportWidth=\"192\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#FAD2CF\"\n        android:pathData=\"M18.34,9.5a60.06,60.3 0,1 0,120.12 0a60.06,60.3 0,1 0,-120.12 0z\"\n        android:strokeColor=\"#FAD2CF\"\n        android:strokeWidth=\"6.6\" />\n    <path\n        android:pathData=\"M0,56.5H86V108\"\n        android:strokeColor=\"#174EA6\"\n        android:strokeWidth=\"3.96\" />\n    <path\n        android:pathData=\"M192,25H174V55.5H141.75V88.75H114.5V108\"\n        android:strokeColor=\"#4285F4\"\n        android:strokeWidth=\"3.96\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/event_placeholder_session4.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"96dp\"\n    android:height=\"54dp\"\n    android:viewportWidth=\"192\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#FDE293\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M26,56.75h111.5V108h-111.5z\" />\n    <path\n        android:pathData=\"M178.62,0v56.8c0,2.71,-3.63,4.27,-6.01,2.41l-58,-62\"\n        android:strokeColor=\"#174EA6\"\n        android:strokeWidth=\"3.96\" />\n    <path\n        android:pathData=\"M119.22,129.82C119.22,77.87 77.11,35.76 25.17,35.76C-26.77,35.76 -68.88,77.87 -68.88,129.82\"\n        android:strokeColor=\"#5BB974\"\n        android:strokeWidth=\"3.96\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/fading_snackbar_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <solid android:color=\"#202124\" />\n    <corners android:radius=\"4dp\" />\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/filters_sheet_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <corners\n        android:topLeftRadius=\"@dimen/bottom_sheet_corner_radius\"\n        android:topRightRadius=\"@dimen/bottom_sheet_corner_radius\" />\n\n    <solid android:color=\"?colorSurface\" />\n\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/filters_sheet_header_shadow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <gradient\n        android:angle=\"270\"\n        android:endColor=\"@android:color/transparent\"\n        android:startColor=\"#26000000\" />\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/generic_placeholder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <solid android:color=\"@color/color_control_light\" />\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/hashtag_io19.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"145dp\"\n    android:height=\"54dp\"\n    android:viewportWidth=\"145\"\n    android:viewportHeight=\"54\">\n    <path\n        android:fillColor=\"#4285F4\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M54,9A9,9 0,1 1,36 9a9,9 0,0 1,18 0\" />\n    <path\n        android:fillColor=\"#D2E3FC\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M36,54h18L54,18L36,18v36zM37.688,52.312h14.624L52.312,19.688L37.688,19.688v32.624z\" />\n    <path\n        android:fillColor=\"#FDEDC5\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M91,54h18L109,18L91,18v36zM92.688,52.312h14.624L107.312,19.688L92.689,19.688v32.624z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M36,28H0M36,44H0M10,18v36M26,18v36\"\n        android:strokeColor=\"#AECBF7\"\n        android:strokeWidth=\"1.637\" />\n    <path\n        android:fillColor=\"#CEEAD6\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M127,0v54h18L145,9l-18,-9zM128.688,2.73l14.625,7.313v42.27h-14.625L128.688,2.73z\" />\n    <path\n        android:fillColor=\"#FAD2CF\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M72,18c-9.941,0 -18,8.059 -18,18h36c0,-9.941 -8.059,-18 -18,-18m0,1.688c8.425,0 15.379,6.42 16.226,14.625H55.774c0.848,-8.205 7.801,-14.626 16.226,-14.626\" />\n    <path\n        android:fillColor=\"#E5443F\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M72,54c9.941,0 18,-8.059 18,-18H54c0,9.941 8.059,18 18,18\" />\n    <path\n        android:fillColor=\"#34A853\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M109,18c0,9.941 8.059,18 18,18V0c-9.941,0 -18,8.059 -18,18\" />\n    <path\n        android:fillColor=\"#FBBC04\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M106.892,0H92.473l-0.496,1.006 -1.755,3.566 -1.813,3.681 -4.304,8.74c-0.272,0.554 0.003,1.007 0.613,1.007H108V0h-1.108z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_after_hours.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M 9 2 C 7.95 2 6.95 2.16 6 2.46 C 10.06 3.73 13 7.52 13 12 C 13 16.48 10.06 20.27 6 21.54 C 6.95 21.84 7.95 22 9 22 C 14.52 22 19 17.52 19 12 C 19 6.48 14.52 2 9 2 Z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_badge.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,1L3,5v6c0,5.55 3.84,10.74 9,12 5.16,-1.26 9,-6.45 9,-12L21,5l-9,-4zM10,17l-4,-4 1.41,-1.41L10,14.17l6.59,-6.59L18,9l-8,8z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_codelab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M9.4,16.6L4.8,12l4.6,-4.6L8,6l-6,6 6,6 1.4,-1.4zM14.6,16.6l4.6,-4.6 -4.6,-4.6L16,6l6,6 -6,6 -1.4,-1.4z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_concert.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_keynote.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_meal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M11,9L9,9L9,2L7,2v7L5,9L5,2L3,2v7c0,2.12 1.66,3.84 3.75,3.97L6.75,22h2.5v-9.03C11.34,12.84 13,11.12 13,9L13,2h-2v7zM16,6v8h2.5v8L21,22L21,2c-2.76,0 -5,2.24 -5,4z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_office_hours.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M 16.5 12 C 17.9 12 19 10.9 19 9.5 C 19 8.1 17.9 7 16.5 7 C 15.1 7 14 8.1 14 9.5 C 14 10.9 15.1 12 16.5 12 Z M 9 11 C 10.7 11 12 9.7 12 8 C 12 6.3 10.7 5 9 5 C 7.3 5 6 6.3 6 8 C 6 9.7 7.3 11 9 11 Z M 16.5 14 C 14.7 14 11 14.9 11 16.8 L 11 19 L 22 19 L 22 16.8 C 22 14.9 18.3 14 16.5 14 Z M 9 13 C 6.7 13 2 14.2 2 16.5 L 2 19 L 9 19 L 9 16.8 C 9 15.9 9.3 14.5 11.4 13.3 C 10.5 13.1 9.7 13 9 13 Z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_sandbox.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M22.7,19l-9.1,-9.1c0.9,-2.3 0.4,-5 -1.5,-6.9 -2,-2 -5,-2.4 -7.4,-1.3L9,6 6,9 1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1c1.9,1.9 4.6,2.4 6.9,1.5l9.1,9.1c0.4,0.4 1,0.4 1.4,0l2.3,-2.3c0.5,-0.4 0.5,-1.1 0.1,-1.4z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_session.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M 17 2 L 18.732 3 L 7.732 22.052 L 6 21.052 Z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_agenda_store.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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=\"#000\"\n        android:pathData=\"M20,4L4,4v2h16L20,4zM21,14v-2l-1,-5L4,7l-1,5v2h1v6h10v-6h4v6h2v-6h1zM12,18L6,18v-4h6v4z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_arrow_back.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_arrow_right.xml",
    "content": "<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M8.59,16.59L13.17,12 8.59,7.41 10,6l6,6 -6,6 -1.41,-1.41z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_clear_all.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_default_avatar_1.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"@dimen/speaker_headshot_size\"\n    android:height=\"@dimen/speaker_headshot_size\"\n    android:viewportWidth=\"36\"\n    android:viewportHeight=\"36\">\n    <path\n        android:pathData=\"M18,18m-17.375,0a17.375,17.375 0,1 1,34.75 0a17.375,17.375 0,1 1,-34.75 0\"\n        android:strokeWidth=\"1.25\"\n        android:strokeColor=\"#069f86\" />\n    <path\n        android:pathData=\"M12.6125,10.3785a5.3785,5.3785 0,0 1,10.75 0z\"\n        android:strokeWidth=\"1.25\"\n        android:strokeColor=\"#AECBF7\" />\n    <path\n        android:pathData=\"M12,11a6,6 0,0 0,12 0z\"\n        android:fillColor=\"#4285F4\" />\n    <path\n        android:pathData=\"M8.2,26.9a9.8,9.8 0,0 1,19.6 0z\"\n        android:strokeWidth=\"1.1\"\n        android:strokeColor=\"#FBBC04\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_default_avatar_2.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"@dimen/speaker_headshot_size\"\n    android:height=\"@dimen/speaker_headshot_size\"\n    android:viewportWidth=\"36\"\n    android:viewportHeight=\"36\">\n    <path\n        android:pathData=\"M18,18m-17.375,0a17.375,17.375 0,1 1,34.75 0a17.375,17.375 0,1 1,-34.75 0\"\n        android:strokeWidth=\"1.25\"\n        android:strokeColor=\"#1db8d2\" />\n    <path\n        android:pathData=\"M12.6125,10.3785a5.3785,5.3785 0,0 1,10.75 0z\"\n        android:strokeWidth=\"1.25\"\n        android:strokeColor=\"#ff9e80\" />\n    <path\n        android:pathData=\"M12,11a6,6 0,0 0,12 0z\"\n        android:fillColor=\"#ff6c00\" />\n    <path\n        android:pathData=\"M8.2,26.9a9.8,9.8 0,0 1,19.6 0z\"\n        android:strokeWidth=\"1.1\"\n        android:strokeColor=\"#069f86\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_default_avatar_3.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"@dimen/speaker_headshot_size\"\n    android:height=\"@dimen/speaker_headshot_size\"\n    android:viewportWidth=\"36\"\n    android:viewportHeight=\"36\">\n    <path\n        android:pathData=\"M18,18m-17.375,0a17.375,17.375 0,1 1,34.75 0a17.375,17.375 0,1 1,-34.75 0\"\n        android:strokeWidth=\"1.25\"\n        android:strokeColor=\"#ff6c00\" />\n    <path\n        android:pathData=\"M12.6125,10.3785a5.3785,5.3785 0,0 1,10.75 0z\"\n        android:strokeWidth=\"1.25\"\n        android:strokeColor=\"#31e7b6\" />\n    <path\n        android:pathData=\"M12,11a6,6 0,0 0,12 0z\"\n        android:fillColor=\"#069f86\" />\n    <path\n        android:pathData=\"M8.2,26.9a9.8,9.8 0,0 1,19.6 0z\"\n        android:strokeWidth=\"1.1\"\n        android:strokeColor=\"#4285F4\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_default_profile_avatar.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"32dp\"\n    android:height=\"32dp\"\n    android:viewportWidth=\"20\"\n    android:viewportHeight=\"20\"\n    android:tint=\"?colorPrimary\">\n    <path\n        android:fillColor=\"#000\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M10,0C4.48,0 0,4.48 0,10s4.48,10 10,10 10,-4.48 10,-10S15.52,0 10,0zM5.07,16.28c0.43,-0.9 3.05,-1.78 4.93,-1.78s4.51,0.88 4.93,1.78A7.893,7.893 0,0 1,10 18c-1.86,0 -3.57,-0.64 -4.93,-1.72zM16.36,14.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33A7.95,7.95 0,0 1,2 10c0,-4.41 3.59,-8 8,-8s8,3.59 8,8c0,1.82 -0.62,3.49 -1.64,4.83zM10,4C8.06,4 6.5,5.56 6.5,7.5S8.06,11 10,11s3.5,-1.56 3.5,-3.5S11.94,4 10,4zM10,9c-0.83,0 -1.5,-0.67 -1.5,-1.5S9.17,6 10,6s1.5,0.67 1.5,1.5S10.83,9 10,9z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_expand_more.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_feed_social_button_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"?attr/colorControlLight\">\n\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"?attr/colorPrimary\" />\n        </shape>\n    </item>\n</ripple>"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_filter.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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:fillAlpha=\"0.9\"\n        android:fillColor=\"#FFF\"\n        android:pathData=\"M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_filter_clear.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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:pathData=\"M6,6L18,18M18,6L6,18Z\"\n        android:strokeColor=\"#000\"\n        android:strokeWidth=\"2\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_launch.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_layers.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11.99,18.54l-7.37,-5.73L3,14.07l9,7 9,-7 -1.63,-1.27 -7.38,5.74zM12,16l7.36,-5.73L21,9l-9,-7 -9,7 1.63,1.27L12,16z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_login.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#000000\"\n        android:pathData=\"M11,7L9.6,8.4l2.6,2.6H2v2h10.2l-2.6,2.6L11,17l5,-5L11,7zM20,19h-8v2h8c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2h-8v2h8V19z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_logo_assistant.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"192\"\n    android:viewportHeight=\"192\">\n    <path\n        android:fillColor=\"#34A853\"\n        android:pathData=\"M172,60m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0\" />\n    <path\n        android:fillColor=\"#EA4335\"\n        android:pathData=\"M136,88m-24,0a24,24 0,1 1,48 0a24,24 0,1 1,-48 0\" />\n    <path\n        android:fillColor=\"#FBBC05\"\n        android:pathData=\"M136,148m-28,0a28,28 0,1 1,56 0a28,28 0,1 1,-56 0\" />\n    <path\n        android:fillColor=\"#4285F4\"\n        android:pathData=\"M56,64m-48,0a48,48 0,1 1,96 0a48,48 0,1 1,-96 0\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_logo_components.xml",
    "content": "<!--\n  Copyright 2019 The Android Open Source Project\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n      https://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n  -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"48dp\"\n    android:viewportHeight=\"48.0\"\n    android:viewportWidth=\"48.0\"\n    android:width=\"48dp\">\n    <path\n        android:fillColor=\"#212121\"\n        android:pathData=\"M7.16,4h33.68C42.59,4 44,5.41 44,7.16v33.68c0,1.74 -1.41,3.16 -3.16,3.16H7.16C5.41,44 4,42.59 4,40.84V7.16C4,5.41 5.41,4 7.16,4z\"/>\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M9,29h10l10,-10V9H9z\"/>\n    <path\n        android:fillColor=\"#00E676\"\n        android:pathData=\"M29,29m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0\"/>\n    <path\n        android:fillColor=\"#B2FF59\"\n        android:pathData=\"M29,19c-5.52,0 -10,4.48 -10,10h10V19z\"/>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_logo_facebook.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"12dp\"\n    android:height=\"22dp\"\n    android:viewportWidth=\"12\"\n    android:viewportHeight=\"22\">\n\n    <path\n        android:fillColor=\"#ffffff\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M3.17666 21.8801H7.67264V10.9988H10.672L11.0693 7.24943H7.67264L7.67731 5.3721C7.67731 4.39477 7.77064 3.87011 9.17331 3.87011H11.048V0.120117H8.04798C4.44465 0.120117 3.17666 1.93944 3.17666 4.9981V7.24943H0.930664V10.9994H3.17666V21.8801Z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_logo_google_developers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <group\n        android:translateX=\"1\"\n        android:translateY=\"4\">\n        <path\n            android:fillColor=\"#ffffff\"\n            android:pathData=\"M2.39664 3.47803L0.215365 7.25547C-0.0514433 7.71888 -0.0514433 8.28994 0.215365 8.75335L4.39068 15.9946H9.60047L2.39664 3.47803Z\" />\n        <path\n            android:fillColor=\"#ffffff\"\n            android:pathData=\"M2.88342 2.63076L5.49066 7.1665L9.61917 0.0141602H4.39066L2.88342 2.63076Z\" />\n        <path\n            android:fillColor=\"#ffffff\"\n            android:pathData=\"M12.3809 15.9946H17.6094L19.1166 13.378L16.5047 8.84229L12.3809 15.9946Z\" />\n        <path\n            android:fillColor=\"#ffffff\"\n            android:pathData=\"M21.7847 7.25539L17.6047 0.0187988H12.3949L19.6034 12.5354L21.7847 8.75327C22.0515 8.28986 22.0515 7.7188 21.7847 7.25539Z\" />\n    </group>\n</vector>"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_logo_instagram.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"510\"\n    android:viewportHeight=\"510\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"m510.949,150.5c-1.199,-27.199 -5.598,-45.898 -11.898,-62.102 -6.5,-17.199 -16.5,-32.598 -29.602,-45.398 -12.801,-13 -28.301,-23.102 -45.301,-29.5 -16.297,-6.301 -34.898,-10.699 -62.098,-11.898 -27.402,-1.301 -36.102,-1.602 -105.602,-1.602s-78.199,0.301 -105.5,1.5c-27.199,1.199 -45.898,5.602 -62.098,11.898 -17.203,6.5 -32.602,16.5 -45.402,29.602 -13,12.801 -23.098,28.301 -29.5,45.301 -6.301,16.301 -10.699,34.898 -11.898,62.098 -1.301,27.402 -1.602,36.102 -1.602,105.602s0.301,78.199 1.5,105.5c1.199,27.199 5.602,45.898 11.902,62.102 6.5,17.199 16.598,32.598 29.598,45.398 12.801,13 28.301,23.102 45.301,29.5 16.301,6.301 34.898,10.699 62.102,11.898 27.297,1.203 36,1.5 105.5,1.5s78.199,-0.297 105.5,-1.5c27.199,-1.199 45.898,-5.598 62.098,-11.898 34.402,-13.301 61.602,-40.5 74.902,-74.898 6.297,-16.301 10.699,-34.902 11.898,-62.102 1.199,-27.301 1.5,-36 1.5,-105.5s-0.102,-78.199 -1.301,-105.5zM464.852,359.5c-1.102,25 -5.301,38.5 -8.801,47.5 -8.602,22.301 -26.301,40 -48.602,48.602 -9,3.5 -22.598,7.699 -47.5,8.797 -27,1.203 -35.098,1.5 -103.398,1.5s-76.5,-0.297 -103.402,-1.5c-25,-1.098 -38.5,-5.297 -47.5,-8.797 -11.098,-4.102 -21.199,-10.602 -29.398,-19.102 -8.5,-8.301 -15,-18.301 -19.102,-29.398 -3.5,-9 -7.699,-22.602 -8.797,-47.5 -1.203,-27 -1.5,-35.102 -1.5,-103.402s0.297,-76.5 1.5,-103.398c1.098,-25 5.297,-38.5 8.797,-47.5 4.102,-11.102 10.602,-21.199 19.203,-29.402 8.297,-8.5 18.297,-15 29.398,-19.098 9,-3.5 22.602,-7.699 47.5,-8.801 27,-1.199 35.102,-1.5 103.398,-1.5 68.402,0 76.5,0.301 103.402,1.5 25,1.102 38.5,5.301 47.5,8.801 11.098,4.098 21.199,10.598 29.398,19.098 8.5,8.301 15,18.301 19.102,29.402 3.5,9 7.699,22.598 8.801,47.5 1.199,27 1.5,35.098 1.5,103.398s-0.301,76.301 -1.5,103.301zM464.852,359.5\" />\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"m256.449,124.5c-72.598,0 -131.5,58.898 -131.5,131.5s58.902,131.5 131.5,131.5c72.602,0 131.5,-58.898 131.5,-131.5s-58.898,-131.5 -131.5,-131.5zM256.449,341.301c-47.098,0 -85.301,-38.199 -85.301,-85.301s38.203,-85.301 85.301,-85.301c47.102,0 85.301,38.199 85.301,85.301s-38.199,85.301 -85.301,85.301zM256.449,341.301\" />\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"m423.852,119.301c0,16.953 -13.746,30.699 -30.703,30.699 -16.953,0 -30.699,-13.746 -30.699,-30.699 0,-16.957 13.746,-30.699 30.699,-30.699 16.957,0 30.703,13.742 30.703,30.699zM423.852,119.301\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_logo_twitter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"17\"\n    android:viewportHeight=\"17\">\n\n    <group android:translateY=\"1.5\">\n        <path\n            android:fillColor=\"#ffffff\"\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M17 1.65729C16.3745 1.93839 15.7024 2.12844 14.9968 2.21382C15.7169 1.77645 16.27 1.08375 16.5303 0.258477C15.8565 0.663522 15.1101 0.957602 14.3156 1.11614C13.6794 0.429241 12.773 0 11.7699 0C9.84357 0 8.28199 1.5825 8.28199 3.53425C8.28199 3.81131 8.31283 4.08101 8.37228 4.33967C5.47365 4.19229 2.90372 2.78522 1.18351 0.64695C0.883299 1.16895 0.711303 1.77607 0.711303 2.42378C0.711303 3.64994 1.32703 4.73174 2.26287 5.36558C1.69117 5.34724 1.15336 5.1882 0.683134 4.92348C0.682885 4.93823 0.682823 4.95304 0.682823 4.96791C0.682823 6.68034 1.88505 8.10883 3.48059 8.43354C3.1879 8.51425 2.87978 8.55742 2.56172 8.55742C2.33693 8.55742 2.11849 8.5353 1.90551 8.49403C2.34937 9.8982 3.63741 10.92 5.16361 10.9486C3.9699 11.8965 2.46608 12.4615 0.831998 12.4615C0.550499 12.4615 0.272856 12.4448 0 12.4121C1.54355 13.4149 3.37681 14 5.34643 14C11.7617 14 15.2698 8.61457 15.2698 3.94408C15.2698 3.79083 15.2664 3.63841 15.2597 3.48686C15.9411 2.98856 16.5324 2.36606 17 1.65729Z\" />\n    </group>\n</vector>"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_logo_youtube.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"21dp\"\n    android:height=\"15dp\"\n    android:viewportWidth=\"21\"\n    android:viewportHeight=\"15\">\n\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M19.8437 2.29015C19.6122 1.4222 18.9277 0.738773 18.0599 0.506408C16.487 0.0849609 10.1769 0.0849609 10.1769 0.0849609C10.1769 0.0849609 3.86693 0.0849609 2.29401 0.506408C1.42615 0.738773 0.741728 1.4222 0.510147 2.29015C0.0882568 3.86431 0.0882568 7.14704 0.0882568 7.14704C0.0882568 7.14704 0.0882568 10.4298 0.510147 12.0039C0.741728 12.8719 1.42615 13.5553 2.29401 13.7877C3.86693 14.2091 10.1769 14.2091 10.1769 14.2091C10.1769 14.2091 16.487 14.2091 18.0599 13.7877C18.9277 13.5553 19.6122 12.8719 19.8437 12.0039C20.2656 10.4298 20.2656 7.14704 20.2656 7.14704C20.2656 7.14704 20.2656 3.86431 19.8437 2.29015ZM8.11335 10.1279V4.16616L13.387 7.14704L8.11335 10.1279Z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_logout.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#000000\"\n        android:pathData=\"M17,7l-1.41,1.41L18.17,11H8v2h10.17l-2.58,2.58L17,17l5,-5zM4,5h8V3H4c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h8v-2H4V5z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_map_after_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M 9 2 C 7.95 2 6.95 2.16 6 2.46 C 10.06 3.73 13 7.52 13 12 C 13 16.48 10.06 20.27 6 21.54 C 6.95 21.84 7.95 22 9 22 C 14.52 22 19 17.52 19 12 C 19 6.48 14.52 2 9 2 Z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_map_concert.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_map_daytime.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6.76,4.84l-1.8,-1.79 -1.41,1.41 1.79,1.79 1.42,-1.41zM4,10.5L1,10.5v2h3v-2zM13,0.55h-2L11,3.5h2L13,0.55zM20.45,4.46l-1.41,-1.41 -1.79,1.79 1.41,1.41 1.79,-1.79zM17.24,18.16l1.79,1.8 1.41,-1.41 -1.8,-1.79 -1.4,1.4zM20,10.5v2h3v-2h-3zM12,5.5c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6zM11,22.45h2L13,19.5h-2v2.95zM3.55,18.54l1.41,1.41 1.79,-1.8 -1.41,-1.41 -1.79,1.8z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_menu.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_my_location.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94L13,1h-2v2.06C6.83,3.52 3.52,6.83 3.06,11L1,11v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94L11,23h2v-2.06c4.17,-0.46 7.48,-3.77 7.94,-7.94L23,13v-2h-2.06zM12,19c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_nav_agenda.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:width=\"24dp\"\n    android:height=\"24dp\">\n    <path\n        android:pathData=\"M19.5 5v4h-15V5h15zm0 10v4h-15v-4h15zm1 -12h-17c-0.55 0 -1 0.45 -1 1v6c0 0.55 0.45 1 1 1h17c0.55 0 1 -0.45 1 -1V4c0 -0.55 -0.45 -1 -1 -1zm0 10h-17c-0.55 0 -1 0.45 -1 1v6c0 0.55 0.45 1 1 1h17c0.55 0 1 -0.45 1 -1v-6c0 -0.55 -0.45 -1 -1 -1z\"\n        android:fillColor=\"#5F6368\" />\n</vector>\n\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_nav_codelabs.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#000\"\n        android:pathData=\"M16,6l-1.41,1.41L19.17,12l-4.58,4.59L16,18l6,-6 -6,-6zM8,18l1.41,-1.41L4.83,12l4.58,-4.59L8,6l-6,6 6,6z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_nav_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:pathData=\"M12,3L4,9v12h16L20,9l-8,-6zM18,19h-3v-6L9,13v6L6,19v-9l6,-4.5 6,4.5v9z\"\n        android:fillColor=\"#5F6368\"\n        android:fillType=\"nonZero\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_nav_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:pathData=\"M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z\"\n        android:fillColor=\"#5F6368\"\n        android:fillType=\"nonZero\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_nav_map.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:pathData=\"M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM7,9c0,-2.76 2.24,-5 5,-5s5,2.24 5,5c0,2.88 -2.88,7.19 -5,9.88C9.92,16.21 7,11.85 7,9zM12,6.5a2.5,2.5 0,1 0,0 5,2.5 2.5,0 0,0 0,-5z\"\n        android:fillColor=\"#5F6368\"\n        android:fillType=\"nonZero\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_nav_schedule.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:pathData=\"M19,4h-1L18,2h-2v2L8,4L8,2L6,2v2L5,4c-1.11,0 -1.99,0.9 -1.99,2L3,20a2,2 0,0 0,2 2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM19,20L5,20L5,10h14v10zM14.5,13a2.5,2.5 0,0 0,0 5,2.5 2.5,0 0,0 0,-5z\"\n        android:fillColor=\"#5F6368\"\n        android:fillType=\"nonZero\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_nav_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#5F6368\"\n        android:pathData=\"M13.85,22.25h-3.7c-0.74,0 -1.36,-0.54 -1.45,-1.27l-0.27,-1.89c-0.27,-0.14 -0.53,-0.29 -0.79,-0.46l-1.8,0.72c-0.7,0.26 -1.47,-0.03 -1.81,-0.65l-1.83,-3.17c-0.35,-0.66 -0.2,-1.44 0.36,-1.88l1.53,-1.19c-0.03,-0.3 -0.03,-0.61 0,-0.92l-1.52,-1.19c-0.59,-0.45 -0.74,-1.26 -0.37,-1.88l1.85,-3.19c0.34,-0.62 1.11,-0.9 1.79,-0.63l1.81,0.73c0.26,-0.17 0.52,-0.32 0.78,-0.46l0.27,-1.91c0.09,-0.7 0.71,-1.25 1.44,-1.25h3.7c0.74,0 1.36,0.54 1.45,1.27l0.27,1.89c0.27,0.14 0.53,0.29 0.79,0.46l1.8,-0.72c0.71,-0.26 1.48,0.03 1.82,0.65l1.84,3.18c0.36,0.66 0.2,1.44 -0.36,1.88l-1.52,1.19c0.02,0.29 0.02,0.61 0,0.92l1.52,1.19c0.56,0.45 0.72,1.23 0.37,1.86l-1.86,3.22c-0.34,0.62 -1.11,0.9 -1.8,0.63l-1.8,-0.72c-0.26,0.17 -0.52,0.32 -0.78,0.46l-0.27,1.91c-0.1,0.68 -0.72,1.22 -1.46,1.22zM10.62,20.25h2.76l0.37,-2.55c0.9,-0.32 1.61,-0.76 2.32,-1.34l2.38,0.96 1.38,-2.4 -2.03,-1.58c0.19,-1.05 0.17,-1.78 0,-2.68l2.03,-1.58 -1.39,-2.4 -2.39,0.96c-0.69,-0.61 -1.56,-1.08 -2.3,-1.34l-0.37,-2.55h-2.76l-0.37,2.55C9.31,6.62 8.77,6.97 7.93,7.63l-2.38,-0.95 -1.39,2.39 2.03,1.58c-0.17,0.87 -0.17,1.76 0,2.69l-2.03,1.58 1.38,2.4 2.39,-0.96c0.73,0.63 1.43,1.04 2.31,1.34zM8.5,12a3.5,3.5 0,1 1,7 0a3.5,3.5 0,1 1,-7 0z\"\n        tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_nav_signpost.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#000000\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M7.1621,8l-2.042,-1.521l2.042,-1.479l3.838,0l0,-1l2,0l0,1l0,3l0,2l3.838,0l2.042,1.521l-2.042,1.479l-3.838,0l0,7l-2,0l0,-7l0,-3l0,-2z\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\" />\n    <path\n        android:fillColor=\"#000000\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M18.8506,1L14.9996,1L14.9996,3L18.8506,3C20.0356,3 20.9996,3.964 20.9996,5.149L20.9996,9L22.9996,9L22.9996,5.149C22.9996,2.861 21.1386,1 18.8506,1\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\" />\n    <path\n        android:fillColor=\"#000000\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M21,18.8506C21,20.0366 20.036,20.9996 18.851,20.9996L15,20.9996L15,22.9996L18.851,22.9996C21.139,22.9996 23,21.1386 23,18.8506L23,14.9996L21,14.9996L21,18.8506Z\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\" />\n    <path\n        android:fillColor=\"#000000\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M3,18.8506L3,14.9996L1,14.9996L1,18.8506C1,21.1386 2.861,22.9996 5.149,22.9996L9,22.9996L9,20.9996L5.149,20.9996C3.964,20.9996 3,20.0366 3,18.8506\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\" />\n    <path\n        android:fillColor=\"#000000\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M3,5.1494C3,3.9634 3.964,3.0004 5.149,3.0004L9,3.0004L9,1.0004L5.149,1.0004C2.861,1.0004 1,2.8614 1,5.1494L1,9.0004L3,9.0004L3,5.1494Z\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_play.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,16.5v-9l6,4.5 -6,4.5z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_play_circle_outline.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M10,16.5l6,-4.5 -6,-4.5v9zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_question_answer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?colorControlNormal\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M21,6h-2v9L6,15v2c0,0.55 0.45,1 1,1h11l4,4L22,7c0,-0.55 -0.45,-1 -1,-1zM17,12L17,3c0,-0.55 -0.45,-1 -1,-1L3,2c-0.55,0 -1,0.45 -1,1v14l4,-4h10c0.55,0 1,-0.45 1,-1z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_reservable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:pathData=\"M22,9.43V6.75c0,-0.4 -0.37,-0.75 -0.83,-0.75H2.83c-0.46,0 -0.82,0.35 -0.82,0.75v2.68c1.06,0.4 1.82,1.39 1.82,2.57S3.07,14.18 2,14.57v2.68c0,0.4 0.37,0.75 0.83,0.75h18.34c0.46,0 0.83,-0.35 0.83,-0.75v-2.68A2.76,2.76 0,0 1,20.17 12c0,-1.18 0.76,-2.18 1.83,-2.57z\"\n        android:strokeColor=\"#fff\"\n        android:strokeWidth=\"2\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M14.39,15.5L11.95,13.93 9.51,15.5 10.24,12.69 8,10.86 10.89,10.69 11.95,8 13,10.69 15.89,10.86 13.65,12.7z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_reservation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<selector\n    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/reserved\"\n        android:drawable=\"@drawable/ic_reserved\"\n        app:state_reserved=\"true\" />\n\n    <item\n        android:id=\"@+id/wait_listed\"\n        android:drawable=\"@drawable/ic_waitlisted\"\n        app:state_wait_listed=\"true\" />\n\n    <item\n        android:id=\"@+id/wait_list_available\"\n        android:drawable=\"@drawable/ic_waitlist_available\"\n        app:state_wait_list_available=\"true\" />\n\n    <item\n        android:id=\"@+id/reservation_pending\"\n        android:drawable=\"@drawable/ic_reservation_pending\"\n        app:state_reservation_pending=\"true\" />\n\n    <item\n        android:id=\"@+id/reservation_disabled\"\n        android:drawable=\"@drawable/ic_reservation_disabled\"\n        app:state_reservation_disabled=\"true\" />\n\n    <item\n        android:id=\"@+id/reservable\"\n        android:drawable=\"@drawable/ic_reservable\" />\n\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_reservation_disabled.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?android:textColorTertiary\">\n    <path\n        android:pathData=\"M22,9.43V6.75c0,-0.4 -0.37,-0.75 -0.83,-0.75H2.83c-0.46,0 -0.82,0.35 -0.82,0.75v2.68c1.06,0.4 1.82,1.39 1.82,2.57S3.07,14.18 2,14.57v2.68c0,0.4 0.37,0.75 0.83,0.75h18.34c0.46,0 0.83,-0.35 0.83,-0.75v-2.68A2.76,2.76 0,0 1,20.17 12c0,-1.18 0.76,-2.18 1.83,-2.57z\"\n        android:strokeColor=\"#fff\"\n        android:strokeWidth=\"2\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M14.39,15.5L11.95,13.93 9.51,15.5 10.24,12.69 8,10.86 10.89,10.69 11.95,8 13,10.69 15.89,10.86 13.65,12.7z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_reservation_pending.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?android:textColorTertiary\"\n        android:pathData=\"M8,9L11.75,12.33 8,16.08 8,19.67 16,19.67 16,16.09 12.25,12.33 16,9z\" />\n    <path\n        android:pathData=\"M8,5L8,8.59 11.75,12.33 8,16.08 8,19.67 16,19.67 16,16.09 12.25,12.33 16,8.59 16,5z\"\n        android:strokeColor=\"?colorControlNormal\"\n        android:strokeWidth=\"2\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_reserved.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M21.17,12c0,0.96 0.82,1.75 1.83,1.75v3.5A1.8,1.8 0,0 1,21.17 19L2.83,19c-1,0 -1.83,-0.79 -1.83,-1.75v-3.5A1.8,1.8 0,0 0,2.83 12c0,-0.96 -0.81,-1.75 -1.82,-1.75v-3.5c0,-0.96 0.81,-1.75 1.82,-1.75h18.34c1,0 1.83,0.79 1.83,1.75v3.5c-1,0 -1.83,0.79 -1.83,1.75zM15.1,16l-0.94,-3.54L17,10.13l-3.66,-0.22L12,6.5l-1.35,3.4 -3.66,0.22 2.84,2.33L8.91,16l3.1,-2 3.09,2z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_search.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#FF000000\"\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": "mobile/src/main/res/drawable/ic_share.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_sustainability_art.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"121dp\"\n    android:height=\"127dp\"\n    android:viewportWidth=\"121\"\n    android:viewportHeight=\"127\">\n\n    <path\n        android:fillColor=\"#34A853\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M10 16V27.4001C20.8035 27.4134 31.1611 31.7109 38.8003 39.3501C46.4395 46.9893 50.7368 57.3466 50.75 68.1501H51.0996H62.1602H62.4995C62.5127 57.3466 66.8105 46.9893 74.4497 39.3501C82.089 31.7109 92.446 27.4134 103.25 27.4001V16C89.4225 16.0132 76.1658 21.5119 66.3887 31.2891C62.3931 35.2846 59.1121 39.8613 56.628 44.8205C54.143 39.861 50.8611 35.2842 46.8647 31.2886C37.086 21.5117 23.8279 16.0132 10 16ZM10 70.2502V58.8403C23.8288 58.8562 37.0868 64.3568 46.8652 74.1353C50.8561 78.1261 54.1344 82.6966 56.6181 87.6488C59.1024 82.6939 62.3823 78.1211 66.3755 74.1287C76.1567 64.3493 89.4186 58.8509 103.25 58.8403V70.2502C92.4422 70.2555 82.0782 74.55 74.4341 82.1904C66.7899 89.8308 62.4906 100.192 62.48 111H62.1602H51.0801H50.75C50.7394 100.196 46.443 89.8373 38.8032 82.1975C31.1634 74.5577 20.8043 70.2608 10 70.2502Z\" />\n</vector>"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_tune.xml",
    "content": "<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M3,17v2h6v-2L3,17zM3,5v2h10L13,5L3,5zM13,21v-2h8v-2h-8v-2h-2v6h2zM7,9v2L3,11v2h4v2h2L9,9L7,9zM21,13v-2L11,11v2h10zM15,9h2L17,7h4L21,5h-4L17,3h-2v6z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_waitlist_available.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:pathData=\"M8,5L8,8.59 11.75,12.33 8,16.08 8,19.67 16,19.67 16,16.09 12.25,12.33 16,8.59 16,5z\"\n        android:strokeColor=\"#fff\"\n        android:strokeWidth=\"2\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/ic_waitlisted.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M7,4L7,9 10.33,12.33 7,15.67 7,20.67 17,20.67 17,15.68 13.67,12.33 17,9.01 17,4z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/io_logo_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"34dp\"\n    android:height=\"25dp\"\n    android:viewportWidth=\"34\"\n    android:viewportHeight=\"25\">\n    <path\n        android:fillColor=\"#D2E3FC\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M0,20.245h8.485V3.275H0z\" />\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M24.243,3.723a8.038,8.038 0,1 0,0 16.075,8.038 8.038,0 0,0 0,-16.075z\"\n        android:strokeWidth=\"1.5\"\n        android:strokeColor=\"#2C83FC\" />\n    <path\n        android:fillColor=\"#5BB974\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M10.494,23.908l-0.905,-0.204L14.919,0.143l0.905,0.205z\"\n        android:strokeWidth=\".25\"\n        android:strokeColor=\"#21BD6C\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/list_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  Copyright (c) 2018 Google Inc.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\n  in compliance with the License. You may obtain a copy of the License at\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software distributed under the License\n  is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n  or implied. See the License for the specific language governing permissions and limitations under\n  the License.\n  -->\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <size\n        android:width=\"1dp\"\n        android:height=\"1dp\" />\n    <solid android:color=\"@color/list_divider\" />\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_1.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#5bb974\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M18.34,15.44l-2.74,2l-1.76,-2.69l5.35,-3.86h2.64v18.22h-3.49v-13.67z\" />\n\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_2.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#5bb974\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M14.02,26.13c0.59,-0.59,6.15,-6.17,6.63,-6.68c0.64,-0.69,1.69,-1.72,1.68,-3.3c-0.06,-1.84,-1.76,-2.21,-2.53,-2.21c-0.92,0,-2.13,0.4,-2.79,2.23l-3.14,-1.3c0.96,-2.86,3.44,-4.3,5.99,-4.21c2.4,0.07,6.05,1.4,6.01,5.33c-0.2,4.39,-5.23,8.1,-7.21,10.09l0.08,0.16l7.37,0l0,3.06l-12.09,0l0,-3.17z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_3.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#5bb974\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M13.53,24.72l3.3,-1.3c0.33,1.42,1.42,2.75,3.28,2.72c1.78,-0.05,2.7,-1.27,2.76,-2.46c0,-2.07,-2.29,-2.49,-3.3,-2.49l-1.57,0l0,-3.17l1.44,0c2.46,-0.19,2.81,-1.52,2.8,-2.25c0,-0.67,-0.51,-2.17,-2.37,-2.12c-1.47,0,-2.18,0.69,-2.69,2.05l-3.17,-1.3c1.22,-2.94,3.43,-3.92,6,-3.94c2.37,0,5.66,1.3,5.76,4.88c0,2.59,-1.64,3.66,-2.32,4.01l0,0.21c0.87,0.34,3.11,1.97,2.98,4.52c-0.15,3.21,-2.48,5.37,-6.38,5.43c-3.53,0,-5.85,-2.08,-6.53,-4.79z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_4.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#5bb974\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20.82,25.75h-8.39l0,-2.82l8.1,-12.04h3.78l0,11.6h2.27v3.25l-2.27,0v3.36l-3.49,0zm0,-3.25l0,-6.42h-0.21l-4.31,6.42z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_5.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#5bb974\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M13.54,24.58l3.11,-1.3c0.46,1.59,1.47,2.91,3.36,2.85c1.14,-0.04,2.89,-0.7,2.91,-3.07c0,-1.33,-0.95,-2.93,-3.04,-2.94c-0.82,-0.06,-1.95,0.46,-2.53,1.28l-3.42,-1.44l0.83,-9.12l10.27,-0.23l-0.07,3.06l-7.37,0.16l-0.47,4.27l0.31,0c0.87,-0.75,1.89,-1.15,3.16,-1.17c2.5,-0.04,5.87,2.12,5.8,6.17c-0.06,3.2,-2.16,6.13,-6.3,6.23c-4.04,-0.06,-6.08,-2.58,-6.57,-4.77z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_6.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#5bb974\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M13.5,23.19c-0.06,-2.93,1.73,-5.26,2.58,-6.46l4.39,-6.27l2.72,1.85l-3.75,5.23l0.16,0.16c0.41,-0.17,1.36,-0.27,1.38,-0.27c2.99,0.12,5.43,2.55,5.48,5.87c-0.16,4.1,-3.3,6.06,-6.42,6.21c-2.95,0,-6.46,-1.81,-6.54,-6.32zm9.56,0.15c0,-1.72,-1.48,-3,-3.12,-3.01c-1.52,0,-2.95,1.08,-3.03,3.08c0.14,1.66,1.52,2.96,3.11,2.91c1.76,0,3.04,-1.44,3.04,-2.98z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_7.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#5bb974\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M14.89,28.3l7.59,-13.59l-0.11,-0.16h-8.36v-3.28h12.39v3.44l-8.58,15.21z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_8.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#5bb974\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M13.39,24.03c0.05,-2.64,1.97,-4.02,2.77,-4.45l0,-0.21c-0.62,-0.43,-2.15,-1.57,-2.16,-3.78c0.05,-3.5,3.28,-5.19,6.03,-5.15c2.56,-0.05,5.88,1.53,5.95,5.15c0.06,1.96,-1.55,3.36,-2.18,3.78l0,0.21c0.8,0.43,2.72,1.51,2.79,4.44c0,3.86,-3.81,5.44,-6.6,5.48c-2.64,0,-6.57,-1.48,-6.59,-5.48zm9.68,-0.35c-0.05,-2.14,-2.2,-2.56,-3.09,-2.56c-0.89,0,-3.11,0.41,-3.11,2.56c0,2.11,2.21,2.61,3.11,2.61c1.7,0,3.12,-0.92,3.09,-2.61zm-0.48,-7.88c0,-1.49,-1.36,-2.23,-2.61,-2.24c-1.37,0,-2.63,0.71,-2.63,2.24c0,1.54,1.25,2.28,2.63,2.26c1.36,0,2.65,-0.71,2.61,-2.26z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_a.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M17.95,10.46h4.1l7.16,19.07h-3.97l-1.57,-4.56l-7.35,0l-1.57,4.56l-3.97,0zm4.56,11.21l-1.7,-4.77l-0.69,-2.32h-0.21l-0.69,2.32l-1.7,4.77z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_b.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M13.84,10.45l7.5,0c1.92,0,5.7,1.3,5.78,4.96c0,2.72,-1.82,3.77,-2.55,4.12l0,0.2c0.94,0.32,3.27,1.48,3.25,4.55c-0.07,4.16,-4.23,5.21,-6.18,5.22l-7.79,0l0,-19.06zm7.19,7.77c0.83,0,2.62,-0.39,2.61,-2.29c0,-1.8,-1.72,-2.26,-2.5,-2.26l-3.69,0l0,4.55l3.59,0zm0.4,7.98c0.91,0,2.83,-0.34,2.8,-2.43c0,-2.07,-1.94,-2.47,-2.9,-2.47l-3.89,0l0,4.9l3.99,0z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_bike.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <group\n        android:pivotX=\"12\"\n        android:pivotY=\"12\"\n        android:scaleX=\"0.9\"\n        android:scaleY=\"0.9\">\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M11.33,16.67l0,-3.33l-2.2,-1.87c-0.47,-0.47 -0.47,-1.33 -0.13,-1.67l2.13,-2.14c0.47,-0.47 1.3,-0.47 1.8,0l1.13,1.07c0.87,0.8 1.47,1.27 2.6,1.27l0,1.33c-1.8,0 -2.74,-0.73 -3.87,-1.93l-1.6,1.53l1.47,1.6l0,4.14zM14.33,5a1.33,1.33 0 1,1 0,2.667a1.33,1.33 0 1,1 0,-2.67zM4,15.33a3.33,3.33 0 1,1 6.67,0a3.33,3.33 0 1,1 -6.67,0zM5,15.33a2.33,2.33 0 0,0 4.67,0a2.33,2.33 0 0,0 -4.67,0M13.33,15.33a3.33,3.33 0 1,1 6.67,0a3.33,3.33 0 1,1 -6.67,0zM14.33,15.33a2.33,2.33 0 0,0 4.67,0a2.33,2.33 0 0,0 -4.67,0z\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_c.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M28.12,26.45c-0.89,1.09,-3.11,3.53,-7.7,3.48c-6.23,-0.06,-9.84,-4.95,-9.89,-9.95c0.04,-4.55,3.47,-10.06,9.89,-9.95c4.07,-0.07,6.37,2.14,7.23,3.11l-2.53,2.45c-0.55,-0.64,-1.95,-2.2,-4.63,-2.16c-3.03,0,-6.4,2.17,-6.37,6.55c0.07,3.73,2.38,6.54,6.42,6.55c2.85,0,4.44,-1.74,5.03,-2.5l2.55,2.42z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_charging.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <group\n        android:pivotX=\"12\"\n        android:pivotY=\"12\"\n        android:scaleX=\"1.1\"\n        android:scaleY=\"1.1\">\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M12,19l4,-8h-4v-6l-4,8h4z\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_d.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M13.09,10.45l6.44,0c1.51,0,9.6,0.24,9.8,9.53c-0.14,9.02,-8.29,9.53,-9.8,9.53l-6.44,0l0,-19.05zm6.75,15.64c1.16,0,5.92,-0.5,5.88,-6.2c-0.06,-5.49,-4.68,-6.03,-5.96,-6.05l-3.06,0l0,12.25c0,0,3.16,0,3.16,0z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_drink.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <group\n        android:pivotX=\"12\"\n        android:pivotY=\"12\"\n        android:scaleX=\"1.1\"\n        android:scaleY=\"1.1\"\n        android:translateY=\"0.5\">\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M15.13,8.28c1.13,-0.97,0.37,-3.16,-1.49,-2.69c-0.89,-1.38,-2.76,-1.38,-3.74,-0.04c-1.98,-0.28,-2.38,1.82,-1.44,2.72l6.66,0zm-6.17,-0.69c-0.2,-0.11,-0.47,-1.23,0.57,-1.32c0.26,0,0.39,0.15,0.56,0.16c0.55,0,0.44,-1.11,1.66,-1.11c1.3,0,1.2,1.17,1.72,1.18c0.4,-0.05,0.31,-0.23,0.73,-0.23c0.88,0.13,0.78,1.07,0.5,1.37l-5.74,-0.04z\" />\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M8.46,8.17v8.6c0,0.42,0.34,0.75,0.76,0.75h5.05c0.48,0,0.86,-0.39,0.86,-0.87v-1.15h0.78c0.79,0,1.43,-0.59,1.43,-1.32v-3.64c0,-0.73,-0.64,-1.32,-1.43,-1.32h-0.78v-1.06h-6.68zm5.78,8.13c0,0.15,-0.13,0.28,-0.28,0.28h-4.43c-0.15,0,-0.28,-0.13,-0.28,-0.28v-7.51c0,-0.15,0.13,-0.28,0.28,-0.28h4.42c0.15,0,0.28,0.13,0.28,0.28v7.51zm2.24,-1.97c0,0.16,-0.19,0.3,-0.4,0.3h-0.94v-4.49h0.94c0.21,0,0.4,0.14,0.4,0.29v3.89z\" />\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M13.35,15.58h-0.59v-6.14h0.59v6.12zm-1.33,0h-0.59v-6.14h0.59v6.12zm-1.33,0h-0.59v-6.14h0.59v6.12z\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_e.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M17.55,13.87v4.42h7.64v3.41h-7.64v4.43h8.5v3.41h-12.09v-19.07h12.09v3.41z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_f.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M13.95,10.46h12.09v3.41h-8.5v4.64h7.64v3.41h-7.64v7.62h-3.6z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_food.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <group\n        android:pivotX=\"12\"\n        android:pivotY=\"12\"\n        android:scaleX=\"0.85\"\n        android:scaleY=\"0.85\">\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M5.25,4h1.5v5.65h1.5v-5.65h1.5v5.65h1.5v-5.65h1.5v6.65c0,1.15,-1.875,2.3,-2.75,2.3v7.05h-2v-7.05c-0.875,0,-2.75,-1.15,-2.75,-2.3zM18.75,4v16h-2v-7.05h-2v-5.9c0,-1 2,-3,4,-3z\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_g.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20.21,19.05l9.34,0c0.06,0.25,0.19,1.72,0.19,1.75c-0.11,5.52,-3.77,8.99,-9.51,9.14c-4.43,0.06,-9.97,-3.14,-9.99,-9.96c0.19,-6.56,5.08,-9.83,9.98,-9.95c2.78,0,5.42,0.97,7.34,3l-2.47,2.42c-0.95,-0.97,-2.45,-2.12,-4.85,-2.02c-3.77,-0.04,-6.35,3.12,-6.4,6.55c0,3.51,2.49,6.54,6.49,6.55c3.72,0,5.33,-2.19,5.88,-4.42l-5.98,0l0,-3.06z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_h.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12.39,10.46h3.6v7.62h8.02v-7.62h3.6v19.07h-3.6v-8.05h-8.02v8.05h-3.6v-19.07z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_handicap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#ff5fc3e7\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#ffa1d6e6\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,5a1.5,1.5 0 1,1 0,3a1.5,1.5 0 1,1 0,-3zM12,8.5c-0.75,0 -1.5,0.75 -1.5,1.5v4.5c0,0.5 0.5,1 1,1h3.5v3.5h1.5v-4.25c0,-0.5 -0.5,-1 -1,-1 h-2v-2.75c0,0 1.5,1 3,1v-1c-2.75,-0.25 -3,-2.5 -4.5,-2.5zM10.5,15m-0.5,-3.25a3.75,3.75 0 1,0 4.25,4.25h-1.5a2.25,2.25 0 1,1 -2.75,-2.75z\" />\n\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_i.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"40\"\n    android:viewportHeight=\"40\">\n    <path\n        android:fillColor=\"#4285f4\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,0a20,20 0 1,1 0,40a20,20 0 1,1 0,-40M20,3a17,17 0 0,0 0,34a17,17 0 0,0 0,-34\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M17.67,10v19.18h4v-19.18z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M12,5a2,2 0,1 1,0,4a2,2 0,1 1,0,-4zM10.5,19h3v-7.8h-3z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_label_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <corners android:radius=\"4dp\" />\n    <solid android:color=\"#4285f4\" />\n\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_lounge.xml",
    "content": "<!--\n ~ Copyright 2018 Google LLC\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~     https://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M6,16.5h12c0.5,0 1,-0.5 1,-1v-3.5c0,-0.375 -0.5,-0.75 -1,-0.75c-0.5,0 -1,0.375 -1,0.75v2.5h-9.75v-2.5c0,-0.375 -0.5,-0.75 -1,-0.75c-0.5,0 -1,0.375 -1,0.75v3.5c0,0.5 0.5,1 1,1zM8,13.75h8.25,v-1.5c0,-1 0.625,-1.5 1.25,-1.75v-0.75c0,-1 -1,-2 -2,-2h-6.75c-1,0 -2,1 -2,2v0.75c0.625,0.25 1.25,1 1.25,1.75Z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_medical.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#e94235\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M17.61,13.87v-3.74h-3.74v-3.74h-3.74v3.74h-3.74v3.74h3.74v3.74h3.74v-3.74h3.74\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_mothers_room.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <group\n        android:pivotX=\"12\"\n        android:pivotY=\"12\"\n        android:rotation=\"-40\">\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M12,4c0.88,0 1.75,0.875 1.75,1.75v0.5c1,0.25 1.75,1 2,2c0.5,0 1,0.5 1,2c0,1.5 -0.5,2 -1,2v5c0,1 -1,2 -2,2h-3.5c-1,0 -2,-1 -2,-2v-5c-0.5,0 -1,-0.5 -1,-2c0,-1.5 0.5,-2 1,-2c0.25,-1 1,-1.75 2,-2v-0.5c0,-0.88 0.88,-1.75 1.75,-1.75zM12,5c-0.44,0 -1,0.44 -0.88,0.88v1.13c-1,0 -1.75,0.75 -1.75,1.25h5.25c0,-0.5 -0.75,-1.25 -1.75,-1.25v-1.13c0,-0.44 -0.44,-0.88 -0.88,-0.88zM8.5,9.25c-0.25,0 -0.5,0.5 -0.5,1c0,0.5 0.25,1 0.5,1h7c0.25,0 0.5,-0.5 0.5,-1c0,-0.5 -0.25,-1 -0.5,-1zM9.38,12.25v5c0,0.5 0.5,1 1,1h3.25c0.5,0 1,-0.5 1,-1v-5M10.75,13.75h2.5v1h-2.5zM10.75,15.5h2.5v1h-2.5z\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_parking.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M8.2,6l0,12 2.4,0 0,-4.2 2.1,0a3.9,3.9 0,0 0,0 -7.8zm2.4,2.4l2.1,0a1.5,1.5 0,1 1,0,3l-2.1,0z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_restroom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M8.75,5a1.5,1.5 0 1,1 0,3a1.5,1.5 0 1,1 0,-3zM6.5,14h1v5h2.5v-5h1v-4c0,-0.5 -0.5,-1 -1,-1h-2.5c-0.5,0 -1,0.5 -1,1zM15.5,5a1.5,1.5 0 1,1 0,3a1.5,1.5 0 1,1 0,-3zM12.5,15h2v4h2v-4h2l-1.75,-5.25c-0.5,-1.2 -2,-1.2 -2.5,0z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_rideshare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M12,5a1.5,1.5 0 1,1 0,3a1.5,1.5 0 1,1 0,-3zM10.5,10.5v8.5h1.3v-4h0.9v4h1.3v-9c1,-0.5 2.5,-2 3,-3.5l-1,-0.5c-0.7,1 -1,3 -5.5,3c-1.25,0 -2.25,2.5 -2.5,4.5l1.2,0.2c0,-0.75 1,-3.3 1.3,-3.3zM7.4,19v-4.7h2v4.7z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_service_dog.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M10.1,14.36l2.9,-0.27l0,-1.54l-2.9,0z\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M9.49,11.61l0,-1.67l-0.04,-0.012l-2.06,-3.67c-0.11,-0.21,-0.43,-0.15,-0.46,0.09l-0.06,0.49c-0.01,0.12,-0.02,0.56,-0.14,0.57l-2.29,0.24c-0.17,0.02,-0.27,0.2,-0.19,0.35l0.27,0.72c0.03,0.06,0.08,0.1,0.14,0.12l1.4,0.66c0.09,0.03,0.15,0.11,0.16,0.20l0.26,1.31v0.02c0,0.07,0.01,0.12,0.02,0.14l0.1,0.42l2.87,0z\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M18.27,6.81c-0.51,1.3,-1.57,3.66,-2.6,3.85c-0.02,0,-0.04,0,-0.06,0l-2.01,-0.18l0,1.7h0.01v1.83l0.78,-0.07c0.11,-0.01,0.2,0.07,0.21,0.17l0.53,4.05c0.01,0.1,0.1,0.17,0.2,0.17h0.52c0.1,0,0.19,-0.08,0.2,-0.18l0.65,-5.94c0.01,-0.04,0.02,-0.08,0.05,-0.10c0.27,-0.32,1.93,-2.4,1.91,-5.24c-0,-0.22,-0.3,-0.28,-0.38,-0.07\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M9.47,12.29l-2.69,0l1.4,5.93c0.02,0.09,0.1,0.15,0.19,0.15l0.57,0c0.11,0,0.2,-0.09,0.2,-0.2l0,-3.54c0,-0.1,0.08,-0.19,0.18,-0.2l0.15,-0.01l0,-2.14z\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M15.44,6.69l-0.55,-0.61c-0.13,-0.14,-0.31,-0.22,-0.51,-0.23c-0.22,-0,-0.46,0.08,-0.64,0.24l-3.8,3.58c-0.01,0.01,-0,0.03,-0.02,0.04l0.6,0.1l3.56,-3.35c0.08,-0.07,0.18,-0.11,0.28,-0.11c0.05,0,0.11,0.02,0.16,0.07l0.55,0.61c0.1,0.11,0.06,0.31,-0.08,0.44l-3.97,3.72c-0.1,0.1,-0.11,0.25,-0.01,0.35c0.05,0.05,0.12,0.08,0.18,0.08c0.06,0,0.12,-0.02,0.17,-0.07l3.97,-3.71c0.35,-0.32,0.4,-0.83,0.11,-1.14\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_shuttle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M12,5c-4.5,0 -5.5,1.5 -5.5,3v7c0,1 0.5,1.5 1,2v1.5c0,0.25 0.25,0.5 0.5,0.5h1c0.25,0 0.5,-0.25 0.5,-0.5v-1h5v1c0,0.25 0.25,0.5 0.5,0.5h1c0.25,0 0.5,-0.25 0.5,-0.5v-1.5c0.5,-0.5 1,-1 1,-2v-7c0,-1.5 -1,-3 -5.5,-3zM8,8h8v4.25h-8zM9,14a1,1 0 1,1 0,2a1,1 0 1,1 0,-2M15,14a1,1 0 1,1 0,2a1,1 0 1,1 0,-2z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_star.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <group\n        android:pivotX=\"12\"\n        android:pivotY=\"12\"\n        android:scaleX=\"0.8\"\n        android:scaleY=\"0.8\">\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_store.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n    <group\n        android:pivotX=\"12\"\n        android:pivotY=\"12\"\n        android:scaleX=\"0.9\"\n        android:scaleY=\"0.9\">\n        <path\n            android:fillColor=\"#174ea6\"\n            android:pathData=\"M8.5,7.5h-2.5c-0.5,0 -1,0.5 -1,1v9.5c0,0.5 0.5,1 1,1h12c0.5,0 1,-0.5 1,-1v-9.5c0,-0.5 -0.5,-1 -1,-1h-2.5a3.5,3.5 0 1,0 -7,0zM10,7.5a2,2 0 1,1 4,0zM14,9h1.5a3.5,3.5 0 1,1 -7,0h1.5a2,2 0 0,0 4,0z\" />\n    </group>\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/map_marker_water.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M0,12a12,12 0 1,1 24,0a12,12 0 1,1 -24,0z\" />\n    <path\n        android:fillColor=\"#fbbc04\"\n        android:pathData=\"M12,0a12,12 0 0.6,0.6 0,24a12,12 0 0.6,0.6 0,-24M12,1.8a10.2,10.2 0 0,0 0,20.4a10.2,10.2 0 0,0 0,-20.4\" />\n\n    <path\n        android:fillColor=\"#174ea6\"\n        android:pathData=\"M11.99,19.95c3.17,0,5.06,-2.27,5.06,-5.06c0,-2.79,-3.8,-7.12,-5.06,-10.98c-1.3,3.87,-5.06,8.19,-5.06,10.98c0,2.8,1.89,5.06,5.06,5.06zm0.26,-1.26c-2.16,0,-3.9,-1.75,-3.91,-3.91c0,-0.23,0.18,-0.41,0.41,-0.41c0.23,0,0.41,0.18,0.41,0.41c0,1.7,1.38,3.08,3.08,3.08c0.23,0,0.41,0.18,0.41,0.41c0,0.23,-0.1,0.41,-0.41,0.41z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/navigation_item_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_checked=\"true\">\n        <inset\n            android:insetLeft=\"@dimen/nav_item_background_inset_left\"\n            android:insetRight=\"@dimen/nav_item_background_inset_right\">\n            <shape>\n                <corners\n                    android:bottomLeftRadius=\"@dimen/nav_item_background_corner_radius_left\"\n                    android:bottomRightRadius=\"@dimen/nav_item_background_corner_radius_right\"\n                    android:topLeftRadius=\"@dimen/nav_item_background_corner_radius_left\"\n                    android:topRightRadius=\"@dimen/nav_item_background_corner_radius_right\" />\n            </shape>\n        </inset>\n    </item>\n    <item>\n        <color android:color=\"@color/transparent\" />\n    </item>\n</selector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/no_items_found_204.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"260dp\"\n    android:height=\"120dp\"\n    android:viewportWidth=\"260\"\n    android:viewportHeight=\"120\"\n    tools:ignore=\"VectorRaster\">\n    <path\n        android:fillColor=\"#F1F3F4\"\n        android:pathData=\"M40,0C17.909,0 0,17.909 0,40h80C80,17.909 62.091,0 40,0m0,3.75c18.722,0 34.175,14.267 36.057,32.5H3.943C5.825,18.017 21.278,3.75 40,3.75\" />\n    <path\n        android:fillColor=\"#DADCE0\"\n        android:pathData=\"M40,40L25,40L0,80h40L40,40zM36.875,43.125v33.75L5.638,76.875l21.094,-33.75h10.143z\" />\n    <path\n        android:fillColor=\"#F1F3F4\"\n        android:pathData=\"M0,120h80V80H0z\" />\n    <path\n        android:fillColor=\"#9AA0A6\"\n        android:pathData=\"M80,40H40v40c22.092,0 40,-17.909 40,-40\" />\n    <path\n        android:fillColor=\"#F1F3F4\"\n        android:pathData=\"M260,20c0,11.046 -8.954,20 -20,20s-20,-8.954 -20,-20 8.954,-20 20,-20 20,8.954 20,20M220,120h40L260,80h-40v40zM223.125,116.875h33.75v-33.75h-33.75v33.75z\" />\n    <path\n        android:fillColor=\"#DADCE0\"\n        android:pathData=\"M220,0l-40,25v55h40L220,0zM216.875,5.638v71.237h-33.75L183.125,26.732l33.75,-21.094z\" />\n    <path\n        android:fillColor=\"#9AA0A6\"\n        android:pathData=\"M220,80h40V40h-40z\" />\n    <path\n        android:fillColor=\"#DADCE0\"\n        android:pathData=\"M130,0c-22.091,0 -40,17.909 -40,40h80c0,-22.091 -17.909,-40 -40,-40m0,3.125c19.281,0 35.153,14.874 36.744,33.75H93.256C94.847,17.999 110.72,3.125 130,3.125\" />\n    <path\n        android:fillColor=\"#F1F3F4\"\n        android:pathData=\"M130,120c22.092,0 40,-17.909 40,-40H90c0,22.091 17.908,40 40,40\" />\n    <path\n        android:fillColor=\"#9AA0A6\"\n        android:pathData=\"M90,80h80V40H90z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/onboarding_io_19.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"180dp\"\n    android:height=\"125dp\"\n    android:viewportWidth=\"360\"\n    android:viewportHeight=\"250\">\n    <path\n        android:fillColor=\"#4285F4\"\n        android:pathData=\"M104.913,102.976a18.713,18.736 0,1 0,37.426 0a18.713,18.736 0,1 0,-37.426 0z\" />\n    <path\n        android:pathData=\"M140.34,123.712h-33.428v70.943h33.427v-70.943z\"\n        android:strokeColor=\"#D2E3FC\"\n        android:strokeWidth=\"4\" />\n    <path\n        android:pathData=\"M252.702,123.712h-33.427v70.943h33.427v-70.943z\"\n        android:strokeColor=\"#FDEDC5\"\n        android:strokeWidth=\"4\" />\n    <path\n        android:pathData=\"M104.912,142.79H30.058M104.912,175.577H30.058M51.111,121.712v74.943M83.86,121.712v74.943\"\n        android:strokeColor=\"#AECBF7\"\n        android:strokeWidth=\"4\" />\n    <path\n        android:pathData=\"M294.129,87.478v107.177h33.427V104.21l-33.427,-16.733z\"\n        android:strokeColor=\"#CEEAD6\"\n        android:strokeWidth=\"4\" />\n    <path\n        android:pathData=\"M144.395,157.183h70.743c-1.036,-18.66 -16.477,-33.471 -35.372,-33.471s-34.336,14.81 -35.371,33.471z\"\n        android:strokeColor=\"#FAD2CF\"\n        android:strokeWidth=\"4\" />\n    <path\n        android:fillColor=\"#E5443F\"\n        android:pathData=\"M179.766,196.655c20.67,0 37.427,-16.777 37.427,-37.472h-74.854c0,20.695 16.757,37.472 37.427,37.472z\" />\n    <path\n        android:fillColor=\"#34A853\"\n        android:pathData=\"M254.702,121.712c0,20.694 16.756,37.471 37.427,37.471V84.24c-20.67,0 -37.427,16.777 -37.427,37.472z\" />\n    <path\n        android:fillColor=\"#FBBC04\"\n        android:pathData=\"M252.363,84.24h-30.445l-1.047,2.102 -3.707,7.418 -3.83,7.664 -9.065,18.191c-0.585,1.171 0,2.097 1.298,2.097h49.158V84.24h-2.362z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/onboarding_io_date_2019.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"180dp\"\n    android:height=\"125dp\"\n    android:viewportWidth=\"360\"\n    android:viewportHeight=\"250\">\n    <path\n        android:pathData=\"M198.627,179.577h57.683c-0.778,-15.299 -13.394,-27.462 -28.842,-27.462 -15.447,0 -28.063,12.163 -28.841,27.462z\"\n        android:strokeColor=\"#AECBF7\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#D2E3FC\"\n        android:pathData=\"M227.468,242c16.779,0 30.38,-13.638 30.38,-30.462h-60.76c0,16.824 13.602,30.462 30.38,30.462z\" />\n    <path\n        android:fillColor=\"#4285F4\"\n        android:pathData=\"M197.089,181.077h60.759v30.462h-60.759z\" />\n    <path\n        android:pathData=\"M31.539,179.577H89.22c-0.778,-15.299 -13.394,-27.462 -28.841,-27.462a28.838,28.838 0,0 0,-20.42 8.482,29 29,0 0,0 -8.421,18.98z\"\n        android:strokeColor=\"#FDE293\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#FDEDC5\"\n        android:pathData=\"M60.38,242c16.778,0 30.38,-13.638 30.38,-30.462H30C30,228.362 43.601,242 60.38,242z\" />\n    <path\n        android:fillColor=\"#FBBC04\"\n        android:pathData=\"M30,181.077h60.759v30.462H30z\" />\n    <path\n        android:pathData=\"M31.538,73.913h57.683c-0.778,-15.298 -13.394,-27.461 -28.841,-27.461 -15.448,0 -28.064,12.163 -28.842,27.461z\"\n        android:strokeColor=\"#D2E3FC\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M58.88,76.913h-9.06l-17.117,27.462H58.88V76.913z\"\n        android:strokeColor=\"#AECBF7\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#D2E3FC\"\n        android:pathData=\"M30,105.875h60.759v30.462H30z\" />\n    <path\n        android:fillColor=\"#4285F4\"\n        android:pathData=\"M90.76,75.413H60.38v30.462c16.778,0 30.38,-13.638 30.38,-30.462z\" />\n    <path\n        android:fillColor=\"#FBBC04\"\n        android:pathData=\"M163.818,73.957l18.08,-29.005h26.583v30.461h-43.856a0.954,0.954 0,0 1,-0.807 -1.456z\" />\n    <path\n        android:pathData=\"M206.981,76.913h-27.38v57.924h27.38V76.913z\"\n        android:strokeColor=\"#FDEDC5\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#34A853\"\n        android:pathData=\"M216.076,74.462c0,16.823 13.601,30.461 30.38,30.461V44c-16.779,0 -30.38,13.638 -30.38,30.462z\" />\n    <path\n        android:pathData=\"M247.956,46.71v87.175h27.38V63.869l-27.38,-17.159z\"\n        android:strokeColor=\"#CEEAD6\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M99.892,73.913h57.684c-0.778,-15.298 -13.395,-27.461 -28.842,-27.461s-28.063,12.163 -28.842,27.461z\"\n        android:strokeColor=\"#FAD2CF\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#FCE8E6\"\n        android:pathData=\"M128.734,136.337c16.778,0 30.38,-13.639 30.38,-30.462h-60.76c0,16.823 13.602,30.462 30.38,30.462z\" />\n    <path\n        android:fillColor=\"#E5443F\"\n        android:pathData=\"M98.354,75.413h60.759v30.462H98.354z\" />\n    <path\n        android:fillColor=\"#34A853\"\n        android:pathData=\"M128.734,211.538L98.354,192.5v-11.423h30.38z\" />\n    <path\n        android:pathData=\"M130.234,182.615v57.847c15.252,-0.783 27.38,-13.432 27.38,-28.924 0,-15.49 -12.128,-28.14 -27.38,-28.923z\"\n        android:strokeColor=\"#A8DAB5\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#CEEAD6\"\n        android:pathData=\"M98.354,150.615h60.759v30.462H98.354z\" />\n    <path\n        android:pathData=\"M113.544,213.038c-7.56,0 -13.69,6.147 -13.69,13.731s6.13,13.731 13.69,13.731 13.69,-6.147 13.69,-13.73c0,-7.585 -6.13,-13.732 -13.69,-13.732z\"\n        android:strokeColor=\"#CEEAD6\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#FCE8E6\"\n        android:pathData=\"M265.443,150.615H330v30.462h-64.557z\" />\n    <path\n        android:pathData=\"M296.222,183.703l-29.279,17.27V240.5h29.279v-56.797z\"\n        android:strokeColor=\"#FAD2CF\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#E5443F\"\n        android:pathData=\"M330,181.077h-32.278v30.461c17.829,0 32.278,-13.636 32.278,-30.461z\" />\n    <path\n        android:pathData=\"M295.823,106.423c-7.56,0 -13.69,6.147 -13.69,13.73 0,7.585 6.13,13.732 13.69,13.732s13.69,-6.147 13.69,-13.731 -6.13,-13.73 -13.69,-13.73z\"\n        android:strokeColor=\"#D2E3FC\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M178.101,213.038c-7.56,0 -13.69,6.147 -13.69,13.731s6.13,13.731 13.69,13.731 13.69,-6.147 13.69,-13.73c0,-7.585 -6.13,-13.732 -13.69,-13.732z\"\n        android:strokeColor=\"#FCE8E6\"\n        android:strokeWidth=\"3\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/onboarding_schedule.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"180dp\"\n    android:height=\"125dp\"\n    android:viewportWidth=\"360\"\n    android:viewportHeight=\"250\">\n    <path\n        android:fillColor=\"#34A853\"\n        android:pathData=\"M195,163.192h135v42.394H195z\" />\n    <path\n        android:pathData=\"M194.5,164.202v83.78\"\n        android:strokeColor=\"#F4F4F4\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#D2E3FC\"\n        android:pathData=\"M123,206.596h135v42.394H123z\" />\n    <path\n        android:fillColor=\"#FBBC04\"\n        android:pathData=\"M78,120.798h45v42.394H78z\" />\n    <path\n        android:pathData=\"M122.5,36.335l0.5,126.19\"\n        android:strokeColor=\"#F4F4F4\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:fillColor=\"#4285F4\"\n        android:pathData=\"M246,225.008l-7.19,-0.626L236,217.7l-2.81,6.692 -7.19,0.616 5.46,4.774 -1.64,7.096 6.18,-3.765 6.18,3.765 -1.63,-7.096z\" />\n    <path\n        android:pathData=\"M77.5,35.745v124.924\"\n        android:strokeColor=\"#F4F4F4\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M33,249.495h327M32,36.335v126.857\"\n        android:strokeColor=\"#E8EAED\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M0,78.29h160.42M32,163.192v85.799\"\n        android:strokeColor=\"#F4F4F4\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M257.5,207.606v40.375M122.5,207.606v40.375\"\n        android:strokeColor=\"#E8EAED\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M330.01,164.202l-0.01,41.89\"\n        android:strokeColor=\"#F4F4F4\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M0,205.587l360,0.505\"\n        android:strokeColor=\"#E8EAED\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n    <path\n        android:pathData=\"M32,162.688h298\"\n        android:strokeColor=\"#F4F4F4\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"4\" />\n    <path\n        android:pathData=\"M0,120.546h236.135\"\n        android:strokeColor=\"#E8EAED\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"3\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/page_margin.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<inset xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:inset=\"@dimen/spacing_normal\">\n    <shape android:shape=\"rectangle\">\n        <solid android:color=\"?colorControlLight\" />\n        <size\n            android:width=\"1dp\"\n            android:height=\"1dp\" />\n    </shape>\n</inset>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/preview_window.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/white\" />\n\n    <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@drawable/preview_window_logo\" />\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/signal_wifi_off.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"196dp\"\n    android:height=\"196dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#000\"\n        android:pathData=\"M23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4 -1.5,0 -2.89,0.19 -4.15,0.48L18.18,13.8 23.64,7zM17.04,15.22L3.27,1.44 2,2.72l2.05,2.06C1.91,5.76 0.59,6.82 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01 3.9,-4.86 3.32,3.32 1.27,-1.27 -3.46,-3.46z\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/tab_indicator.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<inset\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:insetLeft=\"@dimen/margin_normal\"\n    android:insetRight=\"@dimen/margin_normal\">\n    <shape android:shape=\"rectangle\">\n        <size android:height=\"2dp\" />\n        <corners android:radius=\"1dp\" />\n        <solid android:color=\"?colorPrimary\" />\n    </shape>\n</inset>\n"
  },
  {
    "path": "mobile/src/main/res/drawable/unrated_thumb.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <solid android:color=\"@android:color/transparent\" />\n    <size\n        android:width=\"18dp\"\n        android:height=\"18dp\" />\n</shape>\n"
  },
  {
    "path": "mobile/src/main/res/drawable-anydpi-v23/preview_window.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"?attr/colorSurface\" />\n\n    <item\n        android:drawable=\"@drawable/preview_window_logo\"\n        android:gravity=\"center\" />\n\n</layer-list>\n"
  },
  {
    "path": "mobile/src/main/res/drawable-anydpi-v23/preview_window_logo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"136dp\"\n    android:height=\"100dp\"\n    android:viewportWidth=\"34\"\n    android:viewportHeight=\"25\">\n    <path\n        android:fillColor=\"#D2E3FC\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M0,20.245h8.485V3.275H0z\" />\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M24.243,3.723a8.038,8.038 0,1 0,0 16.075,8.038 8.038,0 0,0 0,-16.075z\"\n        android:strokeWidth=\"1.5\"\n        android:strokeColor=\"#2C83FC\" />\n    <path\n        android:fillColor=\"#5BB974\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M10.494,23.908l-0.905,-0.204L14.919,0.143l0.905,0.205z\"\n        android:strokeWidth=\".25\"\n        android:strokeColor=\"#21BD6C\" />\n</vector>\n"
  },
  {
    "path": "mobile/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/root_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <FrameLayout\n        android:id=\"@+id/content_container\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toTopOf=\"@+id/bottom_navigation\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/nav_host_fragment\"\n            android:name=\"com.google.samples.apps.iosched.ui.DispatchInsetsNavHostFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:defaultNavHost=\"true\"\n            app:navGraph=\"@navigation/nav_graph\" />\n\n        <View\n            android:id=\"@+id/status_bar_scrim\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:background=\"@color/status_bar_scrim\" />\n\n        <com.google.samples.apps.iosched.widget.FadingSnackbar\n            android:id=\"@+id/snackbar\"\n            android:layout_width=\"@dimen/snackbar_width\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/snackbar_margin_end_fab\"\n            android:visibility=\"gone\" />\n\n    </FrameLayout>\n\n    <com.google.android.material.bottomnavigation.BottomNavigationView\n        android:id=\"@+id/bottom_navigation\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:menu=\"@menu/bar_navigation\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/activity_onboarding.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/fragment_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".ui.onboarding.OnboardingActivity\" />\n"
  },
  {
    "path": "mobile/src/main/res/layout/activity_session_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/session_detail_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n"
  },
  {
    "path": "mobile/src/main/res/layout/collapsible_card_content.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  Copyright 2018 Google Inc. All rights reserved.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS 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<merge\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:parentTag=\"android.widget.FrameLayout\">\n\n    <!-- Note: putting everything in a RelativeLayout confuses Talkback, which does not always\n    focus on the HtmlTextView. -->\n    <LinearLayout\n        android:id=\"@+id/collapsible_card\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <LinearLayout\n            android:id=\"@+id/title_container\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?selectableItemBackground\"\n            android:gravity=\"center_vertical\"\n            android:minHeight=\"?android:listPreferredItemHeightSmall\"\n            android:orientation=\"horizontal\"\n            android:paddingEnd=\"@dimen/margin_normal\"\n            android:paddingStart=\"@dimen/margin_normal\">\n\n            <TextView\n                android:id=\"@+id/card_title\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:paddingBottom=\"@dimen/spacing_micro\"\n                android:paddingTop=\"@dimen/spacing_micro\"\n                android:textAlignment=\"viewStart\"\n                android:textAppearance=\"@style/TextAppearance.IOSched.CollapsibleCard\"\n                tools:text=\"@string/travel_shuttle_service_title\" />\n\n            <ImageView\n                android:id=\"@+id/expand_icon\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"@dimen/margin_normal\"\n                android:importantForAccessibility=\"no\"\n                android:src=\"@drawable/ic_expand_more\" />\n\n        </LinearLayout>\n\n        <TextView\n            android:id=\"@+id/card_description\"\n            style=\"@style/Widget.IOSched.MultilineBody\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingBottom=\"@dimen/margin_normal\"\n            android:paddingEnd=\"@dimen/margin_normal\"\n            android:paddingStart=\"@dimen/margin_normal\"\n            android:paddingTop=\"@dimen/spacing_normal\"\n            android:textAlignment=\"viewStart\"\n            android:textColor=\"?android:textColorPrimary\"\n            android:visibility=\"gone\"\n            tools:text=\"@string/travel_shuttle_service_description\"\n            tools:visibility=\"visible\" />\n\n    </LinearLayout>\n\n</merge>\n"
  },
  {
    "path": "mobile/src/main/res/layout/countdown.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  Copyright 2018 Google Inc. All rights reserved.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS 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<merge 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    tools:parentTag=\"androidx.constraintlayout.widget.ConstraintLayout\">\n\n    <Space\n        android:id=\"@+id/spacer_top\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"@dimen/margin_normal\"\n        app:layout_constraintBottom_toTopOf=\"@id/countdown_days_1\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_chainStyle=\"spread_inside\" />\n\n    <com.airbnb.lottie.LottieAnimationView\n        android:id=\"@+id/countdown_days_1\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerInside\"\n        app:layout_constraintBottom_toTopOf=\"@id/spacer_days_mins\"\n        app:layout_constraintEnd_toStartOf=\"@id/countdown_days_2\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/spacer_top\" />\n\n    <com.airbnb.lottie.LottieAnimationView\n        android:id=\"@+id/countdown_days_2\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerInside\"\n        app:layout_constraintBottom_toBottomOf=\"@id/countdown_days_1\"\n        app:layout_constraintEnd_toEndOf=\"@id/spacer_days_hours\"\n        app:layout_constraintStart_toEndOf=\"@id/countdown_days_1\"\n        app:layout_constraintTop_toTopOf=\"@id/countdown_days_1\" />\n\n    <Space\n        android:id=\"@+id/spacer_days_hours\"\n        android:layout_width=\"@dimen/onboarding_animation_padding\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintEnd_toStartOf=\"@id/countdown_hours_1\"\n        app:layout_constraintStart_toEndOf=\"@id/countdown_days_2\"\n        app:layout_constraintTop_toTopOf=\"@id/countdown_days_1\" />\n\n    <com.airbnb.lottie.LottieAnimationView\n        android:id=\"@+id/countdown_hours_1\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerInside\"\n        app:layout_constraintBottom_toBottomOf=\"@id/countdown_days_1\"\n        app:layout_constraintEnd_toStartOf=\"@id/countdown_hours_2\"\n        app:layout_constraintStart_toEndOf=\"@id/spacer_days_hours\"\n        app:layout_constraintTop_toTopOf=\"@id/countdown_days_1\" />\n\n    <com.airbnb.lottie.LottieAnimationView\n        android:id=\"@+id/countdown_hours_2\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerInside\"\n        app:layout_constraintBottom_toBottomOf=\"@id/countdown_days_1\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/countdown_hours_1\"\n        app:layout_constraintTop_toTopOf=\"@id/countdown_days_1\" />\n\n    <TextView\n        android:id=\"@+id/countdown_days_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:text=\"@string/onboarding_label_days\"\n        android:textAppearance=\"@style/TextAppearance.IOSched.CountdownLabel\"\n        app:layout_constraintStart_toStartOf=\"@id/countdown_days_1\"\n        app:layout_constraintTop_toBottomOf=\"@id/countdown_days_1\" />\n\n    <TextView\n        android:id=\"@+id/countdown_hours_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:text=\"@string/onboarding_label_hours\"\n        android:textAppearance=\"@style/TextAppearance.IOSched.CountdownLabel\"\n        app:layout_constraintStart_toStartOf=\"@id/countdown_hours_1\"\n        app:layout_constraintTop_toBottomOf=\"@id/countdown_hours_1\" />\n\n    <Space\n        android:id=\"@+id/spacer_days_mins\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"@dimen/onboarding_animation_padding\"\n        app:layout_constraintBottom_toTopOf=\"@id/countdown_mins_1\"\n        app:layout_constraintTop_toBottomOf=\"@id/countdown_days_1\" />\n\n    <com.airbnb.lottie.LottieAnimationView\n        android:id=\"@+id/countdown_mins_1\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerInside\"\n        app:layout_constraintBottom_toTopOf=\"@id/spacer_mins_text\"\n        app:layout_constraintEnd_toStartOf=\"@id/countdown_mins_2\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/spacer_days_mins\" />\n\n    <com.airbnb.lottie.LottieAnimationView\n        android:id=\"@+id/countdown_mins_2\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerInside\"\n        app:layout_constraintBottom_toBottomOf=\"@id/countdown_mins_1\"\n        app:layout_constraintEnd_toStartOf=\"@id/spacer_mins_secs\"\n        app:layout_constraintStart_toEndOf=\"@id/countdown_mins_1\"\n        app:layout_constraintTop_toTopOf=\"@id/countdown_mins_1\" />\n\n    <Space\n        android:id=\"@+id/spacer_mins_secs\"\n        android:layout_width=\"@dimen/onboarding_animation_padding\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintEnd_toStartOf=\"@id/countdown_secs_1\"\n        app:layout_constraintStart_toEndOf=\"@id/countdown_mins_2\"\n        app:layout_constraintTop_toTopOf=\"@id/countdown_mins_1\" />\n\n    <com.airbnb.lottie.LottieAnimationView\n        android:id=\"@+id/countdown_secs_1\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerInside\"\n        app:layout_constraintBottom_toBottomOf=\"@id/countdown_mins_1\"\n        app:layout_constraintEnd_toStartOf=\"@id/countdown_secs_2\"\n        app:layout_constraintStart_toEndOf=\"@id/spacer_mins_secs\"\n        app:layout_constraintTop_toTopOf=\"@id/countdown_mins_1\" />\n\n    <com.airbnb.lottie.LottieAnimationView\n        android:id=\"@+id/countdown_secs_2\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerInside\"\n        app:layout_constraintBottom_toBottomOf=\"@id/countdown_mins_1\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/countdown_secs_1\"\n        app:layout_constraintTop_toTopOf=\"@id/countdown_mins_1\" />\n\n    <Space\n        android:id=\"@+id/spacer_mins_text\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"56dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/countdown_mins_1\" />\n\n    <TextView\n        android:id=\"@+id/countdown_mins_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:text=\"@string/onboarding_label_mins\"\n        android:textAppearance=\"@style/TextAppearance.IOSched.CountdownLabel\"\n        app:layout_constraintStart_toStartOf=\"@id/countdown_mins_1\"\n        app:layout_constraintTop_toBottomOf=\"@id/countdown_mins_1\" />\n\n    <TextView\n        android:id=\"@+id/countdown_secs_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:text=\"@string/onboarding_label_seconds\"\n        android:textAppearance=\"@style/TextAppearance.IOSched.CountdownLabel\"\n        app:layout_constraintStart_toStartOf=\"@id/countdown_secs_1\"\n        app:layout_constraintTop_toBottomOf=\"@id/countdown_secs_1\" />\n</merge>\n"
  },
  {
    "path": "mobile/src/main/res/layout/dialog_schedule_hints.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<LinearLayout\n    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:orientation=\"vertical\"\n    android:paddingEnd=\"@dimen/margin_large\"\n    android:paddingStart=\"@dimen/margin_large\"\n    tools:targetApi=\"o\">\n\n    <TextView\n        android:id=\"@+id/schedule_hint_textview_star_event\"\n        style=\"?materialAlertDialogBodyTextStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:drawablePadding=\"@dimen/margin_normal\"\n        android:drawableStart=\"@drawable/ic_star_border\"\n        android:text=\"@string/schedule_hint_star_event\"\n        tools:style=\"@style/AlertDialog.BodyText\"\n        tools:ignore=\"PrivateResource\" />\n\n    <TextView\n        android:id=\"@+id/schedule_hint_textview_reserve_seat\"\n        style=\"?materialAlertDialogBodyTextStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/margin_normal\"\n        android:drawablePadding=\"@dimen/margin_normal\"\n        android:drawableStart=\"@drawable/ic_reservable\"\n        android:text=\"@string/schedule_hint_reserve_session_seat\"\n        tools:style=\"@style/AlertDialog.BodyText\"\n        tools:ignore=\"PrivateResource\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/dialog_sign_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<layout 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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.signin.SignInViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"?dialogPreferredPadding\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"?dialogPreferredPadding\" />\n\n        <TextView\n            android:id=\"@+id/welcome\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/margin_normal\"\n            android:gravity=\"center_vertical\"\n            android:lines=\"1\"\n            android:minHeight=\"@dimen/profile_dialog_header_height\"\n            android:paddingBottom=\"@dimen/margin_normal\"\n            android:paddingTop=\"@dimen/margin_normal\"\n            android:text=\"@string/welcome\"\n            android:textAppearance=\"@style/TextAppearance.IOSched.AccountDialog.Username\"\n            app:layout_constraintEnd_toStartOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toEndOf=\"@id/user_avatar\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <ImageView\n            android:id=\"@+id/user_avatar\"\n            android:layout_width=\"@dimen/profile_dialog_account_image_size\"\n            android:layout_height=\"@dimen/profile_dialog_account_image_size\"\n            android:contentDescription=\"@null\"\n            app:layout_constraintBottom_toBottomOf=\"@id/welcome\"\n            app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:clipToCircle=\"@{true}\"\n            app:srcCompat=\"@drawable/ic_default_profile_avatar\" />\n\n        <View\n            android:id=\"@+id/divider1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"1dp\"\n            android:background=\"@drawable/list_divider\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/welcome\" />\n\n        <TextView\n            android:id=\"@+id/message\"\n            style=\"?materialAlertDialogBodyTextStyle\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@string/dialog_sign_in_content\"\n            app:layout_constraintEnd_toStartOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/divider1\"\n            tools:style=\"@style/AlertDialog.BodyText\"\n            tools:ignore=\"PrivateResource\" />\n\n        <TextView\n            android:id=\"@+id/sign_in\"\n            style=\"@style/Widget.IOSched.AccountDialog.ActionButton\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:drawableStart=\"@drawable/ic_login\"\n            android:onClick=\"@{() -> viewModel.onSignIn()}\"\n            android:text=\"@string/sign_in\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/message\" />\n\n        <View\n            android:id=\"@+id/divider2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"1dp\"\n            android:background=\"@drawable/list_divider\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/sign_in\" />\n\n        <Button\n            android:id=\"@+id/privacy_policy\"\n            style=\"@style/Widget.IOSched.BorderlessButton.NormalText\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/settings_privacy_policy\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toStartOf=\"@id/bullet\"\n            app:layout_constraintHorizontal_chainStyle=\"packed\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/divider2\"\n            app:websiteLink=\"@{@string/privacy_policy_url}\" />\n\n        <ImageView\n            android:id=\"@+id/bullet\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@null\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toStartOf=\"@id/terms_of_service\"\n            app:layout_constraintStart_toEndOf=\"@id/privacy_policy\"\n            app:layout_constraintTop_toBottomOf=\"@id/divider2\"\n            app:srcCompat=\"@drawable/bullet_small\" />\n\n        <Button\n            android:id=\"@+id/terms_of_service\"\n            style=\"@style/Widget.IOSched.BorderlessButton.NormalText\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/settings_tos\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@id/bullet\"\n            app:layout_constraintTop_toBottomOf=\"@id/divider2\"\n            app:websiteLink=\"@{@string/tos_url}\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/dialog_sign_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<layout 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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.signin.SignInViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"?dialogPreferredPadding\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"?dialogPreferredPadding\" />\n\n        <LinearLayout\n            android:id=\"@+id/username_email_container\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/margin_small\"\n            android:gravity=\"center_vertical\"\n            android:minHeight=\"@dimen/profile_dialog_header_height\"\n            android:orientation=\"vertical\"\n            android:paddingBottom=\"@dimen/margin_normal\"\n            android:paddingTop=\"@dimen/margin_normal\"\n            app:layout_constraintEnd_toStartOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toEndOf=\"@id/user_avatar\"\n            app:layout_constraintTop_toTopOf=\"parent\">\n\n            <TextView\n                android:id=\"@+id/username\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:lines=\"1\"\n                android:textAppearance=\"@style/TextAppearance.IOSched.AccountDialog.Username\"\n                app:username=\"@{viewModel.userInfo}\"\n                tools:text=\"User Name\" />\n\n            <TextView\n                android:id=\"@+id/email\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:lines=\"1\"\n                app:userEmail=\"@{viewModel.userInfo}\"\n                tools:text=\"user@email.com\" />\n        </LinearLayout>\n\n        <ImageView\n            android:id=\"@+id/user_avatar\"\n            android:layout_width=\"@dimen/profile_dialog_account_image_size\"\n            android:layout_height=\"@dimen/profile_dialog_account_image_size\"\n            android:contentDescription=\"@null\"\n            app:layout_constraintBottom_toBottomOf=\"@id/username_email_container\"\n            app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:clipToCircle=\"@{true}\"\n            app:imageUri=\"@{viewModel.currentUserImageUri}\"\n            app:placeholder=\"@{@drawable/ic_default_profile_avatar}\"\n            tools:src=\"@drawable/ic_default_profile_avatar\" />\n\n        <Button\n            android:id=\"@+id/manage_account\"\n            style=\"@style/Widget.IOSched.AccountDialog.ManageAccountButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/manage_google_account\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/username_email_container\"\n            app:shapeAppearanceOverlay=\"@style/ShapeAppearanceOverlay.MaterialComponents.Chip\"\n            app:websiteLink=\"@{@string/manage_google_account_url}\" />\n\n        <View\n            android:id=\"@+id/divider1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"1dp\"\n            android:layout_marginTop=\"12dp\"\n            android:background=\"@drawable/list_divider\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/manage_account\" />\n\n        <TextView\n            android:id=\"@+id/message\"\n            style=\"?materialAlertDialogBodyTextStyle\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@string/dialog_sign_out_content\"\n            app:layout_constraintEnd_toStartOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/divider1\"\n            tools:style=\"@style/AlertDialog.BodyText\"\n            tools:ignore=\"PrivateResource\" />\n\n        <TextView\n            android:id=\"@+id/sign_out\"\n            style=\"@style/Widget.IOSched.AccountDialog.ActionButton\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:drawableStart=\"@drawable/ic_logout\"\n            android:onClick=\"@{() -> viewModel.onSignOut()}\"\n            android:text=\"@string/sign_out\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/message\" />\n\n        <View\n            android:id=\"@+id/divider2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"1dp\"\n            android:background=\"@drawable/list_divider\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/sign_out\" />\n\n        <Button\n            android:id=\"@+id/privacy_policy\"\n            style=\"@style/Widget.IOSched.BorderlessButton.NormalText\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/settings_privacy_policy\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toStartOf=\"@id/bullet\"\n            app:layout_constraintHorizontal_chainStyle=\"packed\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/divider2\"\n            app:websiteLink=\"@{@string/privacy_policy_url}\" />\n\n        <ImageView\n            android:id=\"@+id/bullet\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@null\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toStartOf=\"@id/terms_of_service\"\n            app:layout_constraintStart_toEndOf=\"@id/privacy_policy\"\n            app:layout_constraintTop_toBottomOf=\"@id/divider2\"\n            app:srcCompat=\"@drawable/bullet_small\" />\n\n        <Button\n            android:id=\"@+id/terms_of_service\"\n            style=\"@style/Widget.IOSched.BorderlessButton.NormalText\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/settings_tos\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@id/bullet\"\n            app:layout_constraintTop_toBottomOf=\"@id/divider2\"\n            app:websiteLink=\"@{@string/tos_url}\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/event_card_content.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<merge\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    tools:layout_height=\"wrap_content\"\n    tools:layout_width=\"match_parent\"\n    tools:parentTag=\"com.google.android.material.card.MaterialCardView\"\n    tools:style=\"@style/Widget.IOSched.EventCardView\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:id=\"@+id/header_image\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"192dp\"\n            android:contentDescription=\"@null\"\n            android:scaleType=\"fitCenter\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:srcCompat=\"@drawable/event_header_sessions\" />\n\n        <TextView\n            android:id=\"@+id/event_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"@dimen/margin_normal\"\n            android:text=\"@string/event_sessions_title\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"@style/TextAppearance.IOSched.H3\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/header_image\" />\n\n        <TextView\n            android:id=\"@+id/event_description\"\n            style=\"@style/Widget.IOSched.MultilineBody\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginStart=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@string/event_sessions_description\"\n            android:textAlignment=\"viewStart\"\n            app:layout_constraintBottom_toTopOf=\"@id/action_button\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/event_title\"\n            app:layout_goneMarginBottom=\"@dimen/margin_normal\" />\n\n        <Button\n            android:id=\"@+id/action_button\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:visibility=\"gone\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/event_description\"\n            tools:text=\"@string/view_sessions_text\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</merge>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fading_snackbar_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<merge\n    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\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"@dimen/margin_normal\"\n        android:background=\"@drawable/fading_snackbar_background\"\n        android:theme=\"@style/ThemeOverlay.IOSched.Dark\">\n\n        <TextView\n            android:id=\"@+id/snackbar_text\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical|start\"\n            android:layout_weight=\"1\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"4\"\n            android:padding=\"@dimen/margin_normal\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"@style/TextAppearance.Design.Snackbar.Message\"\n            tools:text=\"Look at all the wonderful snack bar text...\" />\n\n        <Button\n            android:id=\"@+id/snackbar_action\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical|end\"\n            android:paddingEnd=\"@dimen/margin_normal\"\n            android:paddingStart=\"@dimen/margin_normal\"\n            android:visibility=\"gone\"\n            tools:text=\"Action\"\n            tools:visibility=\"visible\"\n            tools:targetApi=\"o\" />\n\n    </LinearLayout>\n\n</merge>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_agenda.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.agenda.AgendaViewModel\" />\n    </data>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/appbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\">\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?actionBarSize\"\n                app:navigationContentDescription=\"@string/a11y_show_navigation\"\n                app:navigationIcon=\"@drawable/ic_menu\"\n                app:title=\"@string/agenda\" />\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recyclerView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:clipToPadding=\"false\"\n                android:orientation=\"vertical\"\n                android:paddingBottom=\"@dimen/spacing_normal\"\n                android:paddingTop=\"@dimen/spacing_normal\"\n                android:scrollbars=\"vertical\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintWidth_percent=\"@dimen/content_max_width_percent\"\n                app:agendaItems=\"@{viewModel.agenda}\"\n                app:layoutManager=\"LinearLayoutManager\"\n                app:timeZoneId=\"@{viewModel.timeZoneId}\"\n                tools:ignore=\"UnusedAttribute\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_announcements.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data>\n\n        <import type=\"android.view.View\" />\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.feed.AnnouncementsViewModel\" />\n    </data>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <View\n            android:id=\"@+id/status_bar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:visibility=\"gone\" />\n\n        <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?actionBarSize\"\n            app:navigationContentDescription=\"@string/navigate_up\"\n            app:navigationIcon=\"@drawable/ic_arrow_back\"\n            app:title=\"@string/feed_announcement_title\" />\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recycler_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:clipToPadding=\"false\"\n            android:paddingTop=\"@dimen/spacing_normal\"\n            android:paddingBottom=\"@dimen/spacing_normal\"\n            android:scrollbars=\"vertical\"\n            app:layoutManager=\"LinearLayoutManager\" />\n\n    </LinearLayout>\n\n</layout>"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_arcore_not_supported.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/fragment_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideline_start\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_begin=\"@dimen/margin_large\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideline_end\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_end=\"@dimen/margin_large\" />\n\n    <ImageView\n        android:id=\"@+id/image_arcore_gray\"\n        android:layout_width=\"280dp\"\n        android:layout_height=\"280dp\"\n        android:contentDescription=\"@string/no_network_connection\"\n        app:layout_constraintBottom_toTopOf=\"@+id/phone_does_not_support_arcore_title\"\n        app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n        app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_chainStyle=\"packed\"\n        app:layout_constrainedWidth=\"true\"\n        app:srcCompat=\"@drawable/arcore_gray\" />\n\n    <TextView\n        android:id=\"@+id/phone_does_not_support_arcore_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/margin_normal\"\n        android:gravity=\"center\"\n        android:text=\"@string/phone_does_not_support_arcore_title\"\n        android:textAppearance=\"@style/TextAppearance.IOSched.H1\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toTopOf=\"@+id/message_no_network_description\"\n        app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n        app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n        app:layout_constraintTop_toBottomOf=\"@+id/image_arcore_gray\" />\n\n    <TextView\n        android:id=\"@+id/message_no_network_description\"\n        style=\"@style/TextAppearance.IOSched.NoticeBody\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/margin_normal\"\n        android:text=\"@string/phone_does_not_support_arcore_message\"\n        android:gravity=\"center\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n        app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n        app:layout_constraintTop_toBottomOf=\"@+id/phone_does_not_support_arcore_title\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_codelabs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<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\n    <data>\n\n        <variable\n            name=\"isEmpty\"\n            type=\"Boolean\" />\n    </data>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/appbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\">\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?actionBarSize\"\n                app:menu=\"@menu/codelabs_menu\"\n                app:title=\"@string/event_codelabs_title\" />\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/codelabs_list\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:clipToPadding=\"false\"\n                android:orientation=\"vertical\"\n                android:paddingHorizontal=\"@dimen/codelabs_list_item_spacing\"\n                android:paddingVertical=\"@dimen/spacing_normal\"\n                android:scrollbars=\"vertical\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintWidth_percent=\"@dimen/codelabs_max_width_percent\"\n                app:layoutManager=\"@string/codelabs_recyclerview_layoutmanager\"\n                app:spanCount=\"2\"\n                app:itemSpacing=\"@{@dimen/codelabs_list_item_spacing}\"\n                tools:listitem=\"@layout/item_codelab\" />\n\n            <!-- TODO add empty view -->\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_feed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <data>\n\n        <import type=\"android.view.View\" />\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.feed.FeedViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <View\n            android:id=\"@+id/status_bar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:visibility=\"gone\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"?actionBarSize\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/status_bar\"\n            app:navigationContentDescription=\"@string/a11y_show_navigation\"\n            app:navigationIcon=\"@drawable/ic_menu\"\n            app:title=\"@string/title_home\" />\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:clipToPadding=\"false\"\n            android:paddingBottom=\"@dimen/spacing_normal\"\n            android:scrollbars=\"vertical\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/toolbar\"\n            app:goneUnless=\"@{!viewModel.feed.isEmpty}\"\n            app:layoutManager=\"LinearLayoutManager\">\n\n        </androidx.recyclerview.widget.RecyclerView>\n\n        <com.google.samples.apps.iosched.widget.FadingSnackbar\n            android:id=\"@+id/snackbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom\"\n            android:visibility=\"gone\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_dodgeInsetEdges=\"bottom\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_filters.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.filters.FiltersViewModelDelegate\" />\n\n        <variable\n            name=\"contentAlpha\"\n            type=\"androidx.databinding.ObservableFloat\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/filter_sheet\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"?attr/colorSurface\"\n        android:clickable=\"true\"\n        android:elevation=\"@dimen/bottom_sheet_elevation\"\n        android:focusable=\"true\"\n        tools:ignore=\"Overdraw\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guide_header_height\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintGuide_begin=\"@dimen/schedule_bottom_sheet_peek_height\" />\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerview_filters\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:alpha=\"@{contentAlpha}\"\n            android:clipToPadding=\"false\"\n            android:nestedScrollingEnabled=\"false\"\n            android:orientation=\"horizontal\"\n            android:paddingHorizontal=\"@dimen/margin_normal\"\n            android:paddingVertical=\"@dimen/spacing_normal\"\n            android:scrollbarStyle=\"outsideOverlay\"\n            android:scrollbars=\"vertical\"\n            app:layoutManager=\"com.google.android.flexbox.FlexboxLayoutManager\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/guide_header_height\"\n            tools:listitem=\"@layout/item_filter_chip_selectable\"\n            tools:targetApi=\"o\" />\n\n        <!--\n          ~ Mimics raising the elevation of a container around the header elements (like when an\n          ~ AppBarLayout reaches the collapsed state). We fake this instead of using a container\n          ~ view around header views because the extra elevation would show along the top of the\n          ~ sheet, particularly around corners, and wouldn't look good.\n          -->\n        <View\n            android:id=\"@+id/filters_header_shadow\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"4dp\"\n            android:alpha=\"0\"\n            android:background=\"@drawable/filters_sheet_header_shadow\"\n            android:stateListAnimator=\"@animator/active_alpha\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/guide_header_height\" />\n\n        <!-- Header views -->\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:alpha=\"@{contentAlpha}\"\n            android:textAppearance=\"@style/TextAppearance.IOSched.FiltersLabel\"\n            android:textColor=\"?android:textColorPrimary\"\n            app:layout_constraintBottom_toTopOf=\"@id/guide_header_height\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:resultCount=\"@{viewModel.resultCount}\"\n            app:showResultCount=\"@{viewModel.showResultCount}\"\n            tools:text=\"@string/filters\" />\n\n        <Button\n            android:id=\"@+id/reset\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/spacing_normal\"\n            android:alpha=\"@{contentAlpha}\"\n            android:clickable=\"@{contentAlpha > 0f}\"\n            android:minWidth=\"0dp\"\n            android:onClick=\"@{() -> viewModel.clearFilters()}\"\n            android:paddingStart=\"@dimen/margin_normal\"\n            android:paddingEnd=\"@dimen/margin_normal\"\n            android:text=\"@string/reset\"\n            app:layout_constraintBottom_toTopOf=\"@id/guide_header_height\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:goneUnless=\"@{viewModel.hasAnyFilters}\"\n            tools:targetApi=\"o\"\n            tools:visibility=\"visible\" />\n\n        <ImageButton\n            android:id=\"@+id/collapse_arrow\"\n            android:layout_width=\"@dimen/a11y_min_touch_target\"\n            android:layout_height=\"@dimen/a11y_min_touch_target\"\n            android:layout_marginEnd=\"@dimen/margin_small\"\n            android:alpha=\"@{contentAlpha}\"\n            android:background=\"?selectableItemBackgroundBorderless\"\n            android:clickable=\"@{contentAlpha > 0f}\"\n            android:contentDescription=\"@string/a11y_collapse_filters_sheet\"\n            android:scaleType=\"center\"\n            app:layout_constraintBottom_toTopOf=\"@id/guide_header_height\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:srcCompat=\"@drawable/ic_expand_more\"\n            app:tint=\"?attr/colorControlNormal\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:id=\"@+id/info_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/appbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\">\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?actionBarSize\"\n                app:layout_scrollFlags=\"scroll|enterAlways|snap\"\n                app:navigationContentDescription=\"@string/a11y_show_navigation\"\n                app:navigationIcon=\"@drawable/ic_menu\"\n                app:title=\"@string/title_info\" />\n\n            <com.google.android.material.tabs.TabLayout\n                android:id=\"@+id/tabs\"\n                style=\"@style/Widget.IOSched.Tabs\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\" />\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <!-- A view to draw above the AppBarLayout to mimic the status bar -->\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:background=\"?attr/colorSurface\"\n            android:fitsSystemWindows=\"true\"\n            app:layout_behavior=\"com.google.samples.apps.iosched.util.StatusBarScrimBehavior\" />\n\n        <androidx.viewpager2.widget.ViewPager2\n            android:id=\"@+id/viewpager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n            app:pageMargin=\"@{@dimen/info_page_margin}\" />\n\n        <com.google.samples.apps.iosched.widget.FadingSnackbar\n            android:id=\"@+id/snackbar\"\n            android:layout_width=\"@dimen/snackbar_width\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|start\"\n            android:visibility=\"gone\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_info_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.info.EventInfoViewModel\" />\n\n        <variable\n            name=\"showAssistantApp\"\n            type=\"Boolean\" />\n    </data>\n\n    <androidx.core.widget.NestedScrollView\n        android:id=\"@+id/scroll_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        android:paddingBottom=\"@dimen/margin_normal\"\n        android:paddingTop=\"@dimen/margin_normal\"\n        android:scrollbarStyle=\"insideOverlay\"\n        android:scrollbars=\"vertical\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/content\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <androidx.constraintlayout.widget.Guideline\n                android:id=\"@+id/guideline_start\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                app:layout_constraintGuide_begin=\"@dimen/margin_normal\" />\n\n            <androidx.constraintlayout.widget.Guideline\n                android:id=\"@+id/guideline_end\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n            <include\n                android:id=\"@+id/wifi_card\"\n                layout=\"@layout/info_wifi_card\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintEnd_toStartOf=\"@id/guideline_end\"\n                app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:viewModel=\"@{viewModel}\" />\n\n            <TextView\n                android:id=\"@+id/related_apps_header\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_large\"\n                android:text=\"@string/related_apps_header\"\n                android:textAppearance=\"@style/TextAppearance.IOSched.Overline\"\n                app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@id/wifi_card\"\n                app:goneUnless=\"@{showAssistantApp}\" />\n\n            <com.google.android.material.card.MaterialCardView\n                android:id=\"@+id/assistant_app\"\n                style=\"@style/Widget.IOSched.EventCardView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                android:onClick=\"@{() -> viewModel.onClickAssistantApp()}\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n                app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@+id/related_apps_header\"\n                app:cardCornerRadius=\"8dp\"\n                app:contentPadding=\"@dimen/margin_small\"\n                app:goneUnless=\"@{showAssistantApp}\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\">\n\n                    <ImageView\n                        android:id=\"@+id/assistant_app_logo\"\n                        android:layout_width=\"40dp\"\n                        android:layout_height=\"40dp\"\n                        android:importantForAccessibility=\"no\"\n                        android:src=\"@drawable/ic_logo_assistant\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <TextView\n                        android:id=\"@+id/assistant_app_description\"\n                        style=\"@style/TextAppearance.IOSched.Info.AssistantApp\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"@dimen/spacing_normal\"\n                        android:text=\"@string/assistant_app_description\"\n                        android:textAlignment=\"viewStart\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintStart_toEndOf=\"@id/assistant_app_logo\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n\n                    <TextView\n                        android:id=\"@+id/assistant_app_description2\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"@dimen/spacing_micro\"\n                        android:text=\"@string/assistant_app_description2\"\n                        android:textAlignment=\"viewStart\"\n                        android:textAppearance=\"?textAppearanceBody2\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"@id/assistant_app_description\"\n                        app:layout_constraintTop_toBottomOf=\"@id/assistant_app_description\" />\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n            </com.google.android.material.card.MaterialCardView>\n\n            <TextView\n                android:id=\"@+id/event_types_header\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_large\"\n                android:text=\"@string/event_types_header\"\n                android:textAppearance=\"@style/TextAppearance.IOSched.Overline\"\n                app:layout_constraintStart_toStartOf=\"@+id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@+id/assistant_app\" />\n\n            <com.google.samples.apps.iosched.widget.EventCardView\n                android:id=\"@+id/event_sessions\"\n                style=\"@style/Widget.IOSched.EventCardView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n                app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@+id/event_types_header\"\n                app:eventDescription=\"@string/event_sessions_description\"\n                app:eventTitle=\"@string/event_sessions_title\"\n                app:eventTypeLogo=\"@drawable/event_header_sessions\" />\n\n            <com.google.samples.apps.iosched.widget.EventCardView\n                android:id=\"@+id/event_sandbox\"\n                style=\"@style/Widget.IOSched.EventCardView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n                app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@+id/event_sessions\"\n                app:eventDescription=\"@string/event_sandbox_description\"\n                app:eventTitle=\"@string/event_sandbox_title\"\n                app:eventTypeLogo=\"@drawable/event_header_sandbox\" />\n\n            <com.google.samples.apps.iosched.widget.EventCardView\n                android:id=\"@+id/event_codelabs\"\n                style=\"@style/Widget.IOSched.EventCardView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n                app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@+id/event_sandbox\"\n                app:eventDescription=\"@string/event_codelabs_description\"\n                app:eventTitle=\"@string/event_codelabs_title\"\n                app:eventTypeLogo=\"@drawable/event_header_codelabs\" />\n\n            <com.google.samples.apps.iosched.widget.EventCardView\n                android:id=\"@+id/event_officehours\"\n                style=\"@style/Widget.IOSched.EventCardView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n                app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@+id/event_codelabs\"\n                app:eventDescription=\"@string/event_officehours_description\"\n                app:eventTitle=\"@string/event_officehours_title\"\n                app:eventTypeLogo=\"@drawable/event_header_office_hours\" />\n\n            <!-- After hours header is always on dark background -->\n            <com.google.samples.apps.iosched.widget.EventCardView\n                android:id=\"@+id/event_afterhours\"\n                style=\"@style/Widget.IOSched.EventCardView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n                app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@+id/event_officehours\"\n                app:eventDescription=\"@string/event_afterhours_description\"\n                app:eventTitle=\"@string/event_afterhours_title\"\n                app:eventTypeLogo=\"@drawable/event_header_afterhours\"\n                app:eventTypeLogoBackground=\"@color/event_card_header_background_dark\"/>\n\n            <com.google.samples.apps.iosched.widget.EventCardView\n                android:id=\"@+id/event_meals\"\n                style=\"@style/Widget.IOSched.EventCardView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n                app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n                app:layout_constraintTop_toBottomOf=\"@+id/event_afterhours\"\n                app:eventDescription=\"@string/event_meals_description\"\n                app:eventTitle=\"@string/event_meals_title\"\n                app:eventTypeLogo=\"@drawable/event_header_meals\" />\n\n            <!-- TODO remove countdownVisibility method -->\n            <com.google.samples.apps.iosched.widget.CountdownView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"@dimen/countdown_height\"\n                android:layout_marginEnd=\"@dimen/onboarding_margins\"\n                android:layout_marginStart=\"@dimen/onboarding_margins\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/event_meals\"\n                app:countdownVisibility=\"@{true}\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.core.widget.NestedScrollView>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_info_faq.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.core.widget.NestedScrollView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/scroll_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipToPadding=\"false\"\n    android:paddingBottom=\"@dimen/margin_normal\"\n    android:paddingTop=\"@dimen/margin_normal\"\n    android:scrollbarStyle=\"insideOverlay\"\n    android:scrollbars=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_when_and_where_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/faq_when_and_where_description\"\n            app:cardTitle=\"@string/faq_when_and_where_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_how_can_stay_informed\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_how_can_i_stay_informed_description\"\n            app:cardTitle=\"@string/faq_how_can_i_stay_informed_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_will_the_sessions_be_english\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_will_the_sessions_be_english_description\"\n            app:cardTitle=\"@string/faq_will_the_sessions_be_english_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_can_i_reserve_sessions_ahead_of_time\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_can_i_reserve_sessions_ahead_of_time_description\"\n            app:cardTitle=\"@string/faq_can_i_reserve_sessions_ahead_of_time_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_best_way_to_get_to_shoreline\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_best_way_to_get_to_shoreline_description\"\n            app:cardTitle=\"@string/faq_best_way_to_get_to_shoreline_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_pick_up_badge\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_where_and_when_can_i_pick_up_badge_description\"\n            app:cardTitle=\"@string/faq_where_and_when_can_i_pick_up_badge_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_want_a_front_row_seat\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_want_a_front_row_seat_at_keynote_description\"\n            app:cardTitle=\"@string/faq_want_a_front_row_seat_at_keynote_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_what_should_i_wear\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_what_should_i_wear_description\"\n            app:cardTitle=\"@string/faq_what_should_i_wear_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_onsite_food_options\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_onsite_food_options_description\"\n            app:cardTitle=\"@string/faq_onsite_food_options_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_if_i_lose_something_else\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_if_i_lose_something_onsite_description\"\n            app:cardTitle=\"@string/faq_if_i_lose_something_onsite_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_after_dark_program\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_after_dark_program_description\"\n            app:cardTitle=\"@string/faq_after_dark_program_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_accessibility_needs\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_accessibility_needs_description\"\n            app:cardTitle=\"@string/faq_accessibility_needs_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_support_for_parents\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_support_for_expectant_mothers_parent_description\"\n            app:cardTitle=\"@string/faq_support_for_expectant_mothers_parents_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_comunity_guidelines\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_community_guidelines_and_policy_description\"\n            app:cardTitle=\"@string/faq_community_guidelines_and_policy_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_sessions_be_livestreamed\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_sessions_be_live_streamed_question_description\"\n            app:cardTitle=\"@string/faq_sessions_be_live_streamed_question_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/faq_celebrate_io\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            app:cardDescription=\"@string/faq_want_to_celebrate_i_o_description\"\n            app:cardTitle=\"@string/faq_want_to_celebrate_i_o_title\" />\n    </LinearLayout>\n\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_info_travel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  Copyright 2018 Google Inc. All rights reserved.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS 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.core.widget.NestedScrollView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/scroll_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipToPadding=\"false\"\n    android:paddingBottom=\"@dimen/margin_normal\"\n    android:paddingTop=\"@dimen/margin_normal\"\n    android:scrollbarStyle=\"insideOverlay\"\n    android:scrollbars=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_what_to_bring\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_what_to_bring_description\"\n            app:cardTitle=\"@string/travel_what_to_bring_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_hotels\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_hotels_description\"\n            app:cardTitle=\"@string/travel_hotels_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_getting_to_mountain_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_getting_to_mountain_view_description\"\n            app:cardTitle=\"@string/travel_getting_to_mountain_view_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_getting_to_shoreline\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_getting_to_shoreline_description\"\n            app:cardTitle=\"@string/travel_getting_to_shoreline_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_shuttle_service\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_shuttle_service_description\"\n            app:cardTitle=\"@string/travel_shuttle_service_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_off_site_parking\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_off_site_parking_description\"\n            app:cardTitle=\"@string/travel_off_site_parking_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_public_transportation\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_for_public_transportation_description\"\n            app:cardTitle=\"@string/travel_for_public_transportation_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_biking\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_biking_description\"\n            app:cardTitle=\"@string/travel_biking_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_ridesharing\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_ridesharing_description\"\n            app:cardTitle=\"@string/travel_ridesharing_title\" />\n\n        <com.google.samples.apps.iosched.widget.CollapsibleCard\n            android:id=\"@+id/travel_airport_transfers\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardDescription=\"@string/travel_airport_transfers_description\"\n            app:cardTitle=\"@string/travel_airport_transfers_title\" />\n    </LinearLayout>\n\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_map.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <import type=\"com.google.samples.apps.iosched.R\" />\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.map.MapViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/map_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <View\n            android:id=\"@+id/status_bar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:visibility=\"gone\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?actionBarSize\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/status_bar\"\n            app:menu=\"@menu/map_menu\"\n            app:title=\"@string/title_map\"\n            tools:navigationIcon=\"@drawable/ic_menu\" />\n\n        <com.google.android.gms.maps.MapView\n            android:id=\"@+id/map\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/toolbar\"\n            app:cameraBearing=\"@dimen/map_camera_bearing\"\n            app:cameraTargetLat=\"@dimen/map_camera_target_lat\"\n            app:cameraTargetLng=\"@dimen/map_camera_target_lng\"\n            app:cameraTilt=\"@dimen/map_camera_tilt\"\n            app:cameraZoom=\"@dimen/map_camera_zoom\"\n            app:isIndoorEnabled=\"@{false}\"\n            app:isMapToolbarEnabled=\"@{false}\"\n            app:mapMaxZoom=\"@{R.dimen.map_viewport_max_zoom}\"\n            app:mapMinZoom=\"@{R.dimen.map_viewport_min_zoom}\"\n            app:mapStyle=\"@{viewModel.mapVariant.styleResId}\"\n            app:mapTileProvider=\"@{viewModel.mapVariant}\"\n            app:mapViewport=\"@{viewModel.conferenceLocationBounds}\"\n            app:uiCompass=\"false\"\n            app:uiZoomControls=\"false\" />\n\n        <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:id=\"@+id/coordinatorLayout\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/toolbar\">\n\n            <com.google.android.material.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/map_mode_fab\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"bottom|end\"\n                android:layout_margin=\"@dimen/margin_normal\"\n                android:contentDescription=\"@string/a11y_select_map_mode\"\n                app:srcCompat=\"@drawable/ic_layers\" />\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/bottom_sheet\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@drawable/filters_sheet_background\"\n                android:backgroundTint=\"?attr/colorSurface\"\n                android:elevation=\"@dimen/bottom_sheet_elevation\"\n                app:layout_behavior=\"com.google.samples.apps.iosched.widget.BottomSheetBehavior\"\n                app:behavior_hideable=\"true\"\n                app:behavior_peekHeight=\"@dimen/map_bottom_sheet_peek_height\">\n\n                <androidx.constraintlayout.widget.Guideline\n                    android:id=\"@+id/guide_peek_height\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"0dp\"\n                    android:orientation=\"horizontal\"\n                    app:layout_constraintGuide_begin=\"@dimen/map_bottom_sheet_peek_height\" />\n\n                <!--\n                  ~ Bug: When a sheet's height is the same as it's peek height, an upward drag breaks\n                  ~ the UI. To avoid this, use a 1px minHeight.\n                  ~ Also, we don't use contraintTop_toBottomOf the guideline because that pushes the\n                  ~ view down and can leave it partly off screen if the description is long. Instead we\n                  ~ use paddingTop to leave room for the header views.\n                  -->\n                <androidx.core.widget.NestedScrollView\n                    android:id=\"@+id/description_scrollview\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:minHeight=\"1px\"\n                    android:paddingTop=\"@dimen/map_bottom_sheet_peek_height\"\n                    app:layout_constraintLeft_toLeftOf=\"parent\"\n                    app:layout_constraintRight_toRightOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\">\n\n                    <TextView\n                        android:id=\"@+id/marker_description\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:padding=\"@dimen/margin_normal\"\n                        android:textAlignment=\"viewStart\" />\n                </androidx.core.widget.NestedScrollView>\n\n                <View\n                    android:id=\"@+id/clickable\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"0dp\"\n                    android:background=\"?selectableItemBackground\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/guide_peek_height\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <ImageView\n                    android:id=\"@+id/marker_icon\"\n                    android:layout_width=\"32dp\"\n                    android:layout_height=\"32dp\"\n                    android:layout_marginStart=\"@dimen/margin_normal\"\n                    android:importantForAccessibility=\"no\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/guide_peek_height\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    tools:src=\"@drawable/map_marker_a\" />\n\n                <ImageView\n                    android:id=\"@+id/expand_icon\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"@dimen/margin_normal\"\n                    android:importantForAccessibility=\"no\"\n                    android:src=\"@drawable/ic_expand_more\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/guide_peek_height\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\" />\n\n                <TextView\n                    android:id=\"@+id/marker_title\"\n                    style=\"@style/Widget.IOSched.Map.MarkerTitle\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"@dimen/margin_normal\"\n                    android:layout_marginStart=\"@dimen/margin_normal\"\n                    app:layout_constraintEnd_toStartOf=\"@id/expand_icon\"\n                    app:layout_constraintStart_toEndOf=\"@id/marker_icon\"\n                    app:layout_constraintTop_toTopOf=\"@id/bottom_sheet\"\n                    app:layout_constraintBottom_toTopOf=\"@id/marker_subtitle\"\n                    app:layout_constraintVertical_chainStyle=\"packed\"\n                    tools:text=\"Sandbox A\" />\n\n                <TextView\n                    android:id=\"@+id/marker_subtitle\"\n                    style=\"@style/Widget.IOSched.Map.MarkerSubtitle\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"@dimen/margin_normal\"\n                    android:layout_marginStart=\"@dimen/margin_normal\"\n                    android:visibility=\"gone\"\n                    app:layout_constraintBottom_toTopOf=\"@id/guide_peek_height\"\n                    app:layout_constraintEnd_toStartOf=\"@id/expand_icon\"\n                    app:layout_constraintStart_toEndOf=\"@id/marker_icon\"\n                    app:layout_constraintTop_toBottomOf=\"@id/marker_title\"\n                    tools:text=\"Accessiblity &amp; Material Design\"\n                    tools:visibility=\"visible\" />\n\n                <!--\n                  ~ Mimics raising the elevation of a container around the header elements (like when an\n                  ~ AppBarLayout reaches the collapsed state). We fake this because (a) there is no\n                  ~ container view around these views, and (b) the extra elevation shows along the top\n                  ~ of the sheet, particularly around the rounded corners, and doesn't look good.\n                  -->\n                <View\n                    android:id=\"@+id/sheet_header_shadow\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"4dp\"\n                    android:alpha=\"0\"\n                    android:background=\"@drawable/filters_sheet_header_shadow\"\n                    android:stateListAnimator=\"@animator/active_alpha\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/guide_peek_height\" />\n\n            </androidx.constraintlayout.widget.ConstraintLayout>\n\n        </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_map_variant_select.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<com.google.android.material.card.MaterialCardView\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=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    app:cardCornerRadius=\"@dimen/dialog_corner_radius\"\n    app:cardElevation=\"8dp\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/map_variant_list\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:nestedScrollingEnabled=\"false\"\n        android:orientation=\"vertical\"\n        app:layoutManager=\"LinearLayoutManager\"\n        tools:itemCount=\"3\"\n        tools:listitem=\"@layout/item_map_variant\" />\n</com.google.android.material.card.MaterialCardView>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_no_network.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/fragment_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideline_start\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_begin=\"@dimen/margin_normal\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideline_end\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n    <ImageView\n        android:id=\"@+id/image_no_network\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:contentDescription=\"@string/no_network_connection\"\n        app:layout_constraintBottom_toTopOf=\"@+id/message_no_network_title\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_chainStyle=\"packed\"\n        app:srcCompat=\"@drawable/signal_wifi_off\" />\n\n    <TextView\n        android:id=\"@+id/message_no_network_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/margin_normal\"\n        android:text=\"@string/no_network_connection\"\n        android:textAppearance=\"@style/TextAppearance.IOSched.H1\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toTopOf=\"@+id/message_no_network_description\"\n        app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n        app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n        app:layout_constraintTop_toBottomOf=\"@+id/image_no_network\" />\n\n    <TextView\n        android:id=\"@+id/message_no_network_description\"\n        style=\"@style/TextAppearance.IOSched.NoticeBody\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/margin_normal\"\n        android:text=\"@string/no_network_description\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n        app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n        app:layout_constraintTop_toBottomOf=\"@+id/message_no_network_title\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_onboarding.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.onboarding.OnboardingViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/pager\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:importantForAccessibility=\"no\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:offscreenPageLimit=\"@{2}\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guide_actions\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintGuide_end=\"@dimen/onboarding_actions_height\" />\n\n        <Button\n            android:id=\"@+id/get_started\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:onClick=\"@{() -> viewModel.getStartedClick()}\"\n            android:paddingBottom=\"@dimen/padding_onboarding_button\"\n            android:paddingTop=\"@dimen/padding_onboarding_button\"\n            android:text=\"@string/onboarding_get_started\"\n            app:layout_constraintBottom_toTopOf=\"@id/page_indicator\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/guide_actions\"\n            app:layout_constraintVertical_chainStyle=\"spread_inside\" />\n\n        <com.pixelcan.inkpageindicator.InkPageIndicator\n            android:id=\"@+id/page_indicator\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"24dp\"\n            android:importantForAccessibility=\"no\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/get_started\"\n            app:ipi_currentPageIndicatorColor=\"#aa000000\"\n            app:ipi_pageIndicatorColor=\"#80000000\"\n            app:viewPager=\"@{pager}\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_onboarding_signin.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"activityViewModel\"\n            type=\"com.google.samples.apps.iosched.ui.onboarding.OnboardingViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/onboarding_margins\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/onboarding_margins\" />\n\n        <ImageView\n            android:id=\"@+id/onboarding_schedule\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:fitsSystemWindows=\"true\"\n            android:importantForAccessibility=\"no\"\n            app:layout_constraintBottom_toTopOf=\"@id/onboarding_signin_message\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/button_signin\"\n            app:layout_constraintVertical_chainStyle=\"spread_inside\"\n            app:srcCompat=\"@drawable/onboarding_schedule\" />\n\n        <Button\n            android:id=\"@+id/button_signin\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            android:onClick=\"@{() -> activityViewModel.onSigninClicked()}\"\n            android:text=\"@string/sign_in\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:goneUnless=\"@{!activityViewModel.isUserSignedIn}\"\n            tools:text=\"Sign in\" />\n\n        <TextView\n            android:id=\"@+id/onboarding_signin_message\"\n            style=\"@style/Widget.IOSched.OnboardingText\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/onboarding_signin\"\n            android:textAlignment=\"center\"\n            app:layout_constraintBottom_toTopOf=\"@id/spacer\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/onboarding_schedule\" />\n\n        <Space\n            android:id=\"@+id/spacer\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/onboarding_actions_height\"\n            android:layout_marginTop=\"32dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/onboarding_signin_message\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_onboarding_welcome_during.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"activityViewModel\"\n            type=\"com.google.samples.apps.iosched.ui.onboarding.OnboardingViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/onboarding_margins\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/onboarding_margins\" />\n\n        <Button\n            android:id=\"@+id/button_signin\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            android:onClick=\"@{() -> activityViewModel.onSigninClicked()}\"\n            android:text=\"@string/sign_in\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:goneUnless=\"@{!activityViewModel.isUserSignedIn}\"\n            tools:text=\"Sign in\" />\n\n        <ImageView\n            android:id=\"@+id/io_hashtag\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:fitsSystemWindows=\"true\"\n            android:importantForAccessibility=\"no\"\n            app:layout_constraintBottom_toTopOf=\"@id/welcome_during_message\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/button_signin\"\n            app:layout_constraintVertical_chainStyle=\"spread_inside\"\n            app:srcCompat=\"@drawable/onboarding_io_19\" />\n\n        <TextView\n            android:id=\"@+id/welcome_during_message\"\n            style=\"@style/Widget.IOSched.OnboardingText\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/onboarding_welcome_google_io_during\"\n            android:textAlignment=\"center\"\n            app:layout_constraintBottom_toTopOf=\"@id/date_location\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/io_hashtag\" />\n\n        <TextView\n            android:id=\"@+id/date_location\"\n            style=\"@style/Widget.IOSched.OnboardingText\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/onboarding_date_location\"\n            android:textColor=\"?android:textColorSecondary\"\n            app:layout_constraintBottom_toTopOf=\"@id/spacer\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/welcome_during_message\" />\n\n        <Space\n            android:id=\"@+id/spacer\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/onboarding_actions_height\"\n            android:layout_marginTop=\"32dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/date_location\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_onboarding_welcome_post.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout\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    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideline_start\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_begin=\"@dimen/onboarding_margins\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideline_end\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_end=\"@dimen/onboarding_margins\" />\n\n    <ImageView\n        android:id=\"@+id/io_hashtag\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:fitsSystemWindows=\"true\"\n        android:importantForAccessibility=\"no\"\n        app:srcCompat=\"@drawable/onboarding_io_19\"\n        app:layout_constraintBottom_toTopOf=\"@id/welcome_post_message\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_chainStyle=\"spread_inside\" />\n\n    <TextView\n        android:id=\"@+id/welcome_post_message\"\n        style=\"@style/Widget.IOSched.OnboardingText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/onboarding_welcome_google_io_post\"\n        android:textAlignment=\"center\"\n        app:layout_constraintBottom_toTopOf=\"@id/spacer\"\n        app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n        app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n        app:layout_constraintTop_toBottomOf=\"@id/io_hashtag\" />\n\n    <Space\n        android:id=\"@+id/spacer\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"@dimen/onboarding_actions_height\"\n        android:layout_marginTop=\"32dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/welcome_post_message\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_onboarding_welcome_pre.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"activityViewModel\"\n            type=\"com.google.samples.apps.iosched.ui.onboarding.OnboardingViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/onboarding_margins\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/onboarding_margins\" />\n\n        <Button\n            android:id=\"@+id/button_signin\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            android:text=\"@string/sign_in\"\n            android:onClick=\"@{() -> activityViewModel.onSigninClicked()}\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:goneUnless=\"@{!activityViewModel.isUserSignedIn}\"\n            tools:text=\"Sign in\" />\n\n        <ImageView\n            android:id=\"@+id/io_date_2019\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:fitsSystemWindows=\"true\"\n            android:importantForAccessibility=\"no\"\n            app:layout_constraintBottom_toTopOf=\"@id/welcome_pre_message\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/button_signin\"\n            app:layout_constraintVertical_chainStyle=\"spread_inside\"\n            app:srcCompat=\"@drawable/onboarding_io_date_2019\" />\n\n        <TextView\n            android:id=\"@+id/welcome_pre_message\"\n            style=\"@style/Widget.IOSched.OnboardingText\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/onboarding_welcome_google_io_pre\"\n            android:textAlignment=\"center\"\n            app:layout_constraintBottom_toTopOf=\"@id/date_location\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/io_date_2019\" />\n\n        <TextView\n            android:id=\"@+id/date_location\"\n            style=\"@style/Widget.IOSched.OnboardingText\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/onboarding_date_location\"\n            android:textColor=\"?android:textColorSecondary\"\n            app:layout_constraintBottom_toTopOf=\"@id/spacer\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/welcome_pre_message\" />\n\n        <Space\n            android:id=\"@+id/spacer\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/onboarding_actions_height\"\n            android:layout_marginTop=\"32dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/date_location\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_schedule.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.schedule.ScheduleViewModel\" />\n\n        <variable\n            name=\"isEmpty\"\n            type=\"boolean\" />\n    </data>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:id=\"@+id/coordinator_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/appbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\">\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?actionBarSize\">\n\n                <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/day_indicators\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    app:layoutManager=\"LinearLayoutManager\"\n                    tools:itemCount=\"3\"\n                    tools:listitem=\"@layout/item_schedule_day_indicator\" />\n\n            </androidx.appcompat.widget.Toolbar>\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <!-- A view to draw above the AppBarLayout to mimic the status bar -->\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:background=\"?attr/colorSurface\"\n            android:fitsSystemWindows=\"true\"\n            app:layout_behavior=\"com.google.samples.apps.iosched.util.StatusBarScrimBehavior\" />\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n            <com.google.samples.apps.iosched.widget.CustomSwipeRefreshLayout\n                android:id=\"@+id/swipe_refresh_layout\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:onRefreshListener=\"@{() -> viewModel.onSwipeRefresh()}\"\n                app:refreshing=\"@{viewModel.swipeRefreshing}\"\n                app:swipeRefreshColors=\"@{@intArray/swipe_refresh}\">\n\n                <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/recyclerview_schedule\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:clipToPadding=\"false\"\n                    android:orientation=\"vertical\"\n                    android:paddingBottom=\"@dimen/schedule_page_padding_bottom\"\n                    android:paddingTop=\"@dimen/spacing_normal\"\n                    android:scrollbars=\"vertical\"\n                    app:layoutManager=\"LinearLayoutManager\"\n                    tools:listitem=\"@layout/item_session\" />\n\n            </com.google.samples.apps.iosched.widget.CustomSwipeRefreshLayout>\n\n            <TextView\n                android:id=\"@+id/empty\"\n                style=\"@style/Widget.IOSched.EmptyResults\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\"\n                android:layout_marginBottom=\"@dimen/schedule_page_padding_bottom\"\n                android:layout_marginHorizontal=\"@dimen/margin_large\"\n                android:text=\"@string/schedule_filters_empty\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:goneUnless=\"@{isEmpty &amp;&amp; !viewModel.isLoading}\"\n                tools:targetApi=\"o\"\n                tools:visibility=\"visible\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <!-- TODO(b/72711711): Provide a better loading indicator -->\n        <ProgressBar\n            android:id=\"@+id/loading\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:indeterminate=\"true\"\n            android:indeterminateTint=\"?attr/colorControlLight\"\n            app:goneUnless=\"@{viewModel.isLoading}\" />\n\n        <!-- A custom snackbar implementation for more control over positioning i.e. above the\n             FAB, to control its entry/exit animation. -->\n        <com.google.samples.apps.iosched.widget.FadingSnackbar\n            android:id=\"@+id/snackbar\"\n            android:layout_width=\"@dimen/snackbar_width\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|start\"\n            android:layout_marginBottom=\"@dimen/snackbar_margin_bottom_fab\"\n            android:layout_marginEnd=\"@dimen/snackbar_margin_end_fab\"\n            android:visibility=\"gone\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_schedule_two_pane.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<FrameLayout\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.samples.apps.iosched.widget.IoSlidingPaneLayout\n        android:id=\"@+id/sliding_pane_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/list_pane\"\n            android:name=\"androidx.navigation.fragment.NavHostFragment\"\n            android:layout_width=\"@dimen/schedule_list_pane_width\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"2\"\n            app:navGraph=\"@navigation/schedule_list\" />\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/detail_pane\"\n            android:name=\"androidx.navigation.fragment.NavHostFragment\"\n            android:layout_width=\"@dimen/schedule_detail_pane_width\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"3\"\n            app:navGraph=\"@navigation/schedule_detail\" />\n\n    </com.google.samples.apps.iosched.widget.IoSlidingPaneLayout>\n\n    <com.google.samples.apps.iosched.widget.FadingSnackbar\n        android:id=\"@+id/snackbar\"\n        android:layout_width=\"@dimen/snackbar_width\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|start\"\n        android:visibility=\"gone\" />\n</FrameLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.search.SearchViewModel\" />\n    </data>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/appbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\">\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?actionBarSize\">\n\n                <!-- Toolbar doesn't support layout_weight, so use intermediary LinearLayout. -->\n                <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:divider=\"?android:dividerHorizontal\"\n                    android:dividerPadding=\"@dimen/spacing_normal\"\n                    android:orientation=\"horizontal\"\n                    android:showDividers=\"middle\">\n\n                    <SearchView\n                        android:id=\"@+id/searchView\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_weight=\"2\"\n                        android:iconifiedByDefault=\"false\"\n                        android:imeOptions=\"actionDone|flagNoExtractUi\"\n                        android:queryBackground=\"@color/transparent\"\n                        android:queryHint=\"@string/search_schedule_hint\"\n                        android:searchHintIcon=\"@null\"\n                        android:searchIcon=\"@null\"\n                        tools:targetApi=\"lollipop_mr1\">\n\n                    </SearchView>\n\n                    <ViewStub\n                        android:id=\"@+id/active_filters_wide_stub\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"3\"\n                        android:layout=\"@layout/search_active_filters_wide\"\n                        app:viewModel=\"@{viewModel}\" />\n                </LinearLayout>\n\n            </androidx.appcompat.widget.Toolbar>\n\n            <ViewStub\n                android:id=\"@+id/active_filters_narrow_stub\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout=\"@layout/search_active_filters_narrow\"\n                app:viewModel=\"@{viewModel}\"\n                tools:visibility=\"visible\" />\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recyclerView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:clipToPadding=\"false\"\n                android:orientation=\"vertical\"\n                android:paddingBottom=\"@dimen/spacing_normal\"\n                android:paddingTop=\"@dimen/spacing_normal\"\n                android:scrollbars=\"vertical\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:goneUnless=\"@{!viewModel.isEmpty}\"\n                app:layoutManager=\"LinearLayoutManager\"\n                tools:listitem=\"@layout/item_session\" />\n\n            <TextView\n                android:id=\"@+id/empty\"\n                style=\"@style/Widget.IOSched.EmptyResults\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginHorizontal=\"@dimen/margin_large\"\n                android:layout_marginTop=\"?actionBarSize\"\n                android:text=\"@string/search_schedule_no_results\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:goneUnless=\"@{viewModel.isEmpty}\"\n                tools:targetApi=\"o\"\n                tools:visibility=\"visible\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <fragment\n            android:id=\"@+id/filter_sheet\"\n            android:name=\"com.google.samples.apps.iosched.ui.search.SearchFilterFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"bottom\"\n            android:layout_marginBottom=\"?actionBarSize\"\n            app:layout_behavior=\"com.google.samples.apps.iosched.widget.BottomSheetBehavior\"\n            app:behavior_hideable=\"true\"\n            app:behavior_peekHeight=\"0dp\"\n            app:behavior_skipCollapsed=\"true\"\n            tools:ignore=\"FragmentTagUsage\"\n            tools:layout=\"@layout/fragment_filters\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_session_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewModel\" />\n    </data>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:id=\"@+id/coordinator_layout_session_detail\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\"\n        tools:ignore=\"MergeRootFrame\">\n\n        <!-- CollapsingToolbarLayout consumes all system window insets, so we need to put this\n             first in order for RecyclerView to inspect the insets first.\n             Use layout_height=\"wrap_content\" so that the CollapsingToolbarLayout doesn't collapse\n             when there is not enough content to fill the screen.\n        -->\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n            <!-- Use a large padding bottom so the content scrolls up above the FAB. -->\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/session_detail_recycler_view\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:clipToPadding=\"false\"\n                android:paddingBottom=\"80dp\"\n                android:scrollbars=\"vertical\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layoutManager=\"LinearLayoutManager\"\n                tools:listitem=\"@layout/item_session_info\"\n                tools:itemCount=\"1\"\n                tools:layout_constraintWidth_percent=\"@dimen/content_max_width_percent\"/>\n            </androidx.constraintlayout.widget.ConstraintLayout>\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:background=\"@null\"\n            android:fitsSystemWindows=\"true\"\n            app:elevation=\"0dp\">\n\n            <com.google.android.material.appbar.CollapsingToolbarLayout\n                android:id=\"@+id/collapsing_toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_scrollFlags=\"scroll\"\n                app:statusBarScrim=\"?colorSurface\">\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\">\n\n                    <!-- Header photo, shown if there is a photo and/or video url. If there is a\n                         a video but no photo url, the placeholder image will stay shown.\n                    -->\n                    <ImageView\n                        android:id=\"@+id/detail_image\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"0dp\"\n                        android:importantForAccessibility=\"no\"\n                        android:scaleType=\"centerCrop\"\n                        android:visibility=\"gone\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintDimensionRatio=\"@string/session_detail_header_aspect\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\"\n                        app:eventPhoto=\"@{viewModel.session}\"\n                        app:goneUnless=\"@{viewModel.session.hasPhotoOrVideo}\"\n                        tools:src=\"@drawable/event_placeholder_keynote\"\n                        tools:visibility=\"visible\" />\n\n                    <!-- Play button, shown if there is a video url -->\n                    <ImageButton\n                        android:id=\"@+id/play_button\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"0dp\"\n                        android:background=\"@color/scrim\"\n                        android:contentDescription=\"@string/a11y_play\"\n                        android:foreground=\"?selectableItemBackground\"\n                        android:onClick=\"@{() -> viewModel.onPlayVideo()}\"\n                        android:scaleType=\"center\"\n                        android:visibility=\"gone\"\n                        app:layout_constraintBottom_toBottomOf=\"@id/detail_image\"\n                        app:layout_constraintEnd_toEndOf=\"@id/detail_image\"\n                        app:layout_constraintStart_toStartOf=\"@id/detail_image\"\n                        app:layout_constraintTop_toTopOf=\"@id/detail_image\"\n                        app:goneUnless=\"@{viewModel.session.hasVideo}\"\n                        app:srcCompat=\"@drawable/ic_play\"\n                        tools:ignore=\"UnusedAttribute\"\n                        tools:visibility=\"visible\" />\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n                <!-- Narrow header image for when there is no photo or video -->\n                <ImageView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:importantForAccessibility=\"no\"\n                    android:scaleType=\"fitCenter\"\n                    android:visibility=\"gone\"\n                    android:fitsSystemWindows=\"true\"\n                    app:eventNarrowHeader=\"@{viewModel.session}\"\n                    app:goneUnless=\"@{!viewModel.session.hasVideo}\" />\n\n                <!-- Toolbar needs to be on top for the back button to be tappable -->\n                <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?actionBarSize\"\n                    app:layout_collapseMode=\"pin\"\n                    app:navigationContentDescription=\"@string/navigate_up\" />\n\n            </com.google.android.material.appbar.CollapsingToolbarLayout>\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <com.google.android.material.bottomappbar.BottomAppBar\n            android:id=\"@+id/session_detail_bottom_app_bar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?actionBarSize\"\n            android:layout_gravity=\"bottom\"\n            app:contentInsetStart=\"@dimen/margin_normal\"\n            app:elevation=\"6dp\"\n            app:fabAlignmentMode=\"end\" />\n\n        <com.google.samples.apps.iosched.ui.reservation.StarReserveFab\n            android:id=\"@+id/session_detail_fab\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:layout_anchor=\"@id/session_detail_bottom_app_bar\"\n            app:backgroundTint=\"?attr/colorSurface\"\n            app:eventListener=\"@{viewModel}\"\n            app:isRegistered=\"@{viewModel.isUserRegistered}\"\n            app:isReservable=\"@{viewModel.isReservable}\"\n            app:isReservationDeniedByCutoff=\"@{viewModel.isReservationDeniedByCutoff}\"\n            app:isSignedIn=\"@{viewModel.isUserSignedIn}\"\n            app:tint=\"?attr/colorOnSurface\"\n            app:userSession=\"@{viewModel.userSession}\" />\n\n        <View\n            android:id=\"@+id/nav_bar_scrim\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_gravity=\"bottom\"\n            android:background=\"?attr/colorSurface\"\n            android:fitsSystemWindows=\"true\"\n            app:layout_behavior=\"com.google.samples.apps.iosched.util.NavigationBarScrimBehavior\" />\n\n        <!-- A custom snackbar implementation for more control over positioning i.e. above the FAB,\n             and to control its entry/exit animation. -->\n        <com.google.samples.apps.iosched.widget.FadingSnackbar\n            android:id=\"@+id/snackbar\"\n            android:layout_width=\"@dimen/snackbar_width\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|start\"\n            android:layout_marginBottom=\"@dimen/snackbar_margin_bottom_bab\"\n            android:layout_marginEnd=\"@dimen/snackbar_margin_end_fab\"\n            android:visibility=\"gone\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_session_feedback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/questions\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<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\n    <data>\n\n        <import type=\"com.google.samples.apps.iosched.BuildConfig\" />\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.settings.SettingsViewModel\" />\n    </data>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/appbar\"\n            style=\"@style/Widget.IOSched.AppBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\">\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?actionBarSize\"\n                app:navigationContentDescription=\"@string/a11y_show_navigation\"\n                app:navigationIcon=\"@drawable/ic_menu\"\n                app:title=\"@string/settings_title\" />\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n            <androidx.core.widget.NestedScrollView\n                android:id=\"@+id/settings_scroll\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:clipToPadding=\"false\"\n                android:scrollbarStyle=\"insideOverlay\"\n                android:scrollbars=\"vertical\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintWidth_percent=\"@dimen/content_max_width_percent\">\n\n                <LinearLayout\n                    android:id=\"@+id/settings_layout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:paddingBottom=\"@dimen/margin_normal\"\n                    android:paddingTop=\"@dimen/margin_normal\"\n                    tools:targetApi=\"o\">\n\n                    <TextView\n                        android:id=\"@+id/settings_choose_theme\"\n                        style=\"@style/Widget.IOSched.Settings.Button\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:focusable=\"true\"\n                        android:onClick=\"@{(view) -> viewModel.onThemeSettingClicked()}\"\n                        android:text=\"@string/settings_theme_title\" />\n\n                    <!-- AppCompat/MaterialComponents layout inflators don't automatically handle\n                         Switch widgets. See https://material.io/develop/android/components/switch/ -->\n                    <com.google.android.material.switchmaterial.SwitchMaterial\n                        android:id=\"@+id/settings_time_zone\"\n                        style=\"@style/Widget.IOSched.Settings.Switch\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:checked=\"@{viewModel.preferConferenceTimeZone}\"\n                        android:onClick=\"@{(view) -> viewModel.toggleTimeZone()}\"\n                        android:text=\"@string/settings_time_zone_label\" />\n\n                    <com.google.android.material.switchmaterial.SwitchMaterial\n                        android:id=\"@+id/settings_enable_notifications\"\n                        style=\"@style/Widget.IOSched.Settings.Switch\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:checked=\"@{viewModel.enableNotifications}\"\n                        android:onClick=\"@{(view) -> viewModel.toggleEnableNotifications()}\"\n                        android:text=\"@string/settings_enable_notifications\" />\n\n                    <com.google.android.material.switchmaterial.SwitchMaterial\n                        android:id=\"@+id/settings_send_anonymous_usage_statistics\"\n                        style=\"@style/Widget.IOSched.Settings.Switch\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:checked=\"@{viewModel.sendUsageStatistics}\"\n                        android:onClick=\"@{(view) -> viewModel.toggleSendUsageStatistics()}\"\n                        android:text=\"@string/settings_send_anonymous_usage_statistics\" />\n\n                    <View\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"1dp\"\n                        android:background=\"?android:dividerHorizontal\" />\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"@dimen/margin_normal\"\n                        android:layout_marginLeft=\"@dimen/margin_normal\"\n                        android:layout_marginRight=\"@dimen/margin_normal\"\n                        android:layout_marginTop=\"@dimen/margin_large\"\n                        android:text=\"@string/about_title\"\n                        android:textAppearance=\"@style/TextAppearance.IOSched.Overline\" />\n\n                    <TextView\n                        android:id=\"@+id/terms_of_service\"\n                        style=\"@style/Widget.IOSched.Settings.Button.About\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/settings_tos\"\n                        app:websiteLink=\"@{@string/tos_url}\" />\n\n                    <TextView\n                        android:id=\"@+id/privacy_policy\"\n                        style=\"@style/Widget.IOSched.Settings.Button.About\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/settings_privacy_policy\"\n                        app:websiteLink=\"@{@string/privacy_policy_url}\" />\n\n                    <TextView\n                        android:id=\"@+id/open_source_license\"\n                        style=\"@style/Widget.IOSched.Settings.Button.About\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/settings_oss_licenses\"\n                        app:dialogTitle=\"@{@string/settings_oss_licenses}\"\n                        app:fileLink=\"@{@string/oss_file}\" />\n\n                    <TextView\n                        android:id=\"@+id/version_build_number\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:gravity=\"start|center_vertical\"\n                        android:minHeight=\"?listPreferredItemHeightSmall\"\n                        android:paddingEnd=\"?listPreferredItemPaddingEnd\"\n                        android:paddingStart=\"?listPreferredItemPaddingStart\"\n                        android:textAppearance=\"?textAppearanceBody2\"\n                        app:versionName=\"@{BuildConfig.VERSION_NAME}\" />\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center\"\n                        android:layout_marginTop=\"@dimen/margin_normal\"\n                        android:drawablePadding=\"@dimen/margin_small\"\n                        android:gravity=\"center\"\n                        android:text=\"@string/built_with_material_components\"\n                        android:textAppearance=\"?attr/textAppearanceBody1\"\n                        app:drawableStartCompat=\"@drawable/ic_logo_components\" />\n\n                </LinearLayout>\n\n            </androidx.core.widget.NestedScrollView>\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <com.google.samples.apps.iosched.widget.FadingSnackbar\n            android:id=\"@+id/snackbar\"\n            android:layout_width=\"@dimen/snackbar_width\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|start\"\n            android:visibility=\"gone\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/fragment_speaker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.speaker.SpeakerViewModel\" />\n\n        <variable\n            name=\"headshotLoadListener\"\n            type=\"com.google.samples.apps.iosched.ui.speaker.ImageLoadListener\" />\n    </data>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:id=\"@+id/coordinator_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fitsSystemWindows=\"true\"\n        tools:ignore=\"MergeRootFrame\">\n\n        <!-- CollapsingToolbarLayout consumes all system window insets, so we need to put this\n             first in order for RecyclerView to inspect the insets first.\n             Use layout_height=\"wrap_content\" so that the CollapsingToolbarLayout doesn't collapse\n             when there is not enough content to fill the screen.\n        -->\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/speaker_detail_recycler_view\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:clipToPadding=\"false\"\n                android:paddingBottom=\"@dimen/margin_normal\"\n                android:scrollbars=\"vertical\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layoutManager=\"LinearLayoutManager\"\n                tools:listitem=\"@layout/item_speaker_info\"\n                tools:itemCount=\"1\"\n                tools:layout_constraintWidth_percent=\"@dimen/content_max_width_percent\"/>\n        </androidx.constraintlayout.widget.ConstraintLayout>\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:background=\"@null\"\n            android:fitsSystemWindows=\"true\"\n            app:elevation=\"0dp\">\n\n            <com.google.android.material.appbar.CollapsingToolbarLayout\n                android:id=\"@+id/collapsing_toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_scrollFlags=\"scroll\"\n                app:statusBarScrim=\"?colorSurface\">\n\n                <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?actionBarSize\"\n                    app:layout_collapseMode=\"pin\"\n                    app:navigationContentDescription=\"@string/navigate_up\"\n                    app:navigationIcon=\"@drawable/ic_arrow_back\" />\n\n                <!-- Use the speaker id as the transition name. When a session has multiple\n                     speakers, the id is unique, preventing conflicts with the transition name.\n                     See item_speaker.xml for the corresponding shared element.\n                -->\n                <ImageView\n                    android:id=\"@+id/speaker_image\"\n                    android:layout_width=\"@dimen/speaker_large_headshot_size\"\n                    android:layout_height=\"@dimen/speaker_large_headshot_size\"\n                    android:layout_gravity=\"center_horizontal\"\n                    android:layout_marginTop=\"?actionBarSize\"\n                    android:contentDescription=\"@null\"\n                    android:transitionName=\"@{viewModel.speaker.id}\"\n                    app:listener=\"@{headshotLoadListener}\"\n                    app:speakerImage=\"@{viewModel.speaker}\"\n                    tools:src=\"@drawable/ic_default_avatar_1\" />\n\n            </com.google.android.material.appbar.CollapsingToolbarLayout>\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <com.google.samples.apps.iosched.widget.FadingSnackbar\n            android:id=\"@+id/snackbar\"\n            android:layout_width=\"@dimen/snackbar_width\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|start\"\n            android:visibility=\"gone\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/include_agenda_contents.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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    tools:showIn=\"@layout/item_agenda_light\">\n\n    <data>\n\n        <variable\n            name=\"timeZoneId\"\n            type=\"org.threeten.bp.ZoneId\" />\n\n        <variable\n            name=\"agenda\"\n            type=\"com.google.samples.apps.iosched.model.Block\" />\n    </data>\n\n    <merge tools:parentTag=\"androidx.constraintlayout.widget.ConstraintLayout\"\n        tools:layout_width=\"match_parent\"\n        tools:layout_height=\"wrap_content\">\n\n        <View\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:agendaColor=\"@{agenda.color}\"\n            app:agendaStrokeColor=\"@{agenda.strokeColor}\"\n            app:agendaStrokeWidth=\"@{@dimen/agenda_item_stroke_width}\"\n            tools:background=\"#eee\" />\n\n        <ImageView\n            android:id=\"@+id/icon\"\n            android:layout_width=\"@dimen/agenda_icon_width\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@null\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:agendaIcon=\"@{agenda.type}\"\n            tools:src=\"@drawable/ic_agenda_badge\" />\n\n        <TextView\n            android:id=\"@+id/agenda_title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"@dimen/agenda_block_padding_vertical\"\n            android:text=\"@{agenda.title}\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"?textAppearanceListItem\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@id/icon\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"Badge &amp; device pick-up\" />\n\n        <TextView\n            android:id=\"@+id/duration\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:paddingBottom=\"@dimen/agenda_block_padding_vertical\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"?textAppearanceBody2\"\n            app:layout_constraintEnd_toEndOf=\"@id/agenda_title\"\n            app:layout_constraintStart_toStartOf=\"@id/agenda_title\"\n            app:layout_constraintTop_toBottomOf=\"@id/agenda_title\"\n            app:endTime=\"@{agenda.endTime}\"\n            app:startTime=\"@{agenda.startTime}\"\n            app:timeZoneId=\"@{timeZoneId}\"\n            tools:text=\"8:00 AM - 7:00 PM\" />\n\n    </merge>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/info_wifi_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.info.EventInfoViewModel\" />\n    </data>\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/wifi_card\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:cardBackgroundColor=\"@color/highlighted_card_background\"\n        app:cardCornerRadius=\"16dp\"\n        app:cardElevation=\"0dp\"\n        app:goneUnless=\"@{viewModel.showWifi}\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"@dimen/margin_normal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"@dimen/margin_small\"\n                android:text=\"@string/wifi_header\"\n                android:textAppearance=\"@style/TextAppearance.IOSched.Overline\" />\n\n            <TextView\n                android:id=\"@+id/wifi_network_and_password\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:fontFamily=\"sans-serif-medium\"\n                android:textAlignment=\"viewStart\"\n                android:textAppearance=\"?textAppearanceBody1\"\n                app:wifiInfo=\"@{viewModel.wifiConfig}\"\n                tools:text=\"@string/wifi_network_and_password\" />\n\n            <Button\n                android:id=\"@+id/join_network\"\n                style=\"?borderlessButtonStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:onClick=\"@{() -> viewModel.onWifiConnect()}\"\n                android:text=\"@string/join_network\" />\n        </LinearLayout>\n\n    </com.google.android.material.card.MaterialCardView>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_agenda_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<!-- Alternative layout, identical to @layout/item_agenda_light except for a dark theme specified on\n     the root view group so contents uses a dark theme. -->\n<layout 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\n    <data>\n\n        <variable\n            name=\"timeZoneId\"\n            type=\"org.threeten.bp.ZoneId\" />\n\n        <variable\n            name=\"agenda\"\n            type=\"com.google.samples.apps.iosched.model.Block\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?selectableItemBackground\"\n        android:paddingStart=\"@dimen/margin_normal\"\n        android:paddingEnd=\"@dimen/margin_normal\"\n        android:paddingTop=\"@dimen/spacing_micro\"\n        android:paddingBottom=\"@dimen/spacing_micro\"\n        android:theme=\"@style/ThemeOverlay.MaterialComponents.Dark\"\n        tools:ignore=\"RtlSymmetry,UnusedAttribute\">\n\n        <include\n            layout=\"@layout/include_agenda_contents\"\n            app:agenda=\"@{agenda}\"\n            app:timeZoneId=\"@{timeZoneId}\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_agenda_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<!-- Alternative layout, identical to @layout/item_agenda_dark except without the dark theme\n     specified on the root view group, so contents use the default light theme. -->\n<layout 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\n    <data>\n\n        <variable\n            name=\"timeZoneId\"\n            type=\"org.threeten.bp.ZoneId\" />\n\n        <variable\n            name=\"agenda\"\n            type=\"com.google.samples.apps.iosched.model.Block\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?selectableItemBackground\"\n        android:paddingStart=\"@dimen/margin_normal\"\n        android:paddingEnd=\"@dimen/margin_normal\"\n        android:paddingTop=\"@dimen/spacing_micro\"\n        android:paddingBottom=\"@dimen/spacing_micro\"\n        android:theme=\"@style/ThemeOverlay.MaterialComponents.Light\"\n        tools:ignore=\"RtlSymmetry,UnusedAttribute\">\n\n        <include\n            layout=\"@layout/include_agenda_contents\"\n            app:agenda=\"@{agenda}\"\n            app:timeZoneId=\"@{timeZoneId}\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_codelab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"codelab\"\n            type=\"com.google.samples.apps.iosched.model.Codelab\" />\n\n        <variable\n            name=\"isExpanded\"\n            type=\"Boolean\" />\n\n        <variable\n            name=\"actionHandler\"\n            type=\"com.google.samples.apps.iosched.ui.codelabs.CodelabsActionsHandler\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?selectableItemBackground\"\n        android:minHeight=\"?listPreferredItemHeight\"\n        android:paddingEnd=\"?listPreferredItemPaddingEnd\"\n        android:paddingStart=\"?listPreferredItemPaddingStart\"\n        android:paddingTop=\"@dimen/margin_small\"\n        android:paddingBottom=\"@dimen/margin_small\"\n        tools:ignore=\"RtlSymmetry\">\n\n        <ImageView\n            android:id=\"@+id/codelab_icon\"\n            android:layout_width=\"32dp\"\n            android:layout_height=\"32dp\"\n            android:contentDescription=\"@null\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintEnd_toStartOf=\"@id/codelab_title\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:imageUrl=\"@{codelab.iconUrl}\"\n            app:placeholder=\"@{@drawable/ic_nav_codelabs}\"\n            tools:src=\"@drawable/ic_nav_codelabs\" />\n\n        <ImageView\n            android:id=\"@+id/expand_icon\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:importantForAccessibility=\"no\"\n            android:rotationX=\"@{isExpanded ? 180f : 0f}\"\n            android:src=\"@drawable/ic_expand_more\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <TextView\n            android:id=\"@+id/codelab_title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:text=\"@{codelab.title}\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"?textAppearanceListItem\"\n            app:layout_constraintEnd_toStartOf=\"@id/expand_icon\"\n            app:layout_constraintStart_toEndOf=\"@id/codelab_icon\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"@sample/codelabs.json/codelabs/title\" />\n\n        <TextView\n            android:id=\"@+id/codelab_duration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/spacing_micro\"\n            app:layout_constraintStart_toStartOf=\"@id/codelab_title\"\n            app:layout_constraintTop_toBottomOf=\"@id/codelab_title\"\n            app:codelabDuration=\"@{codelab.durationMinutes}\"\n            tools:text=\"@sample/codelabs.json/codelabs/duration\"\n            tools:visibility=\"visible\" />\n\n        <com.google.samples.apps.iosched.widget.NoTouchRecyclerView\n            android:id=\"@+id/codelab_tags\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"@id/codelab_title\"\n            app:layout_constraintTop_toBottomOf=\"@id/codelab_duration\"\n            app:topicTags=\"@{codelab.tags}\"\n            tools:itemCount=\"3\"\n            tools:layoutManager=\"LinearLayoutManager\"\n            tools:listitem=\"@layout/item_inline_tag\" />\n\n        <TextView\n            android:id=\"@+id/codelab_description\"\n            style=\"@style/Widget.IOSched.MultilineBody\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@{codelab.description}\"\n            android:textAlignment=\"viewStart\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"@id/codelab_title\"\n            app:layout_constraintTop_toBottomOf=\"@id/codelab_tags\"\n            app:goneUnless=\"@{isExpanded}\"\n            tools:text=\"@sample/codelabs.json/codelabs/description\"\n            tools:visibility=\"visible\" />\n\n        <Button\n            android:id=\"@+id/start_codelab\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:onClick=\"@{() -> actionHandler.startCodelab(codelab)}\"\n            android:text=\"@string/start_codelab\"\n            app:layout_constraintStart_toStartOf=\"@id/codelab_title\"\n            app:layout_constraintTop_toBottomOf=\"@id/codelab_description\"\n            app:goneUnless=\"@{isExpanded &amp;&amp; codelab.hasUrl()}\"\n            app:icon=\"@drawable/ic_launch\"\n            app:iconPadding=\"8dp\"\n            tools:visibility=\"visible\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_codelabs_information_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<layout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data>\n\n        <variable\n            name=\"actionHandler\"\n            type=\"com.google.samples.apps.iosched.ui.codelabs.CodelabsActionsHandler\" />\n    </data>\n\n    <com.google.android.material.card.MaterialCardView\n        style=\"@style/Widget.IOSched.Codelabs.InfoCard\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:contentPaddingBottom=\"@dimen/margin_small\"\n        app:contentPaddingLeft=\"@dimen/margin_normal\"\n        app:contentPaddingRight=\"@dimen/margin_normal\"\n        app:contentPaddingTop=\"@dimen/margin_normal\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                style=\"@style/Widget.IOSched.MultilineBody\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/codelabs_information\" />\n\n            <Button\n                android:id=\"@+id/dismiss_card\"\n                style=\"?borderlessButtonStyle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end\"\n                android:layout_marginTop=\"@dimen/margin_small\"\n                android:onClick=\"@{() -> actionHandler.dismissCodelabsInfoCard()}\"\n                android:text=\"@string/got_it\" />\n        </LinearLayout>\n\n    </com.google.android.material.card.MaterialCardView>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_announcement.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <import type=\"kotlinx.coroutines.flow.StateFlow\" />\n\n        <variable\n            name=\"timeZoneId\"\n            type=\"StateFlow&lt;org.threeten.bp.ZoneId&gt;\" />\n\n        <variable\n            name=\"announcement\"\n            type=\"com.google.samples.apps.iosched.model.Announcement\" />\n\n    </data>\n\n    <com.google.android.material.card.MaterialCardView\n        style=\"@style/Widget.IOSched.Feed.Card\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/margin_small\"\n        android:layout_marginEnd=\"@dimen/margin_normal\"\n        android:layout_marginStart=\"@dimen/margin_normal\"\n        android:layout_marginTop=\"@dimen/margin_small\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:minHeight=\"@dimen/feed_announcement_min_height\">\n\n            <ImageView\n                android:id=\"@+id/image\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:contentDescription=\"@null\"\n                android:scaleType=\"centerCrop\"\n                android:visibility=\"gone\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintWidth_percent=\"@dimen/feed_announcement_image_width_percent\"\n                app:goneUnless=\"@{announcement.hasImage}\"\n                app:imageUrl=\"@{announcement.imageUrl}\"\n                app:placeholder=\"@{@drawable/generic_placeholder}\"\n                tools:src=\"@drawable/event_header_sessions\"\n                tools:visibility=\"visible\" />\n\n            <TextView\n                android:id=\"@+id/title\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"@dimen/margin_normal\"\n                android:text=\"@{announcement.title}\"\n                android:textAlignment=\"viewStart\"\n                android:textAppearance=\"?textAppearanceListItem\"\n                app:layout_constraintEnd_toStartOf=\"@+id/time\"\n                app:layout_constraintStart_toEndOf=\"@id/image\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                tools:text=\"Google I/O Highlights\" />\n\n            <TextView\n                android:id=\"@+id/time\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"@dimen/margin_normal\"\n                android:text=\"@string/feed_no_reserved_events\"\n                app:announcementTime=\"@{announcement.timestamp}\"\n                app:timeZoneId=\"@{timeZoneId}\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"@+id/title\"\n                app:layout_constraintBottom_toBottomOf=\"@+id/title\"\n                app:layout_constraintStart_toEndOf=\"@+id/title\"\n                tools:text=\"6:00 PM\" />\n\n            <TextView\n                android:id=\"@+id/message\"\n                style=\"@style/Widget.IOSched.MultilineBody\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"@dimen/margin_normal\"\n                android:autoLink=\"web\"\n                android:text=\"@{announcement.message}\"\n                android:textAlignment=\"viewStart\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/image\"\n                app:layout_constraintTop_toBottomOf=\"@+id/title\"\n                tools:text=\"@tools:sample/lorem[10]\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </com.google.android.material.card.MaterialCardView>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_announcements_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/feed_empty_text\"\n    style=\"@style/Widget.IOSched.EmptyResults\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:padding=\"@dimen/margin_normal\"\n    android:text=\"@string/feed_not_available\" />\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_announcements_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data>\n\n        <variable\n            name=\"eventListener\"\n            type=\"com.google.samples.apps.iosched.ui.feed.FeedEventListener\" />\n\n        <variable\n            name=\"announcementsHeaderState\"\n            type=\"com.google.samples.apps.iosched.ui.feed.AnnouncementsHeader\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/margin_small\"\n        android:layout_marginTop=\"@dimen/margin_normal\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/margin_normal\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n        <TextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@string/feed_announcement_title\"\n            android:textAppearance=\"@style/TextAppearance.IOSched.Overline\"\n            app:layout_constrainedHeight=\"true\"\n            app:layout_constraintEnd_toStartOf=\"@+id/actionButton\"\n            app:layout_constraintStart_toStartOf=\"@+id/guideline_start\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <Button\n            android:id=\"@+id/actionButton\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/feed_past_announcements\"\n            android:onClick=\"@{() -> eventListener.openPastAnnouncements()}\"\n            app:icon=\"@drawable/ic_arrow_right\"\n            app:iconGravity=\"end\"\n            app:goneUnless=\"@{announcementsHeaderState.showPastNotificationsButton}\"\n            app:layout_constrainedWidth=\"true\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/title\"\n            app:layout_constraintEnd_toEndOf=\"@+id/guideline_end\"\n            app:layout_constraintTop_toTopOf=\"@+id/title\"\n            app:layout_constraintStart_toEndOf=\"@+id/title\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_announcements_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<ProgressBar xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:padding=\"@dimen/margin_large\" />\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_countdown.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<com.google.samples.apps.iosched.widget.CountdownView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/countdown_height\"\n    android:paddingBottom=\"@dimen/spacing_normal\"\n    android:paddingEnd=\"@dimen/margin_normal\"\n    android:paddingStart=\"@dimen/margin_normal\"\n    android:paddingTop=\"@dimen/spacing_normal\" />\n\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_moment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <import type=\"kotlinx.coroutines.flow.StateFlow\" />\n\n        <variable\n            name=\"moment\"\n            type=\"com.google.samples.apps.iosched.model.Moment\" />\n\n        <variable\n            name=\"userInfo\"\n            type=\"StateFlow&lt;com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo&gt;\" />\n\n        <variable\n            name=\"theme\"\n            type=\"StateFlow&lt;com.google.samples.apps.iosched.model.Theme&gt;\" />\n\n        <variable\n            name=\"eventListener\"\n            type=\"com.google.samples.apps.iosched.ui.feed.FeedEventListener\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <ImageView\n            android:id=\"@+id/momentImage\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/feed_moment_height\"\n            app:layout_constrainedHeight=\"true\"\n            android:adjustViewBounds=\"true\"\n            android:contentDescription=\"@null\"\n            android:scaleType=\"fitCenter\"\n            app:momentImageUrl=\"@{moment.imageUrl}\"\n            app:momentImageUrlDarkTheme=\"@{moment.imageUrlDarkTheme}\"\n            app:momentTheme=\"@{theme}\"\n            android:background=\"?attr/colorSurfaceSecondary\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <Button\n            android:id=\"@+id/actionButton\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"@dimen/margin_normal\"\n            app:layout_constraintStart_toStartOf=\"@+id/momentImage\"\n            app:layout_constraintTop_toBottomOf=\"@+id/momentImage\"\n            app:iconPadding=\"@dimen/feed_header_cta_icon_padding\"\n            app:iconSize=\"@dimen/feed_header_cta_icon_size\"\n            app:moment=\"@{moment}\"\n            app:userInfo=\"@{userInfo}\"\n            app:eventListener=\"@{eventListener}\"\n            tools:icon=\"@drawable/ic_default_profile_avatar\"\n            tools:text=\"Watch livestream\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_session.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <import type=\"android.view.View\" />\n\n        <variable\n            name=\"isMapFeatureEnabled\"\n            type=\"Boolean\" />\n\n        <variable\n            name=\"timeZoneId\"\n            type=\"org.threeten.bp.ZoneId\" />\n\n        <variable\n            name=\"userSession\"\n            type=\"com.google.samples.apps.iosched.model.userdata.UserSession\" />\n\n        <variable\n            name=\"eventListener\"\n            type=\"com.google.samples.apps.iosched.ui.feed.FeedEventListener\" />\n\n    </data>\n\n    <com.google.android.material.card.MaterialCardView\n        style=\"@style/Widget.IOSched.Feed.Card\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/margin_small\"\n        android:layout_marginStart=\"@dimen/margin_small\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"@dimen/feed_my_day_session_width\"\n            android:layout_height=\"@dimen/feed_my_day_session_height\">\n\n            <ImageView\n                android:id=\"@+id/reserved_icon\"\n                android:layout_width=\"@dimen/feed_session_badge_icon_size\"\n                android:layout_height=\"@dimen/feed_session_badge_icon_size\"\n                android:layout_marginEnd=\"@dimen/margin_normal\"\n                android:layout_marginStart=\"@dimen/margin_small\"\n                android:layout_marginTop=\"@dimen/margin_small\"\n                android:contentDescription=\"@null\"\n                app:layout_constraintStart_toEndOf=\"@id/title\"\n                app:layout_constraintEnd_toStartOf=\"@id/starred_icon\"\n                app:layout_constraintHorizontal_bias=\"1\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:goneUnless=\"@{userSession.userEvent.isReserved}\"\n                app:srcCompat=\"@drawable/ic_reserved\" />\n\n            <ImageView\n                android:id=\"@+id/starred_icon\"\n                android:layout_width=\"@dimen/feed_session_badge_icon_size\"\n                android:layout_height=\"@dimen/feed_session_badge_icon_size\"\n                android:layout_marginTop=\"@dimen/margin_small\"\n                android:contentDescription=\"@null\"\n                app:layout_constraintStart_toEndOf=\"@id/reserved_icon\"\n                app:layout_constraintEnd_toEndOf=\"@id/keyline_right\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:goneUnless=\"@{userSession.userEvent.isStarred &amp;&amp; !userSession.userEvent.isReserved}\"\n                app:srcCompat=\"@drawable/ic_star\" />\n\n            <androidx.constraintlayout.widget.Guideline\n                android:id=\"@+id/keyline_left\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:orientation=\"vertical\"\n                app:layout_constraintGuide_begin=\"@dimen/margin_normal\" />\n\n            <androidx.constraintlayout.widget.Guideline\n                android:id=\"@+id/keyline_right\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:orientation=\"vertical\"\n                app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n            <TextView\n                android:id=\"@+id/title\"\n                style=\"@style/Widget.IOSched.Feed.Session.Title\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                android:lines=\"2\"\n                android:maxLines=\"2\"\n                android:ellipsize=\"end\"\n                android:text=\"@{userSession.session.title}\"\n                app:layout_constraintBottom_toTopOf=\"@id/time\"\n                app:layout_constraintEnd_toStartOf=\"@id/reserved_icon\"\n                app:layout_constraintVertical_chainStyle=\"packed\"\n                app:layout_constraintVertical_bias=\"0\"\n                app:layout_constraintStart_toStartOf=\"@id/keyline_left\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                tools:text=\"What's New in Android\" />\n\n            <TextView\n                android:id=\"@+id/time\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_small\"\n                android:textAppearance=\"?attr/textAppearanceCaption\"\n                app:layout_constraintStart_toStartOf=\"@id/keyline_left\"\n                app:layout_constraintTop_toBottomOf=\"@id/title\"\n                app:layout_constraintBottom_toTopOf=\"@id/location\"\n                app:feedSessionStartTime=\"@{userSession.session.startTime}\"\n                app:feedSessionEndTime=\"@{userSession.session.endTime}\"\n                app:timeZoneId=\"@{timeZoneId}\"\n                tools:text=\"1:00 pm\" />\n\n            <TextView\n                android:id=\"@+id/location\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:text=\"@{userSession.session.room.name}\"\n                android:maxLines=\"1\"\n                android:ellipsize=\"end\"\n                app:layout_constraintBottom_toTopOf=\"@id/footer_buttons\"\n                app:layout_constraintEnd_toEndOf=\"@id/keyline_right\"\n                app:layout_constraintTop_toBottomOf=\"@id/time\"\n                app:layout_constraintStart_toStartOf=\"@id/keyline_left\"\n                tools:text=\"Stage 1\" />\n\n            <LinearLayout\n                android:id=\"@+id/footer_buttons\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constrainedHeight=\"true\"\n                app:layout_constraintTop_toBottomOf=\"@id/location\"\n                app:layout_constraintStart_toStartOf=\"@id/keyline_left\"\n                app:layout_constraintEnd_toEndOf=\"@id/keyline_right\"\n                app:layout_constraintBottom_toBottomOf=\"@id/keyline_bottom\">\n\n                <Button\n                    android:id=\"@+id/map_button\"\n                    style=\"@style/Widget.MaterialComponents.Button.OutlinedButton\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"@dimen/margin_small\"\n                    android:text=\"@string/feed_session_map_button_title\"\n                    android:onClick=\"@{() -> eventListener.openMapForSession(userSession.session)}\"\n                    app:goneUnless=\"@{isMapFeatureEnabled}\"\n                    app:icon=\"@drawable/ic_nav_map\" />\n\n                <Button\n                    android:id=\"@+id/details_button\"\n                    style=\"@style/Widget.MaterialComponents.Button.OutlinedButton\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/feed_session_details_button_title\"\n                    android:onClick=\"@{() -> eventListener.openEventDetail(userSession.session.id)}\" />\n\n            </LinearLayout>\n\n            <androidx.constraintlayout.widget.Guideline\n                android:id=\"@+id/keyline_bottom\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:orientation=\"horizontal\"\n                app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </com.google.android.material.card.MaterialCardView>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_sessions_container.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"sessionContainerState\"\n            type=\"com.google.samples.apps.iosched.ui.feed.FeedSessions\" />\n\n        <variable\n            name=\"eventListener\"\n            type=\"com.google.samples.apps.iosched.ui.feed.FeedEventListener\" />\n\n    </data>\n\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/margin_normal\"\n        android:layout_marginTop=\"@dimen/margin_normal\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/margin_normal\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n        <TextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@{sessionContainerState.titleId}\"\n            android:textAppearance=\"@style/TextAppearance.IOSched.Overline\"\n            app:layout_constraintEnd_toStartOf=\"@+id/actionButton\"\n            app:layout_constraintStart_toStartOf=\"@+id/guideline_start\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@+id/recyclerView\"\n            tools:text=\"My day\" />\n\n        <Button\n            android:id=\"@+id/actionButton\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@{sessionContainerState.actionTextId}\"\n            app:icon=\"@drawable/ic_arrow_right\"\n            app:iconGravity=\"end\"\n            app:layout_constrainedWidth=\"true\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/title\"\n            app:layout_constraintEnd_toEndOf=\"@+id/guideline_end\"\n            app:layout_constraintTop_toTopOf=\"@+id/title\"\n            app:layout_constraintStart_toEndOf=\"@+id/title\"\n            tools:text=\"View all events\" />\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:clipToPadding=\"false\"\n            android:paddingEnd=\"@dimen/margin_small\"\n            android:paddingStart=\"@dimen/margin_small\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/title\"/>\n\n        <ProgressBar\n            android:id=\"@+id/loading\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:indeterminate=\"true\"\n            android:indeterminateTint=\"?attr/colorControlLight\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/recyclerView\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/title\"\n            app:goneUnless=\"@{sessionContainerState.isLoading}\" />\n\n        <com.google.android.material.card.MaterialCardView\n            style=\"@style/Widget.IOSched.Feed.Card\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            goneUnless=\"@{!sessionContainerState.loading &amp;&amp; sessionContainerState.userSessions.empty}\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"@+id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@+id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@+id/title\">\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:gravity=\"center\"\n                android:layout_marginTop=\"@dimen/margin_large\"\n                android:layout_marginBottom=\"@dimen/margin_large\">\n\n                <TextView\n                    android:id=\"@+id/noEventsMessage\"\n                    style=\"@style/Widget.IOSched.Feed.EmptySessionsMessage\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center\"\n                    android:text=\"@string/feed_no_reserved_events\" />\n\n                <Button\n                    android:id=\"@+id/noEventsAction\"\n                    style=\"?borderlessButtonStyle\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:onClick=\"@{() -> eventListener.openSchedule(false)}\"\n                    android:text=\"@string/feed_no_reserved_events_action\"\n                    app:icon=\"@drawable/ic_arrow_right\"\n                    app:iconGravity=\"end\" />\n\n            </LinearLayout>\n        </com.google.android.material.card.MaterialCardView>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_social_channels.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/end_guideline\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/start_guideline\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/margin_normal\" />\n\n        <TextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            android:textAppearance=\"?attr/textAppearanceHeadline4\"\n            tools:text=\"#GoogleIO\"\n            app:layout_constraintBottom_toTopOf=\"@+id/message\"\n            app:layout_constrainedHeight=\"true\"\n            app:layout_constraintEnd_toEndOf=\"@id/end_guideline\"\n            app:layout_constraintStart_toStartOf=\"@id/start_guideline\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:websiteLink=\"@{@string/feed_social_twitter_hashtag_link}\" />\n\n        <TextView\n            android:id=\"@+id/message\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_small\"\n            android:gravity=\"start\"\n            android:text=\"@string/feed_social_channels_message\"\n            android:textAppearance=\"?attr/textAppearanceCaption\"\n            app:layout_constraintEnd_toEndOf=\"@id/end_guideline\"\n            app:layout_constrainedHeight=\"true\"\n            app:layout_constraintStart_toStartOf=\"@id/start_guideline\"\n            app:layout_constraintTop_toBottomOf=\"@+id/title\" />\n\n        <ImageButton\n            android:id=\"@+id/twitter_button\"\n            style=\"@style/Widget.IOSched.Feed.SocialChannelButton\"\n            android:layout_marginBottom=\"@dimen/margin_large\"\n            android:layout_marginTop=\"@dimen/margin_large\"\n            android:src=\"@drawable/ic_logo_twitter\"\n            android:background=\"@drawable/ic_feed_social_button_bg\"\n            android:contentDescription=\"@string/a11y_feed_social_twitter_button\"\n            app:layout_constraintHorizontal_bias=\"0\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"@id/start_guideline\"\n            app:layout_constraintEnd_toStartOf=\"@id/facebook_button\"\n            app:layout_constraintTop_toBottomOf=\"@+id/message\"\n            app:websiteLink=\"@{@string/feed_social_twitter_link}\" />\n\n        <ImageButton\n            android:id=\"@+id/facebook_button\"\n            style=\"@style/Widget.IOSched.Feed.SocialChannelButton\"\n            android:layout_marginStart=\"@dimen/feed_social_buttons_spacing\"\n            android:src=\"@drawable/ic_logo_facebook\"\n            android:background=\"@drawable/ic_feed_social_button_bg\"\n            android:contentDescription=\"@string/a11y_feed_social_facebook_button\"\n            app:layout_constraintBottom_toBottomOf=\"@id/twitter_button\"\n            app:layout_constraintStart_toEndOf=\"@id/twitter_button\"\n            app:layout_constraintTop_toTopOf=\"@id/twitter_button\"\n            app:websiteLink=\"@{@string/feed_social_facebook_link}\" />\n\n        <ImageButton\n            android:id=\"@+id/google_devs_button\"\n            style=\"@style/Widget.IOSched.Feed.SocialChannelButton\"\n            android:layout_marginStart=\"@dimen/feed_social_buttons_spacing\"\n            android:src=\"@drawable/ic_logo_google_developers\"\n            android:background=\"@drawable/ic_feed_social_button_bg\"\n            android:contentDescription=\"@string/a11y_feed_social_google_devs_button\"\n            app:layout_constraintBottom_toBottomOf=\"@id/twitter_button\"\n            app:layout_constraintStart_toEndOf=\"@id/facebook_button\"\n            app:layout_constraintTop_toTopOf=\"@id/twitter_button\"\n            app:websiteLink=\"@{@string/feed_social_google_devs_link}\" />\n\n        <ImageButton\n            android:id=\"@+id/instagram_button\"\n            style=\"@style/Widget.IOSched.Feed.SocialChannelButton\"\n            android:layout_marginStart=\"@dimen/feed_social_buttons_spacing\"\n            android:src=\"@drawable/ic_logo_instagram\"\n            android:background=\"@drawable/ic_feed_social_button_bg\"\n            android:contentDescription=\"@string/a11y_feed_social_instagram_button\"\n            app:layout_constraintBottom_toBottomOf=\"@id/twitter_button\"\n            app:layout_constraintStart_toEndOf=\"@id/google_devs_button\"\n            app:layout_constraintEnd_toStartOf=\"@id/youtube_button\"\n            app:layout_constraintTop_toTopOf=\"@id/twitter_button\"\n            app:websiteLink=\"@{@string/feed_social_instagram_link}\" />\n\n        <ImageButton\n            android:id=\"@+id/youtube_button\"\n            style=\"@style/Widget.IOSched.Feed.SocialChannelButton\"\n            android:layout_marginStart=\"@dimen/feed_social_buttons_spacing\"\n            android:src=\"@drawable/ic_logo_youtube\"\n            android:background=\"@drawable/ic_feed_social_button_bg\"\n            android:contentDescription=\"@string/a11y_feed_social_youtube_button\"\n            app:layout_constraintBottom_toBottomOf=\"@id/twitter_button\"\n            app:layout_constraintStart_toEndOf=\"@id/instagram_button\"\n            app:layout_constraintTop_toTopOf=\"@id/twitter_button\"\n            app:websiteLink=\"@{@string/feed_social_youtube_link}\" />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_feed_sustainability.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/margin_normal\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/end_guideline\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/margin_large\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/start_guideline\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/margin_large\" />\n\n        <View\n            android:id=\"@+id/container\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:background=\"?attr/colorSurfaceSecondary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/spacing\" />\n\n        <TextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_large\"\n            android:text=\"@string/feed_sustainability_title\"\n            android:textAppearance=\"?attr/textAppearanceBody1\"\n            app:layout_constraintVertical_bias=\"0\"\n            app:layout_constraintVertical_chainStyle=\"packed\"\n            app:layout_constraintStart_toStartOf=\"@id/start_guideline\"\n            app:layout_constraintEnd_toEndOf=\"@id/end_guideline\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toTopOf=\"@+id/message\" />\n\n        <TextView\n            android:id=\"@+id/message\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/feed_sustainability_message\"\n            android:textAppearance=\"?attr/textAppearanceCaption\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            app:layout_constraintStart_toStartOf=\"@+id/start_guideline\"\n            app:layout_constraintEnd_toStartOf=\"@+id/art\"\n            app:layout_constraintTop_toBottomOf=\"@+id/title\"\n            app:layout_constraintBottom_toTopOf=\"@id/action_button\" />\n\n        <Button\n            android:id=\"@+id/action_button\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/feed_sustainability_action\"\n            app:icon=\"@drawable/ic_arrow_right\"\n            app:iconGravity=\"end\"\n            app:websiteLink=\"@{@string/feed_sustainability_link}\"\n            app:layout_constrainedHeight=\"true\"\n            app:layout_constrainedWidth=\"true\"\n            app:layout_constraintHorizontal_bias=\"0\"\n            app:layout_constraintEnd_toStartOf=\"@+id/art\"\n            app:layout_constraintStart_toStartOf=\"@+id/start_guideline\"\n            app:layout_constraintTop_toBottomOf=\"@+id/message\"\n            app:layout_constraintBottom_toBottomOf=\"@id/container\"\n            app:layout_constraintBottom_toTopOf=\"@id/spacing\" />\n\n        <View\n            android:id=\"@+id/spacing\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/margin_large\"\n            app:layout_constrainedHeight=\"true\"\n            app:layout_constraintStart_toStartOf=\"@+id/start_guideline\"\n            app:layout_constraintEnd_toEndOf=\"@+id/end_guideline\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/container\"\n            app:layout_constraintTop_toBottomOf=\"@+id/action_button\" />\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/art\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_sustainability_art\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"12dp\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/message\"\n            app:layout_constraintBottom_toBottomOf=\"parent\" />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>"
  },
  {
    "path": "mobile/src/main/res/layout/item_filter_chip_closeable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"filterChip\"\n            type=\"com.google.samples.apps.iosched.ui.filters.FilterChip\" />\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.filters.FiltersViewModelDelegate\" />\n    </data>\n\n    <com.google.android.material.chip.Chip\n        android:id=\"@+id/filter_label\"\n        style=\"@style/Widget.IOSched.FilterChip.Closeable\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:checked=\"true\"\n        app:filterChipOnClose=\"@{filterChip}\"\n        app:filterChipText=\"@{filterChip}\"\n        app:filterChipTint=\"@{filterChip.color}\"\n        app:viewModel=\"@{viewModel}\"\n        tools:text=\"@sample/tags.json/tags/name\"\n        tools:chipIconTint=\"@sample/tags.json/tags/color\" />\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_filter_chip_selectable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"filterChip\"\n            type=\"com.google.samples.apps.iosched.ui.filters.FilterChip\" />\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.filters.FiltersViewModelDelegate\" />\n    </data>\n\n    <com.google.android.material.chip.Chip\n        android:id=\"@+id/filter_label\"\n        style=\"@style/Widget.IOSched.FilterChip.Selectable\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:checked=\"@{filterChip.isSelected}\"\n        app:filterChipOnClick=\"@{filterChip}\"\n        app:filterChipText=\"@{filterChip}\"\n        app:filterChipTint=\"@{filterChip.color}\"\n        app:viewModel=\"@{viewModel}\"\n        tools:text=\"@sample/tags.json/tags/name\"\n        tools:chipIconTint=\"@sample/tags.json/tags/color\" />\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_generic_section_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <data>\n\n        <variable\n            name=\"sectionHeader\"\n            type=\"com.google.samples.apps.iosched.ui.SectionHeader\" />\n    </data>\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"start|center_vertical\"\n        android:minHeight=\"?actionBarSize\"\n        android:paddingEnd=\"@{ sectionHeader.useHorizontalPadding ? @dimen/margin_normal : 0 }\"\n        android:paddingStart=\"@{ sectionHeader.useHorizontalPadding ? @dimen/margin_normal : 0 }\"\n        android:textAlignment=\"viewStart\"\n        android:textAppearance=\"@style/TextAppearance.IOSched.Overline\"\n        android:text=\"@{sectionHeader.titleId}\"\n        tools:text=\"@string/speaker_events_subhead\" />\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_inline_tag.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"tag\"\n            type=\"com.google.samples.apps.iosched.model.Tag\" />\n    </data>\n\n    <TextView\n        style=\"@style/Widget.IOSched.Tag.Inline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/margin_normal\"\n        android:text=\"@{tag.displayName}\"\n        app:tagTint=\"@{tag.color}\"\n        tools:drawableStart=\"@drawable/tag_dot\"\n        tools:drawableTint=\"@sample/tags.json/tags/color\"\n        tools:text=\"@sample/tags.json/tags/name\" />\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_map_variant.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"variant\"\n            type=\"com.google.samples.apps.iosched.ui.map.MapVariant\" />\n\n        <variable\n            name=\"isChecked\"\n            type=\"Boolean\" />\n    </data>\n\n    <!-- Use larger paddingEnd because the icon makes the paddingStart seem larger than it is. -->\n    <CheckedTextView\n        android:id=\"@+id/map_variant_label\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?selectableItemBackground\"\n        android:checked=\"@{isChecked}\"\n        android:drawablePadding=\"@dimen/margin_normal\"\n        android:drawableTint=\"@color/map_variant_icon\"\n        android:fontFamily=\"@font/google_sans\"\n        android:gravity=\"center_vertical\"\n        android:minHeight=\"?listPreferredItemHeight\"\n        android:paddingEnd=\"@dimen/dialogPreferredPaddingLarge\"\n        android:paddingStart=\"?dialogPreferredPadding\"\n        android:text=\"@{variant.labelResId}\"\n        android:textAppearance=\"?textAppearanceListItem\"\n        android:textColor=\"@color/map_variant_text\"\n        app:variantIcon=\"@{variant.iconResId}\"\n        tools:checked=\"@sample/map_variants.json/variants/checked\"\n        tools:drawableStart=\"@drawable/ic_map_daytime\"\n        tools:targetApi=\"m\"\n        tools:text=\"@sample/map_variants.json/variants/title\">\n\n    </CheckedTextView>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_question.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"question\"\n            type=\"com.google.samples.apps.iosched.ui.sessiondetail.Question\" />\n\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/item_question\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"@dimen/margin_small\"\n        android:paddingEnd=\"@dimen/margin_normal\"\n        android:paddingStart=\"@dimen/margin_normal\"\n        android:paddingTop=\"@dimen/margin_small\">\n\n        <TextView\n            android:id=\"@+id/text\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@{question.text}\"\n            android:textAppearance=\"?textAppearanceListItem\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"How are you?\" />\n\n        <com.google.samples.apps.iosched.widget.SimpleRatingBar\n            android:id=\"@+id/rating\"\n            style=\"@style/Widget.AppCompat.SeekBar.Discrete\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:max=\"4\"\n            android:minHeight=\"@dimen/a11y_min_touch_target\"\n            android:progress=\"@{question.currentRating - 1}\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/text\" />\n\n        <TextView\n            android:id=\"@+id/labelStart\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@{question.labelStart}\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/rating\"\n            tools:text=\"Bad\" />\n\n        <TextView\n            android:id=\"@+id/labelEnd\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@{question.labelEnd}\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/rating\"\n            tools:text=\"Good\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_schedule_day_indicator.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"indicator\"\n            type=\"com.google.samples.apps.iosched.ui.schedule.DayIndicator\" />\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.schedule.ScheduleViewModel\" />\n    </data>\n\n    <CheckedTextView\n        android:id=\"@android:id/title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"@dimen/a11y_min_touch_target\"\n        android:minWidth=\"@dimen/a11y_min_touch_target\"\n        android:background=\"?selectableItemBackgroundBorderless\"\n        android:checked=\"@{indicator.checked}\"\n        android:enabled=\"@{indicator.enabled}\"\n        android:gravity=\"center\"\n        android:onClick=\"@{() -> viewModel.scrollToStartOfDay(indicator.day)}\"\n        android:textAlignment=\"center\"\n        android:textAppearance=\"?textAppearanceBody1\"\n        android:textColor=\"@color/schedule_day_indicator_text\"\n        android:paddingLeft=\"@dimen/spacing_normal\"\n        android:paddingRight=\"@dimen/spacing_normal\"\n        app:inConferenceTimeZone=\"@{viewModel.isConferenceTimeZone}\"\n        app:indicatorText=\"@{indicator}\"\n        tools:checked=\"@sample/day_indicator.json/indicators/checked\"\n        tools:text=\"@sample/day_indicator.json/indicators/label\" />\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_session.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <import type=\"kotlinx.coroutines.flow.StateFlow\" />\n\n        <variable\n            name=\"userSession\"\n            type=\"com.google.samples.apps.iosched.model.userdata.UserSession\" />\n\n        <variable\n            name=\"sessionClickListener\"\n            type=\"com.google.samples.apps.iosched.ui.sessioncommon.OnSessionClickListener\" />\n\n        <variable\n            name=\"sessionStarClickListener\"\n            type=\"com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickListener\" />\n\n        <variable\n            name=\"showReservations\"\n            type=\"StateFlow&lt;Boolean&gt;\" />\n\n        <variable\n            name=\"timeZoneId\"\n            type=\"StateFlow&lt;org.threeten.bp.ZoneId&gt;\" />\n\n        <variable\n            name=\"showTime\"\n            type=\"Boolean\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?selectableItemBackground\"\n        android:onClick=\"@{() -> sessionClickListener.openEventDetail(userSession.session.id)}\"\n        android:paddingBottom=\"@dimen/schedule_item_padding_vertical\"\n        android:paddingTop=\"@dimen/schedule_item_padding_vertical\"\n        tools:targetApi=\"o\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"?sessionListKeyline\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/margin_small\" />\n\n        <TextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@{userSession.session.title}\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"?textAppearanceListItem\"\n            app:layout_constraintEnd_toStartOf=\"@+id/bookmark_session\"\n            app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"What's new in Android\" />\n\n        <com.google.android.material.internal.CheckableImageButton\n            android:id=\"@+id/bookmark_session\"\n            android:layout_width=\"@dimen/a11y_min_touch_target\"\n            android:layout_height=\"@dimen/a11y_min_touch_target\"\n            android:background=\"?selectableItemBackgroundBorderless\"\n            android:checked=\"@{userSession.userEvent.isStarred}\"\n            android:contentDescription=\"@string/a11y_star\"\n            android:onClick=\"@{() -> sessionStarClickListener.onStarClicked(userSession)}\"\n            android:src=\"@drawable/asld_star_event\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <com.google.samples.apps.iosched.ui.reservation.ReservationTextView\n            android:id=\"@+id/reservation_status\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/spacing_micro\"\n            android:drawablePadding=\"@dimen/spacing_normal\"\n            android:gravity=\"center_vertical\"\n            android:textAppearance=\"@style/TextAppearance.IOSched.ReservationStatus\"\n            app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/title\"\n            app:isReservable=\"@{userSession.session.isReservable}\"\n            app:reservationStatus=\"@{userSession.userEvent}\"\n            app:showReservations=\"@{showReservations}\"\n            tools:drawableStart=\"@drawable/ic_reserved\"\n            tools:text=\"Reserved\"\n            tools:visibility=\"visible\" />\n\n        <ImageView\n            android:id=\"@+id/livestream_icon\"\n            android:layout_width=\"18dp\"\n            android:layout_height=\"24dp\"\n            android:layout_marginEnd=\"14dp\"\n            android:importantForAccessibility=\"no\"\n            android:scaleType=\"centerCrop\"\n            app:layout_constraintBottom_toTopOf=\"@id/tags_barrier\"\n            app:layout_constraintEnd_toStartOf=\"@id/length_location\"\n            app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/reservation_status\"\n            app:goneUnless=\"@{userSession.session.isLivestream}\"\n            app:srcCompat=\"@drawable/ic_livestreamed\" />\n\n        <TextView\n            android:id=\"@+id/length_location\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:textAlignment=\"viewStart\"\n            app:layout_constraintBottom_toTopOf=\"@id/tags_barrier\"\n            app:layout_constraintEnd_toStartOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toEndOf=\"@id/livestream_icon\"\n            app:layout_constraintTop_toBottomOf=\"@id/reservation_status\"\n            app:showTime=\"@{showTime}\"\n            app:sessionRoom=\"@{userSession.session.room}\"\n            app:sessionStart=\"@{userSession.session.startTime}\"\n            app:timeZoneId=\"@{timeZoneId}\"\n            tools:text=\"May 7 / Amphitheatre\" />\n\n        <androidx.constraintlayout.widget.Barrier\n            android:id=\"@+id/tags_barrier\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:barrierDirection=\"bottom\"\n            app:constraint_referenced_ids=\"livestream_icon,length_location\" />\n\n        <com.google.samples.apps.iosched.widget.NoTouchRecyclerView\n            android:id=\"@+id/tags\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/spacing_micro\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintEnd_toStartOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toEndOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/tags_barrier\"\n            app:topicTags=\"@{userSession.session.displayTags}\"\n            tools:itemCount=\"3\"\n            tools:layoutManager=\"LinearLayoutManager\"\n            tools:listitem=\"@layout/item_inline_tag\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_session_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailViewModel\" />\n\n        <variable\n            name=\"tagViewPool\"\n            type=\"androidx.recyclerview.widget.RecyclerView.RecycledViewPool\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:paddingBottom=\"@dimen/margin_normal\"\n        android:paddingTop=\"24dp\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/margin_normal\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n        <TextView\n            android:id=\"@+id/session_detail_title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@{viewModel.session.title}\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"@style/TextAppearance.IOSched.H1\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"Architecture Components: Solving the Lifecycle Problem\" />\n\n        <TextView\n            android:id=\"@+id/session_detail_time\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"24dp\"\n            android:textAlignment=\"viewStart\"\n            android:textAppearance=\"?textAppearanceBody2\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/session_detail_title\"\n            app:sessionDetailEndTime=\"@{viewModel.session.endTime}\"\n            app:sessionDetailStartTime=\"@{viewModel.session.startTime}\"\n            app:timeZoneId=\"@{viewModel.timeZoneId}\"\n            tools:text=\"Tuesday, May 7, 11 am - 12 pm\" />\n\n        <TextView\n            android:id=\"@+id/session_detail_room\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/spacing_micro\"\n            android:text=\"@{viewModel.session.room.name}\"\n            android:textAppearance=\"?textAppearanceBody2\"\n            app:layout_constrainedWidth=\"true\"\n            app:layout_constraintBottom_toTopOf=\"@id/session_detail_level_barrier\"\n            app:layout_constraintEnd_toStartOf=\"@id/session_detail_recorded\"\n            app:layout_constraintHorizontal_bias=\"0\"\n            app:layout_constraintHorizontal_chainStyle=\"packed\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/session_detail_time\"\n            tools:text=\"Stage 3\" />\n\n        <ImageView\n            android:id=\"@+id/session_detail_recorded\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/spacing_normal\"\n            android:layout_marginTop=\"@dimen/spacing_micro\"\n            android:importantForAccessibility=\"no\"\n            app:layout_constraintBottom_toTopOf=\"@id/session_detail_level_barrier\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toEndOf=\"@id/session_detail_room\"\n            app:layout_constraintTop_toBottomOf=\"@id/session_detail_time\"\n            app:goneUnless=\"@{viewModel.session.isLivestream}\"\n            app:srcCompat=\"@drawable/ic_livestreamed\" />\n\n        <androidx.constraintlayout.widget.Barrier\n            android:id=\"@+id/session_detail_level_barrier\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:barrierDirection=\"bottom\"\n            app:constraint_referenced_ids=\"session_detail_room,session_detail_recorded\" />\n\n        <TextView\n            android:id=\"@+id/session_detail_level\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/spacing_micro\"\n            android:text=\"@{viewModel.session.levelTag.displayName}\"\n            android:textAppearance=\"?textAppearanceBody2\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/session_detail_level_barrier\"\n            app:goneUnless=\"@{viewModel.session.levelTag != null}\"\n            tools:text=\"Intermediate\" />\n\n        <TextView\n            android:id=\"@+id/session_detail_countdown_timer\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/session_detail_level\"\n            app:sessionStartCountdown=\"@{viewModel.timeUntilStart}\"\n            tools:text=\"5 minutes\" />\n\n        <TextView\n            android:id=\"@+id/session_detail_description\"\n            style=\"@style/Widget.IOSched.MultilineBody\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:paddingTop=\"@dimen/spacing_normal\"\n            android:text=\"@{viewModel.session.description}\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/session_detail_level\"\n            tools:text=\"@tools:sample/lorem[25]\" />\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/tags\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/spacing_normal\"\n            android:orientation=\"horizontal\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@+id/session_detail_description\"\n            app:flexDirection=\"row\"\n            app:flexWrap=\"wrap\"\n            app:layoutManager=\"com.google.android.flexbox.FlexboxLayoutManager\"\n            app:topicTags=\"@{viewModel.session.displayTags}\" />\n\n        <Button\n            android:id=\"@+id/session_detail_feedback_button\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/spacing_normal\"\n            android:onClick=\"@{() -> viewModel.onFeedbackClicked()}\"\n            android:text=\"@string/rate_session\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/tags\"\n            app:goneUnless=\"@{viewModel.showFeedbackButton}\"\n            tools:text=\"Rate Session\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_speaker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<layout 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\n    <data>\n\n        <variable\n            name=\"speaker\"\n            type=\"com.google.samples.apps.iosched.model.Speaker\" />\n\n        <variable\n            name=\"eventListener\"\n            type=\"com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailEventListener\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?selectableItemBackground\"\n        android:onClick=\"@{() -> eventListener.onSpeakerClicked(speaker.id)}\"\n        android:paddingTop=\"@dimen/spacing_normal\"\n        android:paddingBottom=\"@dimen/spacing_normal\" >\n\n        <!--\n        Using the speaker's id as the transition name so when there are multiple speakers the id is\n        unique, thus preventing conflicts with the transition name. See item_speaker_info.xml for\n        the corresponding shared element.\n         -->\n        <ImageView\n            android:id=\"@+id/speaker_item_headshot\"\n            android:layout_width=\"@dimen/speaker_headshot_size\"\n            android:layout_height=\"@dimen/speaker_headshot_size\"\n            android:layout_marginStart=\"@dimen/margin_normal\"\n            android:importantForAccessibility=\"no\"\n            android:transitionName=\"@{speaker.id}\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:speakerImage=\"@{speaker}\"\n            tools:src=\"@drawable/ic_default_avatar_1\" />\n\n        <TextView\n            android:id=\"@+id/speaker_item_name\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginStart=\"@dimen/margin_normal\"\n            android:textAlignment=\"viewStart\"\n            android:text=\"@{speaker.name}\"\n            android:textAppearance=\"?textAppearanceListItem\"\n            app:layout_constraintBottom_toTopOf=\"@id/speaker_item_company\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@+id/speaker_item_headshot\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"Speaker Name\" />\n\n        <TextView\n            android:id=\"@+id/speaker_item_company\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"@dimen/spacing_micro\"\n            android:text=\"@{speaker.company}\"\n            android:textAlignment=\"viewStart\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"@id/speaker_item_name\"\n            app:layout_constraintTop_toBottomOf=\"@id/speaker_item_name\"\n            app:goneUnless=\"@{speaker.hasCompany}\"\n            tools:text=\"Speaker Company\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/item_speaker_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.speaker.SpeakerViewModel\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"@dimen/spacing_normal\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"@dimen/margin_normal\" />\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/guideline_end\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_end=\"@dimen/margin_normal\" />\n\n        <TextView\n            android:id=\"@+id/speaker_name\"\n            style=\"@style/Widget.IOSched.Speaker.Title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@{viewModel.speaker.name}\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"Nick Butcher\" />\n\n        <com.google.android.flexbox.FlexboxLayout\n            android:id=\"@+id/speaker_links\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"24dp\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/speaker_name\"\n            app:dividerDrawableVertical=\"@drawable/divider_slash\"\n            app:flexDirection=\"row\"\n            app:flexWrap=\"wrap\"\n            app:showDividerVertical=\"middle\">\n\n            <Button\n                android:id=\"@+id/speaker_link_website\"\n                style=\"@style/Widget.IOSched.Speaker.SocialButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/speaker_link_website\"\n                android:visibility=\"gone\"\n                app:hideWhenEmpty=\"@{true}\"\n                app:websiteLink=\"@{viewModel.speaker.websiteUrl}\"\n                tools:visibility=\"visible\" />\n\n            <Button\n                android:id=\"@+id/speaker_link_twitter\"\n                style=\"@style/Widget.IOSched.Speaker.SocialButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/speaker_link_twitter\"\n                android:visibility=\"gone\"\n                app:hideWhenEmpty=\"@{true}\"\n                app:websiteLink=\"@{viewModel.speaker.twitterUrl}\"\n                tools:visibility=\"visible\" />\n\n            <Button\n                android:id=\"@+id/speaker_link_github\"\n                style=\"@style/Widget.IOSched.Speaker.SocialButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/speaker_link_github\"\n                android:visibility=\"gone\"\n                app:hideWhenEmpty=\"@{true}\"\n                app:websiteLink=\"@{viewModel.speaker.githubUrl}\"\n                tools:visibility=\"visible\" />\n\n            <Button\n                android:id=\"@+id/speaker_link_linkedin\"\n                style=\"@style/Widget.IOSched.Speaker.SocialButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/speaker_link_linkedin\"\n                android:visibility=\"gone\"\n                app:hideWhenEmpty=\"@{true}\"\n                app:websiteLink=\"@{viewModel.speaker.linkedInUrl}\"\n                tools:visibility=\"visible\" />\n\n        </com.google.android.flexbox.FlexboxLayout>\n\n        <TextView\n            android:id=\"@+id/speaker_bio\"\n            style=\"@style/Widget.IOSched.MultilineBody\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@{viewModel.speaker.biography}\"\n            android:textAlignment=\"viewStart\"\n            android:textColor=\"?android:textColorPrimary\"\n            app:layout_constraintEnd_toEndOf=\"@id/guideline_end\"\n            app:layout_constraintStart_toStartOf=\"@id/guideline_start\"\n            app:layout_constraintTop_toBottomOf=\"@id/speaker_links\"\n            tools:text=\"@tools:sample/lorem[25]\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/navigation_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <LinearLayout\n        android:id=\"@+id/navigation_header\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:id=\"@+id/io_logo\"\n            android:layout_width=\"@dimen/nav_header_logo_size\"\n            android:layout_height=\"@dimen/nav_header_logo_size\"\n            android:layout_marginBottom=\"@dimen/margin_normal\"\n            android:layout_marginStart=\"@dimen/nav_item_horizontal_padding\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:contentDescription=\"@string/onboarding_welcome_to_google_i_o\"\n            app:srcCompat=\"@drawable/io_logo_color\" />\n\n        <View\n            android:id=\"@+id/divider\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1dp\"\n            android:background=\"?android:attr/listDivider\" />\n\n    </LinearLayout>\n\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/navigation_rail_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<ImageView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"48dp\"\n    android:layout_height=\"48dp\"\n    android:contentDescription=\"@null\"\n    app:srcCompat=\"@drawable/io_logo_color\" />\n"
  },
  {
    "path": "mobile/src/main/res/layout/search_active_filters_narrow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.search.SearchViewModel\" />\n    </data>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/active_filters\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:clipToPadding=\"false\"\n        android:orientation=\"horizontal\"\n        android:paddingHorizontal=\"12dp\"\n        android:paddingVertical=\"@dimen/spacing_micro\"\n        app:activeFilters=\"@{viewModel.selectedFilterChips}\"\n        app:goneUnless=\"@{viewModel.hasAnyFilters}\"\n        app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\"\n        app:viewModel=\"@{viewModel}\"\n        tools:itemCount=\"3\"\n        tools:listitem=\"@layout/item_filter_chip_closeable\"\n        tools:visibility=\"visible\" />\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout/search_active_filters_wide.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"viewModel\"\n            type=\"com.google.samples.apps.iosched.ui.search.SearchViewModel\" />\n    </data>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/active_filters\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fadingEdgeLength=\"12dp\"\n        android:orientation=\"horizontal\"\n        android:paddingHorizontal=\"@dimen/spacing_micro\"\n        android:paddingVertical=\"@dimen/spacing_micro\"\n        android:requiresFadingEdge=\"horizontal\"\n        app:activeFilters=\"@{viewModel.selectedFilterChips}\"\n        app:goneUnless=\"@{viewModel.hasAnyFilters}\"\n        app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\"\n        app:viewModel=\"@{viewModel}\"\n        tools:layout_width=\"match_parent\"\n        tools:itemCount=\"3\"\n        tools:listitem=\"@layout/item_filter_chip_closeable\" />\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/layout-w500dp/event_card_content.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<merge\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    tools:style=\"@style/Widget.IOSched.EventCardView\"\n    tools:layout_width=\"match_parent\"\n    tools:layout_height=\"wrap_content\"\n    tools:parentTag=\"com.google.android.material.card.MaterialCardView\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <androidx.constraintlayout.widget.Guideline\n            android:id=\"@+id/keyline\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            app:layout_constraintGuide_begin=\"192dp\" />\n\n        <ImageView\n            android:id=\"@+id/header_image\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:contentDescription=\"@null\"\n            android:scaleType=\"fitCenter\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toStartOf=\"@id/keyline\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:srcCompat=\"@drawable/event_header_sessions\" />\n\n        <TextView\n            android:id=\"@+id/event_title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginStart=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@string/event_sessions_title\"\n            android:textAppearance=\"@style/TextAppearance.IOSched.H3\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"@+id/keyline\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <TextView\n            android:id=\"@+id/event_description\"\n            style=\"@style/Widget.IOSched.MultilineBody\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:layout_marginStart=\"@dimen/margin_normal\"\n            android:layout_marginTop=\"@dimen/margin_normal\"\n            android:text=\"@string/event_sessions_description\"\n            app:layout_constraintBottom_toTopOf=\"@id/action_button\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"@+id/keyline\"\n            app:layout_constraintTop_toBottomOf=\"@id/event_title\"\n            app:layout_goneMarginBottom=\"@dimen/margin_normal\" />\n\n        <Button\n            android:id=\"@+id/action_button\"\n            style=\"?borderlessButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/margin_normal\"\n            android:visibility=\"gone\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/event_description\"\n            tools:text=\"@string/view_sessions_text\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</merge>\n"
  },
  {
    "path": "mobile/src/main/res/layout-w720dp/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/root_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <FrameLayout\n        android:id=\"@+id/content_container\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@+id/navigation_rail\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/nav_host_fragment\"\n            android:name=\"com.google.samples.apps.iosched.ui.DispatchInsetsNavHostFragment\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:defaultNavHost=\"true\"\n            app:navGraph=\"@navigation/nav_graph\" />\n\n        <View\n            android:id=\"@+id/status_bar_scrim\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:background=\"@color/status_bar_scrim\" />\n\n        <com.google.samples.apps.iosched.widget.FadingSnackbar\n            android:id=\"@+id/snackbar\"\n            android:layout_width=\"@dimen/snackbar_width\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"@dimen/snackbar_margin_end_fab\"\n            android:visibility=\"gone\" />\n\n    </FrameLayout>\n\n    <com.google.android.material.navigationrail.NavigationRailView\n        android:id=\"@+id/navigation_rail\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:headerLayout=\"@layout/navigation_rail_header\"\n        app:menu=\"@menu/bar_navigation\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "mobile/src/main/res/layout-w840dp/item_codelab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<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\n    <data>\n\n        <variable\n            name=\"codelab\"\n            type=\"com.google.samples.apps.iosched.model.Codelab\" />\n\n        <variable\n            name=\"actionHandler\"\n            type=\"com.google.samples.apps.iosched.ui.codelabs.CodelabsActionsHandler\" />\n    </data>\n\n    <com.google.android.material.card.MaterialCardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:onClick=\"@{() -> actionHandler.startCodelab(codelab)}\"\n        app:contentPadding=\"@dimen/margin_normal\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:minHeight=\"?listPreferredItemHeight\">\n\n            <ImageView\n                android:id=\"@+id/codelab_icon\"\n                android:layout_width=\"32dp\"\n                android:layout_height=\"32dp\"\n                android:contentDescription=\"@null\"\n                android:layout_marginEnd=\"@dimen/margin_normal\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@id/codelab_title\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:imageUrl=\"@{codelab.iconUrl}\"\n                app:placeholder=\"@{@drawable/ic_nav_codelabs}\"\n                tools:src=\"@drawable/ic_nav_codelabs\" />\n\n            <TextView\n                android:id=\"@+id/codelab_title\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@{codelab.title}\"\n                android:textAlignment=\"viewStart\"\n                android:textAppearance=\"?textAppearanceListItem\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/codelab_icon\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                tools:text=\"@sample/codelabs.json/codelabs/title\" />\n\n            <TextView\n                android:id=\"@+id/codelab_duration\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/spacing_micro\"\n                app:layout_constraintStart_toStartOf=\"@id/codelab_title\"\n                app:layout_constraintTop_toBottomOf=\"@id/codelab_title\"\n                app:codelabDuration=\"@{codelab.durationMinutes}\"\n                tools:text=\"@sample/codelabs.json/codelabs/duration\"\n                tools:visibility=\"visible\" />\n\n            <com.google.samples.apps.iosched.widget.NoTouchRecyclerView\n                android:id=\"@+id/codelab_tags\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"@id/codelab_title\"\n                app:layout_constraintTop_toBottomOf=\"@id/codelab_duration\"\n                app:topicTags=\"@{codelab.tags}\"\n                tools:itemCount=\"3\"\n                tools:layoutManager=\"LinearLayoutManager\"\n                tools:listitem=\"@layout/item_inline_tag\" />\n\n            <TextView\n                android:id=\"@+id/codelab_description\"\n                style=\"@style/Widget.IOSched.MultilineBody\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/margin_normal\"\n                android:text=\"@{codelab.description}\"\n                android:textAlignment=\"viewStart\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"@id/codelab_title\"\n                app:layout_constraintTop_toBottomOf=\"@id/codelab_tags\"\n                tools:text=\"@sample/codelabs.json/codelabs/description\"\n                tools:visibility=\"visible\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </com.google.android.material.card.MaterialCardView>\n</layout>\n"
  },
  {
    "path": "mobile/src/main/res/menu/bar_navigation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\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/navigation_schedule\"\n        android:icon=\"@drawable/ic_nav_schedule\"\n        android:title=\"@string/title_schedule\"\n        app:contentDescription=\"@string/title_schedule\" />\n\n    <item\n        android:id=\"@id/navigation_agenda\"\n        android:icon=\"@drawable/ic_nav_agenda\"\n        android:title=\"@string/agenda\"\n        app:contentDescription=\"@string/agenda\" />\n\n    <item\n        android:id=\"@id/navigation_codelabs\"\n        android:icon=\"@drawable/ic_nav_codelabs\"\n        android:title=\"@string/event_codelabs_title\"\n        app:contentDescription=\"@string/event_codelabs_title\" />\n\n    <item\n        android:id=\"@id/navigation_map\"\n        android:icon=\"@drawable/ic_nav_map\"\n        android:title=\"@string/title_map\"\n        app:contentDescription=\"@string/title_map\" />\n\n    <item\n        android:id=\"@id/navigation_settings\"\n        android:icon=\"@drawable/ic_nav_settings\"\n        android:title=\"@string/settings_title\"\n        app:contentDescription=\"@string/settings_title\" />\n\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/codelabs_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<menu 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\n    <item\n        android:id=\"@+id/action_see_on_map\"\n        android:icon=\"@drawable/ic_nav_map\"\n        android:title=\"@string/codelabs_building\"\n        app:showAsAction=\"ifRoom|withText\"\n        tools:ignore=\"HardcodedText\" />\n    <item\n        android:id=\"@+id/action_codelabs_website\"\n        android:icon=\"@drawable/ic_launch\"\n        android:title=\"@string/codelabs_website\"\n        app:showAsAction=\"ifRoom|withText\"\n        tools:ignore=\"HardcodedText\" />\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/drawer_navigation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <group\n        android:id=\"@+id/nav_first_group\"\n        android:checkableBehavior=\"single\">\n\n        <item\n            android:id=\"@id/navigation_feed\"\n            android:icon=\"@drawable/ic_nav_home\"\n            android:title=\"@string/title_home\"\n            app:contentDescription=\"@string/title_home\" />\n\n        <item\n            android:id=\"@id/navigation_schedule\"\n            android:icon=\"@drawable/ic_nav_schedule\"\n            android:title=\"@string/title_schedule\"\n            app:contentDescription=\"@string/title_schedule\" />\n\n        <item\n            android:id=\"@id/navigation_agenda\"\n            android:icon=\"@drawable/ic_nav_agenda\"\n            android:title=\"@string/agenda\"\n            app:contentDescription=\"@string/agenda\" />\n\n        <item\n            android:id=\"@id/navigation_codelabs\"\n            android:icon=\"@drawable/ic_nav_codelabs\"\n            android:title=\"@string/event_codelabs_title\"\n            app:contentDescription=\"@string/event_codelabs_title\" />\n\n        <item\n            android:id=\"@id/navigation_map\"\n            android:icon=\"@drawable/ic_nav_map\"\n            android:title=\"@string/title_map\"\n            app:contentDescription=\"@string/title_map\" />\n\n        <item\n            android:id=\"@id/navigation_explore_ar\"\n            android:icon=\"@drawable/ic_nav_signpost\"\n            android:title=\"@string/title_explore_io\"\n            app:contentDescription=\"@string/title_explore_io\" />\n    </group>\n\n    <group\n        android:id=\"@+id/nav_second_group\"\n        android:checkableBehavior=\"single\">\n\n        <item\n            android:id=\"@id/navigation_info\"\n            android:icon=\"@drawable/ic_nav_info\"\n            android:title=\"@string/title_info\"\n            app:contentDescription=\"@string/title_info\" />\n\n        <item\n            android:id=\"@id/navigation_settings\"\n            android:icon=\"@drawable/ic_nav_settings\"\n            android:title=\"@string/settings_title\"\n            app:contentDescription=\"@string/settings_title\" />\n    </group>\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/map_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<menu\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\n    <item\n        android:id=\"@+id/action_my_location\"\n        android:icon=\"@drawable/ic_my_location\"\n        android:title=\"@string/enable_my_location\"\n        android:visible=\"false\"\n        app:showAsAction=\"always\"\n        tools:visible=\"true\" />\n\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/profile.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<menu 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\n    <!-- Use a large orderInCategory to make it the last item if other menu items are inflated into\n         the same toolbar.\n         No title because it flickers when loading the image. Content description is set at runtime.\n    -->\n    <item\n        android:id=\"@+id/action_profile\"\n        android:icon=\"@drawable/ic_default_profile_avatar\"\n        android:orderInCategory=\"99\"\n        app:showAsAction=\"always\"\n        tools:ignore=\"MenuTitle\" />\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/schedule_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<menu\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\n    <item\n        android:id=\"@+id/search\"\n        android:icon=\"@drawable/ic_search\"\n        android:title=\"@string/a11y_search_schedule\"\n        android:visible=\"false\"\n        app:showAsAction=\"collapseActionView|always\"\n        tools:visible=\"true\" />\n\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/search_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<!-- TODO(jdkoren): Temporary. Figure out affordance for opening filters sheet. -->\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/action_open_filters\"\n        android:icon=\"@drawable/ic_tune\"\n        android:title=\"@string/filters\"\n        app:showAsAction=\"always\" />\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/menu/session_detail_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<menu 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    tools:ignore=\"AlwaysShowAction,AppCompatResource\">\n    <!-- TODO re-enable AppCompatResource check when it works with androidx. b/80097706 -->\n\n    <item\n        android:id=\"@+id/menu_item_share\"\n        android:icon=\"@drawable/ic_share\"\n        android:title=\"@string/menu_item_share_session\"\n        app:showAsAction=\"always\" />\n\n    <item\n        android:id=\"@+id/menu_item_map\"\n        android:icon=\"@drawable/ic_nav_map\"\n        android:title=\"@string/menu_item_session_location\"\n        app:showAsAction=\"always\" />\n\n    <item\n        android:id=\"@+id/menu_item_star\"\n        android:icon=\"@drawable/ic_star_border\"\n        android:title=\"@string/menu_item_session_star\"\n        app:showAsAction=\"always\" />\n\n    <item\n        android:id=\"@+id/menu_item_ask_question\"\n        android:icon=\"@drawable/ic_question_answer\"\n        android:title=\"@string/ask_question\"\n        app:showAsAction=\"always\" />\n\n    <item\n        android:id=\"@+id/menu_item_calendar\"\n        android:icon=\"@drawable/ic_event\"\n        android:title=\"@string/menu_item_calendar\"\n        app:showAsAction=\"always\" />\n\n</menu>\n"
  },
  {
    "path": "mobile/src/main/res/navigation/nav_graph.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/nav_graph\"\n    app:startDestination=\"@id/navigation_schedule\">\n\n    <fragment\n        android:id=\"@id/navigation_schedule\"\n        android:name=\"com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneFragment\"\n        android:label=\"@string/title_schedule\"\n        tools:layout=\"@layout/fragment_schedule_two_pane\">\n    </fragment>\n\n    <fragment\n        android:id=\"@id/navigation_info\"\n        android:name=\"com.google.samples.apps.iosched.ui.info.InfoFragment\"\n        android:label=\"@string/title_info\"\n        tools:layout=\"@layout/fragment_info\" />\n\n    <fragment\n        android:id=\"@id/navigation_agenda\"\n        android:name=\"com.google.samples.apps.iosched.ui.agenda.AgendaFragment\"\n        android:label=\"@string/agenda\"\n        tools:layout=\"@layout/fragment_agenda\" />\n\n    <fragment\n        android:id=\"@id/navigation_settings\"\n        android:name=\"com.google.samples.apps.iosched.ui.settings.SettingsFragment\"\n        android:label=\"@string/settings_title\"\n        tools:layout=\"@layout/fragment_settings\" />\n\n    <fragment\n        android:id=\"@id/navigation_feed\"\n        android:name=\"com.google.samples.apps.iosched.ui.feed.FeedFragment\"\n        android:label=\"@string/title_home\"\n        tools:layout=\"@layout/fragment_feed\">\n        <action\n            android:id=\"@+id/to_session_detail\"\n            app:destination=\"@id/navigation_session_detail\" />\n        <action\n            android:id=\"@+id/to_schedule\"\n            app:destination=\"@id/navigation_schedule\" />\n        <action\n            android:id=\"@+id/to_map\"\n            app:destination=\"@id/navigation_map\">\n            <argument\n                android:name=\"featureId\"\n                android:defaultValue=\"@null\"\n                app:argType=\"string\"\n                app:nullable=\"true\" />\n            <argument\n                android:name=\"startTime\"\n                android:defaultValue=\"0L\"\n                app:argType=\"long\" />\n        </action>\n        <action\n            android:id=\"@+id/to_announcements_fragment\"\n            app:destination=\"@id/announcements_fragment\"\n            app:popUpTo=\"@id/navigation_feed\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@id/navigation_map\"\n        android:name=\"com.google.samples.apps.iosched.ui.map.MapFragment\"\n        android:label=\"@string/title_map\"\n        tools:layout=\"@layout/fragment_map\">\n        <!-- Navigation library doesn't allow nullable arguments of an enum type, so we have to use\n             the enum name instead.\n        -->\n        <argument\n            android:name=\"mapVariant\"\n            android:defaultValue=\"@null\"\n            app:argType=\"string\"\n            app:nullable=\"true\" />\n        <argument\n            android:name=\"featureId\"\n            android:defaultValue=\"@null\"\n            app:argType=\"string\"\n            app:nullable=\"true\" />\n        <argument\n            android:name=\"startTime\"\n            android:defaultValue=\"0L\"\n            app:argType=\"long\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@id/navigation_codelabs\"\n        android:name=\"com.google.samples.apps.iosched.ui.codelabs.CodelabsFragment\"\n        android:label=\"@string/event_codelabs_title\"\n        tools:layout=\"@layout/fragment_codelabs\">\n        <action\n            android:id=\"@+id/to_map\"\n            app:destination=\"@id/navigation_map_sublevel\">\n            <argument\n                android:name=\"mapVariant\"\n                android:defaultValue=\"DAY\"\n                app:argType=\"string\" />\n            <argument\n                android:name=\"featureId\"\n                android:defaultValue=\"codelabs\"\n                app:argType=\"string\" />\n        </action>\n    </fragment>\n\n    <!-- Map can be be shown as a non-top-level screen, e.g. when entering from Session Detail. In\n         these cases the back button navigates back through the sub-level screens, so we should show\n         the back/up arrow in the toolbar. We accomplish that by creating another destination using\n         the same MapFragment but a different ID.\n    -->\n    <fragment\n        android:id=\"@id/navigation_map_sublevel\"\n        android:name=\"com.google.samples.apps.iosched.ui.map.MapFragment\"\n        android:label=\"@string/title_map\"\n        tools:layout=\"@layout/fragment_map\" >\n        <!-- Unfortunately we have to duplicate the args. -->\n        <argument\n            android:name=\"mapVariant\"\n            android:defaultValue=\"@null\"\n            app:argType=\"string\"\n            app:nullable=\"true\" />\n        <argument\n            android:name=\"featureId\"\n            android:defaultValue=\"@null\"\n            app:argType=\"string\"\n            app:nullable=\"true\" />\n        <argument\n            android:name=\"startTime\"\n            android:defaultValue=\"0L\"\n            app:argType=\"long\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@id/navigation_no_network_ar\"\n        android:name=\"com.google.samples.apps.iosched.ui.ar.NoNetworkConnectionFragment\"\n        android:label=\"@string/no_network_connection\"\n        tools:layout=\"@layout/fragment_no_network\" />\n\n    <fragment\n        android:id=\"@id/navigation_phone_does_not_support_arcore\"\n        android:name=\"com.google.samples.apps.iosched.ui.ar.ArCoreNotSupportedFragment\"\n        android:label=\"@string/phone_does_not_support_arcore_title\"\n        tools:layout=\"@layout/fragment_arcore_not_supported\" />\n\n    <fragment\n        android:id=\"@+id/announcements_fragment\"\n        android:name=\"com.google.samples.apps.iosched.ui.feed.AnnouncementsFragment\"\n        android:label=\"@string/feed_announcement_title\"\n        tools:layout=\"@layout/fragment_announcements\" />\n</navigation>\n"
  },
  {
    "path": "mobile/src/main/res/navigation/schedule_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/schedule_detail_nav_graph\"\n    app:startDestination=\"@id/navigation_placeholder\">\n\n    <!-- This is a global action since we can go to a session's detail regardless of the current\n         destination. Use popUpTo and popUpToInclusive to avoid creating stacks of session details\n         (e.g. by the user tapping on related sessions, or tapping a speaker and then tapping one of\n         their other sessions).\n    -->\n    <action\n        android:id=\"@+id/to_session_detail\"\n        app:destination=\"@id/navigation_session_detail\"\n        app:popUpTo=\"@id/navigation_session_detail\"\n        app:popUpToInclusive=\"true\" />\n\n    <fragment\n        android:id=\"@id/navigation_session_detail\"\n        android:name=\"com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailFragment\"\n        tools:layout=\"@layout/fragment_session_detail\">\n        <argument\n            android:name=\"session_id\"\n            app:argType=\"string\" />\n        <action\n            android:id=\"@+id/to_speaker_detail\"\n            app:destination=\"@id/navigation_speaker_detail\" />\n        <!-- TODO support navigating to the Map -->\n    </fragment>\n\n    <fragment\n        android:id=\"@id/navigation_speaker_detail\"\n        android:name=\"com.google.samples.apps.iosched.ui.speaker.SpeakerFragment\"\n        tools:layout=\"@layout/fragment_speaker\">\n        <argument\n            android:name=\"speaker_id\"\n            app:argType=\"string\" />\n    </fragment>\n\n    <!-- Use an empty start destination until we can load and show the first session detail. -->\n    <fragment\n        android:id=\"@+id/navigation_placeholder\"\n        android:name=\"androidx.fragment.app.Fragment\" />\n\n</navigation>\n"
  },
  {
    "path": "mobile/src/main/res/navigation/schedule_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/schedule_list_nav_graph\"\n    app:startDestination=\"@id/navigation_schedule_list\">\n\n    <fragment\n        android:id=\"@+id/navigation_schedule_list\"\n        android:name=\"com.google.samples.apps.iosched.ui.schedule.ScheduleFragment\"\n        android:label=\"@string/title_schedule\"\n        tools:layout=\"@layout/fragment_schedule\">\n        <action\n            android:id=\"@+id/to_search\"\n            app:destination=\"@id/navigation_schedule_search\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/navigation_schedule_search\"\n        android:name=\"com.google.samples.apps.iosched.ui.search.SearchFragment\"\n        tools:layout=\"@layout/fragment_search\" />\n</navigation>\n"
  },
  {
    "path": "mobile/src/main/res/raw/map_markers_concert.json",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"id\": \"mothers_room4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mother's Room\",\n        \"icon\": \"map_marker_mothers_room\",\n        \"description\": \"Mothers who are nursing are welcome to attend the conference with their child. There will be four first-come, first-served mothers' rooms available throughout the venue. Please see the conference help desk for more information.<br/><br/>This room will be open on<br/><b>May 7</b>: 7am - 7pm<br/><b>May 8</b>: 8am - 10pm<br/><b>May 9</b>: 8am - 5pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08032388,\n          37.42602807\n        ]\n      }\n    },\n    {\n      \"id\": \"info_desk\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Information Desk\",\n        \"icon\": \"map_marker_info\",\n        \"description\": \"If you have any questions about the event, you can ask the Staff members at the Info Desk for help.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07976195,\n          37.42630471\n        ]\n      }\n    },\n    {\n      \"id\": \"shuttle\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Attendee Shuttles\",\n        \"label\": \"Shuttles\",\n        \"description\": \"Free event shuttles from all Google recommended hotels will be provided for Google I/O attendees. There will also be select service from San Francisco, Millbrae BART, Mountain View Caltrain, San Jose, and Oakland. We are increasing the shuttle frequency and capacity at the Mountain View Caltrain and Millbrae Bart stations. Please see the Google I/O 2019 event website and app for detailed shuttles schedules and pick-up/drop-off locations.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07656175,\n          37.42589921\n        ]\n      }\n    },\n    {\n      \"id\": \"io_landmark\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"I/O Landmark\",\n        \"description\": \"See the I/O Landmark come to life in AR. Celebrate by sharing your photos with <b>#io19</b>.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07945015,\n          37.42609171\n        ]\n      }\n    },\n    {\n      \"id\": \"lot_a\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Parking Lot A\",\n        \"label\": \"Lot A\",\n        \"description\": \"Parking Lot A hosts several I/O related services including Registration, Accessibility & Expectant Mothers' Parking, Bike Parking, and Bag/Coat Check.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077082,\n          37.427511\n        ]\n      }\n    },\n    {\n      \"id\": \"lot_b\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Parking Lot B\",\n        \"label\": \"Lot B\",\n        \"description\": \"Attendee shuttles drop-off and pick-up point.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0759549,\n          37.42640243\n        ]\n      }\n    },\n    {\n      \"id\": \"medical1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"First Aid station\",\n        \"icon\": \"map_marker_medical\",\n        \"description\": \"If you need any medical assistance throughout the event, please make your way to the Medical station. If you’re unable to commute or you’re not feeling well, ask any Staff member for help.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08038389,\n          37.42596843\n        ]\n      }\n    },\n    {\n      \"id\": \"medical2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"First Aid station\",\n        \"icon\": \"map_marker_medical\",\n        \"description\": \"If you need any medical assistance throughout the event, please make your way to the Medical station. If you’re unable to commute or you’re not feeling well, ask any Staff member for help.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08020921,\n          37.42390811\n        ]\n      }\n    },\n    {\n      \"id\": \"rideshare\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Rideshare pick-up & drop-off\",\n        \"label\": \"Rideshare\",\n        \"description\": \"Download the Uber or Lyft app and use discount code: <b>IO2019</b><br/><br/>This code is valid from May 7-9, 2019 for shared rides with <b>Lyft Shared</b> and <b>UberPool</b>. It’s redeemable for up to $15 per trip and for up to 600 users per day. Rides must begin or end at Shoreline Amphitheatre.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08050862,\n          37.42311652\n        ]\n      }\n    },\n    {\n      \"id\": \"bike_parking\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Bike Parking\",\n        \"description\": \"Complimentary bike parking will be available to attendees during event hours at Shoreline Amphitheatre in Parking Lot A.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07678337,\n          37.42664925\n        ]\n      }\n    },\n    {\n      \"id\": \"coat_check\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Bag/Coat Check\",\n        \"description\": \"Complimentary bag and coat check will be available to attendees during event hours at Shoreline Amphitheatre in Parking Lot A.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077001,\n          37.426289\n        ]\n      }\n    },\n    {\n      \"id\": \"concert\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"After Hours Concert\",\n        \"label\": \"Concert\",\n        \"description\": \"Enjoy a private musical experience just for I/O attendees! Stay tuned for more details about this year's performance!\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080696,\n          37.426793\n        ]\n      }\n    },\n    {\n      \"id\": \"drinks1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Beer/Wine Trailers\",\n        \"icon\": \"map_marker_drink\",\n        \"description\": \"Come grab a drink from our selection of beers and wines.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.081289,\n          37.426141\n        ]\n      }\n    },\n    {\n      \"id\": \"concession1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Concession stand\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a bite at one of the concession stands found around the concourse from 7pm - 9:30pm.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0815054,\n          37.42604512\n        ]\n      }\n    },\n    {\n      \"id\": \"concession2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Concession stand\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a bite at one of the concession stands found around the concourse from 7pm - 9:30pm.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080377,\n          37.426185\n        ]\n      }\n    },\n    {\n      \"id\": \"concession3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Concession stand\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a bite at one of the concession stands found around the concourse from 7pm - 9:30pm.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07985014,\n          37.42676267\n        ]\n      }\n    },\n    {\n      \"id\": \"concession4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Concession stand\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a bite at one of the concession stands found around the concourse from 7pm - 9:30pm.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080046,\n          37.427616\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080374,\n          37.427546\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079669,\n          37.426839\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.081553,\n          37.42629167\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom5\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0801777,\n          37.42606029\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_concert_entrance\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Entrance\",\n        \"subtitle\": \"Concert\",\n        \"icon\": \"map_marker_handicap\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07986757,\n          37.42661011\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079644,\n          37.42669\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08007813,\n          37.4260792\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_parking_entrance\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Parking Entrance\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"When arriving at the venue, follow signs for Accessibility Parking. Please have your placard hanging from your rearview mirror and visible to parking employees at all times to expedite the parking process. Accessible parking spaces are readily available on a first-come, first-served basis and may not be reserved in advance.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077945,\n          37.426766\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_shuttle\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Shuttle Pickup\",\n        \"icon\": \"map_marker_handicap\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07933918,\n          37.42635051\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_parking\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility / Expectant Mothers\",\n        \"subtitle\": \"Parking\",\n        \"label\": \"Accessibility &\\nExpectant Mothers\",\n        \"description\": \"Designated parking in Lot A for Accessibility and Expectant Mothers. When arriving at the venue, follow signs for Accessibility Parking. Accessible parking spaces are readily available on a first-come, first-served basis and may not be reserved in advance.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07710657,\n          37.42703931\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "mobile/src/main/res/raw/map_markers_day.json",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"id\": \"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Amphitheatre\",\n        \"description\": \"Attend the two Keynotes on May 7: The Google Keynote will feature our latest product and platform innovations led by Sundar Pichai, CEO, Google. The Developer Keynote will focus specifically on updates to our developer products and platforms.<br/><br/>The Amphitheatre will also host breakout Sessions throughout the three days of the event, and the After Hours concert on Day 2.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080725,\n          37.4268969\n        ]\n      }\n    },\n    {\n      \"id\": \"359b19a7-b164-4468-a800-e79f465966bf\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Stage 1\",\n        \"icon\": \"map_marker_1\",\n        \"description\": \"Attend 40-minute Sessions throughout the three days of the event. Check the schedule for more details on topics and speakers.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080294,\n          37.42555547\n        ]\n      }\n    },\n    {\n      \"id\": \"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Stage 2\",\n        \"icon\": \"map_marker_2\",\n        \"description\": \"Attend 40-minute Sessions throughout the three days of the event. Check the schedule for more details on topics and speakers.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080294,\n          37.425053\n        ]\n      }\n    },\n    {\n      \"id\": \"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Stage 3\",\n        \"icon\": \"map_marker_3\",\n        \"description\": \"Attend 40-minute Sessions throughout the three days of the event. Check the schedule for more details on topics and speakers.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08005398,\n          37.42417039\n        ]\n      }\n    },\n    {\n      \"id\": \"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Stage 4\",\n        \"icon\": \"map_marker_4\",\n        \"description\": \"Attend 40-minute Sessions throughout the three days of the event. Check the schedule for more details on topics and speakers.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07963053,\n          37.42417039\n        ]\n      }\n    },\n    {\n      \"id\": \"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Stage 5\",\n        \"icon\": \"map_marker_5\",\n        \"description\": \"Attend 40-minute Sessions throughout the three days of the event. Check the schedule for more details on topics and speakers.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07882,\n          37.42461291\n        ]\n      }\n    },\n    {\n      \"id\": \"38d5eb0d-2088-4096-ad83-916fff0be562\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Stage 6\",\n        \"icon\": \"map_marker_6\",\n        \"description\": \"Attend 40-minute Sessions throughout the three days of the event. Check the schedule for more details on topics and speakers.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07882,\n          37.424977\n        ]\n      }\n    },\n    {\n      \"id\": \"b9b00678-787a-4297-a359-d72d636efd19\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Stage 7\",\n        \"icon\": \"map_marker_7\",\n        \"description\": \"Attend 40-minute Sessions throughout the three days of the event. Check the schedule for more details on topics and speakers.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07882,\n          37.42545216\n        ]\n      }\n    },\n    {\n      \"id\": \"d676bb28-7508-4487-a8a8-c4c258c9219e\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Stage 8\",\n        \"icon\": \"map_marker_8\",\n        \"description\": \"Attend 40-minute Sessions throughout the three days of the event. Check the schedule for more details on topics and speakers.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07893215,\n          37.427163\n        ]\n      }\n    },\n    {\n      \"id\": \"110e32b3-50b9-4661-873d-4ac68a691375,community_lounge\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Community Lounge\",\n        \"icon\": \"map_marker_lounge\",\n        \"description\": \"Enjoy informal encounters with Googlers, community leads, and developers from all around the world in the Community Lounge. It's also a space for you to chill out, try some games, meet others, and join community meetups.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080388,\n          37.425685\n        ]\n      }\n    },\n    {\n      \"id\": \"certification_lounge\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Certification Lounge\",\n        \"icon\": \"map_marker_lounge\",\n        \"description\": \"Find out what's new in the Google Developers and Cloud Certification programs. Try your hand at a sample mini-exam, meet Android, Web, and Cloud experts, network with developer peers, and learn how you can gain recognition for your skills by becoming a Google certified developer.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080287,\n          37.425685\n        ]\n      }\n    },\n    {\n      \"id\": \"sandbox_a\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sandbox A\",\n        \"subtitle\": \"Payments / Web / Chrome OS\",\n        \"icon\": \"map_marker_a\",\n        \"description\": \"Meet the Chrome OS, Google Pay and the Web Platform engineers and product leads to talk about the latest updates and learn how to get started. You'll learn how <b>Google Pay</b> APIs can help you build better checkout experiences in your apps and websites. Sign up for a lightning integration session to see how quickly you can get started.<br/><br/><b>Chrome OS</b> not only powers devices from tablets to desktops, but it can also run Android, Web and Linux applications natively, making Chromebooks great machines for development. Meet Chrome OS experts to learn how to enable Linux (Beta) on Chromebooks for Web development, or use tools and editors like Android Studio, install packages, and use different environments such as VS Code and IntelliJ, all while getting the speed, simplicity and security of Chrome OS.<br/><br/>Finally, with the <b>Web</b> platform gaining incredible momentum across browsers, join the Chrome team and experts at Google to learn how to build modern experiences using modern web tech including AMP, Web Packaging, TWAs, and PWA (mobile & desktop), as well as tools like web.dev, Lighthouse, and the Search Console. You’ll also get a glimpse of the future of the Web as it moves to newer platforms.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07986522,\n          37.42571762\n        ]\n      }\n    },\n    {\n      \"id\": \"sandbox_b\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sandbox B\",\n        \"subtitle\": \"AR / Flutter\",\n        \"icon\": \"map_marker_b\",\n        \"description\": \"Two innovative and exciting Google technologies under one Sandbox: AR and Flutter.<br/><br/>Experience augmented reality (<b>AR</b>) for yourself and see what’s possible when your smartphone camera bridges the digital and physical worlds as you stroll through the AR promenade. Collaborate with friends new and old to build an epic AR garden. Learn about the Mars Rover here on Planet Earth by interacting with a 3D digital model. Transform into a character from a comic book.<br/><br/>Frolic in <b>Flutter</b>'s device forest, a hands-on collage of diverse platforms all running Flutter apps. Learn about coding with Flutter through a fun game about the everyday heroes and heroines in software development. You’ll also be able to try out Flutter's newest features and chat with engineers about building your own app in Flutter.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07977135,\n          37.42558396\n        ]\n      }\n    },\n    {\n      \"id\": \"sandbox_c\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sandbox C\",\n        \"subtitle\": \"Android\",\n        \"icon\": \"map_marker_c\",\n        \"description\": \"Meet the experts from Android, Google Play, Android TV, and Wear OS by Google, and talk directly to Googlers to get your questions answered.<br/><br/>Googlers will be on hand from across the world of Android, from Jetpack, Android Studio and Kotlin to the Android App Bundle and the Google Play Console teams.<br/><br/>In Android TV's Sandbox you'll learn about the user experience and try out great apps that take advantage of the biggest screen in the home. In the Wear OS by Google sandbox try, experience and learn more about the latest smartwatches.<br/><br/>Connect with the people who built the world's most popular mobile platform and get your burning questions answered at Google I/O in the Android and Google Play dome.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07987428,\n          37.42543166\n        ]\n      }\n    },\n    {\n      \"id\": \"sandbox_d\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sandbox D\",\n        \"subtitle\": \"Experiments\",\n        \"icon\": \"map_marker_d\",\n        \"description\": \"A collection of innovative \\\"Start with One\\\" experiments built with Google technologies and inspired by one person, one community, or one need. See their origin stories, meet the creators, and learn about the surprising innovations that followed.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07915678,\n          37.42524528\n        ]\n      }\n    },\n    {\n      \"id\": \"sandbox_e\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sandbox E\",\n        \"subtitle\": \"Accessibility / Material Design\",\n        \"icon\": \"map_marker_e\",\n        \"description\": \"Get the latest from Material Design and Accessibility with interactive demos and short talks on hot UX topics like motion, icons, theming, and accessibility. Through a trio of fun experiences, learn about inclusive design principles that improve the UI for all users. Bring your burning questions, we’ll have a Q&A desk fully staffed by accessibility experts and Material pros.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07913599,\n          37.42563614\n        ]\n      }\n    },\n    {\n      \"id\": \"sandbox_f\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sandbox F\",\n        \"subtitle\": \"Cloud / Firebase\",\n        \"icon\": \"map_marker_f\",\n        \"description\": \"Meet the Google Cloud and Firebase engineers and product leads. Try out demos, ask questions, and learn how to build and scale your apps.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07875881,\n          37.4262693\n        ]\n      }\n    },\n    {\n      \"id\": \"sandbox_g\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sandbox G\",\n        \"subtitle\": \"Machine Learning / AI\",\n        \"icon\": \"map_marker_g\",\n        \"description\": \"Come meet the Google AI teams, check out the latest demos of TensorFlow, ML Kit, and Cloud AutoML, and learn how to build and scale your apps.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07887314,\n          37.42641414\n        ]\n      }\n    },\n    {\n      \"id\": \"sandbox_h\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sandbox H\",\n        \"subtitle\": \"Assistant\",\n        \"icon\": \"map_marker_h\",\n        \"description\": \"Step inside the Google Assistant Sandbox! Play with interactive demos and discover new ways to build for the Assistant, from integrating your existing content, apps, and devices, to creating completely new user experiences. Explore the latest Assistant features alongside Google product leads and conversational designers, and leave inspired to build your next Action.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07904547,\n          37.42649881\n        ]\n      }\n    },\n    {\n      \"id\": \"android_for_cars\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Android for Cars \",\n        \"label\": \"Android\\nfor Cars\",\n        \"description\": \"Come by the Android for Cars space to experience the latest features of Google’s platforms for cars.<br/><br/><ul><li>Try out Android Auto with new visual updates and features that make it easier for users to access their favorite apps and contents.</li><li>Experience the new Polestar 2 with infotainment system powered by Android. Check out apps and services built-in and optimized for the car, including the Google Assistant, Google Maps, and the Google Play Store.</li></ul>Visit us to experience live demos and to learn how you can develop for these in-car experiences.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07917824,\n          37.42677305\n        ]\n      }\n    },\n    {\n      \"id\": \"6827a562-dca1-4dc4-adec-32c69559e32b\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Office Hours & App Reviews\",\n        \"label\": \"Office Hours\\n& App Reviews\",\n        \"description\": \"To connect with Googlers about Google products or your own projects, sign up in the I/O app, or just drop by to receive expert advice or learn something new.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0797747,\n          37.42511881\n        ]\n      }\n    },\n    {\n      \"id\": \"e73736f7-39fd-4f9b-87bc-7abe7271271a,9f0b69a4-66a8-49e7-bc64-d79606b63f8e,3e731738-43cf-485b-a464-cc88c205301a\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Garage & Gaming\",\n        \"label\": \"Garage &\\nGaming\",\n        \"description\": \"Want to know what Google is doing in gaming? Come check out the Games sandbox where you’ll learn about how Google helps game developers across all stages of development. We’ll show off tools and platforms to help you build the best games, optimizations for adapting your game beyond mobile, and how to reach and engage with more players. Come meet the teams working on games technologies and play some games with us.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07866091,\n          37.42678957\n        ]\n      }\n    },\n    {\n      \"id\": \"5fc9ab36-28fb-4ca2-b172-48a7984d5844,codelabs\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Codelabs\",\n        \"description\": \"Get hands-on with the newest Google technologies by trying one of over 100 brand-new Codelabs. Our ready-to-code kiosks have everything you need to work through our self-paced tutorials, or bring your own machine and take your work home with you. Google staff will be on hand to help if you get stuck.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07998995,\n          37.4264256\n        ]\n      }\n    },\n    {\n      \"id\": \"eats\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"EATS\",\n        \"description\": \"Hungry? This is where you can find food and drinks throughout the event.<br/><br/><b>May 7</b>: Dinner 6:30pm - 9:30pm<br/><b>May 8</b>: Lunch 11:30am to 2:30pm<br/><b>May 9</b>: Lunch 11:30am to 2:30pm<br/><br/>Snacks and water will be available throughout the venue at all times. Check the event agenda for exact meal schedules.<br/><br/><b>Dietary restrictions</b><br/>Kosher and Halal meals for EATS can be picked up at the Special Meals stand. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07987461,\n          37.42454475\n        ]\n      }\n    },\n    {\n      \"id\": \"concession1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Concession stand\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Hungry? This is where you can find food and drinks throughout the event.<br/><br/><b>May 7:</b><br/>Breakfast 7:00am - 9:30am<br/>Lunch 11:30am - 12:45pm<br/><b>May 8:</b><br/>Breakfast 8:00am - 10:00am<br/>Dinner 7:00pm - 9:30pm<br/><b>May 9:</b><br/>Breakfast 8:00am - 10:00am<br/><br/><b>Dietary restrictions</b><br/>Kosher and Halal meals for the Concession Stands can be picked up in the Concourse across from the Press Lounge entrance. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0815054,\n          37.42604512\n        ]\n      }\n    },\n    {\n      \"id\": \"concession2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Concession stand\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Hungry? This is where you can find food and drinks throughout the event.<br/><br/><b>May 7:</b><br/>Breakfast 7:00am - 9:30am<br/>Lunch 11:30am - 12:45pm<br/><b>May 8:</b><br/>Breakfast 8:00am - 10:00am<br/>Dinner 7:00pm - 9:30pm<br/><b>May 9:</b><br/>Breakfast 8:00am - 10:00am<br/><br/><b>Dietary restrictions</b><br/>Kosher and Halal meals for the Concession Stands can be picked up in the Concourse across from the Press Lounge entrance. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080377,\n          37.426185\n        ]\n      }\n    },\n    {\n      \"id\": \"concession3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Concession stand\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Hungry? This is where you can find food and drinks throughout the event.<br/><br/><b>May 7:</b><br/>Breakfast 7:00am - 9:30am<br/>Lunch 11:30am - 12:45pm<br/><b>May 8:</b><br/>Breakfast 8:00am - 10:00am<br/>Dinner 7:00pm - 9:30pm<br/><b>May 9:</b><br/>Breakfast 8:00am - 10:00am<br/><br/><b>Dietary restrictions</b><br/>Kosher and Halal meals for the Concession Stands can be picked up in the Concourse across from the Press Lounge entrance. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07985014,\n          37.42676267\n        ]\n      }\n    },\n    {\n      \"id\": \"concession4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Concession stand\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Hungry? This is where you can find food and drinks throughout the event.<br/><br/><b>May 7:</b><br/>Breakfast 7:00am - 9:30am<br/>Lunch 11:30am - 12:45pm<br/><b>May 8:</b><br/>Dinner 7:00pm - 9:30pm<br/><b>No breakfast served from this location on May 8 or May 9.</b><br/><br/><b>Dietary restrictions</b><br/>Kosher and Halal meals for the Concession Stands can be picked up in the Concourse across from the Press Lounge entrance. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080046,\n          37.427616\n        ]\n      }\n    },\n    {\n      \"id\": \"registration\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Registration\",\n        \"description\": \"Pick-up your badge starting on May 6 between 7am - 7pm. Check the event agenda for the badge pick-up schedule on May 7-9.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07761753,\n          37.4259908\n        ]\n      }\n    },\n    {\n      \"id\": \"press_lounge1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Press Lounge\",\n        \"label\": \"Press\\nLounge\",\n        \"description\": \"Reserved for guests with Press badges.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07971066,\n          37.42721131\n        ]\n      }\n    },\n    {\n      \"id\": \"press_lounge2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Press Lounge\",\n        \"label\": \"Press\\nLounge\",\n        \"description\": \"Reserved for guests with Press badges.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08018139,\n          37.42749753\n        ]\n      }\n    },\n    {\n      \"id\": \"charging1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Charging stations\",\n        \"icon\": \"map_marker_charging\",\n        \"description\": \"Need some juice? Charging stations are available throughout the main street of the venue.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07943238,\n          37.42524395\n        ]\n      }\n    },\n    {\n      \"id\": \"mothers_room1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mother's Room\",\n        \"icon\": \"map_marker_mothers_room\",\n        \"description\": \"Mothers who are nursing are welcome to attend the conference with their child. There will be four first-come, first-served mothers' rooms available throughout the venue. Please see the conference help desk for more information.<br/><br/>This room will be open on<br/><b>May 7</b>: 10am - 10pm<br/><b>May 8</b>: 8am - 8pm<br/><b>May 9</b>: 8am - 5pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07866225,\n          37.42614629\n        ]\n      }\n    },\n    {\n      \"id\": \"mothers_room2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mother's Room\",\n        \"icon\": \"map_marker_mothers_room\",\n        \"description\": \"Mothers who are nursing are welcome to attend the conference with their child. There will be four first-come, first-served mothers' rooms available throughout the venue. Please see the conference help desk for more information.<br/><br/>This room will be open on<br/><b>May 7</b>: 10am - 10pm<br/><b>May 8</b>: 8am - 8pm<br/><b>May 9</b>: 8am - 5pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07891036,\n          37.4251268\n        ]\n      }\n    },\n    {\n      \"id\": \"mothers_room3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mother's Room\",\n        \"icon\": \"map_marker_mothers_room\",\n        \"description\": \"Mothers who are nursing are welcome to attend the conference with their child. There will be four first-come, first-served mothers' rooms available throughout the venue. Please see the conference help desk for more information.<br/><br/>This room will be open on<br/><b>May 7</b>: 10am - 10pm<br/><b>May 8</b>: 8am - 8pm<br/><b>May 9</b>: 8am - 5pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07913298,\n          37.42442547\n        ]\n      }\n    },\n    {\n      \"id\": \"mothers_room4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mother's Room\",\n        \"icon\": \"map_marker_mothers_room\",\n        \"description\": \"Mothers who are nursing are welcome to attend the conference with their child. There will be four first-come, first-served mothers' rooms available throughout the venue. Please see the conference help desk for more information.<br/><br/>This room will be open on<br/><b>May 7</b>: 7am - 7pm<br/><b>May 8</b>: 8am - 10pm<br/><b>May 9</b>: 8am - 5pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08032388,\n          37.42602807\n        ]\n      }\n    },\n    {\n      \"id\": \"store1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"I/O Store\",\n        \"icon\": \"map_marker_store\",\n        \"description\": \"The store offers a unique collection of Google I/O'19 branded goodies available for purchase, including T-shirts, hoodies, hats, and a signature Android figurine.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07973346,\n          37.42664765\n        ]\n      }\n    },\n    {\n      \"id\": \"store2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"I/O Store\",\n        \"icon\": \"map_marker_store\",\n        \"description\": \"The store offers a unique collection of Google I/O'19 branded goodies available for purchase, including T-shirts, hoodies, hats, and a signature Android figurine.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0801445,\n          37.42616732\n        ]\n      }\n    },\n    {\n      \"id\": \"mk1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Micro Kitchen\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a snack from one of our Micro Kitchens!<br/><br/><b>May 7</b>: 2:00pm - 6:00pm<br/><b>May 8</b>: 8:00am - 4:00pm<br/><b>May 9</b>: 8:00am - 4:00pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07918964,\n          37.4268918\n        ]\n      }\n    },\n    {\n      \"id\": \"mk2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Micro Kitchen\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a snack from one of our Micro Kitchens!<br/><br/><b>May 7</b>: 2:00pm - 6:00pm<br/><b>May 8</b>: 8:00am - 4:00pm<br/><b>May 9</b>: 8:00am - 4:00pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079767,\n          37.425914\n        ]\n      }\n    },\n    {\n      \"id\": \"mk3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Micro Kitchen\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a snack from one of our Micro Kitchens!<br/><br/><b>May 7</b>: 2:00pm - 6:00pm<br/><b>May 8</b>: 8:00am - 4:00pm<br/><b>May 9</b>: 8:00am - 4:00pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08004527,\n          37.42512866\n        ]\n      }\n    },\n    {\n      \"id\": \"mk4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Micro Kitchen\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a snack from one of our Micro Kitchens!<br/><br/><b>May 7</b>: 2:00pm - 6:00pm<br/><b>May 8</b>: 8:00am - 4:00pm<br/><b>May 9</b>: 8:00am - 4:00pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0798545,\n          37.42441082\n        ]\n      }\n    },\n    {\n      \"id\": \"mk5\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Micro Kitchen\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a snack from one of our Micro Kitchens!<br/><br/><b>May 7</b>: 2:00pm - 6:00pm<br/><b>May 8</b>: 8:00am - 4:00pm<br/><b>May 9</b>: 8:00am - 4:00pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07934152,\n          37.42470024\n        ]\n      }\n    },\n    {\n      \"id\": \"mk6\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Micro Kitchen\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a snack from one of our Micro Kitchens!<br/><br/><b>May 7</b>: 2:00pm - 6:00pm<br/><b>May 8</b>: 8:00am - 4:00pm<br/><b>May 9</b>: 8:00am - 4:00pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07916651,\n          37.42541515\n        ]\n      }\n    },\n    {\n      \"id\": \"mk7\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Micro Kitchen\",\n        \"icon\": \"map_marker_food\",\n        \"description\": \"Come grab a snack from one of our Micro Kitchens!<br/><br/><b>May 7</b>: 2:00pm - 6:00pm<br/><b>May 8</b>: 8:00am - 4:00pm<br/><b>May 9</b>: 8:00am - 4:00pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07921579,\n          37.42505784\n        ]\n      }\n    },\n    {\n      \"id\": \"kosher1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Kosher/Halal Meal Pick Up\",\n        \"label\": \"Kosher/Halal\",\n        \"description\": \"All Kosher and Halal meals can be picked up across from the entrance to the Press Lounge inside the Concourse, or at the Special Meals stand in EATS. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian..\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07985081,\n          37.42691311\n        ]\n      }\n    },\n    {\n      \"id\": \"kosher2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Kosher/Halal Meal Pick Up\",\n        \"label\": \"Kosher/Halal\",\n        \"description\": \"All Kosher and Halal meals can be picked up across from the entrance to the Press Lounge inside the Concourse, or at the Special Meals stand in EATS. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian..\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07997452,\n          37.42470744\n        ]\n      }\n    },\n    {\n      \"id\": \"info_desk\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Information Desk\",\n        \"icon\": \"map_marker_info\",\n        \"description\": \"If you have any questions about the event, you can ask the Staff members at the Info Desk for help.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07976195,\n          37.42630471\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080374,\n          37.427546\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07908738,\n          37.42731435\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079669,\n          37.426839\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.081553,\n          37.42629167\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom5\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0801777,\n          37.42606029\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom6\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.078614,\n          37.426217\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom7\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07897708,\n          37.42567236\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom8\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07878865,\n          37.42520987\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom9\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07916081,\n          37.42432189\n        ]\n      }\n    },\n    {\n      \"id\": \"shuttle\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Attendee Shuttles\",\n        \"label\": \"Shuttles\",\n        \"description\": \"Free event shuttles from all Google recommended hotels will be provided for Google I/O attendees. There will also be select service from San Francisco, Millbrae BART, Mountain View Caltrain, San Jose, and Oakland. We are increasing the shuttle frequency and capacity at the Mountain View Caltrain and Millbrae Bart stations. Please see the Google I/O 2019 event website and app for detailed shuttles schedules and pick-up/drop-off locations.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07656175,\n          37.42589921\n        ]\n      }\n    },\n    {\n      \"id\": \"io_landmark\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"I/O Landmark\",\n        \"description\": \"See the I/O Landmark come to life in AR. Celebrate by sharing your photos with <b>#io19</b>.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07945015,\n          37.42609171\n        ]\n      }\n    },\n    {\n      \"id\": \"lot_a\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Parking Lot A\",\n        \"label\": \"Lot A\",\n        \"description\": \"Parking Lot A hosts several I/O related services including Registration, Accessibility & Expectant Mothers' Parking, Bike Parking, and Bag/Coat Check.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077082,\n          37.427511\n        ]\n      }\n    },\n    {\n      \"id\": \"lot_b\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Parking Lot B\",\n        \"label\": \"Lot B\",\n        \"description\": \"Attendee shuttles drop-off and pick-up point.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0759549,\n          37.42640243\n        ]\n      }\n    },\n    {\n      \"id\": \"bb3d8fbf-6b3f-4316-816e-deae33bdf035,boardwalk\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Boardwalk\",\n        \"description\": \"Experience all the community and culture of I/O by taking a stroll down the Boardwalk. There you’ll find our own Broadcast Studio, Draw to Art (interactive easels from Google Arts & Culture powered by ML), lightning sessions, and other fun surprises.\",\n        \"minZoom\": 99\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [-122.079476, 37.425391]\n      }\n    },\n    {\n      \"id\": \"digital_detox\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Digital Detox\",\n        \"label\": \"Digital\\nDetox\",\n        \"description\": \"Brain overloaded? Walk yourself down our meandering path, take a breather in our dedicated screen-free zone, and refresh with a new twist on the classic lemonade stand. \",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07940053,\n          37.42446514\n        ]\n      }\n    },\n    {\n      \"id\": \"shadow_art\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Shadow Art\",\n        \"label\": \"Shadow\\nArt\",\n        \"description\": \"Try your hands at the art of shadow puppetry featuring Tensorflow.js. Learn how to create the 12 Chinese Zodiac animals with the help of AI. \",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0790334,\n          37.42522052\n        ]\n      }\n    },\n    {\n      \"id\": \"sculpture_garden\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Sculpture Garden\",\n        \"label\": \"Sculpture\\nGarden\",\n        \"description\": \"Stop by our DIY sculpture garden near the Amphitheatre to create some modular magic with candy-coated building blocks. \",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08098035,\n          37.42604272\n        ]\n      }\n    },\n    {\n      \"id\": \"medical1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"First Aid station\",\n        \"icon\": \"map_marker_medical\",\n        \"description\": \"If you need any medical assistance throughout the event, please make your way to the Medical station. If you’re unable to commute or you’re not feeling well, ask any Staff member for help.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08038389,\n          37.42596843\n        ]\n      }\n    },\n    {\n      \"id\": \"medical2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"First Aid station\",\n        \"icon\": \"map_marker_medical\",\n        \"description\": \"If you need any medical assistance throughout the event, please make your way to the Medical station. If you’re unable to commute or you’re not feeling well, ask any Staff member for help.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08020921,\n          37.42390811\n        ]\n      }\n    },\n    {\n      \"id\": \"rideshare\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Rideshare pick-up & drop-off\",\n        \"label\": \"Rideshare\",\n        \"description\": \"Download the Uber or Lyft app and use discount code: <b>IO2019</b><br/><br/>This code is valid from May 7-9, 2019 for shared rides with <b>Lyft Shared</b> and <b>UberPool</b>. It’s redeemable for up to $15 per trip and for up to 600 users per day. Rides must begin or end at Shoreline Amphitheatre.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08050862,\n          37.42311652\n        ]\n      }\n    },\n    {\n      \"id\": \"bike_parking\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Bike Parking\",\n        \"description\": \"Complimentary bike parking will be available to attendees during event hours at Shoreline Amphitheatre in Parking Lot A.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07678337,\n          37.42664925\n        ]\n      }\n    },\n    {\n      \"id\": \"broadcast_studio\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Broadcast Studio\",\n        \"label\": \"Broadcast\\nStudio\",\n        \"description\": \"Home to the I/O '19 Livestream Experience.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07947195,\n          37.42582386\n        ]\n      }\n    },\n    {\n      \"id\": \"mosaic_virus\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mosaic Virus \",\n        \"subtitle\": \"Anna Ridler\",\n        \"label\": \"Mosaic\\nVirus\",\n        \"description\": \"To create this piece, the artist constructed her own training set, based on thousands of pictures she took and categorized by hand. Using AI to \\\"imagine\\\" or \\\"dream\\\" tulips, the model is not just repeating flowers that are in its dataset, but creating new flowers from the knowledge that it has about the flowers it has seen.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07939986,\n          37.42558849\n        ]\n      }\n    },\n    {\n      \"id\": \"meandering_river\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Meandering River\",\n        \"subtitle\": \"Onformative\",\n        \"label\": \"Meandering\\nRiver\",\n        \"description\": \"Meandering River simulates the unpredictable movements of rivers and reinterprets their organic structures, rhythmic fluctuations and visual materiality. It makes changing landscapes perceivable by visualizing and sonifying a river’s impact on the surface of the earth through bespoke algorithms drawn from scientific research and satellite imagery.\\n\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0794753,\n          37.42487438\n        ]\n      }\n    },\n    {\n      \"id\": \"mcxt_mural\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"MCXT Mural \",\n        \"label\": \"MCXT\\nMural\",\n        \"description\": \"\\\"An Inclusive Lens\\\"<br/><br/>Monica Canilao & Xara Thustra are two Bay Area artists who combined their vision, talents, and activism to form a legendary creative partnership: MCXT. Their work is big in scale and heart. MCXT uses drawing, installation, murals, and other media to cultivate a sense of wonder and mindfulness that can help us see the infinite stories in and between people, objects, and ideas.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07953867,\n          37.42541808\n        ]\n      }\n    },\n    {\n      \"id\": \"draw_to_art\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Draw to Art\",\n        \"label\": \"Draw\\nto Art\",\n        \"description\": \"Start drawing to discover artworks. Draw to Art is an experience from Google Arts & Culture that uses machine learning to match doodles to drawings, paintings and sculptures from museums around the world\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07954101,\n          37.42570404\n        ]\n      }\n    },\n    {\n      \"id\": \"coat_check\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Bag/Coat Check\",\n        \"description\": \"Complimentary bag and coat check will be available to attendees during event hours at Shoreline Amphitheatre in Parking Lot A.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077001,\n          37.426289\n        ]\n      }\n    },\n    {\n      \"id\": \"water1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Water Trailer\",\n        \"icon\": \"map_marker_water\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07894254,\n          37.42615135\n        ]\n      }\n    },\n    {\n      \"id\": \"water2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Water Trailer\",\n        \"icon\": \"map_marker_water\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079898,\n          37.425897\n        ]\n      }\n    },\n    {\n      \"id\": \"water3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Water Trailer\",\n        \"icon\": \"map_marker_water\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07924999,\n          37.42554322\n        ]\n      }\n    },\n    {\n      \"id\": \"water4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Water Trailer\",\n        \"icon\": \"map_marker_water\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07933783,\n          37.42463395\n        ]\n      }\n    },\n    {\n      \"id\": \"water5\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Water Trailer\",\n        \"icon\": \"map_marker_water\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07964998,\n          37.42444624\n        ]\n      }\n    },\n    {\n      \"id\": \"quiet_room\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Quiet Room\",\n        \"label\": \"Quiet\\nRoom\",\n        \"description\": \"The Quiet Room is provided for those that wish to pray, meditate, or need a calming space.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07987059,\n          37.42705715\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07916886,\n          37.42731541\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079644,\n          37.42669\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08007813,\n          37.4260792\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0786133,\n          37.42626398\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom5\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07872361,\n          37.4252096\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom6\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07908369,\n          37.42432748\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_eats1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Counter @ EATS\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"EATS Accessibility counters are open the same time EATS is open.<br/><br/><b>May 7</b>: Dinner 6:30pm - 9:30pm<br/><b>May 8</b>: Lunch 11:30am to 2:30pm<br/><b>May 9</b>: Lunch 11:30am to 2:30pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07956314,\n          37.42459454\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_eats2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Counter @ EATS\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"EATS Accessibility counters are open the same time EATS is open.<br/><br/><b>May 7</b>: Dinner 6:30pm - 9:30pm<br/><b>May 8</b>: Lunch 11:30am to 2:30pm<br/><b>May 9</b>: Lunch 11:30am to 2:30pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08016966,\n          37.4245815\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_parking_entrance\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Parking Entrance\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"When arriving at the venue, follow signs for Accessibility Parking. Please have your placard hanging from your rearview mirror and visible to parking employees at all times to expedite the parking process. Accessible parking spaces are readily available on a first-come, first-served basis and may not be reserved in advance.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077945,\n          37.426766\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_shuttle\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Shuttle Pickup\",\n        \"icon\": \"map_marker_handicap\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07933918,\n          37.42635051\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_registration\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Registration\",\n        \"icon\": \"map_marker_handicap\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07769062,\n          37.42608719\n        ]\n      }\n    },\n    {\n      \"id\": \"service_pet_relief\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Service Pet Relief Area\",\n        \"icon\": \"map_marker_service_dog\",\n        \"description\": \"Give your furry friend a break on the lawn West of EATS\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08038423,\n          37.42454262\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_keynote_entrance\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Entrance\",\n        \"subtitle\": \"Keynote\",\n        \"icon\": \"map_marker_handicap\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07986757,\n          37.42661011\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_parking\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility / Expectant Mothers\",\n        \"subtitle\": \"Parking\",\n        \"label\": \"Accessibility &\\nExpectant Mothers\",\n        \"description\": \"Designated parking in Lot A for Accessibility and Expectant Mothers. When arriving at the venue, follow signs for Accessibility Parking. Accessible parking spaces are readily available on a first-come, first-served basis and may not be reserved in advance.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07710657,\n          37.42703931\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "mobile/src/main/res/raw/map_markers_night.json",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"id\": \"eats\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"EATS\",\n        \"description\": \"Hungry? This is where you can find food and drinks throughout the event.<br/><br/><b>May 7</b>: Dinner 6:30pm - 9:30pm<br/><b>May 8</b>: Lunch 11:30am to 2:30pm<br/><b>May 9</b>: Lunch 11:30am to 2:30pm<br/><br/>Snacks and water will be available throughout the venue at all times. Check the event agenda for exact meal schedules.<br/><br/><b>Dietary restrictions</b><br/>Kosher and Halal meals for EATS can be picked up at the Special Meals stand. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07987461,\n          37.42454475\n        ]\n      }\n    },\n    {\n      \"id\": \"charging1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Charging stations\",\n        \"icon\": \"map_marker_charging\",\n        \"description\": \"Need some juice? Charging stations are available throughout the main street of the venue.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07943238,\n          37.42524395\n        ]\n      }\n    },\n    {\n      \"id\": \"mothers_room1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mother's Room\",\n        \"icon\": \"map_marker_mothers_room\",\n        \"description\": \"Mothers who are nursing are welcome to attend the conference with their child. There will be four first-come, first-served mothers' rooms available throughout the venue. Please see the conference help desk for more information.<br/><br/>This room will be open on<br/><b>May 7</b>: 10am - 10pm<br/><b>May 8</b>: 8am - 8pm<br/><b>May 9</b>: 8am - 5pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07866225,\n          37.42614629\n        ]\n      }\n    },\n    {\n      \"id\": \"mothers_room2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mother's Room\",\n        \"icon\": \"map_marker_mothers_room\",\n        \"description\": \"Mothers who are nursing are welcome to attend the conference with their child. There will be four first-come, first-served mothers' rooms available throughout the venue. Please see the conference help desk for more information.<br/><br/>This room will be open on<br/><b>May 7</b>: 10am - 10pm<br/><b>May 8</b>: 8am - 8pm<br/><b>May 9</b>: 8am - 5pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07891036,\n          37.4251268\n        ]\n      }\n    },\n    {\n      \"id\": \"mothers_room3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mother's Room\",\n        \"icon\": \"map_marker_mothers_room\",\n        \"description\": \"Mothers who are nursing are welcome to attend the conference with their child. There will be four first-come, first-served mothers' rooms available throughout the venue. Please see the conference help desk for more information.<br/><br/>This room will be open on<br/><b>May 7</b>: 10am - 10pm<br/><b>May 8</b>: 8am - 8pm<br/><b>May 9</b>: 8am - 5pm\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07913298,\n          37.42442547\n        ]\n      }\n    },\n    {\n      \"id\": \"kosher2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Kosher/Halal Meal Pick Up\",\n        \"label\": \"Kosher/Halal\",\n        \"description\": \"All Kosher and Halal meals can be picked up across from the entrance to the Press Lounge inside the Concourse, or at the Special Meals stand in EATS. Any other dietary needs will be listed on catering signage at each of the food stands or buffets within the venue; this includes gluten free, dairy free, vegan, and vegetarian..\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07997452,\n          37.42470744\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom6\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.078614,\n          37.426217\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom7\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07897708,\n          37.42567236\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom8\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07878865,\n          37.42520987\n        ]\n      }\n    },\n    {\n      \"id\": \"restroom9\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Restrooms\",\n        \"icon\": \"map_marker_restroom\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07916081,\n          37.42432189\n        ]\n      }\n    },\n    {\n      \"id\": \"shuttle\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Attendee Shuttles\",\n        \"label\": \"Shuttles\",\n        \"description\": \"Free event shuttles from all Google recommended hotels will be provided for Google I/O attendees. There will also be select service from San Francisco, Millbrae BART, Mountain View Caltrain, San Jose, and Oakland. We are increasing the shuttle frequency and capacity at the Mountain View Caltrain and Millbrae Bart stations. Please see the Google I/O 2019 event website and app for detailed shuttles schedules and pick-up/drop-off locations.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07656175,\n          37.42589921\n        ]\n      }\n    },\n    {\n      \"id\": \"io_landmark\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"I/O Landmark\",\n        \"description\": \"See the I/O Landmark come to life in AR. Celebrate by sharing your photos with <b>#io19</b>.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07945015,\n          37.42609171\n        ]\n      }\n    },\n    {\n      \"id\": \"lot_a\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Parking Lot A\",\n        \"label\": \"Lot A\",\n        \"description\": \"Parking Lot A hosts several I/O related services including Registration, Accessibility & Expectant Mothers' Parking, Bike Parking, and Bag/Coat Check.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077082,\n          37.427511\n        ]\n      }\n    },\n    {\n      \"id\": \"lot_b\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Parking Lot B\",\n        \"label\": \"Lot B\",\n        \"description\": \"Attendee shuttles drop-off and pick-up point.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0759549,\n          37.42640243\n        ]\n      }\n    },\n    {\n      \"id\": \"bb3d8fbf-6b3f-4316-816e-deae33bdf035,boardwalk\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Boardwalk\",\n        \"description\": \"Experience all the community and culture of I/O by taking a stroll down the Boardwalk. There you’ll find our own Broadcast Studio, Draw to Art (interactive easels from Google Arts & Culture powered by ML), lightning sessions, and other fun surprises.\",\n        \"minZoom\": 99\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [-122.079476, 37.425391]\n      }\n    },\n    {\n      \"id\": \"digital_detox\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Digital Detox\",\n        \"label\": \"Digital\\nDetox\",\n        \"description\": \"Brain overloaded? Walk yourself down our meandering path, take a breather in our dedicated screen-free zone, and refresh with a new twist on the classic lemonade stand. \",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07940053,\n          37.42446514\n        ]\n      }\n    },\n    {\n      \"id\": \"shadow_art\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Shadow Art\",\n        \"label\": \"Shadow\\nArt\",\n        \"description\": \"Try your hands at the art of shadow puppetry featuring Tensorflow.js. Learn how to create the 12 Chinese Zodiac animals with the help of AI. \",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0790334,\n          37.42522052\n        ]\n      }\n    },\n    {\n      \"id\": \"medical1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"First Aid station\",\n        \"icon\": \"map_marker_medical\",\n        \"description\": \"If you need any medical assistance throughout the event, please make your way to the Medical station. If you’re unable to commute or you’re not feeling well, ask any Staff member for help.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08038389,\n          37.42596843\n        ]\n      }\n    },\n    {\n      \"id\": \"medical2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"First Aid station\",\n        \"icon\": \"map_marker_medical\",\n        \"description\": \"If you need any medical assistance throughout the event, please make your way to the Medical station. If you’re unable to commute or you’re not feeling well, ask any Staff member for help.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08020921,\n          37.42390811\n        ]\n      }\n    },\n    {\n      \"id\": \"rideshare\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Rideshare pick-up & drop-off\",\n        \"label\": \"Rideshare\",\n        \"description\": \"Download the Uber or Lyft app and use discount code: <b>IO2019</b><br/><br/>This code is valid from May 7-9, 2019 for shared rides with <b>Lyft Shared</b> and <b>UberPool</b>. It’s redeemable for up to $15 per trip and for up to 600 users per day. Rides must begin or end at Shoreline Amphitheatre.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08050862,\n          37.42311652\n        ]\n      }\n    },\n    {\n      \"id\": \"bike_parking\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Bike Parking\",\n        \"description\": \"Complimentary bike parking will be available to attendees during event hours at Shoreline Amphitheatre in Parking Lot A.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07678337,\n          37.42664925\n        ]\n      }\n    },\n    {\n      \"id\": \"mosaic_virus\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Mosaic Virus \",\n        \"subtitle\": \"Anna Ridler\",\n        \"label\": \"Mosaic\\nVirus\",\n        \"description\": \"To create this piece, the artist constructed her own training set, based on thousands of pictures she took and categorized by hand. Using AI to \\\"imagine\\\" or \\\"dream\\\" tulips, the model is not just repeating flowers that are in its dataset, but creating new flowers from the knowledge that it has about the flowers it has seen.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07939986,\n          37.42558849\n        ]\n      }\n    },\n    {\n      \"id\": \"meandering_river\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Meandering River\",\n        \"subtitle\": \"Onformative\",\n        \"label\": \"Meandering\\nRiver\",\n        \"description\": \"Meandering River simulates the unpredictable movements of rivers and reinterprets their organic structures, rhythmic fluctuations and visual materiality. It makes changing landscapes perceivable by visualizing and sonifying a river’s impact on the surface of the earth through bespoke algorithms drawn from scientific research and satellite imagery.\\n\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0794753,\n          37.42487438\n        ]\n      }\n    },\n    {\n      \"id\": \"coat_check\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Bag/Coat Check\",\n        \"description\": \"Complimentary bag and coat check will be available to attendees during event hours at Shoreline Amphitheatre in Parking Lot A.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077001,\n          37.426289\n        ]\n      }\n    },\n    {\n      \"id\": \"ar_cade\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"ARcade\",\n        \"subtitle\": \"Stage 6\",\n        \"description\": \"All the originals you could imagine with a special AR tribute to a Google classic\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07882,\n          37.424977\n        ]\n      }\n    },\n    {\n      \"id\": \"after_glow\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"After Glow\",\n        \"subtitle\": \"Stage 5\",\n        \"description\": \"Imaginative and exciting performance space that blends cirque nouveau and technology. Featuring the talents of Quixotic.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07882,\n          37.42461291\n        ]\n      }\n    },\n    {\n      \"id\": \"spatial\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"SP a T i AL \",\n        \"subtitle\": \"Stage 4\",\n        \"description\": \"A multi-dimensional sound and performance environment, featuring artists working in creative coding and new technologies in the world of A.I. & M.L.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07963053,\n          37.42417039\n        ]\n      }\n    },\n    {\n      \"id\": \"the_rink\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"The Rink\",\n        \"subtitle\": \"Stage 1\",\n        \"description\": \"Skate back to the 70's in I/O's own roller disco. Show us your moves and we will provide the grooves.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.080294,\n          37.42555547\n        ]\n      }\n    },\n    {\n      \"id\": \"fungineers\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Fungineers\",\n        \"description\": \"The Fungineers are a super-surreal performance group, freestyling, improvising, and serving up ice cream.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079838,\n          37.425524\n        ]\n      }\n    },\n    {\n      \"id\": \"drinks1\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Beer/Wine Trailer\",\n        \"icon\": \"map_marker_drink\",\n        \"description\": \"Come grab a drink from our selection of beers and wines.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079736,\n          37.425941\n        ]\n      }\n    },\n    {\n      \"id\": \"drinks2\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Beer/Wine Trailer\",\n        \"icon\": \"map_marker_drink\",\n        \"description\": \"Come grab a drink from our selection of beers and wines.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.079196,\n          37.42501\n        ]\n      }\n    },\n    {\n      \"id\": \"drinks3\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Beer/Wine Trailer\",\n        \"icon\": \"map_marker_drink\",\n        \"description\": \"Come grab a drink from our selection of beers and wines.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07923591,\n          37.4246044\n        ]\n      }\n    },\n    {\n      \"id\": \"drinks4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Beer/Wine Trailer\",\n        \"icon\": \"map_marker_drink\",\n        \"description\": \"Come grab a drink from our selection of beers and wines.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07919769,\n          37.42476815\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom4\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.0786133,\n          37.42626398\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom5\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07872361,\n          37.4252096\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_restroom6\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Restroom\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"Restroom trailer includes one male restroom, one female restroom, and one unisex ADA restroom.\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07908369,\n          37.42432748\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_parking_entrance\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Parking Entrance\",\n        \"icon\": \"map_marker_handicap\",\n        \"description\": \"When arriving at the venue, follow signs for Accessibility Parking. Please have your placard hanging from your rearview mirror and visible to parking employees at all times to expedite the parking process. Accessible parking spaces are readily available on a first-come, first-served basis and may not be reserved in advance.\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.077945,\n          37.426766\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_shuttle\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Shuttle Pickup\",\n        \"icon\": \"map_marker_handicap\"\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07933918,\n          37.42635051\n        ]\n      }\n    },\n    {\n      \"id\": \"service_pet_relief\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Service Pet Relief Area\",\n        \"icon\": \"map_marker_service_dog\",\n        \"description\": \"Give your furry friend a break on the lawn West of EATS\",\n        \"minZoom\": 18\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.08038423,\n          37.42454262\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_keynote_entrance\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility Entrance\",\n        \"subtitle\": \"Keynote\",\n        \"icon\": \"map_marker_handicap\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07986757,\n          37.42661011\n        ]\n      }\n    },\n    {\n      \"id\": \"accessibility_parking\",\n      \"type\": \"Feature\",\n      \"properties\": {\n        \"title\": \"Accessibility / Expectant Mothers\",\n        \"subtitle\": \"Parking\",\n        \"label\": \"Accessibility &\\nExpectant Mothers\",\n        \"description\": \"Designated parking in Lot A for Accessibility and Expectant Mothers. When arriving at the venue, follow signs for Accessibility Parking. Accessible parking spaces are readily available on a first-come, first-served basis and may not be reserved in advance.\",\n        \"minZoom\": 17\n      },\n      \"geometry\": {\n        \"type\": \"Point\",\n        \"coordinates\": [\n          -122.07710657,\n          37.42703931\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "mobile/src/main/res/raw/map_style_day.json",
    "content": "[\n  {\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#f3f5f6\"\n      }\n    ]\n  },\n  {\n    \"elementType\": \"labels\",\n    \"stylers\": [\n      {\n        \"visibility\": \"off\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"administrative.land_parcel\",\n    \"stylers\": [\n      {\n        \"visibility\": \"off\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"administrative.neighborhood\",\n    \"stylers\": [\n      {\n        \"visibility\": \"off\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"poi\",\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#f3f5f6\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"poi\",\n    \"elementType\": \"labels.text.fill\",\n    \"stylers\": [\n      {\n        \"color\": \"#757575\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"poi.park\",\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#e2e7e8\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"road\",\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#ffffff\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"road.highway\",\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#dadada\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"road.highway\",\n    \"elementType\": \"geometry.stroke\",\n    \"stylers\": [\n      {\n        \"color\": \"#bbbbbb\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"water\",\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#c9c9c9\"\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "mobile/src/main/res/raw/map_style_night.json",
    "content": "[\n  {\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#36607e\"\n      }\n    ]\n  },\n  {\n    \"elementType\": \"labels\",\n    \"stylers\": [\n      {\n        \"visibility\": \"off\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"poi.park\",\n    \"elementType\": \"geometry.fill\",\n    \"stylers\": [\n      {\n        \"color\": \"#1d4c6e\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"road\",\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#68889e\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"road.highway\",\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#1d4c6e\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"road.highway\",\n    \"elementType\": \"geometry.stroke\",\n    \"stylers\": [\n      {\n        \"color\": \"#153d5b\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"water\",\n    \"elementType\": \"geometry\",\n    \"stylers\": [\n      {\n        \"color\": \"#0e1626\"\n      }\n    ]\n  },\n  {\n    \"featureType\": \"water\",\n    \"elementType\": \"labels.text.fill\",\n    \"stylers\": [\n      {\n        \"color\": \"#4e6d70\"\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "mobile/src/main/res/transition/codelab_toggle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<transitionSet\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:interpolator/fast_out_slow_in\">\n\n    <transition class=\"com.google.samples.apps.iosched.widget.transition.RotateX\">\n        <targets>\n            <target android:targetId=\"@id/expand_icon\" />\n        </targets>\n    </transition>\n\n    <autoTransition android:duration=\"200\" />\n\n</transitionSet>\n"
  },
  {
    "path": "mobile/src/main/res/transition/info_card_toggle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<transitionSet\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:interpolator/fast_out_slow_in\">\n\n    <transition class=\"com.google.samples.apps.iosched.widget.transition.RotateX\">\n        <targets>\n            <target android:targetId=\"@id/expand_icon\" />\n        </targets>\n    </transition>\n\n    <changeBounds />\n\n</transitionSet>\n"
  },
  {
    "path": "mobile/src/main/res/transition/speaker_shared_enter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<transitionSet xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <changeBounds>\n        <arcMotion />\n    </changeBounds>\n    <changeTransform />\n    <changeClipBounds />\n    <changeImageTransform />\n</transitionSet>\n"
  },
  {
    "path": "mobile/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <!-- Reservation states -->\n    <!-- Event is reservable; user has no reservation status-->\n    <attr name=\"state_reservable\" format=\"boolean\" />\n    <!-- Event is not reservable -->\n    <attr name=\"state_reservation_disabled\" format=\"boolean\" />\n    <!-- Event is reservable; user can join wait list -->\n    <attr name=\"state_wait_list_available\" format=\"boolean\" />\n    <!-- Reservation request is pending for this event -->\n    <attr name=\"state_reservation_pending\" format=\"boolean\" />\n    <!-- User has reserved a seat for the event -->\n    <attr name=\"state_reserved\" format=\"boolean\" />\n    <!-- User is on the wait list for the event -->\n    <attr name=\"state_wait_listed\" format=\"boolean\" />\n\n    <attr name=\"verticalBias\" format=\"float\" />\n\n    <declare-styleable name=\"Theme\">\n        <!-- Navigation bar divider color, used by NavigationBarContentFrameLayout -->\n        <attr name=\"ioschedNavigationBarDividerColor\" format=\"color\" />\n\n        <attr name=\"colorControlLight\" format=\"color\" />\n\n        <attr name=\"sessionListKeyline\" format=\"dimension\" />\n\n        <attr name=\"eventCardHeaderBackground\" format=\"reference|color\" />\n\n        <attr name=\"colorSurfaceSecondary\" format=\"color\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"TimeHeader\">\n        <attr name=\"android:width\" />\n        <attr name=\"android:padding\" />\n        <attr name=\"android:textColor\" />\n        <attr name=\"android:fontFamily\" />\n        <attr name=\"timeTextSize\" format=\"dimension\" />\n        <attr name=\"meridiemTextSize\" format=\"dimension\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"DateHeader\">\n        <attr name=\"android:width\" />\n        <attr name=\"android:height\" />\n        <attr name=\"android:textColor\" />\n        <attr name=\"android:textSize\" />\n        <attr name=\"android:fontFamily\" />\n        <attr name=\"verticalBias\"/>\n    </declare-styleable>\n\n    <declare-styleable name=\"ReserveButton\">\n        <attr name=\"state_reservable\" />\n        <attr name=\"state_reserved\" />\n        <attr name=\"state_reservation_disabled\" />\n        <attr name=\"state_wait_list_available\" />\n        <attr name=\"state_wait_listed\" />\n        <attr name=\"state_reservation_pending\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"EventCardView\">\n        <attr name=\"eventTitle\" format=\"string\" />\n        <attr name=\"eventDescription\" format=\"string\" />\n        <attr name=\"eventTypeLogo\" format=\"reference\" />\n        <attr name=\"eventTypeLogoBackground\" format=\"reference|color\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"CollapsibleCard\">\n        <attr name=\"cardTitle\" format=\"string\" />\n        <attr name=\"cardDescription\" format=\"string\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"DayIndicatorDecoration\">\n        <attr name=\"android:color\" />\n        <attr name=\"insetHorizontal\" format=\"dimension\" />\n        <attr name=\"insetVertical\" format=\"dimension\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"DaySeparatorDecoration\">\n        <attr name=\"android:width\" />\n        <attr name=\"android:height\" />\n        <attr name=\"android:textColor\" />\n        <attr name=\"android:textSize\" />\n        <attr name=\"android:fontFamily\" />\n        <attr name=\"verticalBias\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"NavigationBarContentFrameLayout\">\n        <attr name=\"navigationBarBorderColor\" format=\"color\" />\n        <attr name=\"navigationBarBorderSize\" format=\"dimension\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"HashtagIoDecoration\">\n        <attr name=\"android:drawable\" />\n        <attr name=\"margin\" format=\"dimension\" />\n    </declare-styleable>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <color name=\"color_primary\">@color/deep_sky_blue</color>\n    <color name=\"color_primary_variant\">@color/warm_blue</color>\n    <color name=\"color_on_secondary\">@color/white</color>\n\n    <color name=\"color_control_light\">#39000000</color> <!-- Same as textColorPrimary disabled -->\n    <color name=\"color_surface_secondary\">#F8F9FA</color> <!-- Same as textColorPrimary disabled -->\n\n    <!-- Scrim colors -->\n    <color name=\"system_ui_scrim_light\">#B3FFFFFF</color> <!-- 70% white -->\n    <color name=\"system_ui_scrim_black\">#40000000</color> <!-- 25% black -->\n\n    <!-- We use a dark scrim by default since light status is API 23+ -->\n    <color name=\"status_bar_scrim\">@color/system_ui_scrim_black</color>\n    <!-- We use a dark scrim by default since light nav bar is API 27+ -->\n    <color name=\"nav_bar_scrim\">@color/system_ui_scrim_black</color>\n\n    <!-- Other colors with dark mode alternatives -->\n    <color name=\"highlighted_card_background\">#e8f0fe</color>\n    <color name=\"event_card_header_background\">@color/event_card_header_background_light</color>\n    <color name=\"list_divider\">#1f000000</color>>\n\n    <!-- Other colors -->\n    <color name=\"default_tag_color\">#999</color>\n    <color name=\"light_grey\">#e6e6e6</color>\n    <color name=\"scrim\">#33000000</color> <!-- 20% black -->\n\n    <color name=\"event_card_header_background_light\">#f8f9fa</color>\n    <color name=\"event_card_header_background_dark\">#252729</color>\n\n    <item name=\"chip_bg_alpha_checked\" format=\"float\" type=\"dimen\">0.18</item>\n\n    <integer-array name=\"swipe_refresh\">\n        <item>@color/deep_sky_blue</item>\n        <item>@color/teal</item>\n        <item>@color/bright_light_blue</item>\n        <item>@color/sun_yellow</item>\n        <item>@color/bright_orange</item>\n    </integer-array>\n\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <bool name=\"use_light_status\">false</bool>\n    <bool name=\"use_light_navigation\">false</bool>\n</resources>"
  },
  {
    "path": "mobile/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <!-- Common dimensions -->\n    <dimen name=\"margin_normal\">16dp</dimen>\n    <dimen name=\"margin_small\">8dp</dimen>\n    <dimen name=\"margin_large\">32dp</dimen>\n    <dimen name=\"spacing_normal\">8dp</dimen>\n    <dimen name=\"spacing_micro\">4dp</dimen>\n\n    <dimen name=\"text_size_h1\">22sp</dimen>\n    <dimen name=\"text_size_h2\">20sp</dimen>\n    <dimen name=\"text_size_h3\">18sp</dimen>\n\n    <dimen name=\"a11y_min_touch_target\">48dp</dimen>\n\n    <dimen name=\"bottom_sheet_elevation\">8dp</dimen>\n    <dimen name=\"bottom_sheet_corner_radius\">16dp</dimen>\n\n    <!-- Maximum width of the content area (in percent) to use in single pane. -->\n    <dimen name=\"content_max_width_percent\">1.0</dimen>\n\n    <!-- Dialogs -->\n    <dimen name=\"dialog_corner_radius\">8dp</dimen>\n    <dimen name=\"dialogPreferredPadding\">24dp</dimen>\n    <dimen name=\"dialogPreferredPaddingLarge\">36dp</dimen> <!-- dialogPreferredPadding + 12dp -->\n\n    <!-- Snackbars -->\n    <dimen name=\"snackbar_width\">@dimen/match_parent</dimen>\n    <dimen name=\"snackbar_margin_end_fab\">0dp</dimen>\n    <dimen name=\"snackbar_margin_bottom_fab\">72dp</dimen>\n    <dimen name=\"snackbar_margin_bottom_bab\">84dp</dimen>\n\n    <!-- Navigation -->\n    <dimen name=\"nav_drawer_width\">@dimen/match_parent</dimen>\n    <dimen name=\"nav_account_image_size\">32dp</dimen>\n    <dimen name=\"nav_header_logo_size\">36dp</dimen>\n    <dimen name=\"nav_item_horizontal_padding\">24dp</dimen>\n    <!-- Intrinsic height may vary. Use a large radius to ensure a semicircle. -->\n    <dimen name=\"nav_item_background_corner_radius_left\">0dp</dimen>\n    <dimen name=\"nav_item_background_corner_radius_right\">100dp</dimen>\n    <dimen name=\"nav_item_background_inset_left\">0dp</dimen>\n    <dimen name=\"nav_item_background_inset_right\">8dp</dimen>>\n\n    <!-- Speaker -->\n    <dimen name=\"speaker_headshot_size\">40dp</dimen>\n    <dimen name=\"speaker_large_headshot_size\">112dp</dimen>\n\n    <!-- Schedule -->\n    <!-- The pane widths are made large enough so that we only show the panes side-by-side on very\n         wide screens, e.g. tablet landscape (even in tablet portrait we cannot show both panes\n         comfortably). When not shown side-by-side, the panes are made to fit the available width.\n         Be careful not to make them so large that they do not fit anywhere.\n    -->\n    <dimen name=\"schedule_list_pane_width\">400dp</dimen>\n    <dimen name=\"schedule_detail_pane_width\">600dp</dimen>\n    <dimen name=\"schedule_bottom_sheet_peek_height\">@dimen/a11y_min_touch_target</dimen>\n    <dimen name=\"schedule_page_padding_bottom\">56dp</dimen> <!-- bottom_sheet_peek_height + 8dp -->\n    <dimen name=\"session_keyline\">64dp</dimen>\n    <dimen name=\"schedule_item_padding_vertical\">8dp</dimen>\n\n    <!-- Use dp because the time decoration has constrained width and we don't want it to grow if\n         the user sets large text scale in the system settings.\n    -->\n    <dimen name=\"time_header_time_text_size\">20dp</dimen>\n    <dimen name=\"time_header_meridiem_text_size\">14dp</dimen>\n\n    <dimen name=\"day_header_text_size\">@dimen/text_size_h3</dimen>\n    <dimen name=\"day_header_decor_width\">300dp</dimen>\n    <dimen name=\"day_header_decor_height\">72dp</dimen>\n\n    <!-- Agenda -->\n    <dimen name=\"agenda_item_stroke_width\">2dp</dimen>\n    <dimen name=\"agenda_block_padding_vertical\">12dp</dimen>\n    <dimen name=\"agenda_icon_width\">56dp</dimen>\n\n    <!-- Search -->\n    <dimen name=\"search_result_icon_size\">24dp</dimen>\n    <!-- How wide the toolbar must be to have the active filters in it. See SearchFragment for\n         details. Calculated as 720dp - 72dp (min width of a NavigationRailView)\n    -->\n    <dimen name=\"active_filters_in_toolbar_threshold\">648dp</dimen>\n\n    <!-- Feed -->\n    <dimen name=\"feed_card_corner_radius\">8dp</dimen>\n    <dimen name=\"feed_header_cta_icon_size\">24dp</dimen>\n    <dimen name=\"feed_header_cta_icon_padding\">4dp</dimen>\n    <dimen name=\"feed_my_day_session_width\">300dp</dimen>\n    <dimen name=\"feed_my_day_session_height\">180dp</dimen>\n    <dimen name=\"feed_my_day_empty_sessions_message_max_width\">250dp</dimen>\n    <dimen name=\"feed_session_dimension\">200dp</dimen>\n    <dimen name=\"feed_session_badge_icon_size\">24dp</dimen>\n    <dimen name=\"feed_announcement_min_height\">96dp</dimen>\n    <item name=\"feed_announcement_image_width_percent\" format=\"float\" type=\"dimen\">0.3</item>\n    <dimen name=\"feed_moment_height\">250dp</dimen>\n    <dimen name=\"countdown_height\">300dp</dimen>\n    <dimen name=\"feed_social_buttons_spacing\">12dp</dimen>\n\n    <!-- Onboarding -->\n    <dimen name=\"onboarding_actions_height\">112dp</dimen>\n    <dimen name=\"onboarding_margins\">48dp</dimen>\n    <dimen name=\"onboarding_animation_padding\">40dp</dimen>\n    <dimen name=\"padding_onboarding_button\">12dp</dimen>\n\n    <!-- Map -->\n    <dimen name=\"map_bottom_sheet_peek_height\">56dp</dimen>\n\n    <!-- Info -->\n    <dimen name=\"info_page_margin\">17dp</dimen>\n\n    <!-- Profile dialog -->\n    <dimen name=\"profile_dialog_account_image_size\">36dp</dimen>\n    <!-- This is the avatar size + paddingTop + paddingBottom (36 + 16 + 16). This ensures the\n         avatar and text in the dialog header both have at least 16dp \"margin\" on top and bottom\n         regardless of the user's text scale setting.\n    -->\n    <dimen name=\"profile_dialog_header_height\">68dp</dimen>\n\n    <!-- Codelabs -->\n    <dimen name=\"codelabs_max_width_percent\">@dimen/content_max_width_percent</dimen>\n    <dimen name=\"codelabs_list_item_spacing\">0dp</dimen>\n\n    <!-- per android.view.ViewGroup.LayoutParams -->\n    <item name=\"match_parent\" format=\"integer\" type=\"dimen\">-1</item>\n    <item name=\"wrap_content\" format=\"integer\" type=\"dimen\">-2</item>\n\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/donottranslate.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2020 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<resources>\n    <!-- Vector paths -->\n    <string name=\"chip_dot_path\" translatable=\"false\">M12,8l0,0c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4c2.21,0 4,-1.79 4,-4c0,-2.21 -1.79,-4 -4,-4l0,0z</string>\n    <string name=\"chip_check_path\" translatable=\"false\">M9,16.2l-4.2,-4.2c0,0 -1.4,1.4 -1.4,1.4c0,0 5.6,5.6 5.6,5.6c0,0 12,-12 12,-12c0,0 -1.4,-1.4 -1.4,-1.4l-10.6,10.6z</string>\n\n    <string name=\"codelabs_recyclerview_layoutmanager\">LinearLayoutManager</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <item name=\"tag_speaker_id\" type=\"id\" />\n    <!-- These ids are used in both the menu (navigation.xml) and the nav graph (nav_graph.xml).\n         Each menu item and nav graph fragment represent the same logical item. -->\n    <item name=\"navigation_agenda\" type=\"id\" />\n    <item name=\"navigation_codelabs\" type=\"id\" />\n    <item name=\"navigation_explore_ar\" type=\"id\" />\n    <item name=\"navigation_feed\" type=\"id\" />\n    <item name=\"navigation_info\" type=\"id\" />\n    <item name=\"navigation_map\" type=\"id\" />\n    <item name=\"navigation_map_sublevel\" type=\"id\" />\n    <item name=\"navigation_schedule\" type=\"id\" />\n    <item name=\"navigation_settings\" type=\"id\" />\n    <item name=\"navigation_session_detail\" type=\"id\" />\n    <item name=\"navigation_speaker_detail\" type=\"id\" />\n    <item name=\"navigation_search\" type=\"id\" />\n    <item name=\"navigation_no_network_ar\" type=\"id\" />\n    <item name=\"navigation_phone_does_not_support_arcore\" type=\"id\" />\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <string name=\"title_schedule\" translation_description=\"The title for the schedule screen where user can see their schedule for Google I/O.\">Schedule</string>\n    <string name=\"title_home\" translation_description=\"The title for the Home screen where user can all the updates from Google I/O team.\">Home</string>\n    <string name=\"title_map\" translation_description=\"The title for the map screen where user can see the map of the venue.\">Map</string>\n    <string name=\"title_explore_io\" translation_description=\"The title for the Augmented reality exploration screen where the user can explore the I/O venue in AR.\">Explore I/O</string>\n    <string name=\"title_info\" translation_description=\"The title for the info screen where user can see various information, such as FAQ and travel info.\">Info</string>\n\n    <!-- Schedule -->\n    <plurals name=\"filter_event_count\" translation_description=\"A label showing how many events match the current filters\">\n        <item quantity=\"one\">%1$d Event</item>\n        <item quantity=\"other\">%1$d Events</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Your starred and reserved events</string>\n    <string name=\"starred_and_reserved_short\">Your events</string>\n    <string name=\"search_schedule_hint\" translation_description=\"Text field hint that is shown when user has not entered a search query\">Search the schedule</string>\n    <string name=\"search_schedule_no_results\" translation_description=\"Text that is shown if there are no search results\">No results found</string>\n\n    <string name=\"session_duration_location\" translatable=\"false\">%1s / %2s</string>\n    <string name=\"agenda\" translation_description=\"The title for the agenda screen where user can see all the sessions they plan to attend.\">Agenda</string>\n    <string name=\"agenda_duration\" translatable=\"false\">%1$s – %2$s</string>\n    <string name=\"event_starred\" translation_description=\"The message shown when user adds an event to their schedule.\">Event added to your starred items</string>\n    <string name=\"event_unstarred\" translation_description=\"The message shown when user removes an event from their schedule.\">Event removed from starred items</string>\n    <string name=\"event_star_error\" translation_description=\"The message shown for an error when user tries to add an event.\">Error adding event to starred items</string>\n    <string name=\"reservation_error\" translation_description=\"The message shown for an error when user is trying to reserve a session attendance.\">Error making changes to reservation. Wait for previous requests to finish or try again later.</string>\n    <string name=\"reservation_request_succeeded\" translation_description=\"The message shown when user tries to reserve a seat for a session.\">Reservation requested.</string>\n    <string name=\"reservation_cancel_succeeded\" translation_description=\"The message shown when user has canceled their reservation for a session.\">Reservation canceled: \\\"&lt;b>%s&lt;/b>.\\\"</string>\n    <string name=\"reservation_new\" translation_description=\"The message shown when user's reservation is confirmed by the system.\">Your seat has been reserved for \\\"&lt;b>%s&lt;/b>\\\".</string>\n    <string name=\"reservation_replaced\" translation_description=\"The message shown when user has chosen to replace a reservation for another and it is confirmed by the system.\">Event replaced.</string>\n    <string name=\"waitlist_new\" translation_description=\"The message shown when user is added to the waitlist of a session reservation.\">You have been waitlisted.</string>\n    <string name=\"waitlist_cancel_succeeded\" translation_description=\"The message shown when user has canceled their reservation and was waitlisted for a session.\">Removed from waitlist.</string>\n    <string name=\"got_it\" translation_description=\"The label for dismissing a information messages.\">Got it</string>\n    <string name=\"dont_show\" translation_description=\"The label for opting out of in-app notification messages.\">Don\\'t show</string>\n    <string name=\"reservation_denied_cutoff\" translation_description=\"The message shown when user's reservation is denied because the session starts too soon\">Reservation denied: too close to start time.</string>\n    <string name=\"reservation_denied_clash\" translation_description=\"The message shown when user's reservation is denied because they have reserved another event at that time\">Reservation denied: clash with another reservation</string>\n    <string name=\"reservation_denied_unknown\" translation_description=\"The message shown when user's reservation is denied because of an unknown error\">Reservation denied: unknown error.</string>\n    <string name=\"cancellation_denied_cutoff\" translation_description=\"The message shown when user is trying to cancel a reservation but it's denied because the session starts too soon\">Cancellation denied: too close to start time.</string>\n    <string name=\"cancellation_denied_unknown\" translation_description=\"The message shown when user is trying to cancel a reservation but it's denied because of an unknown error\">Cancellation denied: unknown error.</string>\n\n    <string name=\"schedule_filters_empty\" translation_description=\"The message shown when a schedule page is empty because no events match the current filters.\">No events found.</string>\n\n    <string name=\"reservation_reservable\" translation_description=\"Label shown on events for which the user can request to reserve a seat.\">Reserve seat</string>\n    <string name=\"reservation_reserved\" translation_description=\"Label shown on events for which the user has reserved a seat.\">Reserved</string>\n    <string name=\"reservation_waitlisted\" translation_description=\"Label shown on events for which the user is on the waitlist.\">Waitlisted</string>\n    <string name=\"reservation_waitlist_available\" translation_description=\"Label shown on events for which the user can join the waitlist.\">Join waitlist</string>\n    <string name=\"reservation_disabled\" translation_description=\"Label shown on events for which the user cannot request a seat.\">Reservations unavailable</string>\n    <string name=\"reservation_pending\" translation_description=\"Label shown on events for which a reservation request is pending.\">Reservation pending</string>\n\n    <!-- Schedule UI hints -->\n    <string name=\"schedule_hint_title\" translation_description=\"The title of the schedule hint dialog.\">Customize your schedule</string>\n    <string name=\"schedule_hint_star_event\" translation_description=\"The schedule hint for the icon to star an event.\">Add to your starred events</string>\n    <string name=\"schedule_hint_reserve_session_seat\" translation_description=\"The schedule hint for the icon to reserve a session.\">Reserve a session seat</string>\n\n    <!-- Filters -->\n    <string name=\"filters\" translation_description=\"The label for the button to filter sessions by their topics, room, and so on.\">Filters</string>\n    <string name=\"category_heading_tracks\" translation_description=\"Label in the filters panel above session topics (Android, Cloud, etc.)\">Topics</string>\n    <string name=\"category_heading_types\" translation_description=\"Label in the filters panel above event types (Sessions, Codelabs, etc.)\">Types</string>\n    <string name=\"category_heading_levels\" translation_description=\"Label in the filters panel above levels (Beginner, Advanced, etc.)\">Levels</string>\n    <string name=\"category_heading_dates\" translation_description=\"Label in the filters panel above dates.\">Dates</string>\n    <string name=\"my_events\" translation_description=\"Label for a button to show only the user's events.\">My events</string>\n    <string name=\"reset\" translation_description=\"The label for the button to reset the filter conditions.\">Reset</string>\n    <string name=\"result_count\" translation_description=\"A label showing how search results match current filters.\">Results: %1$d</string>\n\n    <!-- Session Detail -->\n    <string name=\"ask_question\" translation_description=\"The label for the link to open an input form to ask a question about this session. [CHAR_LIMIT=30]\">Q &amp; A</string>\n    <string name=\"rate_session\" translation_description=\"The label for the button to rate the session by 5 stars\">Rate Session</string>\n    <string name=\"menu_item_session_location\" translation_description=\"The label for the location of the session.\">Session location</string>\n    <string name=\"menu_item_session_star\" translation_description=\"The label for starring of the session.\">Star session</string>\n    <string name=\"menu_item_calendar\" translation_description=\"The label for adding a session schedule to the user's calendar app.\">Add to calendar</string>\n    <string name=\"paragraph_delimiter\" translatable=\"false\">\\n\\n</string>\n    <string name=\"speaker_delimiter\" translation_description=\"The text delimiter of speaker names. The names are not localized.\">, </string>\n    <string name=\"session_detail_header_aspect\" translatable=\"false\">H,16:9</string>\n    <string name=\"session_detail_speakers_header\" translation_descriptions=\"The label for the session speakers.\">Speakers</string>\n    <string name=\"session_detail_related_header\" translation_description=\"The label for the events related to this session.\">Related Events</string>\n\n    <!-- Session Feedback -->\n    <string name=\"feedback_submit\" translation_description=\"The label for the button to submit feedback to a session\">Submit</string>\n    <string name=\"feedback_thank_you\" translation_description=\"The message shown to the user when they have sent feedback to a session.\">Thank you for your feedback!</string>\n\n    <string name=\"feedback_q1_text\" translation_description=\"A question for session feedback (Q1)\">How would you rate the overall quality of the Session?</string>\n    <string name=\"feedback_q2_text\" translation_description=\"A question for session feedback (Q2)\">How would you describe the content of the Session based on your expectations/session description?</string>\n    <string name=\"feedback_q3_text\" translation_description=\"A question for session feedback (Q3)\">How would you rate the Speaker(s)?</string>\n    <string name=\"feedback_q4_text\" translation_description=\"A question for session feedback (q4)\">How relevant was the Session to your projects?</string>\n\n    <string name=\"feedback_q1_label_start\" translation_description=\"The label of negative answer for a session feedback question (Q1)\">Poor</string>\n    <string name=\"feedback_q2_label_start\" translation_description=\"The label of negative answer for a session feedback question (Q2)\">Poor</string>\n    <string name=\"feedback_q3_label_start\" translation_description=\"The label of negative answer for a session feedback question (Q3)\">Poor</string>\n    <string name=\"feedback_q4_label_start\" translation_description=\"The label of negative answer for a session feedback question (Q4)\">Not very</string>\n\n    <string name=\"feedback_q1_label_end\" translation_description=\"The label of positive answer for a session feedback question (Q1)\">Outstanding</string>\n    <string name=\"feedback_q2_label_end\" translation_description=\"The label of positive answer for a session feedback question (Q2)\">Outstanding</string>\n    <string name=\"feedback_q3_label_end\" translation_description=\"The label of positive answer for a session feedback question (Q3)\">Outstanding</string>\n    <string name=\"feedback_q4_label_end\" translation_description=\"The label of positive answer for a session feedback question (Q4)\">Extremely</string>\n\n    <!-- Accessibility -->\n    <string name=\"a11y_show_navigation\" translation_description=\"Description of the menu button shown on top-level screens.\">Show navigation menu</string>\n\n    <string name=\"a11y_collapse_filters_sheet\" translation_description=\"Description of a button to lower the filters sheet.\">Lower filters sheet</string>\n    <string name=\"a11y_clear_tag_filters\" translation_description=\"Description of a button to remove all current tag filters.\">Clear filters</string>\n    <string name=\"a11y_filter_applied\" translation_description=\"Alternative text when an event filter is applies\">%1s filter applied</string>\n    <string name=\"a11y_filter_not_applied\" translation_description=\"Alternative text when an event filter is not applies\">%1s filter not applied</string>\n\n    <string name=\"a11y_reservation_available\" translation_description=\"Alternative text for the button letting the user reserve a seat for a given event.\">Reserve event</string>\n    <string name=\"a11y_reservation_reserved\" translation_description=\"Alternative text for the event reservation button when the user has reserved a seat.\">Event reserved</string>\n    <string name=\"a11y_reservation_disabled\" translation_description=\"Alternative text for the event reservation button when reservation is not available.\">Reservation not available</string>\n    <string name=\"a11y_reservation_wait_list_available\" translation_description=\"Alternative text for the event reservation button when the user can join a wait list.\">Join wait list for event</string>\n    <string name=\"a11y_reservation_wait_listed\" translation_description=\"Alternative text for the event reservation button when the user is on a wait list for the event.\">On wait list for event</string>\n    <string name=\"a11y_reservation_pending\" translation_description=\"Alternative text for the event reservation button when the user's reservation is pending.\">Reservation pending</string>\n    <string name=\"a11y_starred\" translation_description=\"Alternative text for the event bookmark button when the event has been bookmarked.\">Event bookmarked</string>\n    <string name=\"a11y_unstarred\" translation_description=\"Alternative text for the event bookmark button when the event has not been bookmarked.\">Event not bookmarked</string>\n    <string name=\"a11y_star\" translation_description=\"Alternate text for a button used for starring or unstarring events\">Star</string>\n    <string name=\"a11y_play\" translation_description=\"Alternate text for a button used to play a video\">Play video</string>\n\n    <string name=\"a11y_feed_social_instagram_button\" translation_description=\"Description of the instagram button on the feed.\">Open instagram to see what others are sharing</string>\n    <string name=\"a11y_feed_social_twitter_button\" translation_description=\"Description of the twitter button on the feed.\">Open twitter to see what others are sharing</string>\n    <string name=\"a11y_feed_social_google_devs_button\" translation_description=\"Description of the google developer button on the feed.\">Open google developers blog</string>\n    <string name=\"a11y_feed_social_facebook_button\" translation_description=\"Description of the facebook button on the feed.\">Open google developers facebook page</string>\n    <string name=\"a11y_feed_social_youtube_button\" translation_description=\"Description of the youtube button on the feed.\">Open google developers youtube channel</string>\n\n    <string name=\"a11y_select_map_mode\" translation_description=\"Alternate text for a button used to select the mode on the Map.\">Select map mode</string>\n    <string name=\"a11y_search_schedule\" translation_description=\"Alternate text for a button used to search the schedule.\">Search schedule</string>\n\n    <!-- Sign in / Sign out -->\n    <string name=\"welcome\" translation_description=\"Text shown instead of the user's name when the user is not signed in.\">Welcome!</string>\n    <string name=\"a11y_signed_in_content_description\" translation_description=\"Description of the account header when the user is signed in.\">Signed in as %s.</string>\n    <string name=\"a11y_signed_out_content_description\" translation_description=\"Description of the account header when the user is not signed in.\">Tap to sign in.</string>\n\n    <string name=\"dialog_sign_in_content\" translation_description=\"The content of the dialog. When the user needs to sign in.\">Sign in to save events, reserve seats and rate sessions (if an attendee). Actions will be synced from your account across app and site.</string>\n    <string name=\"sign_in\" translation_description=\"The description of a button to sign in.\">Sign in</string>\n    <string name=\"firebase_auth_no_network_connection\" translation_description=\"Snackbar message when there is no network connectivity.\">No internet connection</string>\n    <string name=\"firebase_auth_unknown_error\" translation_description=\"Snackbar message when Firebase Auth has an unknown error.\">Unknown error</string>\n\n    <string name=\"dialog_sign_out_content\" translation_description=\"The content of the dialog. Used to confirm that the user wants to sign out.\">All saved events, seat reservations and session ratings (if an attendee) remain synced to your account.</string>\n    <string name=\"sign_out\" translation_description=\"The description of a button to sign out.\">Sign out</string>\n\n    <string name=\"manage_google_account\" translation_description=\"Text for a button allowing the user to manage their Google account.\">Manage your Google account</string>\n    <string name=\"manage_google_account_url\" translatable=\"false\">https://myaccount.google.com/</string>\n\n    <!-- Cancel reservation dialog -->\n    <string name=\"remove_reservation_title\" translation_description=\"The title of the dialog when the user is about to remove their reservation.\">Remove reservation?</string>\n    <string name=\"remove_reservation_content\" translation_description=\"The content of the dialog when the user is about to cancel their reservation.\">You\\'re about to give up your seat for \\\"%1$s\\\". If you decide not to reserve a seat but still want to attend, all sessions will have a portion of seats available first come, first serve onsite.</string>\n    <string name=\"cancel\" translation_description=\"The label of the button to keep the seat.\">Cancel</string>\n    <string name=\"remove\" translation_description=\"The label of the button to release the seat.\">Remove</string>\n\n    <!-- Swap reservations dialog -->\n    <string name=\"swap_reservation_title\" translation_description=\"The title of the dialog when the user is about to change their reservation from one session to another.\">Swap reservation?</string>\n    <string name=\"swap_reservation_content\" translation_description=\"The content of the dialog when the user is about to change their reservation from one session to another.\">You already have a reservation/waitlist for \\\"%1$s\\\". Only one reservation per time block is allowed. Would you like to swap for \\\"%2$s\\\"?</string>\n    <string name=\"swap\" translation_description=\"The label of the button to swap the reservation with another.\">Swap</string>\n\n    <!-- Notifications preference dialog -->\n    <string name=\"notifications_preference_dialog_title\" translation_description=\"The title of the dialog for the notifications preference\">I/O Notifications</string>\n    <string name=\"notifications_preference_dialog_content\" translation_description=\"The content of the dialog for the notifications preference\">Would you like to receive notifications about I/O? We\\'ll send you information about session start times, after hours events, session recordings, and more. You can change this setting under \\\"Settings\\\" at any time.</string>\n    <string name=\"no\" translation_description=\"Negative answer to the question \\'Would you like to receive notification?\\'\">No</string>\n    <string name=\"yes\" translation_description=\"Positive answer to the question \\'Would you like to receive notification?\\'\">Yes</string>\n\n    <!-- Feed -->\n    <string name=\"feed_not_available\" translation_description=\"Message that is shown when the announcements could not be loaded or are empty.\">No announcements found.</string>\n    <string name=\"feed_loading_error\" translation_description=\"Short error message that is displayed in a Snackbar when the feed could not be loaded.\">Could not load feed. Try again later.</string>\n    <string name=\"feed_announcement_title\" translation_description=\"The title of the announcements section in feed\">Announcements</string>\n    <string name=\"feed_past_announcements\" translation_description=\"The label of the button to see all the past announcements\">Past announcements</string>\n    <string name=\"feed_sessions_title\" translation_description=\"The title for the list of reserved sessions on the Feed.\">My reservations</string>\n    <string name=\"feed_session_map_button_title\">Show on map</string>\n    <string name=\"feed_view_full_schedule\" translation_description=\"The title of the call to action in sessions section of feed when user is signed in\">My full schedule</string>\n    <string name=\"feed_watch_live_stream\" translation_description=\"The title of the call to action in FeedHeader when the moment contains a livestream\">Watch livestream</string>\n    <string name=\"feed_no_reserved_events\" translation_description=\"Message that is shown when the user hasn't reserved a seat for any event\">Your reserved events for today will show up here</string>\n    <string name=\"feed_no_reserved_events_action\" translation_description=\"Button label for the action on the no reserved events card\">Find events to reserve in Schedule</string>\n    <string name=\"feed_session_details_button_title\" translation_description=\"Label for the button that takes the user to the session details.\">See details</string>\n\n    <string name=\"feed_social_channels_message\" translation_description=\"The sub-title of the social channels section in feed\">See what other people are sharing.</string>\n    <string name=\"feed_social_twitter_link\" translatable=\"false\">https://twitter.com/googledevs</string>\n    <string name=\"feed_social_twitter_hashtag_link\" translatable=\"false\">https://twitter.com/hashtag/googleio</string>\n    <string name=\"feed_social_instagram_link\" translatable=\"false\">https://www.instagram.com/googledevs</string>\n    <string name=\"feed_social_google_devs_link\" translatable=\"false\">https://developers.googleblog.com/</string>\n    <string name=\"feed_social_facebook_link\" translatable=\"false\">https://www.facebook.com/Google-Developers-967415219957038/</string>\n    <string name=\"feed_social_youtube_link\" translatable=\"false\">https://www.youtube.com/googledevelopers</string>\n\n    <string name=\"feed_sustainability_title\" translation_description=\"The title of the sustainability section in feed\">A more sustainable and diverse I/O</string>\n    <string name=\"feed_sustainability_message\" translation_description=\"The message in the sustainability section in feed\">See what I/O is doing this year around sustainability and diversity.</string>\n    <string name=\"feed_sustainability_action\" translation_description=\"The button label in the sustainability section in feed\">Learn more</string>\n    <string name=\"feed_sustainability_link\" translatable=\"false\">https://events.google.com/io/sustainability/</string>\n\n    <!-- [start] TODO(gauravbhola): To be removed -->\n    <string name=\"feed_upcoming_events\" translation_description=\"The title of the sessions section in feed when user is attending\">Upcoming events</string>\n    <string name=\"feed_saved_events\" translation_description=\"The title of the sessions section in feed when user is signed in\">Saved events</string>\n    <string name=\"feed_no_saved_events\" translation_description=\"The title of the sessions section in feed when user is signed in and they don't have any saved event\">No saved events</string>\n    <string name=\"feed_view_all_events\" translation_description=\"The title of the call to action in sessions section of feed when user is signed out\">View all events</string>\n    <string name=\"feed_view_your_schedule\" translation_description=\"The title of the call to action in sessions section of feed when user is signed in\">View your schedule</string>\n    <!-- [end] To be removed -->\n\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\" translation_description=\"Unit for duration of time by days. Singular.\">%s day</item>\n        <item quantity=\"other\" translation_description=\"Unit for duration of time by days. Plural.\">%s days</item>\n    </plurals>\n\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\" translation_description=\"Unit for duration of time by hours. Singular.\">%s hour</item>\n        <item quantity=\"other\" translation_description=\"Unit for duration of time by hours. Plural.\">%s hours</item>\n    </plurals>\n\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\" translation_description=\"Unit for duration of time by minutes. Singular.\">%s minute</item>\n        <item quantity=\"other\" translation_description=\"Unit for duration of time by minutes. Plural.\">%s minutes</item>\n    </plurals>\n\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\" translation_description=\"Unit for duration of time by seconds. Singular.\">%s second</item>\n        <item quantity=\"other\" translation_description=\"Unit for duration of time by seconds. Plural.\">%s seconds</item>\n    </plurals>\n\n    <!--Strings for sharing session-->\n    <string name=\"menu_item_share_session\" translation_description=\"The label for the button to share this session on SNS, etc.\">Share session</string>\n    <string name=\"share_text_session_detail\" translation_description=\"The default message to be used when user is sharing an I/O session on SNS, etc.\">Check out \\'%1$s\\' at #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\" translation_description=\"The label for share screen where user can tell people about an I/O session on SNS, etc.\">Share</string>\n\n    <!-- Map -->\n    <string name=\"map_variant_after_dark\" translation_description=\"Label for the map mode showing the after dark map.\">After dark</string>\n    <string name=\"map_variant_concert\" translation_description=\"Label for the map mode showing the concert map.\">Concert</string>\n    <string name=\"map_variant_daytime\" translation_description=\"Label for the map mode showing the daytime map.\">Daytime</string>\n    <string name=\"enable_my_location\" translation_description=\"The label for the button to enable the blue dot indicating the user's location on the map\">Enable my location</string>\n    <string name=\"my_location_rationale\" translation_description=\"Explanation about the location permission\">The app needs location permission to show your location on the map.</string>\n\n    <!-- Onboarding -->\n    <string name=\"onboarding_get_started\" translation_description=\"The label for the button to start using the app.\">Get started</string>\n    <string name=\"onboarding_welcome_to_google_i_o\" translation_description=\"The welcome message shown at the onboarding screen of the app.\">Welcome to Google I/O</string>\n    <string name=\"onboarding_date_location\" translation_description=\"The date and the place of Google I/O 2019. [CHAR_LIMIT=80]\">May 7–9, 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\" translation_description=\"The label for the display of the number of days until the conference starts\">D</string>\n    <string name=\"onboarding_label_hours\" translation_description=\"The label for the display of the number of hours until the conference starts\">H</string>\n    <string name=\"onboarding_label_mins\" translation_description=\"The label for the display of the number of minutes until the conference starts\">M</string>\n    <string name=\"onboarding_label_seconds\" translation_description=\"The label for the display of the number of seconds until the conference starts\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\" translation_description=\"The welcome message shown before the conference to tell that Google I/O is coming\">Google I/O is coming</string>\n    <string name=\"onboarding_welcome_google_io_during\" translation_description=\"The welcome message shown during the conference\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\" translation_description=\"The welcome message shown post the conference\">Watch the I/O \\'19 recap and check out #io19 on social</string>\n    <string name=\"onboarding_signin\" translation_description=\"The welcome message to encourage the user to sign-in to have better experience\">Sign-in to receive I/O notifications and attendees can reserve seats for sessions.</string>\n\n    <plurals name=\"session_starting_in\" translation_description=\"A countdown timer for a session starting, e.g. 'Session starting in 5 minutes'. Will always be minutes\">\n        <item quantity=\"one\">Session starting in %1$s minute</item>\n        <item quantity=\"other\">Session starting in %1$s minutes</item>\n    </plurals>\n\n    <string name=\"expanded\" translation_description=\"The label used on a button when a view is in an expanded state.\">Expanded</string>\n    <string name=\"collapsed\" translation_description=\"The label used on a button when a view is in an collapsed state.\">Collapsed</string>\n\n    <!-- Settings -->\n    <string name=\"settings_title\" translation_description=\"Title for the tab that shows all the settings of this app.\">Settings</string>\n    <string name=\"version_name\" translation_description=\"Label for the app version name in Settings.\">Version %s</string>\n\n    <!-- Info pages - TODO: update with 2018 copy and set translatable=\"true\". -->\n    <string name=\"event_title\" translation_description=\"The title for the tab that shows interesting events, such as sessions and office hours.\">Event</string>\n    <string name=\"travel_title\" translation_description=\"The title for the tab that shows travel information, such as carpool and bus schedules.\">Travel</string>\n    <string name=\"faq_title\" translation_description=\"The title for the tab that shows FAQ.\">FAQ</string>\n    <string name=\"about_title\" translation_description=\"Title for the 'About' tab that shows miscellaneous info.\">About</string>\n\n    <string name=\"tos_url\" translatable=\"false\">https://policies.google.com/terms</string>\n    <string name=\"privacy_policy_url\" translatable=\"false\">https://policies.google.com/privacy</string>\n    <string name=\"oss_file\" translatable=\"false\">file:///android_asset/licenses.html</string>\n\n    <string name=\"travel_what_to_bring_title\" translation_description=\"Header label for what to bring for the event\">What to bring for the event</string>\n    <string name=\"travel_hotels_title\" translation_description=\"Header label for hotels information for travel\">Hotels</string>\n    <string name=\"travel_getting_to_mountain_view_title\" translation_description=\"Header label for getting to Mountain View for travel\">Getting to Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\" translation_description=\"Header label for getting to Mountain View for travel\">Getting to Shoreline Amphitheatre</string>\n    <string name=\"travel_shuttle_service_title\" translation_description=\"Header label for Shuttle service for travel\">Shuttle service</string>\n    <string name=\"travel_off_site_parking_title\" translation_description=\"Header label for off-site parking for travel\">Off-site parking</string>\n    <string name=\"travel_for_public_transportation_title\" translation_description=\"Header label public transportation for travel\">Public transportation</string>\n    <string name=\"travel_biking_title\" translation_description=\"Header label for biking for travel\">Biking</string>\n    <string name=\"travel_ridesharing_title\" translation_description=\"Header label for ride sharing for travel\">Ridesharing</string>\n    <string name=\"travel_airport_transfers_title\" translation_description=\"Header label for airport transfers for travel\">Airport Transfers</string>\n\n    <string name=\"travel_what_to_bring_description\" translation_description=\"Information on what to bring for the event\"><![CDATA[Google I/O is an outdoor festival. While this is a big part of what makes I/O special, it also means there are some things to consider. Sessions will happen inside climate-controlled tents, but sunscreen, sunglasses, and an extra layer for the evening are recommended. I/O is a casual event, so keep this in mind when deciding what to wear.]]></string>\n    <string name=\"travel_hotels_description\" translation_description=\"Information on hotels for travel\"><![CDATA[We have room blocks at many local hotels. The list of hotels and room availability will be updated regularly. Please use the map below to find the hotel that’s best for you. <a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&ll=37.383600316075075%2C-122.07007405000002&z=12\">Hotel Map</a>]]></string>\n    <string name=\"travel_getting_to_mountain_view_description\" translation_description=\"Information on getting to Mountain View for travel\"><![CDATA[Here are the three major airports in the Bay Area with international airline service:<br> <a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\">San Francisco International Airport (SFO)</a> ~24 miles<br><br> <a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\">Oakland International Airport (OAK)</a> ~32 miles<br><br> <a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\">San Jose International Airport (SJC)</a> ~12 miles]]></string>\n    <string name=\"travel_getting_to_shoreline_description\" translation_description=\"Information on getting to Shoreline Amphitheater travel\"><![CDATA[In an effort to reduce traffic congestion and reduce our carbon emissions, Google I/O 2019 has committed to be a “No Parking Event*.” This decision has been carefully considered and we are offering you many free options to arrive at the event without requiring a vehicle.<br><br>We will be providing more information as the event approaches.<br><br>*Accessibility parking will be available.]]></string>\n    <string name=\"travel_shuttle_service_description\" translation_description=\"Information on getting to Shoreline Amphitheater travel\"><![CDATA[Free event shuttles from all Google recommended hotels will be provided for Google I/O attendees. There will also be select service from San Francisco, Millbrae BART, Mountain View Caltrain, San Jose, and Oakland. We are increasing the shuttle frequency and capacity at the Mountain View Caltrain and Millbrae Bart stations. Check back closer to the event for pick-up schedules and additional shuttle pickup locations. The Shuttle Schedule  will be posted closer to the event.]]></string>\n    <string name=\"travel_off_site_parking_description\" translation_description=\"Information on off-site parking for travel\"><![CDATA[Free off-site parking will be provided at <a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\">Avaya Stadium</a>. Shuttles from Avaya will be provided to/from Google I/O.<br><br> Please indicate on your registration form if you have any ADA or special assistance requirements, and the planning team will follow up with you directly.]]></string>\n    <string name=\"travel_for_public_transportation_description\" translation_description=\"Information on public transportation for travel\"><![CDATA[We will offer prepaid public transit passes that will be available for pickup during preregistration. Public transportation to the area is accessible via:<br><br> <a href=\"http://www.caltrain.com/\">Caltrain</a>: Regional rail system<br><br> <a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\">VTA</a>: Light rail system servicing the South Bay<br><br> <a href=\"https://www.bart.gov/\">BART</a>: Bay Area Rapid Transit<br><br> <a href=\"https://www.amtrak.com/home.html\">AMTRAK</a>: Regional rail system<br><br> Public transit doesn’t go directly to Google I/O. Stay tuned for the exact transportation locations serviced by Google I/O event shuttles. ]]></string>\n    <string name=\"travel_biking_description\" translation_description=\"Information on biking for travel\"><![CDATA[Complimentary bike parking will be available at Shoreline Amphitheatre in Parking Lot A. The Silicon Valley Bicycle Coalition will provide secure valet parking for your bicycle from 7am until the event ends each day.<br><br> Check Google Maps for the best bike routes and directions. There are two trails, Stevens Creek Trail and Permanente Creek Trail, that are convenient for bike riders heading to Shoreline Amphitheatre.]]></string>\n    <string name=\"travel_ridesharing_description\" translation_description=\"Information on ridesharing for travel\"><![CDATA[We will be offering partially subsidized use of Lyft Shared and Uber Pool  to/from Shoreline with the code IO2019. You can redeem this code as long as your destination or pick up is Shoreline Amphitheatre.<br><br> Lyft Share: Download the <a href=\"https://play.google.com/store/apps/details?id=me.lyft.android&hl=enor\">Lyft app</a> and use Lyft Shared using Code: IO2019 with a $15 credit per ride.<br><br> uberPOOL: Download the <a href=\"https://play.google.com/store/apps/details?id=com.ubercab&hl=en\">Uber app</a> to use uberPOOL and share a ride using the <a href=\"https://r.uber.com/LYMijgu98T\">Uber Voucher Link.</a>]]></string>\n    <string name=\"travel_airport_transfers_description\" translation_description=\"Information on ridesharing for travel\"><![CDATA[Airport transfers to SFO and SJC from Google I/O will be provided on the last day of the event. Airport transfers will NOT be provided on any other dates.]]></string>\n\n    <string name=\"faq_when_and_where_title\" translation_description=\"Header label for when and where is Google I/O 2019\">When and where is Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\" translation_description=\"Header label for how can I stay informed on Google I/O 2019\">How can I stay informed on the latest from Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\" translation_description=\"Header label for will the sessions be in English\">Will all the Sessions be in English?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\" translation_description=\"Header label for can I reserve sessions ahead of time\">Can I reserve Sessions ahead of the event?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\" translation_description=\"Header label for what is the best way to get to Shoreline Amphitheater\">What\\’s the best way to get to Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\" translation_description=\"Header label for where and when an attendee can pick up their badge\">Where and when can I pick up my badge?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\" translation_description=\"Header label for I want a front row seat at the Keynote\">I really want a front row seat at the Keynote. Tips?</string>\n    <string name=\"faq_what_should_i_wear_title\" translation_description=\"Header label for what should I wear\">What should I wear?</string>\n    <string name=\"faq_onsite_food_options_title\" translation_description=\"Header label for onsite food options in FAQ\">I like to snack. What are my onsite food options?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\" translation_description=\"Header label for if I lose something else in FAQ\">If I lose something onsite, where can I find it?</string>\n    <string name=\"faq_after_dark_program_title\" translation_description=\"Header label for after dark program in FAQ\">The After Dark programs sound like fun. Should I go?</string>\n    <string name=\"faq_accessibility_needs_title\" translation_description=\"Header label for accessibility needs in FAQ\">Can you accommodate my accessibility needs?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\" translation_description=\"Header label for support for expectant mothers and parents in FAQ\">How do you support expectant mothers and parents attending I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\" translation_description=\"Header label community guidelines and Anti harassment policy in FAQ\">Google\\’s Event Community Guidelines and Anti-Harassment Policy</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\" translation_description=\"Header label for a question whether the sessions be livestreamed in FAQ\">Will the Sessions be livestreamed?  What if I can\\’t follow the event in real time?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\" translation_description=\"Header label for I want to celebrate I/O with my community FAQ\">I want to celebrate I/O with my community!  Any ideas?</string>\n\n    <string name=\"faq_when_and_where_description\" translation_description=\"Information on when and where is Google I/O 2019 in FAQ\"><![CDATA[The 2019 developer festival will be held from May 7 – 9 at Shoreline Amphitheatre in Mountain View, California.]]></string>\n    <string name=\"faq_how_can_i_stay_informed_description\" translation_description=\"Information on when and where is Google I/O 2019 in FAQ\"><![CDATA[To stay up-to-date on the latest information on Sessions, speakers, and overall activities, be sure to frequently visit the <a href=\"https://events.google.com/io/\">Google I/O 2019 website</a>, the <a href=\"http://googledevelopers.blogspot.com/\">Google Developers Blog</a>, and follow us on <a href=\"https://twitter.com/googledevs\">Twitter</a> and <a href=\"https://www.facebook.com/Google-Developers-967415219957038/\">Facebook</a>. You can also follow and join the social conversation about Google I/O 2019 via the official <a href=\"https://twitter.com/search?q=%23io19&src=typd\">#io19</a> hashtag. In addition, we\\'ll be emailing important information to all registered attendees, along with check-in instructions prior to the festival.]]></string>\n    <string name=\"faq_will_the_sessions_be_english_description\" translation_description=\"Information on will the sessions be in English in FAQ\"><![CDATA[Yes. This will allow our global audience to follow along.]]></string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\" translation_description=\"Information on can I reserve sessions ahead of time in FAQ\"><![CDATA[Starting in April, in-person attendees can reserve seats for Sessions in advance of the event on the I/O website and also via the I/O mobile app (note: a portion of Session seats will be exempt from reservations and available first-come, first-served onsite). Attendance at Codelabs, App Reviews, and Office Hours is on a first-come, first-served basis onsite.]]></string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\" translation_description=\"Information on what is the best way to get to Shoreline Amphitheater in FAQ\"><![CDATA[Check out the Travel section for all the transportation tips you need, including shuttle information, driving and biking directions, ride sharing tips, and more!]]></string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\" translation_description=\"Information on where and when an attendee can pick up their badge in FAQ\"><![CDATA[To expedite the check-in process, we\\'ll begin badge pickup on Monday, May 6, at Shoreline Amphitheatre. To give you your Google I/O badge, we\\'ll need to:<br> - Verify your photo ID. We\\'re OK with government-issued licenses, passports, and other forms of identification. If you don\\'t have proper identification, you won\\'t be able to receive a badge and won\\'t be admitted into the conference. The name on your ID needs to be an exact match of your registration profile. If you\\'re an Academic attendee, please remember to bring proof of eligibility.<br> - Scan your registration QR code received via email. You can scan it from your phone—no need to print the email! #savetheenvironment <br><br>Please note, you may not share, give, or otherwise provide your badge to anyone. Google I/O badges aren\\'t replaceable, so don\\'t lose yours or you won\\'t be readmitted to the conference. You must wear your Google I/O badge to gain admission to Google I/O, including the Sessions, Sandboxes, and After Hours. If requested by security, please display or provide additional identification. Google I/O badges may include your name, company or organization (if provided), and photo.]]></string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\" translation_description=\"Information on I want a front row seat at the Keynote in FAQ\"><![CDATA[Everyone is guaranteed a seat for the Keynotes, but the best seats will be assigned on a first-come, first-served basis during badge pickup beginning at 7am on May 6th. So make sure to come by early!]]></string>\n    <string name=\"faq_what_should_i_wear_description\" translation_description=\"Information on what should I wear at the conference\"><![CDATA[Google I/O is an outdoor developer event, so please be comfortable and casual. There is no enforced dress code. The Bay Area can get very hot during the day and chilly in the evenings, so take this into consideration when planning your attire.]]></string>\n    <string name=\"faq_onsite_food_options_description\" translation_description=\"Information on onsite food options\"><![CDATA[Good news, we like food, too!  Attendees are offered complimentary breakfast, lunch, and snacks on all three days of the conference. Dinner will also be available on Day 1 and 2 during the After Hours events.]]></string>\n    <string name=\"faq_if_i_lose_something_onsite_description\" translation_description=\"Information on if I lose something else in FAQ\"><![CDATA[We got your back! The lost and found station will be located at the Conference Information Desk during event hours. Any items left overnight will be turned over to the Conference Security Office. One important detail: Google I/O badges are NOT replaceable, so don\\'t lose yours or you won\\'t be readmitted to the conference.]]></string>\n    <string name=\"faq_after_dark_program_description\" translation_description=\"Information on after dark program in FAQ\"><![CDATA[These are two nights you don\\'t want to miss! Attendees are invited to enjoy music, games, and more during the evening of May 8, and to an exclusive concert in the Amphitheatre on May 9. Food and drinks will be available on both nights (alcoholic beverages available for those 21 and over). Both After Hours events are hosted at Shoreline Amphitheatre, and your attendee badge is required for entrance.]]></string>\n    <string name=\"faq_accessibility_needs_description\" translation_description=\"Information on accessibility needs in FAQ\"><![CDATA[Google strives to make events open and accessible to everyone, regardless of disability or special needs. Participants with disabilities and/or special needs should provide details in the registration form and/or by emailing us at io19@google.com. This information will be kept private and will be distributed only to the individuals who need to know it to accommodate your request. Otherwise, please approach the Help Desk at Google I/O if you need assistance or have questions about accessibility during the event.<br><br>Shoreline Amphitheatre is an entirely outdoor venue. While the Keynotes will be taking place in an open-air amphitheatre, the Sessions will take place in enclosed areas. All areas of the venue are accessible for wheelchair users, and there will be a limited number of wheelchairs available on a first-come, first-served basis. Wheelchairs can be checked out at the First Aid station and returned at the end of each day. Additionally, there will be a service dog relief area.<br><br> We\\'ll provide live real-time transcription (CART) for the Keynotes and Sessions. Caption text displayed on a large screen at the front of the room will be accessible to all attendees. We\\'ll also use the text to provide captions for our livestream and post-event recordings.<br><br> If you need an ASL interpreter to accompany you in the Sessions at Google I/O, please let us know during registration and we\\'ll be happy to provide one for you. We\\'ll do our best to find a technical translator who is familiar with the domain, but please keep in mind that the interpreter probably won\\'t be able to meet with the speakers beforehand.<br><br> ADA parking spaces will be available. When arriving at the venue, please follow signs for ADA parking. Please have your placard hanging from your rearview mirror and visible to parking employees at all times to expedite the parking process. Accessible parking spaces are readily available on a first-come, first-served basis and may not be reserved in advance to fairly serve all attendees.]]></string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\" translation_description=\"Information on accessibility needs in FAQ\"><![CDATA[We\\'ll have expectant mother parking spaces in the ADA area.<br> Mothers who are nursing are welcome to attend the conference with their child. There will be four mothers\\' rooms open on May 7 and 8 from 8am - 8pm and on May 9 from 8am - 4pm. Sign up sheets will be available in front of the mothers\\' rooms and usage is first-come, first-served. Please see the conference help desk for more information.<br><br> Childcare reimbursement of USD $100 per day (not exceeding USD $300 total) will be offered to parents attending that express interest in childcare via our registration form, and is available on a first-come, first-served basis. Our childcare reimbursement is offered through a third-party vendor. If your request for childcare is approved by us via email before the conference starts and your onsite attendance is confirmed, our vendor will reach out to you with next steps within 7 business days following Google I/O. They will manage all disbursement of our childcare disbursement.]]></string>\n    <string name=\"faq_community_guidelines_and_policy_description\" translation_description=\"Information on guidelines and Anti harassment policy in FAQ\"><![CDATA[Google is dedicated to providing a harassment-free and inclusive event experience for everyone regardless of gender identity and expression, sexual orientation, disabilities, neurodiversity, physical appearance, body size, ethnicity, nationality, race, age, religion, or other protected category. In an effort to make the event as inclusive as possible, gender-neutral bathrooms will be offered throughout the venue.<br><br> We don\\'t tolerate harassment of event participants in any form.<br> Google takes violations of our policy seriously and will respond appropriately. For more information on Google\\'s Event Community Guidelines and Anti-Harassment Policy, please see <a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\">here</a>.]]></string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\" translation_description=\"Information on whether the sessions be livestreamd in FAQ\"><![CDATA[The two Keynotes and all Sessions will be livestreamed on the event website\\'s homepage during the three days of the festival. If you\\'re busy at work or on the other side of the planet with a tricky time difference, you can watch the session recordings later on the <a href=\"https://www.youtube.com/user/GoogleDevelopers\">Google Developers YouTube channel</a>.]]></string>\n    <string name=\"faq_want_to_celebrate_i_o_description\" translation_description=\"Information on I want to celebrate I/O with my community in FAQ\"><![CDATA[Yes! Every year, developers around the world host <a href=\"https://events.google.com/io/extended\">Google I/O Extended events</a>. During these events, organizers can livestream the event and host their own sessions including hackathons, codelabs, demos, and more.<br> If you\\'re joining us as an I/O Extended host this year, here are the steps you should take to get started:<br><br>  Read through the <a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\">Organizer Guide</a> to get tips and suggestions on how to host a successful event.<br><br> <a href=\"https://events.google.com/io/extended/form\">Register</a> your public event on the I/O website for increased visibility.<br><br> Use the official #io19extended hashtag on all your social posts related to I/O Extended for easier discoverability.<br><br> Note: I/O Extended hosts can request the deletion of their personal and/or event data after the event ends by emailing io19@google.com.<br> If you simply want to attend an I/O Extended event, browse <a href=\"https://events.google.com/io/extended\">our map</a> to find one near you and RSVP!<br> For questions about the I/O Extended program, contact us at io19extended\\-external@google.com.]]></string>\n\n    <string name=\"view_sessions_text\" translation_description=\"Link label for viewing all sessions in schedule.\">View Sessions</string>\n    <string name=\"wifi_install_success\" translation_description=\"Snackbar message when wifi network is successfully saved.\">Wifi network saved</string>\n    <string name=\"wifi_install_clipboard_message\" translation_description=\"WiFi install failed, so tell the user we saved the password to the clipboard.\">Unable to save wifi network.\\nSaved password to clipboard instead.</string>\n    <string name=\"event_sessions_title\" translation_description=\"Header label for general information on &quot;sessions&quot;.\">Sessions</string>\n    <string name=\"event_sandbox_title\" translation_description=\"Header label for general &quot;sandbox&quot; description.\">Sandbox</string>\n    <string name=\"event_codelabs_title\" translation_description=\"Header label for general information on &quot;codelabs&quot;.\">Codelabs</string>\n    <string name=\"event_officehours_title\" translation_description=\"Header label for general information on &quot;office hours and app reviews&quot;.\">Office Hours &amp; App Reviews</string>\n    <string name=\"event_afterhours_title\" translation_description=\"Header label for general information on &quot;after hours&quot;\">After Hours</string>\n    <string name=\"event_meals_title\" translation_description=\"Header label for general information on &quot;meals&quot;\">Meals</string>\n    <string name=\"event_sessions_description\" translation_description=\"General information on sessions\">Starting in April, in-person attendees can reserve seats for Sessions in advance of the event on the I/O website and also via the I/O mobile app (note: a portion of Session seats will be exempt from reservations and available first-come, first-served onsite). Attendance at Codelabs, App Reviews, and Office Hours is on a first-come, first-served basis onsite.</string>\n    <string name=\"event_sandbox_description\" translation_description=\"General information on sandboxes.\">Dedicated spaces to explore, learn, and play with our latest products and platforms via interactive demos, physical installations, and more.</string>\n    <string name=\"event_codelabs_description\" translation_description=\"General information on codelabs.\">Get hands-on experience in our ready-to-code kiosks. Here, you’ll have everything you need to learn about the latest and greatest Google technologies via self-paced tutorials, or bring your own machine and take your work home with you. Google staff will be on hand for helpful advice and to provide direction if you get stuck.</string>\n    <string name=\"event_officehours_description\" translation_description=\"General information on office hours and app reviews.\">Office Hours are your chance to meet one-on-one with Google experts to ask all your technical questions, and App Reviews will give you the opportunity to receive advice and tips on your specific app-related projects.</string>\n    <string name=\"event_afterhours_description\" translation_description=\"General information on after hours.\">After Sessions end for the day, stick around Shoreline for two evenings of food, drinks, and fun. On the first night, the party will take over the Sandbox space, and on the second night, we\\'ll have an exclusive concert in the Amphitheatre.</string>\n    <string name=\"event_meals_description\" translation_description=\"General information on meals.\">Attendees are offered complimentary breakfast, lunch, and snacks on all three days of the conference. Dinner will also be available on Day 1 and 2 during the After Hours events.</string>\n    <string name=\"wifi_header\" translation_description=\"Header label for wifi information.\">Wifi</string>\n    <string name=\"related_apps_header\" translation_description=\"Header label for related apps.\">Related Apps</string>\n    <string name=\"event_types_header\" translation_description=\"Header label for information on the different event types.\">Event Types</string>\n\n    <!--Info pages - Strings ready to translate-->\n    <string name=\"settings_time_zone_label\" translate_description=\"Set time zone in app to PST.\">Events in Pacific Time Zone (UTC-8)</string>\n    <string name=\"settings_enable_notifications\" translate_description=\"Turn on notifications.\">Enable notifications</string>\n    <string name=\"settings_send_anonymous_usage_statistics\" translation_description=\"Enable sending usage statistics.\">Send anonymous usage statistics</string>\n    <string name=\"settings_tos\" translation_description=\"Open link to terms of service.\">Terms of service</string>\n    <string name=\"settings_privacy_policy\" translation_description=\"Open link to privacy policy.\">Privacy policy</string>\n    <string name=\"settings_oss_licenses\" translation_description=\"Open link to open source licenses.\">Open sources licenses</string>\n    <string name=\"settings_theme_title\" translation_description=\"Choose the app theme\">Choose theme</string>\n    <string name=\"settings_theme_system\" translation_description=\"Theme option to use the system default\">System default</string>\n    <string name=\"settings_theme_light\" translation_description=\"Theme option to use the light theme\">Light</string>\n    <string name=\"settings_theme_dark\" translation_description=\"Theme option to use the dark theme\">Dark</string>\n    <string name=\"settings_theme_battery\" translation_description=\"Theme option to use which is set by the device Battery Saver feature being enabled\">Set by Battery Saver</string>\n\n    <string name=\"built_with_material_components\" translation_description=\"The app was built with Material Components.\">Built with Material Components.</string>\n\n    <string name=\"wifi_network_and_password\" translation_description=\"Label for wifi network name and password, separated by a line break.\">Network: %1$s\\nPassword: %2$s</string>\n    <string name=\"join_network\" translation_description=\"Text for a button to automatically connect to the Wifi network.\">Join network</string>\n\n    <string name=\"assistant_app_description\" translation_description=\"Text explaining the I/O 19 app for Google Assistant. [CHAR_LIMIT=100]\">Use the I/O 19 Action on Google Assistant.</string>\n    <string name=\"assistant_app_description2\" translation_description=\"Text explaining the I/O 19 app for Google Assistant. [CHAR_LIMIT=100]\">Just say \\\"Hey Google, talk to Google I/O 19\\\"!</string>\n\n    <!-- Speaker -->\n    <string name=\"speaker_link_website\" translation_description=\"The label for a link to a speaker's Website\">Website</string>\n    <string name=\"speaker_link_twitter\" translation_description=\"The label for a link to a speaker's Twitter profile\">Twitter</string>\n    <string name=\"speaker_link_github\" translation_description=\"The label for a link to a speaker's GitHub profile\">GitHub</string>\n    <string name=\"speaker_link_linkedin\" translation_description=\"The label for a link to a speaker's LinkedIn profile\">LinkedIn</string>\n    <!-- \\u0020 is breakable whitespace - whitespace characters at start/end of string res are trimmed. -->\n    <string name=\"speaker_events_subhead\" translation_description=\"The heading for a list of events a speaker is associated with\">Events</string>\n\n    <string name=\"no_network_connection\" translation_description=\"Snackbar message when there is not network connection\">No internet connection.</string>\n\n    <string name=\"navigate_up\" translation_description=\"Arrow at the top left of the screen for navigation\">Navigate up</string>\n\n    <!-- AR -->\n    <string name=\"no_network_description\" translation_description=\"Message to be shown when user tries to open the Explore feature without any network connection. [CHAR_LIMIT=500]\">To use Explore I/O, try:\\n\\n - Turning off airplane mode\\n\\n - Turning on mobile data or Wi-Fi\\n\\n - Checking the signal in your area</string>\n    <string name=\"phone_does_not_support_arcore_title\" translation_description=\"Title to be shown when user tries to open the Explore feature with a device which does not support ARCore. [CHAR_LIMIT=500]\">Your phone doesn\\'t support ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\" translation_description=\"Message to be shown when user tries to open the Explore feature with a device which does not support ARCore. [CHAR_LIMIT=500]\">Try another device, or borrow one from a friend</string>\n\n    <!-- Codelabs -->\n    <string name=\"codelabs_information\" translation_description=\"Information about codelabs.\">Learn about the latest and greatest Google technologies via self-paced tutorials in our ready-to-code kiosks, or bring your own machine and take your work home with you. Kiosks are open daily except during the first Keynote.</string>\n    <string name=\"codelabs_building\" translation_description=\"Text of a button that shows where the Codelabs building is on the map.\">Codelabs building</string>\n    <string name=\"codelabs_website\" translation_description=\"Text of a button that launches the Codelabs website.\">Codelabs website</string>\n    <string name=\"codelab_duration\" translation_description=\"Text showing the approximate time in minutes that a user would spend during a codelab tutorial. Abbreviated.\">Duration: %1$d min</string>\n    <string name=\"start_codelab\" translation_description=\"Text of a button that allows a user to start a codelab tutorial.\">Start codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/styles.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <style name=\"AlertDialog.TitleText\" parent=\"MaterialAlertDialog.MaterialComponents.Title.Text\">\n        <item name=\"android:fontFamily\">@font/google_sans_medium</item>\n        <item name=\"android:textSize\">20sp</item>\n        <item name=\"fontFamily\">@font/google_sans_medium</item>\n    </style>\n\n    <style name=\"AlertDialog.TitlePanel\" parent=\"MaterialAlertDialog.MaterialComponents.Title.Panel\">\n        <item name=\"android:paddingBottom\">16dp</item>\n        <item name=\"android:paddingTop\">?attr/dialogPreferredPadding</item>\n    </style>\n\n    <style name=\"AlertDialog.BodyText\" parent=\"MaterialAlertDialog.MaterialComponents.Body.Text\">\n        <item name=\"android:textSize\">16sp</item>\n        <item name=\"android:textAlignment\">viewStart</item>\n        <item name=\"android:lineSpacingExtra\">4sp</item>\n    </style>\n\n    <style name=\"AlertDialog.ButtonBar\" parent=\"@style/Widget.AppCompat.ButtonBar.AlertDialog\">\n        <item name=\"android:paddingBottom\">@dimen/margin_small</item>\n        <item name=\"android:paddingTop\">@dimen/margin_small</item>\n    </style>\n\n    <!-- Text appearances -->\n\n    <!-- For titles, e.g. Event Detail, Speaker Detail -->\n    <style name=\"TextAppearance.IOSched.H1\" parent=\"@style/TextAppearance.MaterialComponents.Headline5\">\n        <item name=\"android:fontFamily\">@font/google_sans</item>\n        <item name=\"android:textSize\">@dimen/text_size_h1</item>\n        <item name=\"fontFamily\">@font/google_sans</item>\n    </style>\n\n    <!-- For smaller titles, e.g. Schedule day decorations -->\n    <style name=\"TextAppearance.IOSched.H2\" parent=\"@style/TextAppearance.IOSched.H1\">\n        <item name=\"android:textSize\">@dimen/text_size_h2</item>\n    </style>\n\n    <!-- For other prominent text -->\n    <style name=\"TextAppearance.IOSched.H3\" parent=\"@style/TextAppearance.IOSched.H1\">\n        <item name=\"android:fontFamily\">@font/google_sans_medium</item>\n        <item name=\"android:textSize\">@dimen/text_size_h3</item>\n        <item name=\"fontFamily\">@font/google_sans_medium</item>\n    </style>\n\n    <style name=\"TextAppearance.IOSched.Button\" parent=\"TextAppearance.MaterialComponents.Button\">\n        <item name=\"android:fontFamily\">@font/google_sans_medium</item>\n        <item name=\"android:letterSpacing\">0</item>\n        <item name=\"android:textAllCaps\">false</item>\n        <item name=\"fontFamily\">@font/google_sans_medium</item>\n    </style>\n\n    <!-- List item primary text, e.g. event titles, codelab titles -->\n    <style name=\"TextAppearance.IOSched.ListPrimary\" parent=\"TextAppearance.MaterialComponents.Body1\">\n        <item name=\"android:fontFamily\">@font/google_sans_medium</item>\n        <item name=\"android:letterSpacing\">0</item>\n        <item name=\"fontFamily\">@font/google_sans_medium</item>\n    </style>\n\n    <!-- Intermediate style to make further style extensions below easier to follow -->\n    <style name=\"TextAppearance.IOSched.Body2\" parent=\"TextAppearance.MaterialComponents.Body2\" />\n\n    <!-- Section headers -->\n    <style name=\"TextAppearance.IOSched.Overline\" parent=\"@style/TextAppearance.IOSched.Body2\">\n        <item name=\"android:textStyle\">bold</item>\n        <item name=\"android:textColor\">?android:textColorSecondary</item>\n        <item name=\"android:textAllCaps\">true</item>\n    </style>\n\n    <style name=\"TextAppearance.IOSched.NoticeBody\" parent=\"@style/Widget.IOSched.MultilineBody\">\n        <item name=\"android:textSize\">18sp</item>\n    </style>\n\n    <style name=\"TextAppearance.IOSched.ToolbarTitle\" parent=\"@style/TextAppearance.Widget.AppCompat.Toolbar.Title\">\n        <item name=\"android:fontFamily\">@font/google_sans</item>\n        <item name=\"android:textSize\" tools:ignore=\"SpUsage\">20dp</item>\n    </style>\n\n    <style name=\"TextAppearance.IOSched.Tab\" parent=\"@style/TextAppearance.Design.Tab\">\n        <item name=\"android:fontFamily\">@font/google_sans</item>\n        <item name=\"android:textStyle\">bold</item>\n        <item name=\"textAllCaps\">false</item>\n    </style>\n\n    <!-- Filters -->\n    <style name=\"TextAppearance.IOSched.FilterChip.Selectable\" parent=\"TextAppearance.MaterialComponents.Body2\">\n        <item name=\"android:textStyle\">bold</item>\n    </style>\n\n    <!-- Schedule -->\n    <style name=\"TextAppearance.IOSched.ReservationStatus\" parent=\"@style/TextAppearance.IOSched.Body2\">\n        <item name=\"android:textAllCaps\">true</item>\n    </style>\n\n    <style name=\"TextAppearance.IOSched.FiltersLabel\" parent=\"TextAppearance.IOSched.H2\">\n        <item name=\"android:textSize\">18sp</item>\n    </style>\n\n    <!-- Map -->\n    <style name=\"TextAppearance.IOSched.Map.MarkerLabel\" parent=\"TextAppearance.IOSched.Body2\">\n        <item name=\"android:textSize\">12sp</item>\n        <item name=\"android:fontFamily\">monospace</item>\n        <item name=\"android:textColor\">@color/white</item>\n        <item name=\"android:letterSpacing\">-0.03</item>\n    </style>\n\n    <!-- Info -->\n    <style name=\"TextAppearance.IOSched.CollapsibleCard\" parent=\"@style/TextAppearance.IOSched.ListPrimary\">\n        <item name=\"android:textColor\">?colorPrimary</item>\n    </style>\n\n    <style name=\"TextAppearance.IOSched.Info.AssistantApp\" parent=\"TextAppearance.IOSched.Body2\">\n        <item name=\"android:fontFamily\">sans-serif-medium</item>\n        <item name=\"android:textColor\">?colorPrimary</item>\n        <item name=\"fontFamily\">sans-serif-medium</item>\n    </style>\n\n    <!-- Home -->\n    <style name=\"TextAppearance.IOSched.CountdownLabel\" parent=\"@style/TextAppearance.MaterialComponents.Caption\">\n        <item name=\"android:fontFamily\">@font/google_sans</item>\n        <item name=\"android:textSize\">18sp</item>\n    </style>\n\n    <!-- Settings -->\n    <style name=\"TextAppearance.IOSched.AboutButtons\" parent=\"@style/TextAppearance.IOSched.ListPrimary\">\n        <item name=\"android:textColor\">?colorPrimary</item>\n    </style>\n\n    <!-- Account dialogs -->\n    <style name=\"TextAppearance.IOSched.AccountDialog.Username\" parent=\"@style/TextAppearance.IOSched.ListPrimary\" />\n\n    <!-- Widget styles -->\n\n    <style name=\"Widget.IOSched\" parent=\"@android:style/Widget.Material\" />\n\n    <style name=\"Widget.IOSched.AppBar\" parent=\"@style/Widget.Design.AppBarLayout\">\n        <item name=\"android:background\">?attr/colorSurface</item>\n        <item name=\"android:elevation\">8dp</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Toolbar\" parent=\"Widget.MaterialComponents.Toolbar\">\n        <item name=\"android:paddingEnd\">8dp</item>\n        <item name=\"contentInsetStartWithNavigation\">?sessionListKeyline</item>\n        <item name=\"popupTheme\">@style/AppTheme.PopupTheme</item>\n        <item name=\"titleTextAppearance\">@style/TextAppearance.IOSched.ToolbarTitle</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Tabs\" parent=\"@style/Widget.MaterialComponents.TabLayout\">\n        <item name=\"tabTextAppearance\">@style/TextAppearance.IOSched.Tab</item>\n        <item name=\"tabIndicator\">@drawable/tab_indicator</item>\n    </style>\n\n    <!-- textAppearance alone doesn't support line spacing attrs. Multiline body text will use\n         style=\"Widget.IOSched.MultilineBody\" instead of the equivalent textAppearance.\n    -->\n    <style name=\"Widget.IOSched.MultilineBody\">\n        <item name=\"android:lineSpacingExtra\">4sp</item>\n        <item name=\"android:textColor\">?android:textColorSecondary</item>\n    </style>\n\n    <!-- Filters -->\n    <!-- Easier to extend Chip.Choice because it includes some desired color effects. -->\n    <style name=\"Widget.IOSched.FilterChip\" parent=\"Widget.MaterialComponents.Chip.Choice\">\n        <item name=\"android:textAppearance\">@style/TextAppearance.IOSched.FilterChip.Selectable</item>\n        <item name=\"chipBackgroundColor\">@color/chip_bg</item>\n        <item name=\"chipIcon\">@drawable/asld_chip_icon</item>\n        <item name=\"chipIconVisible\">true</item>\n        <item name=\"chipStrokeColor\">@color/chip_stroke</item>\n        <item name=\"textStartPadding\">0dp</item>\n    </style>\n\n    <style name=\"Widget.IOSched.FilterChip.Selectable\">\n        <item name=\"chipStrokeWidth\">1dp</item>\n    </style>\n\n    <!-- Active filters show a close shortcut and no checkmark. -->\n    <style name=\"Widget.IOSched.FilterChip.Closeable\">\n        <item name=\"android:clickable\">false</item>\n        <item name=\"chipIcon\">@drawable/chip_dot</item>\n        <item name=\"closeIcon\">@drawable/ic_filter_clear</item>\n        <item name=\"closeIconVisible\">true</item>\n        <item name=\"textEndPadding\">2dp</item>\n    </style>\n\n    <!-- Schedule -->\n    <style name=\"Widget.IOSched.Tag\">\n        <item name=\"android:gravity\">center_vertical</item>\n        <item name=\"android:lines\">1</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Tag.Inline\">\n        <item name=\"android:drawablePadding\">@dimen/spacing_micro</item>\n        <item name=\"android:drawableStart\">@drawable/tag_dot</item>\n        <item name=\"android:textColor\">?android:textColorSecondary</item>\n    </style>\n\n    <style name=\"Widget.IOSched.TimeHeaders\">\n        <item name=\"android:width\">@dimen/session_keyline</item>\n        <item name=\"android:fontFamily\">@font/google_sans</item>\n        <item name=\"android:padding\">@dimen/schedule_item_padding_vertical</item>\n        <item name=\"android:textColor\">?colorPrimary</item>\n        <item name=\"timeTextSize\">@dimen/time_header_time_text_size</item>\n        <item name=\"meridiemTextSize\">@dimen/time_header_meridiem_text_size</item>\n    </style>\n\n    <style name=\"Widget.IOSched.DayIndicatorDecoration\">\n        <item name=\"android:color\">?colorPrimary</item>\n        <item name=\"insetVertical\">8dp</item>\n    </style>\n\n    <style name=\"Widget.IOSched.DaySeparatorDecoration\">\n        <item name=\"android:width\">@dimen/day_header_decor_width</item>\n        <item name=\"android:height\">@dimen/day_header_decor_height</item>\n        <item name=\"android:fontFamily\">@font/google_sans</item>\n        <item name=\"android:textColor\">?android:textColorPrimary</item>\n        <item name=\"android:textSize\">@dimen/day_header_text_size</item>\n        <item name=\"verticalBias\">0.67</item>\n    </style>\n\n    <!-- Agenda -->\n    <style name=\"Widget.IOSched.DateHeaders\">\n        <item name=\"android:width\">@dimen/day_header_decor_width</item>\n        <item name=\"android:height\">@dimen/day_header_decor_height</item>\n        <item name=\"android:fontFamily\">@font/google_sans</item>\n        <item name=\"android:textColor\">?android:textColorPrimary</item>\n        <item name=\"android:textSize\">@dimen/day_header_text_size</item>\n        <item name=\"verticalBias\">0.67</item>\n    </style>\n\n    <!-- Account dialogs -->\n    <style name=\"Widget.IOSched.BorderlessButton.NormalText\" parent=\"@style/Widget.MaterialComponents.Button.TextButton\">\n        <item name=\"android:textAppearance\">?android:textAppearance</item>\n        <item name=\"android:textColor\">?android:textColorSecondary</item>\n    </style>\n\n    <style name=\"Widget.IOSched.AccountDialog.ActionButton\" parent=\"\">\n        <item name=\"android:background\">?selectableItemBackground</item>\n        <item name=\"android:drawablePadding\">@dimen/margin_normal</item>\n        <item name=\"android:gravity\">center_vertical</item>\n        <item name=\"android:minHeight\">?listPreferredItemHeightSmall</item>\n        <item name=\"android:paddingBottom\">@dimen/spacing_normal</item>\n        <item name=\"android:paddingEnd\">?listPreferredItemPaddingEnd</item>\n        <item name=\"android:paddingStart\">?listPreferredItemPaddingStart</item>\n        <item name=\"android:paddingTop\">@dimen/spacing_normal</item>\n        <item name=\"android:textColor\">?android:textColorPrimary</item>\n        <item name=\"android:textSize\">16sp</item>\n        <item name=\"android:textStyle\">bold</item>\n    </style>\n\n    <style name=\"Widget.IOSched.AccountDialog.ManageAccountButton\" parent=\"Widget.MaterialComponents.Button.OutlinedButton\">\n        <item name=\"android:textColor\">?android:textColorSecondary</item>\n        <item name=\"shapeAppearanceOverlay\">@style/ShapeAppearanceOverlay.MaterialComponents.Chip</item>\n    </style>\n\n    <!-- Onboarding -->\n    <style name=\"Widget.IOSched.OnboardingText\">\n        <item name=\"android:textAppearance\">@style/TextAppearance.IOSched.H1</item>\n        <item name=\"android:gravity\">center</item>\n        <item name=\"android:lineSpacingExtra\">6sp</item>\n    </style>\n\n    <!-- Speaker Detail -->\n    <style name=\"Widget.IOSched.Speaker\" />\n\n    <style name=\"Widget.IOSched.Speaker.Title\">\n        <item name=\"android:gravity\">center_horizontal</item>\n        <item name=\"android:textAppearance\">@style/TextAppearance.IOSched.H1</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Speaker.SocialButton\" parent=\"@style/Widget.MaterialComponents.Button.TextButton\">\n        <item name=\"android:minWidth\">0dp</item>\n    </style>\n\n    <!-- Home -->\n    <style name=\"Widget.IOSched.Feed\" />\n\n    <style name=\"Widget.IOSched.Feed.Session\" />\n\n    <style name=\"Widget.IOSched.Feed.Session.Title\">\n        <item name=\"android:ellipsize\">end</item>\n        <item name=\"android:maxLines\">3</item>\n        <item name=\"android:textSize\">18sp</item>\n        <item name=\"fontFamily\">sans-serif</item>\n        <item name=\"android:fontFamily\">sans-serif</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Feed.Card\" parent=\"Widget.MaterialComponents.CardView\">\n        <item name=\"cardElevation\">0dp</item>\n        <item name=\"strokeColor\">?android:attr/colorControlHighlight</item>\n        <item name=\"strokeWidth\">1dp</item>\n        <item name=\"cardCornerRadius\">@dimen/feed_card_corner_radius</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Feed.SocialChannelButton\" parent=\"Widget.MaterialComponents.FloatingActionButton\">\n        <item name=\"android:layout_width\">@dimen/a11y_min_touch_target</item>\n        <item name=\"android:layout_height\">@dimen/a11y_min_touch_target</item>\n        <item name=\"elevation\">0dp</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Feed.EmptySessionsMessage\">\n        <item name=\"android:textSize\">20sp</item>\n        <item name=\"android:textColor\">?android:attr/textColorSecondary</item>\n        <item name=\"fontFamily\">@font/google_sans</item>\n        <item name=\"android:fontFamily\">@font/google_sans</item>\n        <item name=\"android:maxWidth\">@dimen/feed_my_day_empty_sessions_message_max_width</item>\n    </style>\n\n    <!-- Settings -->\n    <style name=\"Widget.IOSched.Settings\" />\n\n    <style name=\"Widget.IOSched.Settings.Switch\" parent=\"Widget.MaterialComponents.CompoundButton.Switch\">\n        <item name=\"android:background\">@null</item>\n        <item name=\"android:foreground\">?selectableItemBackground</item>\n        <item name=\"android:minHeight\">?android:attr/listPreferredItemHeightSmall</item>\n        <item name=\"android:paddingBottom\">@dimen/spacing_normal</item>\n        <item name=\"android:paddingEnd\">?listPreferredItemPaddingEnd</item>\n        <item name=\"android:paddingStart\">?listPreferredItemPaddingStart</item>\n        <item name=\"android:paddingTop\">@dimen/spacing_normal</item>\n        <item name=\"android:textAlignment\">viewStart</item>\n        <item name=\"switchPadding\">@dimen/margin_small</item>\n        <item name=\"switchTextAppearance\">?attr/textAppearanceBody2</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Settings.Button\">\n        <item name=\"android:background\">?selectableItemBackground</item>\n        <item name=\"android:gravity\">start|center_vertical</item>\n        <item name=\"android:minHeight\">?listPreferredItemHeightSmall</item>\n        <item name=\"android:paddingBottom\">@dimen/spacing_normal</item>\n        <item name=\"android:paddingEnd\">?listPreferredItemPaddingEnd</item>\n        <item name=\"android:paddingStart\">?listPreferredItemPaddingStart</item>\n        <item name=\"android:paddingTop\">@dimen/spacing_normal</item>\n        <item name=\"android:textAlignment\">viewStart</item>\n        <item name=\"android:textAppearance\">?textAppearanceBody2</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Settings.Button.About\">\n        <item name=\"android:textAppearance\">@style/TextAppearance.IOSched.AboutButtons</item>\n    </style>\n\n    <!-- Info -->\n    <style name=\"Widget.IOSched.EventCardView\" parent=\"Widget.MaterialComponents.CardView\">\n        <item name=\"cardCornerRadius\">16dp</item>\n        <item name=\"cardElevation\">0dp</item>\n        <item name=\"strokeColor\">?colorControlLight</item>\n        <item name=\"strokeWidth\">1dp</item>\n        <item name=\"eventTypeLogoBackground\">?eventCardHeaderBackground</item>\n    </style>\n\n    <!-- Navigation -->\n    <style name=\"Widget.IOSched.NavigationBarContentFrameLayout\" parent=\"android:Widget.Material\">\n        <item name=\"navigationBarBorderColor\">?attr/ioschedNavigationBarDividerColor</item>\n        <item name=\"navigationBarBorderSize\">1dp</item>\n    </style>\n\n    <style name=\"Widget.IOSched.NavigationView\" parent=\"@style/Widget.MaterialComponents.NavigationView\">\n        <item name=\"itemBackground\">@drawable/navigation_item_background</item>\n        <item name=\"itemHorizontalPadding\">@dimen/nav_item_horizontal_padding</item>\n    </style>\n\n    <style name=\"Widget.IOSched.HashtagIoDecoration\">\n        <item name=\"android:drawable\">@drawable/hashtag_io19</item>\n        <item name=\"margin\">@dimen/nav_item_horizontal_padding</item>\n    </style>\n\n    <!-- Map -->\n    <style name=\"Widget.IOSched.Map\" />\n\n    <style name=\"Widget.IOSched.Map.MarkerTitle\">\n        <item name=\"android:ellipsize\">end</item>\n        <item name=\"android:lines\">1</item>\n        <item name=\"android:gravity\">start</item>\n        <item name=\"android:textAlignment\">viewStart</item>\n        <item name=\"android:textAppearance\">@style/TextAppearance.IOSched.H3</item>\n        <!-- Use dp because we need the title and subtitle to always fit in the sheet peak area. -->\n        <item name=\"android:textSize\" tools:ignore=\"SpUsage\">20dp</item>\n    </style>\n\n    <style name=\"Widget.IOSched.Map.MarkerSubtitle\" parent=\"Widget.IOSched.Map.MarkerTitle\">\n        <item name=\"android:textAppearance\">?android:textAppearanceMedium</item>\n        <!-- Use dp because we need the title and subtitle to always fit in the sheet peak area. -->\n        <item name=\"android:textSize\" tools:ignore=\"SpUsage\">16dp</item>\n    </style>\n\n    <!-- Codelabs -->\n    <style name=\"Widget.IOSched.Codelabs.InfoCard\" parent=\"Widget.MaterialComponents.CardView\">\n        <item name=\"android:layout_marginBottom\">@dimen/margin_small</item>\n        <item name=\"android:layout_marginEnd\">?listPreferredItemPaddingEnd</item>\n        <item name=\"android:layout_marginStart\">?listPreferredItemPaddingStart</item>\n        <item name=\"android:layout_marginTop\">@dimen/margin_small</item>\n        <item name=\"cardCornerRadius\">16dp</item>\n        <item name=\"cardBackgroundColor\">@color/highlighted_card_background</item>\n    </style>\n\n    <!-- Misc -->\n    <style name=\"Widget.IOSched.EmptyResults\">\n        <item name=\"android:drawablePadding\">@dimen/margin_normal</item>\n        <item name=\"android:drawableTop\">@drawable/no_items_found_204</item>\n        <item name=\"android:gravity\">center_horizontal</item>\n        <item name=\"android:textAppearance\">?android:textAppearanceMedium</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <!-- Base application theme. -->\n    <style name=\"Base.AppTheme\" parent=\"Theme.MaterialComponents.DayNight.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/color_primary</item>\n        <item name=\"colorPrimaryVariant\">@color/color_primary_variant</item>\n        <item name=\"colorSecondary\">?attr/colorPrimary</item>\n        <item name=\"colorOnSecondary\">@color/color_on_secondary</item>\n        <item name=\"colorControlLight\">@color/color_control_light</item>\n        <item name=\"colorSurfaceSecondary\">@color/color_surface_secondary</item>\n\n        <!-- Window decor -->\n        <item name=\"android:windowLightStatusBar\" tools:targetApi=\"m\">@bool/use_light_status</item>\n        <item name=\"android:statusBarColor\">@color/transparent</item>\n        <item name=\"android:windowLightNavigationBar\" tools:targetApi=\"o_mr1\">@bool/use_light_navigation</item>\n        <item name=\"android:navigationBarColor\">@color/nav_bar_scrim</item>\n\n        <!-- Widget styles -->\n        <item name=\"toolbarStyle\">@style/Widget.IOSched.Toolbar</item>\n        <item name=\"tabStyle\">@style/Widget.IOSched.Tabs</item>\n        <item name=\"navigationViewStyle\">@style/Widget.IOSched.NavigationView</item>\n\n        <!-- Text appearances -->\n        <item name=\"textAppearanceBody2\">@style/TextAppearance.IOSched.Body2</item>\n        <item name=\"textAppearanceButton\">@style/TextAppearance.IOSched.Button</item>\n        <item name=\"textAppearanceListItem\">@style/TextAppearance.IOSched.ListPrimary</item>\n\n        <!-- Dialogs -->\n        <item name=\"materialAlertDialogTheme\">@style/AlertDialog.Theme</item>\n\n        <!-- Custom theme attrs -->\n        <item name=\"ioschedNavigationBarDividerColor\">?attr/colorControlLight</item>\n        <item name=\"sessionListKeyline\">@dimen/session_keyline</item>\n        <item name=\"eventCardHeaderBackground\">@color/event_card_header_background</item>\n    </style>\n\n    <style name=\"ThemeOverlay.IOSched.Light\" parent=\"ThemeOverlay.MaterialComponents.Light\">\n        <item name=\"colorPrimary\">@color/deep_sky_blue</item>\n        <item name=\"colorPrimaryVariant\">@color/warm_blue</item>\n    </style>\n\n    <style name=\"ThemeOverlay.IOSched.Dark\" parent=\"ThemeOverlay.MaterialComponents.Dark\">\n        <item name=\"colorPrimary\">@color/carolina_blue</item>\n        <item name=\"colorPrimaryVariant\">@color/cornflower_blue</item>\n    </style>\n\n    <style name=\"AppTheme\" parent=\"Base.AppTheme\" />\n\n    <style name=\"AppTheme.Launcher\">\n        <item name=\"android:windowBackground\">@drawable/preview_window</item>\n    </style>\n\n    <style name=\"AppTheme.Onboarding\">\n        <item name=\"android:windowEnterAnimation\">@android:anim/fade_in</item>\n        <item name=\"android:windowExitAnimation\">@android:anim/fade_out</item>\n    </style>\n\n    <!-- Non-top-level screens should inflate with this theme to replace the keyline. -->\n    <style name=\"AppTheme.Detail\">\n        <item name=\"sessionListKeyline\">@dimen/margin_normal</item>\n    </style>\n\n    <style name=\"AppTheme.PopupTheme\" parent=\"ThemeOverlay.IOSched.Light\" />\n\n    <style name=\"AlertDialog.Theme\" parent=\"ThemeOverlay.MaterialComponents.MaterialAlertDialog\">\n        <item name=\"alertDialogStyle\">@style/AlertDialog.Style</item>\n        <item name=\"buttonBarStyle\">@style/AlertDialog.ButtonBar</item>\n        <item name=\"dialogPreferredPadding\">@dimen/dialogPreferredPadding</item>\n        <item name=\"materialAlertDialogTitleTextStyle\">@style/AlertDialog.TitleText</item>\n        <item name=\"materialAlertDialogTitlePanelStyle\">@style/AlertDialog.TitlePanel</item>\n        <item name=\"materialAlertDialogBodyTextStyle\">@style/AlertDialog.BodyText</item>\n    </style>\n\n    <style name=\"AlertDialog.Style\" parent=\"MaterialAlertDialog.MaterialComponents\">\n        <item name=\"shapeAppearance\">@style/AlertDialog.ShapeAppearance</item>\n    </style>\n\n    <style name=\"AlertDialog.ShapeAppearance\" parent=\"ShapeAppearance.MaterialComponents.MediumComponent\">\n        <item name=\"cornerSize\">@dimen/dialog_corner_radius</item>\n    </style>\n\n\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">الجدول الزمني</string>\n    <string name=\"title_home\">الصفحة الرئيسية</string>\n    <string name=\"title_map\">الخريطة</string>\n    <string name=\"title_explore_io\">استكشاف مكان عقد مؤتمر I/O</string>\n    <string name=\"title_info\">معلومات</string>\n    <string name=\"filters\">فلاتر</string>\n    <string name=\"category_heading_tracks\">المواضيع</string>\n    <string name=\"category_heading_types\">أنواع الحدث</string>\n    <string name=\"reset\">إعادة ضبط</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"zero\"> %1$d حدث</item>\n        <item quantity=\"one\"> حدث (%1$d)</item>\n        <item quantity=\"two\"> حدثان (%1$d)</item>\n        <item quantity=\"few\">%1$d أحداث</item>\n        <item quantity=\"many\">%1$d حدثًا</item>\n        <item quantity=\"other\">%1$d حدث</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">الفعاليات المحجوزة والتي تمّ تمييزها بنجمة</string>\n    <string name=\"starred_and_reserved_short\">الفعاليات التي ستشارك فيها</string>\n    <string name=\"search_schedule_hint\">البحث في الجدول الزمني</string>\n    <string name=\"search_schedule_no_results\">لم يتمّ العثور على نتائج.</string>\n    <string name=\"agenda\">جدول الأعمال</string>\n    <string name=\"event_starred\">تمّت إضافة الحدث إلى العناصر المميّزة بنجمة.</string>\n    <string name=\"event_unstarred\">تمّت إزالة الحدث من العناصر المميّزة بنجمة.</string>\n    <string name=\"event_star_error\">حدث خطأ أثناء إضافة الحدث إلى العناصر المميّزة بنجمة.</string>\n    <string name=\"reservation_error\">حدث خطأ أثناء تغيير الحجز، لذلك يُرجى الانتظار حتى إتمام الطلبات السابقة أو المحاولة لاحقًا.</string>\n    <string name=\"reservation_request_succeeded\">تمّ طلب الحجز.</string>\n    <string name=\"reservation_cancel_succeeded\">تمّ إلغاء الحجز: \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">تمّ حجز المقعد لـ \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">تمّ استبدال الحجز.</string>\n    <string name=\"waitlist_new\">تمّت إضافتك إلى قائمة الانتظار.</string>\n    <string name=\"waitlist_cancel_succeeded\">تمّت إزالتك من قائمة الانتظار.</string>\n    <string name=\"got_it\">حسنًا</string>\n    <string name=\"dont_show\">عدم العرض</string>\n    <string name=\"reservation_denied_cutoff\">تمّ رفض الحجز لأنّ وقت بدء الجلسة قريب جدًا.</string>\n    <string name=\"reservation_denied_clash\">تمّ رفض الحجز بسبب تضارب موعده مع حجز آخر.</string>\n    <string name=\"reservation_denied_unknown\">تمّ رفض الحجز بسبب خطأ غير معروف.</string>\n    <string name=\"cancellation_denied_cutoff\">تمّ رفض إلغاء الحجز لأنّ وقت بدء الجلسة قريب جدًا.</string>\n    <string name=\"cancellation_denied_unknown\">تمّ رفض إلغاء الحجز بسبب خطأ غير معروف.</string>\n    <string name=\"schedule_filters_empty\">لم يتمّ العثور على أي فعاليات.</string>\n    <string name=\"reservation_reservable\">حجز مِقعد</string>\n    <string name=\"reservation_reserved\">تمّ الحجز.</string>\n    <string name=\"reservation_waitlisted\">تمّت إضافتك إلى قائمة الانتظار.</string>\n    <string name=\"reservation_waitlist_available\">الانضمام إلى قائمة الانتظار</string>\n    <string name=\"reservation_disabled\">الحجوزات غير متاحة.</string>\n    <string name=\"reservation_pending\">الحجز في الانتظار</string>\n    <string name=\"schedule_hint_title\">تخصيص الجدول الزمني</string>\n    <string name=\"schedule_hint_star_event\">إضافة الحدث إلى الأحداث المميّزة بنجمة</string>\n    <string name=\"schedule_hint_reserve_session_seat\">حجز مِقعد للجلسة</string>\n    <string name=\"rate_session\">تقييم الجلسة</string>\n    <string name=\"menu_item_session_location\">موقع الجلسة</string>\n    <string name=\"menu_item_session_star\">تمييز الجلسة بنجمة</string>\n    <string name=\"menu_item_calendar\">إضافة إلى التقويم</string>\n    <string name=\"speaker_delimiter\">،</string>\n    <string name=\"session_detail_speakers_header\">مكبّرات الصوت</string>\n    <string name=\"session_detail_related_header\">الأحداث ذات الصلة</string>\n    <string name=\"feedback_submit\">إرسال</string>\n    <string name=\"feedback_thank_you\">شكرًا على تعليقاتك.</string>\n    <string name=\"feedback_q1_text\">كيف تقيّم نوعية الجلسة بشكل عام؟</string>\n    <string name=\"feedback_q2_text\">كيف تصف محتوى الجلسة بالاستناد إلى توقعاتك/وصف الجلسة؟</string>\n    <string name=\"feedback_q3_text\">ما مدى ارتباط موضوع الجلسة بمشاريعك؟</string>\n    <string name=\"feedback_q4_text\">ما مدى ارتباط موضوع الجلسة بمشاريعك؟</string>\n    <string name=\"feedback_q1_label_start\">تقدّم معلومات للمبتدئين</string>\n    <string name=\"feedback_q2_label_start\">سيّئة</string>\n    <string name=\"feedback_q3_label_start\">سيّئة</string>\n    <string name=\"feedback_q4_label_start\">عادية</string>\n    <string name=\"feedback_q1_label_end\">رائعة</string>\n    <string name=\"feedback_q2_label_end\">رائعة</string>\n    <string name=\"feedback_q3_label_end\">مفيدة جدًا</string>\n    <string name=\"feedback_q4_label_end\">مفيدة جدًا</string>\n    <string name=\"a11y_show_navigation\">عرض قائمة التنقل</string>\n    <string name=\"a11y_collapse_filters_sheet\">طيّ ورقة الفلاتر</string>\n    <string name=\"a11y_clear_tag_filters\">مسح الفلاتر</string>\n    <string name=\"a11y_filter_applied\">تمّ تطبيق الفلتر %1s.</string>\n    <string name=\"a11y_filter_not_applied\">لم يتمّ تطبيق الفلتر %1s.</string>\n    <string name=\"a11y_reservation_available\">حجز مِقعد</string>\n    <string name=\"a11y_reservation_reserved\">تمّ حجز مِقعد في الحدث</string>\n    <string name=\"a11y_reservation_disabled\">الحجز غير متاح</string>\n    <string name=\"a11y_reservation_wait_list_available\">الانضمام إلى قائمة الانتظار للحدث</string>\n    <string name=\"a11y_reservation_wait_listed\">على قائمة الانتظار للحدث</string>\n    <string name=\"a11y_reservation_pending\">الحجز في الانتظار</string>\n    <string name=\"a11y_starred\">تمّ وضع إشارة مرجعية على الحدث.</string>\n    <string name=\"a11y_unstarred\">لم يتمّ وضع إشارة مرجعية على الحدث.</string>\n    <string name=\"a11y_star\">نجمة</string>\n    <string name=\"a11y_play\">تشغيل الفيديو</string>\n    <string name=\"a11y_select_map_mode\">اختيار وضع الخريطة</string>\n    <string name=\"a11y_search_schedule\">البحث في الجدول الزمني</string>\n    <string name=\"welcome\">مرحبًا</string>\n    <string name=\"a11y_signed_in_content_description\">تم تسجيل الدخول من حساب %s.</string>\n    <string name=\"a11y_signed_out_content_description\">يُرجى النقر لتسجيل الدخول.</string>\n    <string name=\"dialog_sign_in_content\">يُرجى تسجيل الدخول لحفظ الأحداث، وحجز المقاعد، وتقييم الجلسات (إذا كنت ضيفًا). وستتمّ مزامنة الإجراءات التي يتمّ إجراؤها في حسابك على التطبيق والموقع الإلكتروني.</string>\n    <string name=\"sign_in\">تسجيل الدخول</string>\n    <string name=\"firebase_auth_no_network_connection\">لا يتوفَّر اتصال بالإنترنت.</string>\n    <string name=\"firebase_auth_unknown_error\">خطأ غير معروف</string>\n    <string name=\"dialog_sign_out_content\">ستبقى كلّ الأحداث وحجوزات المقاعد وتقييمات الجلسات المحفوظة (إذا كنت ضيفًا) متزامنة على حسابك.</string>\n    <string name=\"sign_out\">الخروج</string>\n    <string name=\"manage_google_account\">إدارة حسابك على Google</string>\n    <string name=\"remove_reservation_title\">هل تودّ إزالة الحجز؟</string>\n    <string name=\"remove_reservation_content\">إنّك على وشك إلغاء حجزك في \"%1$s\". إذا أردت المشاركة في الجلسة بدون حجز مقعد، يتبقّى عدد من المقاعد المتاحة في كلّ الجلسات والأولوية حسب الأسبقيّة.</string>\n    <string name=\"cancel\">إلغاء</string>\n    <string name=\"remove\">إزالة</string>\n    <string name=\"swap_reservation_title\">هل تودّ تبديل الحجز؟</string>\n    <string name=\"swap_reservation_content\">هل سبق أن حجزت مقعدًا أو تمّت إضافتك إلى قائمة الانتظار للمشاركة في \"%1$s\"؟. يمكنك إجراء حجز واحد فقط لكلّ جلسة. هل تريد تبديل حجزك بـ \"%2$s\"؟</string>\n    <string name=\"swap\">تبديل</string>\n    <string name=\"notifications_preference_dialog_title\">إشعارات I/O</string>\n    <string name=\"notifications_preference_dialog_content\">هل تريد تلقّي إشعارات حول I/O؟ سنرسل إليك معلومات عن وقت بدء الجلسات، والأحداث التي تليها، والتسجيلات وغيرها. يمكنك تغيير هذا الإعداد ضمن \"المعلومات &gt; الإعدادات\" في أيّ وقت.</string>\n    <string name=\"no\">لا</string>\n    <string name=\"yes\">نعم</string>\n    <string name=\"feed_not_available\">لم يتمّ العثور على إعلانات.</string>\n    <string name=\"feed_loading_error\">تعذّر تحميل الخلاصة. يُرجى إعادة المحاولة.</string>\n    <string name=\"feed_announcement_title\">الإعلانات</string>\n    <string name=\"feed_upcoming_events\">الفعاليات القادمة</string>\n    <string name=\"feed_saved_events\">الفعاليات المحفوظة</string>\n    <string name=\"feed_no_saved_events\">ما من أحداث محفوظة</string>\n    <string name=\"feed_view_all_events\">عرض كلّ الفعاليات</string>\n    <string name=\"feed_view_your_schedule\">الاطّلاع على جدولك الزمني</string>\n    <string name=\"feed_watch_live_stream\">مشاهدة البث المباشر</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"zero\">%s يوم</item>\n        <item quantity=\"one\">يوم واحد (%s)</item>\n        <item quantity=\"two\">يومان (%s)</item>\n        <item quantity=\"few\">%s أيام</item>\n        <item quantity=\"many\">%s يومًا</item>\n        <item quantity=\"other\">%s يوم</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"zero\">%s ساعة</item>\n        <item quantity=\"one\">ساعة واحدة (%s)</item>\n        <item quantity=\"two\">ساعتان (%s)</item>\n        <item quantity=\"few\">%s ساعات</item>\n        <item quantity=\"many\">%s ساعة</item>\n        <item quantity=\"other\">%s ساعة</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"zero\">%s دقيقة</item>\n        <item quantity=\"one\">دقيقة واحدة (%s)</item>\n        <item quantity=\"two\">دقيقتان (%s)</item>\n        <item quantity=\"few\">%s دقائق</item>\n        <item quantity=\"many\">%s دقيقة</item>\n        <item quantity=\"other\">%s دقيقة</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"zero\">%s ثانية</item>\n        <item quantity=\"one\">ثانية واحدة (%s)</item>\n        <item quantity=\"two\">ثانيتان (%s)</item>\n        <item quantity=\"few\">%s ثوانٍ</item>\n        <item quantity=\"many\">%s ثانية</item>\n        <item quantity=\"other\">%s ثانية</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">مشاركة الجلسة</string>\n    <string name=\"share_text_session_detail\">يُرجى الاطّلاع على \"%1$s\" على العنوان #io19 %2$s.</string>\n    <string name=\"intent_chooser_session_detail\">مشاركة</string>\n    <string name=\"map_variant_after_dark\">الوضع الليلي</string>\n    <string name=\"map_variant_concert\">حفل موسيقي</string>\n    <string name=\"map_variant_daytime\">وضع النهار</string>\n    <string name=\"enable_my_location\">تفعيل الوصول إلى موقعي</string>\n    <string name=\"my_location_rationale\">يجب منح التطبيق إذن تحديد الموقع الجغرافي ليتمكّن من عرض موقعك الجغرافي على الخريطة.</string>\n    <string name=\"onboarding_get_started\">البدء</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">أهلاً بك في Google I/O</string>\n    <string name=\"onboarding_date_location\">من 7 إلى 9 أيار (مايو) 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">يوم</string>\n    <string name=\"onboarding_label_hours\">س</string>\n    <string name=\"onboarding_label_mins\">د</string>\n    <string name=\"onboarding_label_seconds\">ث</string>\n    <string name=\"onboarding_welcome_google_io_pre\">ترقّب مؤتمر Google I/O.</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">ننصحك بمشاهدة ملخّص مؤتمر I/O للعام 2019 والاطّلاع على ‎#io19 على وسائل التواصل الاجتماعي.</string>\n    <string name=\"onboarding_signin\">عليك تسجيل الدخول لتلقّي إشعارات I/O ويستطيع الضيوف حجز مقاعد للجلسات.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"zero\">ستبدأ الجلسة بعد (%1$s) دقيقة.</item>\n        <item quantity=\"one\">ستبدأ الجلسة بعد دقيقة (%1$s).</item>\n        <item quantity=\"two\">ستبدأ الجلسة بعد دقيقتين (%1$s).</item>\n        <item quantity=\"few\">ستبدأ الجلسة بعد %1$s دقائق.</item>\n        <item quantity=\"many\">ستبدأ الجلسة بعد %1$s دقيقة.</item>\n        <item quantity=\"other\">ستبدأ الجلسة بعد %1$s دقيقة.</item>\n    </plurals>\n    <string name=\"expanded\">طريقة عرض موسّعة</string>\n    <string name=\"collapsed\">طريقة عرض مصغّرة</string>\n    <string name=\"event_title\">الحدث</string>\n    <string name=\"travel_title\">السفر</string>\n    <string name=\"faq_title\">الأسئلة الشائعة</string>\n    <string name=\"settings_title\">الإعدادات</string>\n    <string name=\"about_title\">لمحة</string>\n    <string name=\"travel_what_to_bring_title\">ماذا أُحضر معي إلى الفعالية؟</string>\n    <string name=\"travel_hotels_title\">الفنادق</string>\n    <string name=\"travel_getting_to_mountain_view_title\">الوصول إلى ماونتن فيو</string>\n    <string name=\"travel_getting_to_shoreline_title\">الوصول إلى ماونتن فيو</string>\n    <string name=\"travel_shuttle_service_title\">خدمة النقل ذهابًا وإيابًا</string>\n    <string name=\"travel_off_site_parking_title\">مواقف للسيارات خارج الموقع</string>\n    <string name=\"travel_for_public_transportation_title\">وسائل النقل العام</string>\n    <string name=\"travel_biking_title\">ركوب الدرّاجات</string>\n    <string name=\"travel_ridesharing_title\">مشاركة الرحلة</string>\n    <string name=\"travel_airport_transfers_title\">خدمات نقل من المطار وإليه</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O هو مهرجان في الهواء الطلق. ومع أنّ ذلك يشكّل سببًا رئيسيًا في جعل المؤتمر مميزًا، يعني ذلك أنّه يجب التفكير في بعض النقاط. ستُعقد \"الجلسات\" داخل خِيم يتمّ التحكّم بدرجة حرارتها، ولكنّنا ننصحك بوضع كريم الحماية من الشمس وارتداء نظّارات شمسية وطبقة ملابس إضافية في المساء. إنّ مؤتمر I/O فعالية عادية، لذا يجب أخذ ذلك في الاعتبار عند اختيار ملابسك.</string>\n    <string name=\"travel_hotels_description\">يتوفّر لدينا مجموعات غرف للحجز في عدّة فنادق محلية. وسيتمّ تحديث قائمة الفنادق والغرف المتاحة بصورة منتظمة. يُرجى استخدام الخريطة أدناه للعثور على الفندق الذي يناسبك. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;خريطة الفندق&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">إليك ثلاثة مطارات أساسية في منطقة الخليج فيها خدمات خطوط جوية دولية:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار سان فرانسيسكو الدولي (SFO‏)&lt;/a&gt; الذي يبعد مسافة تقارب 24 ميلاً&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار أوكلاند الدولي (OAK‏)&lt;/a&gt; الذي يبعد مسافة تقارب 32 ميلاً&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار سان خوسيه الدولي (SJC‏)&lt;/a&gt; الذي يبعد مسافة تقارب 12 ميلاً</string>\n    <string name=\"travel_getting_to_shoreline_description\">سعيًا منّا إلى الحدّ من ازدحام حركة المرور وانبعاثات غاز الكربون، قرّرنا جعل مؤتمر Google I/O 2019 \"فعالية لا تتوفّر فيها مواقف للسيارات*\". لقد نظرنا في هذا القرار بعناية وسنتيح لك العديد من الخيارات المجانية للوصول إلى الفعالية بدون الحاجة إلى سيارة.&lt;br&gt;&lt;br&gt;سنزوّدك بالمزيد من المعلومات مع اقتراب موعد الفعالية.&lt;br&gt;&lt;br&gt;*ستتوفّر مواقف للكراسي المتحرّكة.</string>\n    <string name=\"travel_shuttle_service_description\">سعيًا منّا إلى الحدّ من ازدحام حركة المرور وانبعاثات غاز الكربون، قرّرنا جعل مؤتمر Google I/O 2019 \"فعالية لا تتوفّر فيها مواقف للسيارات*\". لقد نظرنا في هذا القرار بعناية وسنتيح لك العديد من الخيارات المجانية للوصول إلى الفعالية بدون الحاجة إلى سيارة.&lt;br&gt;&lt;br&gt;سنزوّدك بالمزيد من المعلومات مع اقتراب موعد الفعالية.&lt;br&gt;&lt;br&gt;*ستتوفّر مواقف للكراسي المتحرّكة.</string>\n    <string name=\"travel_off_site_parking_description\">ستتوفّر مواقف مجانية للسيارات خارج الموقع في &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;ملعب أفايا&lt;/a&gt;. وسيتمّ توفير وسائل نقل من ملعب أفايا إلى مؤتمر Google I/O ومنه.&lt;br&gt;&lt;br&gt; يُرجى إعلامنا في استمارة التسجيل إذا كنت من ذوي الاحتياجات الخاصّة وسيتواصل معك فريق التخطيط مباشرةً.</string>\n    <string name=\"travel_for_public_transportation_description\">سنوفّر بطاقات دفع مسبق لوسائل نقل عامة ستكون متاحة لنقل الضيوف أثناء مرحلة ما قبل التسجيل. تتوفّر وسائل النقل العام المتوجّهة إلى المنطقة عبر:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: قطار محلّي&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: قطار سريع داخل منطقة ساوث باي&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART‏&lt;/a&gt;: نظام النقل السريع في منطقة الخليج&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: قطار محلّي&lt;br&gt;&lt;br&gt; لا تتوجّه وسائل النقل العام مباشرةً إلى مؤتمر Google I/O. يمكنك متابعة أخبارنا لمعرفة المواقع الجغرافية المحدّدة لوسائل النقل المخصّصة لفعاليات Google I/O.</string>\n    <string name=\"travel_biking_description\">ستتوفّر مواقف مجانية للدرّاجات في مدرّج شورلاين في موقف السيارات A. وستقدّم مجموعة Silicon Valley Bicycle Coalition خدمة ركن الدرّاجات بشكلٍ آمن من الساعة 7 صباحًا وحتى انتهاء الفعالية كلّ يوم.&lt;br&gt;&lt;br&gt; يُرجى مراجعة \"خرائط Google\" للاطّلاع على أفضل الطرقات المناسبة للدرّاجات والاتّجاهات. ويمكن لراكبي الدرّاجات المتوجّهين إلى مدرّج شورلاين سلوك طريقَين هما: طريق ستيفنز كريك وطريق بيرمانينت كريك.</string>\n    <string name=\"travel_ridesharing_description\">سيتمّ توفير خدمة نقل إلى مطارَي سان فرانسيسكو وسان خوسيه الدوليَّين من مؤتمر Google I/O في اليوم الأخير من الفعالية. ولن تتوفّر هذه الخدمة في أيّ أيّام أخرى.</string>\n    <string name=\"travel_airport_transfers_description\">سيتمّ توفير خدمة نقل إلى مطارَي سان فرانسيسكو وسان خوسيه الدوليَّين من مؤتمر Google I/O في اليوم الأخير من الفعالية. ولن تتوفّر هذه الخدمة في أيّ أيّام أخرى.</string>\n    <string name=\"faq_when_and_where_title\">في أيّ زمان ومكان سيُعقد مؤتمر Google I/O 2019؟</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">كيف يمكنني الاطّلاع على آخر المستجدّات المتعلّقة بمؤتمر Google I/O؟</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">هل سيتمّ تقديم كلّ \"الجلسات\" باللغة الإنجليزية؟</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">هل يمكنني حجز مقعد في \"الجلسات\" قبل موعد الفعالية؟</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">ما هي أفضل طريقة للوصول إلى مدرّج شورلاين؟</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">أين ومتى يمكنني أن أستلم شارتي؟</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">أودّ حجز مقعد في الصف الأمامي لحضور العرض التقديمي الرئيسي، فهل من نصائح يمكنني اتّباعها؟</string>\n    <string name=\"faq_what_should_i_wear_title\">ما اللباس الواجب ارتداؤه؟</string>\n    <string name=\"faq_onsite_food_options_title\">أُحبّ تناول الوجبات الخفيفة. ما هي خيارات الطعام المتوفرة في الفعالية؟</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">في حال فقدتُ مقتنياتي في الموقع، أين يمكنني العثور عليها؟</string>\n    <string name=\"faq_after_dark_program_title\">تبدو برامج After Dark ممتعة. هل تنصحونني بحضورها؟</string>\n    <string name=\"faq_accessibility_needs_title\">هل يمكن تلبية احتياجاتي للكرسي المتحرّك؟</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">كيف يتمّ تقديم الدعم للنساء الحوامل والوالدَين الذين يحضرون مؤتمر I/O؟</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">إرشادات المنتدى للفعاليات التي تنظّمها Google والسياسة المتعلّقة بمكافحة التحرّش</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">هل سيتمّ بثّ \"الجلسات\" مباشرةً على الإنترنت؟ وهل ستتوفّر نُسخ مسجّلة في حال تعذّر عليّ متابعة الفعالية في الوقت الفعلي؟</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">أودّ الاحتفال بمؤتمر I/O مع المنتدى الذي يدعمني.  هل يمكنني الحصول على أفكار لذلك؟</string>\n    <string name=\"faq_when_and_where_description\">للاطّلاع على آخر المعلومات حول \"الجلسات\" والمحاضرين والأنشطة بشكل عام، يُرجى الانتقال إلى &lt;a href=\"https://events.google.com/io/\"&gt; موقع الويب الخاص بمؤتمر Google I/O 2019‏&lt;/a&gt; و&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;مدوّنة Google Developers‏&lt;/a&gt; ومتابعة صفحتنا على &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; وعلى&lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. يمكنك أيضًا متابعة المحادثة على وسائل التواصل الاجتماعي عن مؤتمر Google I/O 2019 عبر استخدام علامة التصنيف الرسمية للمؤتمر &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. بالإضافة إلى ذلك، سنرسل معلومات مهمّة عبر البريد الإلكتروني إلى كلّ المشاركين المسجّلين في الفعالية، ويشمل ذلك تعليمات حول تسجيل الوصول قبل بدء المؤتمر.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">للاطّلاع على آخر المعلومات حول \"الجلسات\" والمحاضرين والأنشطة بشكل عام، يُرجى الانتقال إلى &lt;a href=\"https://events.google.com/io/\"&gt; موقع الويب الخاص بمؤتمر Google I/O 2019‏&lt;/a&gt; و&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;مدوّنة Google Developers‏&lt;/a&gt; ومتابعة صفحتنا على &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; وعلى&lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. يمكنك أيضًا متابعة المحادثة على وسائل التواصل الاجتماعي عن مؤتمر Google I/O 2019 عبر استخدام علامة التصنيف الرسمية للمؤتمر &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. بالإضافة إلى ذلك، سنرسل معلومات مهمّة عبر البريد الإلكتروني إلى كلّ المشاركين المسجّلين في الفعالية، ويشمل ذلك تعليمات حول تسجيل الوصول قبل بدء المؤتمر.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">نعم، بهذه الطريقة سيتمكّن الجمهور في جميع أنحاء العالم من متابعتنا.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">ابتداءً من شهر نيسان (أبريل)، سيتمكّن الضيوف الحاضرون من حجر مقاعد \"للجلسات\" قبل الفعالية على موقع الويب الخاص بمؤتمر I/O وعبر تطبيق المؤتمر المتوافق مع الأجهزة الجوّالة (ملاحظة: لن يتمكّن الضيوف من حجز عدد من المقاعد في \"الجلسات\" لأنّها ستكون متاحة فقط وفقًا لمبدأ الأولوية حسب الأسبقية). وتتوفّر المقاعد في الدروس التطبيقية حول الترميز ومراجعات التطبيقات وساعات العمل وفقًا للمبدأ نفسه.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">يمكنك الاطّلاع على قسم \"السفر\" للحصول على كلّ نصائح التنقّل التي تحتاجها، بما في ذلك معلومات عن وسائل التنقّل واتجاهات سائقي السيارات والدراجات ونصائح حول مشاركة الرحلات وغيرها من المعلومات.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">لتسريع إنجاز إجراءات الدخول إلى المؤتمر، سنبدأ بتوزيع الشارات نهار الاثنين في 6 أيار (مايو) في مدرّج شورلاين. ولاستلام شارة Google I/O، يجب:&lt;br&gt; - إثبات صحّة مستند تعريف شخصي يحمل صورتك: نقبل التراخيص الصادرة عن جهة حكومية وجوازات السفر وغيرها من المستندات التي تعرّف عنك. إذا كنت لا تملك المستندات المناسبة للتعريف عن نفسك، لن تتمكّن من استلام الشارة وبالتالي حضور المؤتمر. ويجب أن يتطابق الاسم الوارد في مستند التعريف تمامًا مع الاسم الوارد في الملف الشخصي الذي استخدمته للتسجيل في الفعالية. وإذا كنت طالبًا أكاديميًا، يُرجى إحضار إثبات عن الأهلية.&lt;br&gt; - يُرجى إجراء مسح ضوئي لرمز الاستجابة السريعة التابع للتسجيل الذي تلقّيته عبر البريد الإلكتروني: يمكنك مسحه ضوئيًا من هاتفك ولا حاجة لطباعة الرسالة الإلكترونية. ‎#savetheenvironment &lt;br&gt;&lt;br&gt;ملاحظة: لا يجوز لك مشاركة شارتك أو إعطاؤها أو تقديمها لشخص آخر بأيّ شكل من الأشكال. ولا يمكن الحصول على شارات بديلة لمؤتمر Google I/O، لذا يُرجى الحرص على عدم فقدانها وإلا لن يُسمح لك بالدخول إلى المؤتمر من جديد. يجب تثبيت شارة Google I/O على ملابسك لتتمكّن من الدخول إلى المؤتمر، بما في ذلك المشاركة في \"الجلسات\" و\"صناديق الإبداع\" و\"ساعات ما بعد المؤتمر\". ويُرجى تقديم مستندات تعريف شخصي إضافية إذا طلبها منك موظّفو الأمن. قد يظهر على شارات Google I/O اسمك واسم شركتك أو مؤسستك (إذا تمّ تقديمه) وصورة لك.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">تتوفّر مقاعد لجميع الضيوف لحضور العرض التقديمي الرئيسي، ولكن سيتمّ تخصيص أفضل المقاعد وفقًا لمبدأ الأولوية حسب الأسبقية عند البدء باستلام الشارات في 6 أيار (مايو) ابتداءً من الساعة 7 صباحًا، لذا يُرجى الحرص على الوصول في وقت مبكر.</string>\n    <string name=\"faq_what_should_i_wear_description\">إنّ Google I/O هو فعالية في الهواء الطلق مخصّصة لمطوّري البرامج، لذا لا تتردّد في ارتداء ملابس مُريحة، فما من لباس معيّن مفروض. قد تكون الحرارة مرتفعة جدًا في منطقة خليج سان فرانسيسكو في النهار وتنخفض في ساعات المساء، لذا يُرجى توضيب ملابس مناسبة.</string>\n    <string name=\"faq_onsite_food_options_description\">إليك خبر سار، إنّنا نحب تناول الطعام أيضًا.  سيتمّ تقديم وجبات الفطور والغداء والوجبات الخفيفة للضيوف مجانًا طوال أيام المؤتمر الثلاثة. وسيتمّ أيضًا تقديم وجبة العشاء في اليومَين الأوّل والثاني خلال فعاليات \"ساعات ما بعد المؤتمر\".</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">نحن جاهزون للمساعدة. ستكون محطة المفقودات موجودة في مكتب المساعدة في المؤتمر خلال ساعات الفعالية. وسيتمّ تسليم المفقودات من اليوم الفائت إلى مكتب الأمن في المؤتمر. ملاحظة مهمّة: لا يمكن الحصول على شارات بديلة لمؤتمر Google I/O، لذا يُرجى الحرص على عدم فقدان شارتك وإلا لن يُسمح لك بدخول المؤتمر من جديد.</string>\n    <string name=\"faq_after_dark_program_description\">لا ننصحك بتفويت هاتين الليلتين. ستتمّ دعوة الضيوف للاستماع إلى الموسيقى وتشغيل الألعاب وغيرها من النشاطات في مساء 8 أيّار (مايو)، وستتمّ دعوتهم أيضًا إلى حفلة موسيقية حصريّة في مدرّج شورلاين في 9 أيّار (مايو). سيتمّ توفير الطعام والمشروبات في كلتا الليلتَين (وستتوفّر المشروبات الكحولية للضيوف الذين يبلغون من العمر 21 عامًا وأكثر). سنستضيف فعاليتَي \"ساعات ما بعد المؤتمر\" في مدرّج شورلاين، ويجب أن تتوفّر معك شارة الحضور للدخول.</string>\n    <string name=\"faq_accessibility_needs_description\">تتوفّر مواقف للنساء الحوامل في منطقة مواقف السيارات المخصّصة لذوي الاحتياجات الخاصّة.&lt;br&gt; ويمكن للأمّهات اصطحاب أطفالهنّ الرضّع إلى المؤتمر. وستتوفّر أربع غرف مخصّصة للأمّهات في 7 و8 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 8 مساءً، وفي 9 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 4 بعد الظهر. يمكن للأمهات العثور على أوراق التسجيل أمام الغرف المخصّصة للأمهات واستخدام الغرف وفقًا لمبدأ الأولوية حسب الأسبقية. يُرجى مراجعة \"مكتب المساعدة\" في المؤتمر للحصول على المزيد من المعلومات.&lt;br&gt;&lt;br&gt; سيتمّ تسديد تكاليف رعاية الأطفال بقيمة تصل إلى 100 دولار أميركي يوميًا (لا يتعدّى المبلغ الإجمالي 300 دولار أميركي) للوالدَين الحاضرين الذين يعبّرون عن اهتمامهم برعاية الأطفال في نموذج التسجيل لدينا، وذلك وفقًا لمبدأ الأولوية حسب الأسبقية. ويسدّد مورِّد خارجي هذه التكاليف. إذا أرسلنا إليك رسالة إلكترونية للتعبير عن موافقتنا على طلبك لرعاية الأطفال قبل بدء المؤتمر وعند الموافقة على حضورك هذا المؤتمر، سيتواصل معك المورِّد لإعلامك بالخطوات التالية في غضون 7 أيام عمل بعد مؤتمر Google I/O. وسيتولّى المورِّد إدارة كلّ عمليات تسديد تكاليف رعاية الأطفال لدينا.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">تتوفّر مواقف للنساء الحوامل في منطقة مواقف السيارات المخصّصة لذوي الاحتياجات الخاصّة.&lt;br&gt; ويمكن للأمّهات اصطحاب أطفالهنّ الرضّع إلى المؤتمر. وستتوفّر أربع غرف مخصّصة للأمّهات في 7 و8 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 8 مساءً، وفي 9 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 4 بعد الظهر. يمكن للأمهات العثور على أوراق التسجيل أمام الغرف المخصّصة للأمهات واستخدام الغرف وفقًا لمبدأ الأولوية حسب الأسبقية. يُرجى مراجعة \"مكتب المساعدة\" في المؤتمر للحصول على المزيد من المعلومات.&lt;br&gt;&lt;br&gt; سيتمّ تسديد تكاليف رعاية الأطفال بقيمة تصل إلى 100 دولار أميركي يوميًا (لا يتعدّى المبلغ الإجمالي 300 دولار أميركي) للوالدَين الحاضرين الذين يعبّرون عن اهتمامهم برعاية الأطفال في نموذج التسجيل لدينا، وذلك وفقًا لمبدأ الأولوية حسب الأسبقية. ويسدّد مورِّد خارجي هذه التكاليف. إذا أرسلنا إليك رسالة إلكترونية للتعبير عن موافقتنا على طلبك لرعاية الأطفال قبل بدء المؤتمر وعند الموافقة على حضورك هذا المؤتمر، سيتواصل معك المورِّد لإعلامك بالخطوات التالية في غضون 7 أيام عمل بعد مؤتمر Google I/O. وسيتولّى المورِّد إدارة كلّ عمليات تسديد تكاليف رعاية الأطفال لدينا.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">تسعى Google إلى توفير تجربة خالية من التحرّش وشاملة في الفعالية لجميع المشاركين مهما كانت هويّتهم الجنسية وطريقة تعبيرهم عنها أو ميولهم الجنسية أو الإعاقات التي يعانون منها أو تنوّع النظام العصبي لديهم أو مظهرهم الخارجي أو حجمهم أو انتمائهم العرقي أو جنسيتهم أو عِرقهم أو عمرهم أو دينهم أو أيّ فئة أخرى محميّة. وليتمكّن الجميع من الحضور إلى الفعالية، ستتوفّر حمّامات للجنسين في كلّ أنحاء المكان.&lt;br&gt;&lt;br&gt; نحن لا نقبل أن يتعرّض الضيوف للتحرّش بأيّ شكل من الأشكال.&lt;br&gt; تأخذ Google مسألة مخالفة سياستها على محمل الجد وتردّ على هذه المخالفات بالطُرق المناسبة. للمزيد من المعلومات حول إرشادات المنتدى المتعلّقة بفعاليات Google وسياسة مكافحة التحرّش، يُرجى الانتقال إلى &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;هذا الرابط&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">سيتمّ بثّ العرضين التقديميين الرئيسيّين وكلّ \"الجلسات\" بشكل مباشر على الصفحة الرئيسية لموقع الويب الخاص بالفعالية طوال أيام المؤتمر الثلاثة. في حال انهماكك في العمل أو إقامتك في بلد يتّبع توقيتًا زمنيًا مختلفًا، يمكنك مشاهدة تسجيلات الجلسات في وقت لاحق على &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;قناة Google Developers على YouTube‏&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">نعم. يستضيف مطوّرو البرامج من حول العالم كلّ عام &lt;a href=\"https://events.google.com/io/extended\"&gt;فعاليات Google I/O Extended‏&lt;/a&gt;. وخلال هذه الفعاليات، تستطيع الجهات المنظِّمة بث المحتوى مباشرةً واستضافة جلساتهم الخاصة من ضمنها الهاكاثونات والدروس التطبيقية حول الترميز والعروض التوضيحية وغيرها.&lt;br&gt; وإذا أردت المشاركة في فعالية I/O Extended كمضيف هذا العام، يمكنك اتّباع هذه الخطوات للبدء في ذلك:&lt;br&gt;&lt;br&gt;  يُرجى قراءة &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;دليل الجهات المنظِّمة&lt;/a&gt; للحصول على نصائح واقتراحات حول كيفية استضافة فعالية ناجحة.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;سجِّل&lt;/a&gt; الفعالية العامة التي تريدها على موقع الويب الخاص بمؤتمر I/O لتصل إلى جمهور أكبر.&lt;br&gt;&lt;br&gt; استخدِم علامة التصنيف ‎#io19extended الرسمية في كلّ المشارَكات المتعلّقة بفعالية I/O Extended على وسائل التواصل الاجتماعي لتسهيل العثور عليها&lt;br&gt;&lt;br&gt; ملاحظة: يمكن لمستضيفي I/O Extended طلب حذف معلوماتهم الشخصية و/أو بيانات الفعالية بعد انتهائها عبر توجيه رسالة إلكترونية إلى العنوان io19@google.com.&lt;‏br&gt; إذا أردت حضور فعالية I/O Extended ببساطة، تصفَّح &lt;a href=\"https://events.google.com/io/extended\"&gt;الخريطة&lt;/a&gt; لإيجاد فعالية تقع بالقرب منك والردّ على الدعوة.&lt;br&gt; إذا كان لديك أسئلة حول برنامج I/O Extended، يمكنك التواصل معنا على البريد الإلكتروني io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">عرض الجلسات</string>\n    <string name=\"wifi_install_success\">تمّ حفظ شبكة Wi-Fi.</string>\n    <string name=\"wifi_install_clipboard_message\">تعذّر حفظ تفاصيل شبكة Wi-Fi.‏\\nوتمّ حفظ كلمة المرور في الحافظة بدلاً من ذلك.</string>\n    <string name=\"event_sessions_title\">الجلسات</string>\n    <string name=\"event_sandbox_title\">وَضْع الحماية</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">ساعات العمل وتقييمات التطبيق</string>\n    <string name=\"event_afterhours_title\">أحداث ما بعد المؤتمر</string>\n    <string name=\"event_meals_title\">الوجبات</string>\n    <string name=\"event_sessions_description\">ابتداءً من شهر نيسان (أبريل)، سيتمكّن الضيوف الحاضرون من حجر مقاعد \"للجلسات\" قبل الفعالية على موقع الويب الخاص بمؤتمر I/O وعبر تطبيق المؤتمر المتوافق مع الأجهزة الجوّالة (ملاحظة: لن يتمكّن الضيوف من حجز عدد من المقاعد في \"الجلسات\" لأنّها ستكون متاحة فقط وفقًا لمبدأ الأولوية حسب الأسبقية). وتتوفّر المقاعد في الدروس التطبيقية حول الترميز ومراجعات التطبيقات وساعات العمل وفقًا للمبدأ نفسه.</string>\n    <string name=\"event_sandbox_description\">مساحات مخصّصة للاستكشاف والتعلّم واللعب باستخدام أحدث المنتجات والمنصّات عبر عروض توضيحية تفاعلية وأجهزة فعلية وغيرها.</string>\n    <string name=\"event_codelabs_description\">يمكنك تجربة \"الأكشاك الجاهزة للترميز\" للاطّلاع على مزيد من المعلومات عن آخر تقنيات Google المدهشة عبر برامج تعليمية تتحكّم بمستوى سرعتها، أو يمكنك جلب جهازك وإنجاز عملك في المنزل. وسيكون فريق عمل Google متوفّرًا لتقديم النصائح المفيدة والإرشادات إذا واجهت أيّ صعوبات.</string>\n    <string name=\"event_officehours_description\">يمكنك أن تتعرّف على خبراء Google شخصيًّا ضمن ساعات العمل ليجيبوا عن أسئلتك التقنية. وتمكنّك تقييمات التطبيق من الحصول على نصائح بشأن مشاريعك المحدّدة لأيّ تطبيق.</string>\n    <string name=\"event_afterhours_description\">بعد انتهاء \"الجلسات\"، يُرجى البقاء في شورلاين لِلَيْلَتَيْن يتمّ فيهما تقديم الطعام والشراب والتسلية. سنقيم حفلة في الليلة الأولى في مساحة Sandbox، وفي الليلة الثانية سنقيم حفلة حصريّة في المدرّج.</string>\n    <string name=\"event_meals_description\">سيتمّ تقديم وجبات الفطور والغداء والوجبات الخفيفة للضيوف مجانًا طوال أيام المؤتمر الثلاثة. وسيتمّ أيضًا تقديم وجبة العشاء في اليومَين الأول والثاني خلال \"فعاليات ما بعد المؤتمر\".</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">التطبيقات ذات الصلة</string>\n    <string name=\"event_types_header\">أنواع الأحداث</string>\n    <string name=\"settings_time_zone_label\">تجري الأحداث بتوقيت المحيط الهادئ (UTC-8).</string>\n    <string name=\"settings_enable_notifications\">تفعيل الإشعارات</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">إرسال إحصاءات الاستخدام المجهولة المصدر</string>\n    <string name=\"settings_tos\">بنود الخدمة</string>\n    <string name=\"settings_privacy_policy\">سياسة الخصوصية</string>\n    <string name=\"settings_oss_licenses\">تراخيص البرامج المفتوحة المصدر</string>\n    <string name=\"settings_theme_title\">اختيار تصميم</string>\n    <string name=\"settings_theme_system\">إعداد تلقائي للنظام</string>\n    <string name=\"settings_theme_light\">فاتح</string>\n    <string name=\"settings_theme_dark\">غامق</string>\n    <string name=\"settings_theme_battery\">الضبط حسب ميزة \"توفير شحن البطارية\"</string>\n    <string name=\"built_with_material_components\">تمّ إنشاء التطبيق عبر Material Components.</string>\n    <string name=\"wifi_network_and_password\">الشبكة: %1$s\\nكلمة المرور: %2$s</string>\n    <string name=\"join_network\">الانضمام إلى الشبكة</string>\n    <string name=\"assistant_app_description\">ما عليك سوى قول \"Hey Google, talk to Google I/O 19\".</string>\n    <string name=\"assistant_app_description2\">ما عليك سوى قول \"Hey Google, talk to Google I/O 19\".</string>\n    <string name=\"speaker_link_website\">موقع الويب</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">Github</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">الفعاليات</string>\n    <string name=\"no_network_connection\">لا يتوفّر اتصال بالإنترنت.</string>\n    <string name=\"navigate_up\">الانتقال إلى الأعلى</string>\n    <string name=\"no_network_description\">لاستخدام ميزة Explore I/O، يُرجى محاولة:\\n\\n - إيقاف \"وضع الطائرة\"\\n\\n - تفعيل بيانات الجوّال أو  شبكة Wi-Fi‏\\n\\n - التحقّق من الإشارة في منطقتك.</string>\n    <string name=\"phone_does_not_support_arcore_title\">لا يمكنك استخدام ARCore على هاتفك.</string>\n    <string name=\"phone_does_not_support_arcore_message\">يُرجى استخدام جهاز آخر أو استعارة جهاز من صديق.</string>\n    <string name=\"codelabs_information\">يمكنك تعلُّم تقنيات Google الأخيرة والرائعة عبر برامج تعليمية يمكنك التحكّم بوتيرتها في أكشاك الترميز أو يمكنك إحضار جهازك وإنجاز عملك في المنزل. تفتح هذه الأكشاك أبوابها يوميًا ما عدا خلال أوّل عرض تقديمي رئيسي.</string>\n    <string name=\"codelabs_building\">مبنى تقديم الدروس التطبيقية حول الترميز</string>\n    <string name=\"codelabs_website\">موقع الويب لدروس تطبيقية حول الترميز</string>\n    <string name=\"codelab_duration\">المدة: %1$d دقيقة</string>\n    <string name=\"start_codelab\">بدء الدرس التطبيقي حول الترميز</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-ar-rEG/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">الجدول الزمني</string>\n    <string name=\"title_home\">الصفحة الرئيسية</string>\n    <string name=\"title_map\">الخريطة</string>\n    <string name=\"title_explore_io\">استكشاف مكان عقد مؤتمر I/O</string>\n    <string name=\"title_info\">معلومات</string>\n    <string name=\"filters\">فلاتر</string>\n    <string name=\"category_heading_tracks\">المواضيع</string>\n    <string name=\"category_heading_types\">أنواع الحدث</string>\n    <string name=\"reset\">إعادة ضبط</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"zero\"> %1$d حدث</item>\n        <item quantity=\"one\"> حدث (%1$d)</item>\n        <item quantity=\"two\"> حدثان (%1$d)</item>\n        <item quantity=\"few\">%1$d أحداث</item>\n        <item quantity=\"many\">%1$d حدثًا</item>\n        <item quantity=\"other\">%1$d حدث</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">الفعاليات المحجوزة والتي تمّ تمييزها بنجمة</string>\n    <string name=\"starred_and_reserved_short\">الفعاليات التي ستشارك فيها</string>\n    <string name=\"search_schedule_hint\">البحث في الجدول الزمني</string>\n    <string name=\"search_schedule_no_results\">لم يتمّ العثور على نتائج.</string>\n    <string name=\"agenda\">جدول الأعمال</string>\n    <string name=\"event_starred\">تمّت إضافة الحدث إلى العناصر المميّزة بنجمة.</string>\n    <string name=\"event_unstarred\">تمّت إزالة الحدث من العناصر المميّزة بنجمة.</string>\n    <string name=\"event_star_error\">حدث خطأ أثناء إضافة الحدث إلى العناصر المميّزة بنجمة.</string>\n    <string name=\"reservation_error\">حدث خطأ أثناء تغيير الحجز، لذلك يُرجى الانتظار حتى إتمام الطلبات السابقة أو المحاولة لاحقًا.</string>\n    <string name=\"reservation_request_succeeded\">تمّ طلب الحجز.</string>\n    <string name=\"reservation_cancel_succeeded\">تمّ إلغاء الحجز: \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">تمّ حجز المقعد لـ \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">تمّ استبدال الحجز.</string>\n    <string name=\"waitlist_new\">تمّت إضافتك إلى قائمة الانتظار.</string>\n    <string name=\"waitlist_cancel_succeeded\">تمّت إزالتك من قائمة الانتظار.</string>\n    <string name=\"got_it\">حسنًا</string>\n    <string name=\"dont_show\">عدم العرض</string>\n    <string name=\"reservation_denied_cutoff\">تمّ رفض الحجز لأنّ وقت بدء الجلسة قريب جدًا.</string>\n    <string name=\"reservation_denied_clash\">تمّ رفض الحجز بسبب تضارب موعده مع حجز آخر.</string>\n    <string name=\"reservation_denied_unknown\">تمّ رفض الحجز بسبب خطأ غير معروف.</string>\n    <string name=\"cancellation_denied_cutoff\">تمّ رفض إلغاء الحجز لأنّ وقت بدء الجلسة قريب جدًا.</string>\n    <string name=\"cancellation_denied_unknown\">تمّ رفض إلغاء الحجز بسبب خطأ غير معروف.</string>\n    <string name=\"schedule_filters_empty\">لم يتمّ العثور على أي فعاليات.</string>\n    <string name=\"reservation_reservable\">حجز مِقعد</string>\n    <string name=\"reservation_reserved\">تمّ الحجز.</string>\n    <string name=\"reservation_waitlisted\">تمّت إضافتك إلى قائمة الانتظار.</string>\n    <string name=\"reservation_waitlist_available\">الانضمام إلى قائمة الانتظار</string>\n    <string name=\"reservation_disabled\">الحجوزات غير متاحة.</string>\n    <string name=\"reservation_pending\">الحجز في الانتظار</string>\n    <string name=\"schedule_hint_title\">تخصيص الجدول الزمني</string>\n    <string name=\"schedule_hint_star_event\">إضافة الحدث إلى الأحداث المميّزة بنجمة</string>\n    <string name=\"schedule_hint_reserve_session_seat\">حجز مِقعد للجلسة</string>\n    <string name=\"rate_session\">تقييم الجلسة</string>\n    <string name=\"menu_item_session_location\">موقع الجلسة</string>\n    <string name=\"menu_item_session_star\">تمييز الجلسة بنجمة</string>\n    <string name=\"menu_item_calendar\">إضافة إلى التقويم</string>\n    <string name=\"speaker_delimiter\">،</string>\n    <string name=\"session_detail_speakers_header\">مكبّرات الصوت</string>\n    <string name=\"session_detail_related_header\">الأحداث ذات الصلة</string>\n    <string name=\"feedback_submit\">إرسال</string>\n    <string name=\"feedback_thank_you\">شكرًا على تعليقاتك.</string>\n    <string name=\"feedback_q1_text\">كيف تقيّم نوعية الجلسة بشكل عام؟</string>\n    <string name=\"feedback_q2_text\">كيف تصف محتوى الجلسة بالاستناد إلى توقعاتك/وصف الجلسة؟</string>\n    <string name=\"feedback_q3_text\">ما مدى ارتباط موضوع الجلسة بمشاريعك؟</string>\n    <string name=\"feedback_q4_text\">ما مدى ارتباط موضوع الجلسة بمشاريعك؟</string>\n    <string name=\"feedback_q1_label_start\">تقدّم معلومات للمبتدئين</string>\n    <string name=\"feedback_q2_label_start\">سيّئة</string>\n    <string name=\"feedback_q3_label_start\">سيّئة</string>\n    <string name=\"feedback_q4_label_start\">عادية</string>\n    <string name=\"feedback_q1_label_end\">رائعة</string>\n    <string name=\"feedback_q2_label_end\">رائعة</string>\n    <string name=\"feedback_q3_label_end\">مفيدة جدًا</string>\n    <string name=\"feedback_q4_label_end\">مفيدة جدًا</string>\n    <string name=\"a11y_show_navigation\">عرض قائمة التنقل</string>\n    <string name=\"a11y_collapse_filters_sheet\">طيّ ورقة الفلاتر</string>\n    <string name=\"a11y_clear_tag_filters\">مسح الفلاتر</string>\n    <string name=\"a11y_filter_applied\">تمّ تطبيق الفلتر %1s.</string>\n    <string name=\"a11y_filter_not_applied\">لم يتمّ تطبيق الفلتر %1s.</string>\n    <string name=\"a11y_reservation_available\">حجز مِقعد</string>\n    <string name=\"a11y_reservation_reserved\">تمّ حجز مِقعد في الحدث</string>\n    <string name=\"a11y_reservation_disabled\">الحجز غير متاح</string>\n    <string name=\"a11y_reservation_wait_list_available\">الانضمام إلى قائمة الانتظار للحدث</string>\n    <string name=\"a11y_reservation_wait_listed\">على قائمة الانتظار للحدث</string>\n    <string name=\"a11y_reservation_pending\">الحجز في الانتظار</string>\n    <string name=\"a11y_starred\">تمّ وضع إشارة مرجعية على الحدث.</string>\n    <string name=\"a11y_unstarred\">لم يتمّ وضع إشارة مرجعية على الحدث.</string>\n    <string name=\"a11y_star\">نجمة</string>\n    <string name=\"a11y_play\">تشغيل الفيديو</string>\n    <string name=\"a11y_select_map_mode\">اختيار وضع الخريطة</string>\n    <string name=\"a11y_search_schedule\">البحث في الجدول الزمني</string>\n    <string name=\"welcome\">مرحبًا</string>\n    <string name=\"a11y_signed_in_content_description\">تم تسجيل الدخول من حساب %s.</string>\n    <string name=\"a11y_signed_out_content_description\">يُرجى النقر لتسجيل الدخول.</string>\n    <string name=\"dialog_sign_in_content\">يُرجى تسجيل الدخول لحفظ الأحداث، وحجز المقاعد، وتقييم الجلسات (إذا كنت ضيفًا). وستتمّ مزامنة الإجراءات التي يتمّ إجراؤها في حسابك على التطبيق والموقع الإلكتروني.</string>\n    <string name=\"sign_in\">تسجيل الدخول</string>\n    <string name=\"firebase_auth_no_network_connection\">لا يتوفَّر اتصال بالإنترنت.</string>\n    <string name=\"firebase_auth_unknown_error\">خطأ غير معروف</string>\n    <string name=\"dialog_sign_out_content\">ستبقى كلّ الأحداث وحجوزات المقاعد وتقييمات الجلسات المحفوظة (إذا كنت ضيفًا) متزامنة على حسابك.</string>\n    <string name=\"sign_out\">الخروج</string>\n    <string name=\"manage_google_account\">إدارة حسابك على Google</string>\n    <string name=\"remove_reservation_title\">هل تودّ إزالة الحجز؟</string>\n    <string name=\"remove_reservation_content\">إنّك على وشك إلغاء حجزك في \"%1$s\". إذا أردت المشاركة في الجلسة بدون حجز مقعد، يتبقّى عدد من المقاعد المتاحة في كلّ الجلسات والأولوية حسب الأسبقيّة.</string>\n    <string name=\"cancel\">إلغاء</string>\n    <string name=\"remove\">إزالة</string>\n    <string name=\"swap_reservation_title\">هل تودّ تبديل الحجز؟</string>\n    <string name=\"swap_reservation_content\">هل سبق أن حجزت مقعدًا أو تمّت إضافتك إلى قائمة الانتظار للمشاركة في \"%1$s\"؟. يمكنك إجراء حجز واحد فقط لكلّ جلسة. هل تريد تبديل حجزك بـ \"%2$s\"؟</string>\n    <string name=\"swap\">تبديل</string>\n    <string name=\"notifications_preference_dialog_title\">إشعارات I/O</string>\n    <string name=\"notifications_preference_dialog_content\">هل تريد تلقّي إشعارات حول I/O؟ سنرسل إليك معلومات عن وقت بدء الجلسات، والأحداث التي تليها، والتسجيلات وغيرها. يمكنك تغيير هذا الإعداد ضمن \"المعلومات &gt; الإعدادات\" في أيّ وقت.</string>\n    <string name=\"no\">لا</string>\n    <string name=\"yes\">نعم</string>\n    <string name=\"feed_not_available\">لم يتمّ العثور على إعلانات.</string>\n    <string name=\"feed_loading_error\">تعذّر تحميل الخلاصة. يُرجى إعادة المحاولة.</string>\n    <string name=\"feed_announcement_title\">الإعلانات</string>\n    <string name=\"feed_upcoming_events\">الفعاليات القادمة</string>\n    <string name=\"feed_saved_events\">الفعاليات المحفوظة</string>\n    <string name=\"feed_no_saved_events\">ما من أحداث محفوظة</string>\n    <string name=\"feed_view_all_events\">عرض كلّ الفعاليات</string>\n    <string name=\"feed_view_your_schedule\">الاطّلاع على جدولك الزمني</string>\n    <string name=\"feed_watch_live_stream\">مشاهدة البث المباشر</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"zero\">%s يوم</item>\n        <item quantity=\"one\">يوم واحد (%s)</item>\n        <item quantity=\"two\">يومان (%s)</item>\n        <item quantity=\"few\">%s أيام</item>\n        <item quantity=\"many\">%s يومًا</item>\n        <item quantity=\"other\">%s يوم</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"zero\">%s ساعة</item>\n        <item quantity=\"one\">ساعة واحدة (%s)</item>\n        <item quantity=\"two\">ساعتان (%s)</item>\n        <item quantity=\"few\">%s ساعات</item>\n        <item quantity=\"many\">%s ساعة</item>\n        <item quantity=\"other\">%s ساعة</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"zero\">%s دقيقة</item>\n        <item quantity=\"one\">دقيقة واحدة (%s)</item>\n        <item quantity=\"two\">دقيقتان (%s)</item>\n        <item quantity=\"few\">%s دقائق</item>\n        <item quantity=\"many\">%s دقيقة</item>\n        <item quantity=\"other\">%s دقيقة</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"zero\">%s ثانية</item>\n        <item quantity=\"one\">ثانية واحدة (%s)</item>\n        <item quantity=\"two\">ثانيتان (%s)</item>\n        <item quantity=\"few\">%s ثوانٍ</item>\n        <item quantity=\"many\">%s ثانية</item>\n        <item quantity=\"other\">%s ثانية</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">مشاركة الجلسة</string>\n    <string name=\"share_text_session_detail\">يُرجى الاطّلاع على \"%1$s\" على العنوان #io19 %2$s.</string>\n    <string name=\"intent_chooser_session_detail\">مشاركة</string>\n    <string name=\"map_variant_after_dark\">الوضع الليلي</string>\n    <string name=\"map_variant_concert\">حفل موسيقي</string>\n    <string name=\"map_variant_daytime\">وضع النهار</string>\n    <string name=\"enable_my_location\">تفعيل الوصول إلى موقعي</string>\n    <string name=\"my_location_rationale\">يجب منح التطبيق إذن تحديد الموقع الجغرافي ليتمكّن من عرض موقعك الجغرافي على الخريطة.</string>\n    <string name=\"onboarding_get_started\">البدء</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">أهلاً بك في Google I/O</string>\n    <string name=\"onboarding_date_location\">من 7 إلى 9 أيار (مايو) 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">يوم</string>\n    <string name=\"onboarding_label_hours\">س</string>\n    <string name=\"onboarding_label_mins\">د</string>\n    <string name=\"onboarding_label_seconds\">ث</string>\n    <string name=\"onboarding_welcome_google_io_pre\">ترقّب مؤتمر Google I/O.</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">ننصحك بمشاهدة ملخّص مؤتمر I/O للعام 2019 والاطّلاع على ‎#io19 على وسائل التواصل الاجتماعي.</string>\n    <string name=\"onboarding_signin\">عليك تسجيل الدخول لتلقّي إشعارات I/O ويستطيع الضيوف حجز مقاعد للجلسات.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"zero\">ستبدأ الجلسة بعد (%1$s) دقيقة.</item>\n        <item quantity=\"one\">ستبدأ الجلسة بعد دقيقة (%1$s).</item>\n        <item quantity=\"two\">ستبدأ الجلسة بعد دقيقتين (%1$s).</item>\n        <item quantity=\"few\">ستبدأ الجلسة بعد %1$s دقائق.</item>\n        <item quantity=\"many\">ستبدأ الجلسة بعد %1$s دقيقة.</item>\n        <item quantity=\"other\">ستبدأ الجلسة بعد %1$s دقيقة.</item>\n    </plurals>\n    <string name=\"expanded\">طريقة عرض موسّعة</string>\n    <string name=\"collapsed\">طريقة عرض مصغّرة</string>\n    <string name=\"event_title\">الحدث</string>\n    <string name=\"travel_title\">السفر</string>\n    <string name=\"faq_title\">الأسئلة الشائعة</string>\n    <string name=\"settings_title\">الإعدادات</string>\n    <string name=\"about_title\">لمحة</string>\n    <string name=\"travel_what_to_bring_title\">ماذا أُحضر معي إلى الفعالية؟</string>\n    <string name=\"travel_hotels_title\">الفنادق</string>\n    <string name=\"travel_getting_to_mountain_view_title\">الوصول إلى ماونتن فيو</string>\n    <string name=\"travel_getting_to_shoreline_title\">الوصول إلى ماونتن فيو</string>\n    <string name=\"travel_shuttle_service_title\">خدمة النقل ذهابًا وإيابًا</string>\n    <string name=\"travel_off_site_parking_title\">مواقف للسيارات خارج الموقع</string>\n    <string name=\"travel_for_public_transportation_title\">وسائل النقل العام</string>\n    <string name=\"travel_biking_title\">ركوب الدرّاجات</string>\n    <string name=\"travel_ridesharing_title\">مشاركة الرحلة</string>\n    <string name=\"travel_airport_transfers_title\">خدمات نقل من المطار وإليه</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O هو مهرجان في الهواء الطلق. ومع أنّ ذلك يشكّل سببًا رئيسيًا في جعل المؤتمر مميزًا، يعني ذلك أنّه يجب التفكير في بعض النقاط. ستُعقد \"الجلسات\" داخل خِيم يتمّ التحكّم بدرجة حرارتها، ولكنّنا ننصحك بوضع كريم الحماية من الشمس وارتداء نظّارات شمسية وطبقة ملابس إضافية في المساء. إنّ مؤتمر I/O فعالية عادية، لذا يجب أخذ ذلك في الاعتبار عند اختيار ملابسك.</string>\n    <string name=\"travel_hotels_description\">يتوفّر لدينا مجموعات غرف للحجز في عدّة فنادق محلية. وسيتمّ تحديث قائمة الفنادق والغرف المتاحة بصورة منتظمة. يُرجى استخدام الخريطة أدناه للعثور على الفندق الذي يناسبك. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;خريطة الفندق&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">إليك ثلاثة مطارات أساسية في منطقة الخليج فيها خدمات خطوط جوية دولية:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار سان فرانسيسكو الدولي (SFO‏)&lt;/a&gt; الذي يبعد مسافة تقارب 24 ميلاً&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار أوكلاند الدولي (OAK‏)&lt;/a&gt; الذي يبعد مسافة تقارب 32 ميلاً&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار سان خوسيه الدولي (SJC‏)&lt;/a&gt; الذي يبعد مسافة تقارب 12 ميلاً</string>\n    <string name=\"travel_getting_to_shoreline_description\">سعيًا منّا إلى الحدّ من ازدحام حركة المرور وانبعاثات غاز الكربون، قرّرنا جعل مؤتمر Google I/O 2019 \"فعالية لا تتوفّر فيها مواقف للسيارات*\". لقد نظرنا في هذا القرار بعناية وسنتيح لك العديد من الخيارات المجانية للوصول إلى الفعالية بدون الحاجة إلى سيارة.&lt;br&gt;&lt;br&gt;سنزوّدك بالمزيد من المعلومات مع اقتراب موعد الفعالية.&lt;br&gt;&lt;br&gt;*ستتوفّر مواقف للكراسي المتحرّكة.</string>\n    <string name=\"travel_shuttle_service_description\">سعيًا منّا إلى الحدّ من ازدحام حركة المرور وانبعاثات غاز الكربون، قرّرنا جعل مؤتمر Google I/O 2019 \"فعالية لا تتوفّر فيها مواقف للسيارات*\". لقد نظرنا في هذا القرار بعناية وسنتيح لك العديد من الخيارات المجانية للوصول إلى الفعالية بدون الحاجة إلى سيارة.&lt;br&gt;&lt;br&gt;سنزوّدك بالمزيد من المعلومات مع اقتراب موعد الفعالية.&lt;br&gt;&lt;br&gt;*ستتوفّر مواقف للكراسي المتحرّكة.</string>\n    <string name=\"travel_off_site_parking_description\">ستتوفّر مواقف مجانية للسيارات خارج الموقع في &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;ملعب أفايا&lt;/a&gt;. وسيتمّ توفير وسائل نقل من ملعب أفايا إلى مؤتمر Google I/O ومنه.&lt;br&gt;&lt;br&gt; يُرجى إعلامنا في استمارة التسجيل إذا كنت من ذوي الاحتياجات الخاصّة وسيتواصل معك فريق التخطيط مباشرةً.</string>\n    <string name=\"travel_for_public_transportation_description\">سنوفّر بطاقات دفع مسبق لوسائل نقل عامة ستكون متاحة لنقل الضيوف أثناء مرحلة ما قبل التسجيل. تتوفّر وسائل النقل العام المتوجّهة إلى المنطقة عبر:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: قطار محلّي&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: قطار سريع داخل منطقة ساوث باي&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART‏&lt;/a&gt;: نظام النقل السريع في منطقة الخليج&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: قطار محلّي&lt;br&gt;&lt;br&gt; لا تتوجّه وسائل النقل العام مباشرةً إلى مؤتمر Google I/O. يمكنك متابعة أخبارنا لمعرفة المواقع الجغرافية المحدّدة لوسائل النقل المخصّصة لفعاليات Google I/O.</string>\n    <string name=\"travel_biking_description\">ستتوفّر مواقف مجانية للدرّاجات في مدرّج شورلاين في موقف السيارات A. وستقدّم مجموعة Silicon Valley Bicycle Coalition خدمة ركن الدرّاجات بشكلٍ آمن من الساعة 7 صباحًا وحتى انتهاء الفعالية كلّ يوم.&lt;br&gt;&lt;br&gt; يُرجى مراجعة \"خرائط Google\" للاطّلاع على أفضل الطرقات المناسبة للدرّاجات والاتّجاهات. ويمكن لراكبي الدرّاجات المتوجّهين إلى مدرّج شورلاين سلوك طريقَين هما: طريق ستيفنز كريك وطريق بيرمانينت كريك.</string>\n    <string name=\"travel_ridesharing_description\">سيتمّ توفير خدمة نقل إلى مطارَي سان فرانسيسكو وسان خوسيه الدوليَّين من مؤتمر Google I/O في اليوم الأخير من الفعالية. ولن تتوفّر هذه الخدمة في أيّ أيّام أخرى.</string>\n    <string name=\"travel_airport_transfers_description\">سيتمّ توفير خدمة نقل إلى مطارَي سان فرانسيسكو وسان خوسيه الدوليَّين من مؤتمر Google I/O في اليوم الأخير من الفعالية. ولن تتوفّر هذه الخدمة في أيّ أيّام أخرى.</string>\n    <string name=\"faq_when_and_where_title\">في أيّ زمان ومكان سيُعقد مؤتمر Google I/O 2019؟</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">كيف يمكنني الاطّلاع على آخر المستجدّات المتعلّقة بمؤتمر Google I/O؟</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">هل سيتمّ تقديم كلّ \"الجلسات\" باللغة الإنجليزية؟</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">هل يمكنني حجز مقعد في \"الجلسات\" قبل موعد الفعالية؟</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">ما هي أفضل طريقة للوصول إلى مدرّج شورلاين؟</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">أين ومتى يمكنني أن أستلم شارتي؟</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">أودّ حجز مقعد في الصف الأمامي لحضور العرض التقديمي الرئيسي، فهل من نصائح يمكنني اتّباعها؟</string>\n    <string name=\"faq_what_should_i_wear_title\">ما اللباس الواجب ارتداؤه؟</string>\n    <string name=\"faq_onsite_food_options_title\">أُحبّ تناول الوجبات الخفيفة. ما هي خيارات الطعام المتوفرة في الفعالية؟</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">في حال فقدتُ مقتنياتي في الموقع، أين يمكنني العثور عليها؟</string>\n    <string name=\"faq_after_dark_program_title\">تبدو برامج After Dark ممتعة. هل تنصحونني بحضورها؟</string>\n    <string name=\"faq_accessibility_needs_title\">هل يمكن تلبية احتياجاتي للكرسي المتحرّك؟</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">كيف يتمّ تقديم الدعم للنساء الحوامل والوالدَين الذين يحضرون مؤتمر I/O؟</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">إرشادات المنتدى للفعاليات التي تنظّمها Google والسياسة المتعلّقة بمكافحة التحرّش</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">هل سيتمّ بثّ \"الجلسات\" مباشرةً على الإنترنت؟ وهل ستتوفّر نُسخ مسجّلة في حال تعذّر عليّ متابعة الفعالية في الوقت الفعلي؟</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">أودّ الاحتفال بمؤتمر I/O مع المنتدى الذي يدعمني.  هل يمكنني الحصول على أفكار لذلك؟</string>\n    <string name=\"faq_when_and_where_description\">للاطّلاع على آخر المعلومات حول \"الجلسات\" والمحاضرين والأنشطة بشكل عام، يُرجى الانتقال إلى &lt;a href=\"https://events.google.com/io/\"&gt; موقع الويب الخاص بمؤتمر Google I/O 2019‏&lt;/a&gt; و&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;مدوّنة Google Developers‏&lt;/a&gt; ومتابعة صفحتنا على &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; وعلى&lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. يمكنك أيضًا متابعة المحادثة على وسائل التواصل الاجتماعي عن مؤتمر Google I/O 2019 عبر استخدام علامة التصنيف الرسمية للمؤتمر &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. بالإضافة إلى ذلك، سنرسل معلومات مهمّة عبر البريد الإلكتروني إلى كلّ المشاركين المسجّلين في الفعالية، ويشمل ذلك تعليمات حول تسجيل الوصول قبل بدء المؤتمر.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">للاطّلاع على آخر المعلومات حول \"الجلسات\" والمحاضرين والأنشطة بشكل عام، يُرجى الانتقال إلى &lt;a href=\"https://events.google.com/io/\"&gt; موقع الويب الخاص بمؤتمر Google I/O 2019‏&lt;/a&gt; و&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;مدوّنة Google Developers‏&lt;/a&gt; ومتابعة صفحتنا على &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; وعلى&lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. يمكنك أيضًا متابعة المحادثة على وسائل التواصل الاجتماعي عن مؤتمر Google I/O 2019 عبر استخدام علامة التصنيف الرسمية للمؤتمر &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. بالإضافة إلى ذلك، سنرسل معلومات مهمّة عبر البريد الإلكتروني إلى كلّ المشاركين المسجّلين في الفعالية، ويشمل ذلك تعليمات حول تسجيل الوصول قبل بدء المؤتمر.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">نعم، بهذه الطريقة سيتمكّن الجمهور في جميع أنحاء العالم من متابعتنا.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">ابتداءً من شهر نيسان (أبريل)، سيتمكّن الضيوف الحاضرون من حجر مقاعد \"للجلسات\" قبل الفعالية على موقع الويب الخاص بمؤتمر I/O وعبر تطبيق المؤتمر المتوافق مع الأجهزة الجوّالة (ملاحظة: لن يتمكّن الضيوف من حجز عدد من المقاعد في \"الجلسات\" لأنّها ستكون متاحة فقط وفقًا لمبدأ الأولوية حسب الأسبقية). وتتوفّر المقاعد في الدروس التطبيقية حول الترميز ومراجعات التطبيقات وساعات العمل وفقًا للمبدأ نفسه.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">يمكنك الاطّلاع على قسم \"السفر\" للحصول على كلّ نصائح التنقّل التي تحتاجها، بما في ذلك معلومات عن وسائل التنقّل واتجاهات سائقي السيارات والدراجات ونصائح حول مشاركة الرحلات وغيرها من المعلومات.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">لتسريع إنجاز إجراءات الدخول إلى المؤتمر، سنبدأ بتوزيع الشارات نهار الاثنين في 6 أيار (مايو) في مدرّج شورلاين. ولاستلام شارة Google I/O، يجب:&lt;br&gt; - إثبات صحّة مستند تعريف شخصي يحمل صورتك: نقبل التراخيص الصادرة عن جهة حكومية وجوازات السفر وغيرها من المستندات التي تعرّف عنك. إذا كنت لا تملك المستندات المناسبة للتعريف عن نفسك، لن تتمكّن من استلام الشارة وبالتالي حضور المؤتمر. ويجب أن يتطابق الاسم الوارد في مستند التعريف تمامًا مع الاسم الوارد في الملف الشخصي الذي استخدمته للتسجيل في الفعالية. وإذا كنت طالبًا أكاديميًا، يُرجى إحضار إثبات عن الأهلية.&lt;br&gt; - يُرجى إجراء مسح ضوئي لرمز الاستجابة السريعة التابع للتسجيل الذي تلقّيته عبر البريد الإلكتروني: يمكنك مسحه ضوئيًا من هاتفك ولا حاجة لطباعة الرسالة الإلكترونية. ‎#savetheenvironment &lt;br&gt;&lt;br&gt;ملاحظة: لا يجوز لك مشاركة شارتك أو إعطاؤها أو تقديمها لشخص آخر بأيّ شكل من الأشكال. ولا يمكن الحصول على شارات بديلة لمؤتمر Google I/O، لذا يُرجى الحرص على عدم فقدانها وإلا لن يُسمح لك بالدخول إلى المؤتمر من جديد. يجب تثبيت شارة Google I/O على ملابسك لتتمكّن من الدخول إلى المؤتمر، بما في ذلك المشاركة في \"الجلسات\" و\"صناديق الإبداع\" و\"ساعات ما بعد المؤتمر\". ويُرجى تقديم مستندات تعريف شخصي إضافية إذا طلبها منك موظّفو الأمن. قد يظهر على شارات Google I/O اسمك واسم شركتك أو مؤسستك (إذا تمّ تقديمه) وصورة لك.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">تتوفّر مقاعد لجميع الضيوف لحضور العرض التقديمي الرئيسي، ولكن سيتمّ تخصيص أفضل المقاعد وفقًا لمبدأ الأولوية حسب الأسبقية عند البدء باستلام الشارات في 6 أيار (مايو) ابتداءً من الساعة 7 صباحًا، لذا يُرجى الحرص على الوصول في وقت مبكر.</string>\n    <string name=\"faq_what_should_i_wear_description\">إنّ Google I/O هو فعالية في الهواء الطلق مخصّصة لمطوّري البرامج، لذا لا تتردّد في ارتداء ملابس مُريحة، فما من لباس معيّن مفروض. قد تكون الحرارة مرتفعة جدًا في منطقة خليج سان فرانسيسكو في النهار وتنخفض في ساعات المساء، لذا يُرجى توضيب ملابس مناسبة.</string>\n    <string name=\"faq_onsite_food_options_description\">إليك خبر سار، إنّنا نحب تناول الطعام أيضًا.  سيتمّ تقديم وجبات الفطور والغداء والوجبات الخفيفة للضيوف مجانًا طوال أيام المؤتمر الثلاثة. وسيتمّ أيضًا تقديم وجبة العشاء في اليومَين الأوّل والثاني خلال فعاليات \"ساعات ما بعد المؤتمر\".</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">نحن جاهزون للمساعدة. ستكون محطة المفقودات موجودة في مكتب المساعدة في المؤتمر خلال ساعات الفعالية. وسيتمّ تسليم المفقودات من اليوم الفائت إلى مكتب الأمن في المؤتمر. ملاحظة مهمّة: لا يمكن الحصول على شارات بديلة لمؤتمر Google I/O، لذا يُرجى الحرص على عدم فقدان شارتك وإلا لن يُسمح لك بدخول المؤتمر من جديد.</string>\n    <string name=\"faq_after_dark_program_description\">لا ننصحك بتفويت هاتين الليلتين. ستتمّ دعوة الضيوف للاستماع إلى الموسيقى وتشغيل الألعاب وغيرها من النشاطات في مساء 8 أيّار (مايو)، وستتمّ دعوتهم أيضًا إلى حفلة موسيقية حصريّة في مدرّج شورلاين في 9 أيّار (مايو). سيتمّ توفير الطعام والمشروبات في كلتا الليلتَين (وستتوفّر المشروبات الكحولية للضيوف الذين يبلغون من العمر 21 عامًا وأكثر). سنستضيف فعاليتَي \"ساعات ما بعد المؤتمر\" في مدرّج شورلاين، ويجب أن تتوفّر معك شارة الحضور للدخول.</string>\n    <string name=\"faq_accessibility_needs_description\">تتوفّر مواقف للنساء الحوامل في منطقة مواقف السيارات المخصّصة لذوي الاحتياجات الخاصّة.&lt;br&gt; ويمكن للأمّهات اصطحاب أطفالهنّ الرضّع إلى المؤتمر. وستتوفّر أربع غرف مخصّصة للأمّهات في 7 و8 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 8 مساءً، وفي 9 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 4 بعد الظهر. يمكن للأمهات العثور على أوراق التسجيل أمام الغرف المخصّصة للأمهات واستخدام الغرف وفقًا لمبدأ الأولوية حسب الأسبقية. يُرجى مراجعة \"مكتب المساعدة\" في المؤتمر للحصول على المزيد من المعلومات.&lt;br&gt;&lt;br&gt; سيتمّ تسديد تكاليف رعاية الأطفال بقيمة تصل إلى 100 دولار أميركي يوميًا (لا يتعدّى المبلغ الإجمالي 300 دولار أميركي) للوالدَين الحاضرين الذين يعبّرون عن اهتمامهم برعاية الأطفال في نموذج التسجيل لدينا، وذلك وفقًا لمبدأ الأولوية حسب الأسبقية. ويسدّد مورِّد خارجي هذه التكاليف. إذا أرسلنا إليك رسالة إلكترونية للتعبير عن موافقتنا على طلبك لرعاية الأطفال قبل بدء المؤتمر وعند الموافقة على حضورك هذا المؤتمر، سيتواصل معك المورِّد لإعلامك بالخطوات التالية في غضون 7 أيام عمل بعد مؤتمر Google I/O. وسيتولّى المورِّد إدارة كلّ عمليات تسديد تكاليف رعاية الأطفال لدينا.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">تتوفّر مواقف للنساء الحوامل في منطقة مواقف السيارات المخصّصة لذوي الاحتياجات الخاصّة.&lt;br&gt; ويمكن للأمّهات اصطحاب أطفالهنّ الرضّع إلى المؤتمر. وستتوفّر أربع غرف مخصّصة للأمّهات في 7 و8 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 8 مساءً، وفي 9 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 4 بعد الظهر. يمكن للأمهات العثور على أوراق التسجيل أمام الغرف المخصّصة للأمهات واستخدام الغرف وفقًا لمبدأ الأولوية حسب الأسبقية. يُرجى مراجعة \"مكتب المساعدة\" في المؤتمر للحصول على المزيد من المعلومات.&lt;br&gt;&lt;br&gt; سيتمّ تسديد تكاليف رعاية الأطفال بقيمة تصل إلى 100 دولار أميركي يوميًا (لا يتعدّى المبلغ الإجمالي 300 دولار أميركي) للوالدَين الحاضرين الذين يعبّرون عن اهتمامهم برعاية الأطفال في نموذج التسجيل لدينا، وذلك وفقًا لمبدأ الأولوية حسب الأسبقية. ويسدّد مورِّد خارجي هذه التكاليف. إذا أرسلنا إليك رسالة إلكترونية للتعبير عن موافقتنا على طلبك لرعاية الأطفال قبل بدء المؤتمر وعند الموافقة على حضورك هذا المؤتمر، سيتواصل معك المورِّد لإعلامك بالخطوات التالية في غضون 7 أيام عمل بعد مؤتمر Google I/O. وسيتولّى المورِّد إدارة كلّ عمليات تسديد تكاليف رعاية الأطفال لدينا.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">تسعى Google إلى توفير تجربة خالية من التحرّش وشاملة في الفعالية لجميع المشاركين مهما كانت هويّتهم الجنسية وطريقة تعبيرهم عنها أو ميولهم الجنسية أو الإعاقات التي يعانون منها أو تنوّع النظام العصبي لديهم أو مظهرهم الخارجي أو حجمهم أو انتمائهم العرقي أو جنسيتهم أو عِرقهم أو عمرهم أو دينهم أو أيّ فئة أخرى محميّة. وليتمكّن الجميع من الحضور إلى الفعالية، ستتوفّر حمّامات للجنسين في كلّ أنحاء المكان.&lt;br&gt;&lt;br&gt; نحن لا نقبل أن يتعرّض الضيوف للتحرّش بأيّ شكل من الأشكال.&lt;br&gt; تأخذ Google مسألة مخالفة سياستها على محمل الجد وتردّ على هذه المخالفات بالطُرق المناسبة. للمزيد من المعلومات حول إرشادات المنتدى المتعلّقة بفعاليات Google وسياسة مكافحة التحرّش، يُرجى الانتقال إلى &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;هذا الرابط&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">سيتمّ بثّ العرضين التقديميين الرئيسيّين وكلّ \"الجلسات\" بشكل مباشر على الصفحة الرئيسية لموقع الويب الخاص بالفعالية طوال أيام المؤتمر الثلاثة. في حال انهماكك في العمل أو إقامتك في بلد يتّبع توقيتًا زمنيًا مختلفًا، يمكنك مشاهدة تسجيلات الجلسات في وقت لاحق على &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;قناة Google Developers على YouTube‏&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">نعم. يستضيف مطوّرو البرامج من حول العالم كلّ عام &lt;a href=\"https://events.google.com/io/extended\"&gt;فعاليات Google I/O Extended‏&lt;/a&gt;. وخلال هذه الفعاليات، تستطيع الجهات المنظِّمة بث المحتوى مباشرةً واستضافة جلساتهم الخاصة من ضمنها الهاكاثونات والدروس التطبيقية حول الترميز والعروض التوضيحية وغيرها.&lt;br&gt; وإذا أردت المشاركة في فعالية I/O Extended كمضيف هذا العام، يمكنك اتّباع هذه الخطوات للبدء في ذلك:&lt;br&gt;&lt;br&gt;  يُرجى قراءة &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;دليل الجهات المنظِّمة&lt;/a&gt; للحصول على نصائح واقتراحات حول كيفية استضافة فعالية ناجحة.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;سجِّل&lt;/a&gt; الفعالية العامة التي تريدها على موقع الويب الخاص بمؤتمر I/O لتصل إلى جمهور أكبر.&lt;br&gt;&lt;br&gt; استخدِم علامة التصنيف ‎#io19extended الرسمية في كلّ المشارَكات المتعلّقة بفعالية I/O Extended على وسائل التواصل الاجتماعي لتسهيل العثور عليها&lt;br&gt;&lt;br&gt; ملاحظة: يمكن لمستضيفي I/O Extended طلب حذف معلوماتهم الشخصية و/أو بيانات الفعالية بعد انتهائها عبر توجيه رسالة إلكترونية إلى العنوان io19@google.com.&lt;‏br&gt; إذا أردت حضور فعالية I/O Extended ببساطة، تصفَّح &lt;a href=\"https://events.google.com/io/extended\"&gt;الخريطة&lt;/a&gt; لإيجاد فعالية تقع بالقرب منك والردّ على الدعوة.&lt;br&gt; إذا كان لديك أسئلة حول برنامج I/O Extended، يمكنك التواصل معنا على البريد الإلكتروني io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">عرض الجلسات</string>\n    <string name=\"wifi_install_success\">تمّ حفظ شبكة Wi-Fi.</string>\n    <string name=\"wifi_install_clipboard_message\">تعذّر حفظ تفاصيل شبكة Wi-Fi.‏\\nوتمّ حفظ كلمة المرور في الحافظة بدلاً من ذلك.</string>\n    <string name=\"event_sessions_title\">الجلسات</string>\n    <string name=\"event_sandbox_title\">وَضْع الحماية</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">ساعات العمل وتقييمات التطبيق</string>\n    <string name=\"event_afterhours_title\">أحداث ما بعد المؤتمر</string>\n    <string name=\"event_meals_title\">الوجبات</string>\n    <string name=\"event_sessions_description\">ابتداءً من شهر نيسان (أبريل)، سيتمكّن الضيوف الحاضرون من حجر مقاعد \"للجلسات\" قبل الفعالية على موقع الويب الخاص بمؤتمر I/O وعبر تطبيق المؤتمر المتوافق مع الأجهزة الجوّالة (ملاحظة: لن يتمكّن الضيوف من حجز عدد من المقاعد في \"الجلسات\" لأنّها ستكون متاحة فقط وفقًا لمبدأ الأولوية حسب الأسبقية). وتتوفّر المقاعد في الدروس التطبيقية حول الترميز ومراجعات التطبيقات وساعات العمل وفقًا للمبدأ نفسه.</string>\n    <string name=\"event_sandbox_description\">مساحات مخصّصة للاستكشاف والتعلّم واللعب باستخدام أحدث المنتجات والمنصّات عبر عروض توضيحية تفاعلية وأجهزة فعلية وغيرها.</string>\n    <string name=\"event_codelabs_description\">يمكنك تجربة \"الأكشاك الجاهزة للترميز\" للاطّلاع على مزيد من المعلومات عن آخر تقنيات Google المدهشة عبر برامج تعليمية تتحكّم بمستوى سرعتها، أو يمكنك جلب جهازك وإنجاز عملك في المنزل. وسيكون فريق عمل Google متوفّرًا لتقديم النصائح المفيدة والإرشادات إذا واجهت أيّ صعوبات.</string>\n    <string name=\"event_officehours_description\">يمكنك أن تتعرّف على خبراء Google شخصيًّا ضمن ساعات العمل ليجيبوا عن أسئلتك التقنية. وتمكنّك تقييمات التطبيق من الحصول على نصائح بشأن مشاريعك المحدّدة لأيّ تطبيق.</string>\n    <string name=\"event_afterhours_description\">بعد انتهاء \"الجلسات\"، يُرجى البقاء في شورلاين لِلَيْلَتَيْن يتمّ فيهما تقديم الطعام والشراب والتسلية. سنقيم حفلة في الليلة الأولى في مساحة Sandbox، وفي الليلة الثانية سنقيم حفلة حصريّة في المدرّج.</string>\n    <string name=\"event_meals_description\">سيتمّ تقديم وجبات الفطور والغداء والوجبات الخفيفة للضيوف مجانًا طوال أيام المؤتمر الثلاثة. وسيتمّ أيضًا تقديم وجبة العشاء في اليومَين الأول والثاني خلال \"فعاليات ما بعد المؤتمر\".</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">التطبيقات ذات الصلة</string>\n    <string name=\"event_types_header\">أنواع الأحداث</string>\n    <string name=\"settings_time_zone_label\">تجري الأحداث بتوقيت المحيط الهادئ (UTC-8).</string>\n    <string name=\"settings_enable_notifications\">تفعيل الإشعارات</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">إرسال إحصاءات الاستخدام المجهولة المصدر</string>\n    <string name=\"settings_tos\">بنود الخدمة</string>\n    <string name=\"settings_privacy_policy\">سياسة الخصوصية</string>\n    <string name=\"settings_oss_licenses\">تراخيص البرامج المفتوحة المصدر</string>\n    <string name=\"settings_theme_title\">اختيار تصميم</string>\n    <string name=\"settings_theme_system\">إعداد تلقائي للنظام</string>\n    <string name=\"settings_theme_light\">فاتح</string>\n    <string name=\"settings_theme_dark\">غامق</string>\n    <string name=\"settings_theme_battery\">الضبط حسب ميزة \"توفير شحن البطارية\"</string>\n    <string name=\"built_with_material_components\">تمّ إنشاء التطبيق عبر Material Components.</string>\n    <string name=\"wifi_network_and_password\">الشبكة: %1$s\\nكلمة المرور: %2$s</string>\n    <string name=\"join_network\">الانضمام إلى الشبكة</string>\n    <string name=\"assistant_app_description\">ما عليك سوى قول \"Hey Google, talk to Google I/O 19\".</string>\n    <string name=\"assistant_app_description2\">ما عليك سوى قول \"Hey Google, talk to Google I/O 19\".</string>\n    <string name=\"speaker_link_website\">موقع الويب</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">Github</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">الفعاليات</string>\n    <string name=\"no_network_connection\">لا يتوفّر اتصال بالإنترنت.</string>\n    <string name=\"navigate_up\">الانتقال إلى الأعلى</string>\n    <string name=\"no_network_description\">لاستخدام ميزة Explore I/O، يُرجى محاولة:\\n\\n - إيقاف \"وضع الطائرة\"\\n\\n - تفعيل بيانات الجوّال أو  شبكة Wi-Fi‏\\n\\n - التحقّق من الإشارة في منطقتك.</string>\n    <string name=\"phone_does_not_support_arcore_title\">لا يمكنك استخدام ARCore على هاتفك.</string>\n    <string name=\"phone_does_not_support_arcore_message\">يُرجى استخدام جهاز آخر أو استعارة جهاز من صديق.</string>\n    <string name=\"codelabs_information\">يمكنك تعلُّم تقنيات Google الأخيرة والرائعة عبر برامج تعليمية يمكنك التحكّم بوتيرتها في أكشاك الترميز أو يمكنك إحضار جهازك وإنجاز عملك في المنزل. تفتح هذه الأكشاك أبوابها يوميًا ما عدا خلال أوّل عرض تقديمي رئيسي.</string>\n    <string name=\"codelabs_building\">مبنى تقديم الدروس التطبيقية حول الترميز</string>\n    <string name=\"codelabs_website\">موقع الويب لدروس تطبيقية حول الترميز</string>\n    <string name=\"codelab_duration\">المدة: %1$d دقيقة</string>\n    <string name=\"start_codelab\">بدء الدرس التطبيقي حول الترميز</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-ar-rSA/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">الجدول الزمني</string>\n    <string name=\"title_home\">الصفحة الرئيسية</string>\n    <string name=\"title_map\">الخريطة</string>\n    <string name=\"title_explore_io\">استكشاف مكان عقد مؤتمر I/O</string>\n    <string name=\"title_info\">معلومات</string>\n    <string name=\"filters\">فلاتر</string>\n    <string name=\"category_heading_tracks\">المواضيع</string>\n    <string name=\"category_heading_types\">أنواع الحدث</string>\n    <string name=\"reset\">إعادة ضبط</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"zero\"> %1$d حدث</item>\n        <item quantity=\"one\"> حدث (%1$d)</item>\n        <item quantity=\"two\"> حدثان (%1$d)</item>\n        <item quantity=\"few\">%1$d أحداث</item>\n        <item quantity=\"many\">%1$d حدثًا</item>\n        <item quantity=\"other\">%1$d حدث</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">الفعاليات المحجوزة والتي تمّ تمييزها بنجمة</string>\n    <string name=\"starred_and_reserved_short\">الفعاليات التي ستشارك فيها</string>\n    <string name=\"search_schedule_hint\">البحث في الجدول الزمني</string>\n    <string name=\"search_schedule_no_results\">لم يتمّ العثور على نتائج.</string>\n    <string name=\"agenda\">جدول الأعمال</string>\n    <string name=\"event_starred\">تمّت إضافة الحدث إلى العناصر المميّزة بنجمة.</string>\n    <string name=\"event_unstarred\">تمّت إزالة الحدث من العناصر المميّزة بنجمة.</string>\n    <string name=\"event_star_error\">حدث خطأ أثناء إضافة الحدث إلى العناصر المميّزة بنجمة.</string>\n    <string name=\"reservation_error\">حدث خطأ أثناء تغيير الحجز، لذلك يُرجى الانتظار حتى إتمام الطلبات السابقة أو المحاولة لاحقًا.</string>\n    <string name=\"reservation_request_succeeded\">تمّ طلب الحجز.</string>\n    <string name=\"reservation_cancel_succeeded\">تمّ إلغاء الحجز: \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">تمّ حجز المقعد لـ \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">تمّ استبدال الحجز.</string>\n    <string name=\"waitlist_new\">تمّت إضافتك إلى قائمة الانتظار.</string>\n    <string name=\"waitlist_cancel_succeeded\">تمّت إزالتك من قائمة الانتظار.</string>\n    <string name=\"got_it\">حسنًا</string>\n    <string name=\"dont_show\">عدم العرض</string>\n    <string name=\"reservation_denied_cutoff\">تمّ رفض الحجز لأنّ وقت بدء الجلسة قريب جدًا.</string>\n    <string name=\"reservation_denied_clash\">تمّ رفض الحجز بسبب تضارب موعده مع حجز آخر.</string>\n    <string name=\"reservation_denied_unknown\">تمّ رفض الحجز بسبب خطأ غير معروف.</string>\n    <string name=\"cancellation_denied_cutoff\">تمّ رفض إلغاء الحجز لأنّ وقت بدء الجلسة قريب جدًا.</string>\n    <string name=\"cancellation_denied_unknown\">تمّ رفض إلغاء الحجز بسبب خطأ غير معروف.</string>\n    <string name=\"schedule_filters_empty\">لم يتمّ العثور على أي فعاليات.</string>\n    <string name=\"reservation_reservable\">حجز مِقعد</string>\n    <string name=\"reservation_reserved\">تمّ الحجز.</string>\n    <string name=\"reservation_waitlisted\">تمّت إضافتك إلى قائمة الانتظار.</string>\n    <string name=\"reservation_waitlist_available\">الانضمام إلى قائمة الانتظار</string>\n    <string name=\"reservation_disabled\">الحجوزات غير متاحة.</string>\n    <string name=\"reservation_pending\">الحجز في الانتظار</string>\n    <string name=\"schedule_hint_title\">تخصيص الجدول الزمني</string>\n    <string name=\"schedule_hint_star_event\">إضافة الحدث إلى الأحداث المميّزة بنجمة</string>\n    <string name=\"schedule_hint_reserve_session_seat\">حجز مِقعد للجلسة</string>\n    <string name=\"rate_session\">تقييم الجلسة</string>\n    <string name=\"menu_item_session_location\">موقع الجلسة</string>\n    <string name=\"menu_item_session_star\">تمييز الجلسة بنجمة</string>\n    <string name=\"menu_item_calendar\">إضافة إلى التقويم</string>\n    <string name=\"speaker_delimiter\">،</string>\n    <string name=\"session_detail_speakers_header\">مكبّرات الصوت</string>\n    <string name=\"session_detail_related_header\">الأحداث ذات الصلة</string>\n    <string name=\"feedback_submit\">إرسال</string>\n    <string name=\"feedback_thank_you\">شكرًا على تعليقاتك.</string>\n    <string name=\"feedback_q1_text\">كيف تقيّم نوعية الجلسة بشكل عام؟</string>\n    <string name=\"feedback_q2_text\">كيف تصف محتوى الجلسة بالاستناد إلى توقعاتك/وصف الجلسة؟</string>\n    <string name=\"feedback_q3_text\">ما مدى ارتباط موضوع الجلسة بمشاريعك؟</string>\n    <string name=\"feedback_q4_text\">ما مدى ارتباط موضوع الجلسة بمشاريعك؟</string>\n    <string name=\"feedback_q1_label_start\">تقدّم معلومات للمبتدئين</string>\n    <string name=\"feedback_q2_label_start\">سيّئة</string>\n    <string name=\"feedback_q3_label_start\">سيّئة</string>\n    <string name=\"feedback_q4_label_start\">عادية</string>\n    <string name=\"feedback_q1_label_end\">رائعة</string>\n    <string name=\"feedback_q2_label_end\">رائعة</string>\n    <string name=\"feedback_q3_label_end\">مفيدة جدًا</string>\n    <string name=\"feedback_q4_label_end\">مفيدة جدًا</string>\n    <string name=\"a11y_show_navigation\">عرض قائمة التنقل</string>\n    <string name=\"a11y_collapse_filters_sheet\">طيّ ورقة الفلاتر</string>\n    <string name=\"a11y_clear_tag_filters\">مسح الفلاتر</string>\n    <string name=\"a11y_filter_applied\">تمّ تطبيق الفلتر %1s.</string>\n    <string name=\"a11y_filter_not_applied\">لم يتمّ تطبيق الفلتر %1s.</string>\n    <string name=\"a11y_reservation_available\">حجز مِقعد</string>\n    <string name=\"a11y_reservation_reserved\">تمّ حجز مِقعد في الحدث</string>\n    <string name=\"a11y_reservation_disabled\">الحجز غير متاح</string>\n    <string name=\"a11y_reservation_wait_list_available\">الانضمام إلى قائمة الانتظار للحدث</string>\n    <string name=\"a11y_reservation_wait_listed\">على قائمة الانتظار للحدث</string>\n    <string name=\"a11y_reservation_pending\">الحجز في الانتظار</string>\n    <string name=\"a11y_starred\">تمّ وضع إشارة مرجعية على الحدث.</string>\n    <string name=\"a11y_unstarred\">لم يتمّ وضع إشارة مرجعية على الحدث.</string>\n    <string name=\"a11y_star\">نجمة</string>\n    <string name=\"a11y_play\">تشغيل الفيديو</string>\n    <string name=\"a11y_select_map_mode\">اختيار وضع الخريطة</string>\n    <string name=\"a11y_search_schedule\">البحث في الجدول الزمني</string>\n    <string name=\"welcome\">مرحبًا</string>\n    <string name=\"a11y_signed_in_content_description\">تم تسجيل الدخول من حساب %s.</string>\n    <string name=\"a11y_signed_out_content_description\">يُرجى النقر لتسجيل الدخول.</string>\n    <string name=\"dialog_sign_in_content\">يُرجى تسجيل الدخول لحفظ الأحداث، وحجز المقاعد، وتقييم الجلسات (إذا كنت ضيفًا). وستتمّ مزامنة الإجراءات التي يتمّ إجراؤها في حسابك على التطبيق والموقع الإلكتروني.</string>\n    <string name=\"sign_in\">تسجيل الدخول</string>\n    <string name=\"firebase_auth_no_network_connection\">لا يتوفَّر اتصال بالإنترنت.</string>\n    <string name=\"firebase_auth_unknown_error\">خطأ غير معروف</string>\n    <string name=\"dialog_sign_out_content\">ستبقى كلّ الأحداث وحجوزات المقاعد وتقييمات الجلسات المحفوظة (إذا كنت ضيفًا) متزامنة على حسابك.</string>\n    <string name=\"sign_out\">الخروج</string>\n    <string name=\"manage_google_account\">إدارة حسابك على Google</string>\n    <string name=\"remove_reservation_title\">هل تودّ إزالة الحجز؟</string>\n    <string name=\"remove_reservation_content\">إنّك على وشك إلغاء حجزك في \"%1$s\". إذا أردت المشاركة في الجلسة بدون حجز مقعد، يتبقّى عدد من المقاعد المتاحة في كلّ الجلسات والأولوية حسب الأسبقيّة.</string>\n    <string name=\"cancel\">إلغاء</string>\n    <string name=\"remove\">إزالة</string>\n    <string name=\"swap_reservation_title\">هل تودّ تبديل الحجز؟</string>\n    <string name=\"swap_reservation_content\">هل سبق أن حجزت مقعدًا أو تمّت إضافتك إلى قائمة الانتظار للمشاركة في \"%1$s\"؟. يمكنك إجراء حجز واحد فقط لكلّ جلسة. هل تريد تبديل حجزك بـ \"%2$s\"؟</string>\n    <string name=\"swap\">تبديل</string>\n    <string name=\"notifications_preference_dialog_title\">إشعارات I/O</string>\n    <string name=\"notifications_preference_dialog_content\">هل تريد تلقّي إشعارات حول I/O؟ سنرسل إليك معلومات عن وقت بدء الجلسات، والأحداث التي تليها، والتسجيلات وغيرها. يمكنك تغيير هذا الإعداد ضمن \"المعلومات &gt; الإعدادات\" في أيّ وقت.</string>\n    <string name=\"no\">لا</string>\n    <string name=\"yes\">نعم</string>\n    <string name=\"feed_not_available\">لم يتمّ العثور على إعلانات.</string>\n    <string name=\"feed_loading_error\">تعذّر تحميل الخلاصة. يُرجى إعادة المحاولة.</string>\n    <string name=\"feed_announcement_title\">الإعلانات</string>\n    <string name=\"feed_upcoming_events\">الفعاليات القادمة</string>\n    <string name=\"feed_saved_events\">الفعاليات المحفوظة</string>\n    <string name=\"feed_no_saved_events\">ما من أحداث محفوظة</string>\n    <string name=\"feed_view_all_events\">عرض كلّ الفعاليات</string>\n    <string name=\"feed_view_your_schedule\">الاطّلاع على جدولك الزمني</string>\n    <string name=\"feed_watch_live_stream\">مشاهدة البث المباشر</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"zero\">%s يوم</item>\n        <item quantity=\"one\">يوم واحد (%s)</item>\n        <item quantity=\"two\">يومان (%s)</item>\n        <item quantity=\"few\">%s أيام</item>\n        <item quantity=\"many\">%s يومًا</item>\n        <item quantity=\"other\">%s يوم</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"zero\">%s ساعة</item>\n        <item quantity=\"one\">ساعة واحدة (%s)</item>\n        <item quantity=\"two\">ساعتان (%s)</item>\n        <item quantity=\"few\">%s ساعات</item>\n        <item quantity=\"many\">%s ساعة</item>\n        <item quantity=\"other\">%s ساعة</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"zero\">%s دقيقة</item>\n        <item quantity=\"one\">دقيقة واحدة (%s)</item>\n        <item quantity=\"two\">دقيقتان (%s)</item>\n        <item quantity=\"few\">%s دقائق</item>\n        <item quantity=\"many\">%s دقيقة</item>\n        <item quantity=\"other\">%s دقيقة</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"zero\">%s ثانية</item>\n        <item quantity=\"one\">ثانية واحدة (%s)</item>\n        <item quantity=\"two\">ثانيتان (%s)</item>\n        <item quantity=\"few\">%s ثوانٍ</item>\n        <item quantity=\"many\">%s ثانية</item>\n        <item quantity=\"other\">%s ثانية</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">مشاركة الجلسة</string>\n    <string name=\"share_text_session_detail\">يُرجى الاطّلاع على \"%1$s\" على العنوان #io19 %2$s.</string>\n    <string name=\"intent_chooser_session_detail\">مشاركة</string>\n    <string name=\"map_variant_after_dark\">الوضع الليلي</string>\n    <string name=\"map_variant_concert\">حفل موسيقي</string>\n    <string name=\"map_variant_daytime\">وضع النهار</string>\n    <string name=\"enable_my_location\">تفعيل الوصول إلى موقعي</string>\n    <string name=\"my_location_rationale\">يجب منح التطبيق إذن تحديد الموقع الجغرافي ليتمكّن من عرض موقعك الجغرافي على الخريطة.</string>\n    <string name=\"onboarding_get_started\">البدء</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">أهلاً بك في Google I/O</string>\n    <string name=\"onboarding_date_location\">من 7 إلى 9 أيار (مايو) 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">يوم</string>\n    <string name=\"onboarding_label_hours\">س</string>\n    <string name=\"onboarding_label_mins\">د</string>\n    <string name=\"onboarding_label_seconds\">ث</string>\n    <string name=\"onboarding_welcome_google_io_pre\">ترقّب مؤتمر Google I/O.</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">ننصحك بمشاهدة ملخّص مؤتمر I/O للعام 2019 والاطّلاع على ‎#io19 على وسائل التواصل الاجتماعي.</string>\n    <string name=\"onboarding_signin\">عليك تسجيل الدخول لتلقّي إشعارات I/O ويستطيع الضيوف حجز مقاعد للجلسات.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"zero\">ستبدأ الجلسة بعد (%1$s) دقيقة.</item>\n        <item quantity=\"one\">ستبدأ الجلسة بعد دقيقة (%1$s).</item>\n        <item quantity=\"two\">ستبدأ الجلسة بعد دقيقتين (%1$s).</item>\n        <item quantity=\"few\">ستبدأ الجلسة بعد %1$s دقائق.</item>\n        <item quantity=\"many\">ستبدأ الجلسة بعد %1$s دقيقة.</item>\n        <item quantity=\"other\">ستبدأ الجلسة بعد %1$s دقيقة.</item>\n    </plurals>\n    <string name=\"expanded\">طريقة عرض موسّعة</string>\n    <string name=\"collapsed\">طريقة عرض مصغّرة</string>\n    <string name=\"event_title\">الحدث</string>\n    <string name=\"travel_title\">السفر</string>\n    <string name=\"faq_title\">الأسئلة الشائعة</string>\n    <string name=\"settings_title\">الإعدادات</string>\n    <string name=\"about_title\">لمحة</string>\n    <string name=\"travel_what_to_bring_title\">ماذا أُحضر معي إلى الفعالية؟</string>\n    <string name=\"travel_hotels_title\">الفنادق</string>\n    <string name=\"travel_getting_to_mountain_view_title\">الوصول إلى ماونتن فيو</string>\n    <string name=\"travel_getting_to_shoreline_title\">الوصول إلى ماونتن فيو</string>\n    <string name=\"travel_shuttle_service_title\">خدمة النقل ذهابًا وإيابًا</string>\n    <string name=\"travel_off_site_parking_title\">مواقف للسيارات خارج الموقع</string>\n    <string name=\"travel_for_public_transportation_title\">وسائل النقل العام</string>\n    <string name=\"travel_biking_title\">ركوب الدرّاجات</string>\n    <string name=\"travel_ridesharing_title\">مشاركة الرحلة</string>\n    <string name=\"travel_airport_transfers_title\">خدمات نقل من المطار وإليه</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O هو مهرجان في الهواء الطلق. ومع أنّ ذلك يشكّل سببًا رئيسيًا في جعل المؤتمر مميزًا، يعني ذلك أنّه يجب التفكير في بعض النقاط. ستُعقد \"الجلسات\" داخل خِيم يتمّ التحكّم بدرجة حرارتها، ولكنّنا ننصحك بوضع كريم الحماية من الشمس وارتداء نظّارات شمسية وطبقة ملابس إضافية في المساء. إنّ مؤتمر I/O فعالية عادية، لذا يجب أخذ ذلك في الاعتبار عند اختيار ملابسك.</string>\n    <string name=\"travel_hotels_description\">يتوفّر لدينا مجموعات غرف للحجز في عدّة فنادق محلية. وسيتمّ تحديث قائمة الفنادق والغرف المتاحة بصورة منتظمة. يُرجى استخدام الخريطة أدناه للعثور على الفندق الذي يناسبك. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;خريطة الفندق&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">إليك ثلاثة مطارات أساسية في منطقة الخليج فيها خدمات خطوط جوية دولية:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار سان فرانسيسكو الدولي (SFO‏)&lt;/a&gt; الذي يبعد مسافة تقارب 24 ميلاً&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار أوكلاند الدولي (OAK‏)&lt;/a&gt; الذي يبعد مسافة تقارب 32 ميلاً&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;مطار سان خوسيه الدولي (SJC‏)&lt;/a&gt; الذي يبعد مسافة تقارب 12 ميلاً</string>\n    <string name=\"travel_getting_to_shoreline_description\">سعيًا منّا إلى الحدّ من ازدحام حركة المرور وانبعاثات غاز الكربون، قرّرنا جعل مؤتمر Google I/O 2019 \"فعالية لا تتوفّر فيها مواقف للسيارات*\". لقد نظرنا في هذا القرار بعناية وسنتيح لك العديد من الخيارات المجانية للوصول إلى الفعالية بدون الحاجة إلى سيارة.&lt;br&gt;&lt;br&gt;سنزوّدك بالمزيد من المعلومات مع اقتراب موعد الفعالية.&lt;br&gt;&lt;br&gt;*ستتوفّر مواقف للكراسي المتحرّكة.</string>\n    <string name=\"travel_shuttle_service_description\">سعيًا منّا إلى الحدّ من ازدحام حركة المرور وانبعاثات غاز الكربون، قرّرنا جعل مؤتمر Google I/O 2019 \"فعالية لا تتوفّر فيها مواقف للسيارات*\". لقد نظرنا في هذا القرار بعناية وسنتيح لك العديد من الخيارات المجانية للوصول إلى الفعالية بدون الحاجة إلى سيارة.&lt;br&gt;&lt;br&gt;سنزوّدك بالمزيد من المعلومات مع اقتراب موعد الفعالية.&lt;br&gt;&lt;br&gt;*ستتوفّر مواقف للكراسي المتحرّكة.</string>\n    <string name=\"travel_off_site_parking_description\">ستتوفّر مواقف مجانية للسيارات خارج الموقع في &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;ملعب أفايا&lt;/a&gt;. وسيتمّ توفير وسائل نقل من ملعب أفايا إلى مؤتمر Google I/O ومنه.&lt;br&gt;&lt;br&gt; يُرجى إعلامنا في استمارة التسجيل إذا كنت من ذوي الاحتياجات الخاصّة وسيتواصل معك فريق التخطيط مباشرةً.</string>\n    <string name=\"travel_for_public_transportation_description\">سنوفّر بطاقات دفع مسبق لوسائل نقل عامة ستكون متاحة لنقل الضيوف أثناء مرحلة ما قبل التسجيل. تتوفّر وسائل النقل العام المتوجّهة إلى المنطقة عبر:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: قطار محلّي&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: قطار سريع داخل منطقة ساوث باي&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART‏&lt;/a&gt;: نظام النقل السريع في منطقة الخليج&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: قطار محلّي&lt;br&gt;&lt;br&gt; لا تتوجّه وسائل النقل العام مباشرةً إلى مؤتمر Google I/O. يمكنك متابعة أخبارنا لمعرفة المواقع الجغرافية المحدّدة لوسائل النقل المخصّصة لفعاليات Google I/O.</string>\n    <string name=\"travel_biking_description\">ستتوفّر مواقف مجانية للدرّاجات في مدرّج شورلاين في موقف السيارات A. وستقدّم مجموعة Silicon Valley Bicycle Coalition خدمة ركن الدرّاجات بشكلٍ آمن من الساعة 7 صباحًا وحتى انتهاء الفعالية كلّ يوم.&lt;br&gt;&lt;br&gt; يُرجى مراجعة \"خرائط Google\" للاطّلاع على أفضل الطرقات المناسبة للدرّاجات والاتّجاهات. ويمكن لراكبي الدرّاجات المتوجّهين إلى مدرّج شورلاين سلوك طريقَين هما: طريق ستيفنز كريك وطريق بيرمانينت كريك.</string>\n    <string name=\"travel_ridesharing_description\">سيتمّ توفير خدمة نقل إلى مطارَي سان فرانسيسكو وسان خوسيه الدوليَّين من مؤتمر Google I/O في اليوم الأخير من الفعالية. ولن تتوفّر هذه الخدمة في أيّ أيّام أخرى.</string>\n    <string name=\"travel_airport_transfers_description\">سيتمّ توفير خدمة نقل إلى مطارَي سان فرانسيسكو وسان خوسيه الدوليَّين من مؤتمر Google I/O في اليوم الأخير من الفعالية. ولن تتوفّر هذه الخدمة في أيّ أيّام أخرى.</string>\n    <string name=\"faq_when_and_where_title\">في أيّ زمان ومكان سيُعقد مؤتمر Google I/O 2019؟</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">كيف يمكنني الاطّلاع على آخر المستجدّات المتعلّقة بمؤتمر Google I/O؟</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">هل سيتمّ تقديم كلّ \"الجلسات\" باللغة الإنجليزية؟</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">هل يمكنني حجز مقعد في \"الجلسات\" قبل موعد الفعالية؟</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">ما هي أفضل طريقة للوصول إلى مدرّج شورلاين؟</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">أين ومتى يمكنني أن أستلم شارتي؟</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">أودّ حجز مقعد في الصف الأمامي لحضور العرض التقديمي الرئيسي، فهل من نصائح يمكنني اتّباعها؟</string>\n    <string name=\"faq_what_should_i_wear_title\">ما اللباس الواجب ارتداؤه؟</string>\n    <string name=\"faq_onsite_food_options_title\">أُحبّ تناول الوجبات الخفيفة. ما هي خيارات الطعام المتوفرة في الفعالية؟</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">في حال فقدتُ مقتنياتي في الموقع، أين يمكنني العثور عليها؟</string>\n    <string name=\"faq_after_dark_program_title\">تبدو برامج After Dark ممتعة. هل تنصحونني بحضورها؟</string>\n    <string name=\"faq_accessibility_needs_title\">هل يمكن تلبية احتياجاتي للكرسي المتحرّك؟</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">كيف يتمّ تقديم الدعم للنساء الحوامل والوالدَين الذين يحضرون مؤتمر I/O؟</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">إرشادات المنتدى للفعاليات التي تنظّمها Google والسياسة المتعلّقة بمكافحة التحرّش</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">هل سيتمّ بثّ \"الجلسات\" مباشرةً على الإنترنت؟ وهل ستتوفّر نُسخ مسجّلة في حال تعذّر عليّ متابعة الفعالية في الوقت الفعلي؟</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">أودّ الاحتفال بمؤتمر I/O مع المنتدى الذي يدعمني.  هل يمكنني الحصول على أفكار لذلك؟</string>\n    <string name=\"faq_when_and_where_description\">للاطّلاع على آخر المعلومات حول \"الجلسات\" والمحاضرين والأنشطة بشكل عام، يُرجى الانتقال إلى &lt;a href=\"https://events.google.com/io/\"&gt; موقع الويب الخاص بمؤتمر Google I/O 2019‏&lt;/a&gt; و&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;مدوّنة Google Developers‏&lt;/a&gt; ومتابعة صفحتنا على &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; وعلى&lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. يمكنك أيضًا متابعة المحادثة على وسائل التواصل الاجتماعي عن مؤتمر Google I/O 2019 عبر استخدام علامة التصنيف الرسمية للمؤتمر &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. بالإضافة إلى ذلك، سنرسل معلومات مهمّة عبر البريد الإلكتروني إلى كلّ المشاركين المسجّلين في الفعالية، ويشمل ذلك تعليمات حول تسجيل الوصول قبل بدء المؤتمر.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">للاطّلاع على آخر المعلومات حول \"الجلسات\" والمحاضرين والأنشطة بشكل عام، يُرجى الانتقال إلى &lt;a href=\"https://events.google.com/io/\"&gt; موقع الويب الخاص بمؤتمر Google I/O 2019‏&lt;/a&gt; و&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;مدوّنة Google Developers‏&lt;/a&gt; ومتابعة صفحتنا على &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; وعلى&lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. يمكنك أيضًا متابعة المحادثة على وسائل التواصل الاجتماعي عن مؤتمر Google I/O 2019 عبر استخدام علامة التصنيف الرسمية للمؤتمر &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. بالإضافة إلى ذلك، سنرسل معلومات مهمّة عبر البريد الإلكتروني إلى كلّ المشاركين المسجّلين في الفعالية، ويشمل ذلك تعليمات حول تسجيل الوصول قبل بدء المؤتمر.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">نعم، بهذه الطريقة سيتمكّن الجمهور في جميع أنحاء العالم من متابعتنا.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">ابتداءً من شهر نيسان (أبريل)، سيتمكّن الضيوف الحاضرون من حجر مقاعد \"للجلسات\" قبل الفعالية على موقع الويب الخاص بمؤتمر I/O وعبر تطبيق المؤتمر المتوافق مع الأجهزة الجوّالة (ملاحظة: لن يتمكّن الضيوف من حجز عدد من المقاعد في \"الجلسات\" لأنّها ستكون متاحة فقط وفقًا لمبدأ الأولوية حسب الأسبقية). وتتوفّر المقاعد في الدروس التطبيقية حول الترميز ومراجعات التطبيقات وساعات العمل وفقًا للمبدأ نفسه.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">يمكنك الاطّلاع على قسم \"السفر\" للحصول على كلّ نصائح التنقّل التي تحتاجها، بما في ذلك معلومات عن وسائل التنقّل واتجاهات سائقي السيارات والدراجات ونصائح حول مشاركة الرحلات وغيرها من المعلومات.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">لتسريع إنجاز إجراءات الدخول إلى المؤتمر، سنبدأ بتوزيع الشارات نهار الاثنين في 6 أيار (مايو) في مدرّج شورلاين. ولاستلام شارة Google I/O، يجب:&lt;br&gt; - إثبات صحّة مستند تعريف شخصي يحمل صورتك: نقبل التراخيص الصادرة عن جهة حكومية وجوازات السفر وغيرها من المستندات التي تعرّف عنك. إذا كنت لا تملك المستندات المناسبة للتعريف عن نفسك، لن تتمكّن من استلام الشارة وبالتالي حضور المؤتمر. ويجب أن يتطابق الاسم الوارد في مستند التعريف تمامًا مع الاسم الوارد في الملف الشخصي الذي استخدمته للتسجيل في الفعالية. وإذا كنت طالبًا أكاديميًا، يُرجى إحضار إثبات عن الأهلية.&lt;br&gt; - يُرجى إجراء مسح ضوئي لرمز الاستجابة السريعة التابع للتسجيل الذي تلقّيته عبر البريد الإلكتروني: يمكنك مسحه ضوئيًا من هاتفك ولا حاجة لطباعة الرسالة الإلكترونية. ‎#savetheenvironment &lt;br&gt;&lt;br&gt;ملاحظة: لا يجوز لك مشاركة شارتك أو إعطاؤها أو تقديمها لشخص آخر بأيّ شكل من الأشكال. ولا يمكن الحصول على شارات بديلة لمؤتمر Google I/O، لذا يُرجى الحرص على عدم فقدانها وإلا لن يُسمح لك بالدخول إلى المؤتمر من جديد. يجب تثبيت شارة Google I/O على ملابسك لتتمكّن من الدخول إلى المؤتمر، بما في ذلك المشاركة في \"الجلسات\" و\"صناديق الإبداع\" و\"ساعات ما بعد المؤتمر\". ويُرجى تقديم مستندات تعريف شخصي إضافية إذا طلبها منك موظّفو الأمن. قد يظهر على شارات Google I/O اسمك واسم شركتك أو مؤسستك (إذا تمّ تقديمه) وصورة لك.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">تتوفّر مقاعد لجميع الضيوف لحضور العرض التقديمي الرئيسي، ولكن سيتمّ تخصيص أفضل المقاعد وفقًا لمبدأ الأولوية حسب الأسبقية عند البدء باستلام الشارات في 6 أيار (مايو) ابتداءً من الساعة 7 صباحًا، لذا يُرجى الحرص على الوصول في وقت مبكر.</string>\n    <string name=\"faq_what_should_i_wear_description\">إنّ Google I/O هو فعالية في الهواء الطلق مخصّصة لمطوّري البرامج، لذا لا تتردّد في ارتداء ملابس مُريحة، فما من لباس معيّن مفروض. قد تكون الحرارة مرتفعة جدًا في منطقة خليج سان فرانسيسكو في النهار وتنخفض في ساعات المساء، لذا يُرجى توضيب ملابس مناسبة.</string>\n    <string name=\"faq_onsite_food_options_description\">إليك خبر سار، إنّنا نحب تناول الطعام أيضًا.  سيتمّ تقديم وجبات الفطور والغداء والوجبات الخفيفة للضيوف مجانًا طوال أيام المؤتمر الثلاثة. وسيتمّ أيضًا تقديم وجبة العشاء في اليومَين الأوّل والثاني خلال فعاليات \"ساعات ما بعد المؤتمر\".</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">نحن جاهزون للمساعدة. ستكون محطة المفقودات موجودة في مكتب المساعدة في المؤتمر خلال ساعات الفعالية. وسيتمّ تسليم المفقودات من اليوم الفائت إلى مكتب الأمن في المؤتمر. ملاحظة مهمّة: لا يمكن الحصول على شارات بديلة لمؤتمر Google I/O، لذا يُرجى الحرص على عدم فقدان شارتك وإلا لن يُسمح لك بدخول المؤتمر من جديد.</string>\n    <string name=\"faq_after_dark_program_description\">لا ننصحك بتفويت هاتين الليلتين. ستتمّ دعوة الضيوف للاستماع إلى الموسيقى وتشغيل الألعاب وغيرها من النشاطات في مساء 8 أيّار (مايو)، وستتمّ دعوتهم أيضًا إلى حفلة موسيقية حصريّة في مدرّج شورلاين في 9 أيّار (مايو). سيتمّ توفير الطعام والمشروبات في كلتا الليلتَين (وستتوفّر المشروبات الكحولية للضيوف الذين يبلغون من العمر 21 عامًا وأكثر). سنستضيف فعاليتَي \"ساعات ما بعد المؤتمر\" في مدرّج شورلاين، ويجب أن تتوفّر معك شارة الحضور للدخول.</string>\n    <string name=\"faq_accessibility_needs_description\">تتوفّر مواقف للنساء الحوامل في منطقة مواقف السيارات المخصّصة لذوي الاحتياجات الخاصّة.&lt;br&gt; ويمكن للأمّهات اصطحاب أطفالهنّ الرضّع إلى المؤتمر. وستتوفّر أربع غرف مخصّصة للأمّهات في 7 و8 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 8 مساءً، وفي 9 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 4 بعد الظهر. يمكن للأمهات العثور على أوراق التسجيل أمام الغرف المخصّصة للأمهات واستخدام الغرف وفقًا لمبدأ الأولوية حسب الأسبقية. يُرجى مراجعة \"مكتب المساعدة\" في المؤتمر للحصول على المزيد من المعلومات.&lt;br&gt;&lt;br&gt; سيتمّ تسديد تكاليف رعاية الأطفال بقيمة تصل إلى 100 دولار أميركي يوميًا (لا يتعدّى المبلغ الإجمالي 300 دولار أميركي) للوالدَين الحاضرين الذين يعبّرون عن اهتمامهم برعاية الأطفال في نموذج التسجيل لدينا، وذلك وفقًا لمبدأ الأولوية حسب الأسبقية. ويسدّد مورِّد خارجي هذه التكاليف. إذا أرسلنا إليك رسالة إلكترونية للتعبير عن موافقتنا على طلبك لرعاية الأطفال قبل بدء المؤتمر وعند الموافقة على حضورك هذا المؤتمر، سيتواصل معك المورِّد لإعلامك بالخطوات التالية في غضون 7 أيام عمل بعد مؤتمر Google I/O. وسيتولّى المورِّد إدارة كلّ عمليات تسديد تكاليف رعاية الأطفال لدينا.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">تتوفّر مواقف للنساء الحوامل في منطقة مواقف السيارات المخصّصة لذوي الاحتياجات الخاصّة.&lt;br&gt; ويمكن للأمّهات اصطحاب أطفالهنّ الرضّع إلى المؤتمر. وستتوفّر أربع غرف مخصّصة للأمّهات في 7 و8 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 8 مساءً، وفي 9 أيّار (مايو) من الساعة 8 صباحًا حتى الساعة 4 بعد الظهر. يمكن للأمهات العثور على أوراق التسجيل أمام الغرف المخصّصة للأمهات واستخدام الغرف وفقًا لمبدأ الأولوية حسب الأسبقية. يُرجى مراجعة \"مكتب المساعدة\" في المؤتمر للحصول على المزيد من المعلومات.&lt;br&gt;&lt;br&gt; سيتمّ تسديد تكاليف رعاية الأطفال بقيمة تصل إلى 100 دولار أميركي يوميًا (لا يتعدّى المبلغ الإجمالي 300 دولار أميركي) للوالدَين الحاضرين الذين يعبّرون عن اهتمامهم برعاية الأطفال في نموذج التسجيل لدينا، وذلك وفقًا لمبدأ الأولوية حسب الأسبقية. ويسدّد مورِّد خارجي هذه التكاليف. إذا أرسلنا إليك رسالة إلكترونية للتعبير عن موافقتنا على طلبك لرعاية الأطفال قبل بدء المؤتمر وعند الموافقة على حضورك هذا المؤتمر، سيتواصل معك المورِّد لإعلامك بالخطوات التالية في غضون 7 أيام عمل بعد مؤتمر Google I/O. وسيتولّى المورِّد إدارة كلّ عمليات تسديد تكاليف رعاية الأطفال لدينا.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">تسعى Google إلى توفير تجربة خالية من التحرّش وشاملة في الفعالية لجميع المشاركين مهما كانت هويّتهم الجنسية وطريقة تعبيرهم عنها أو ميولهم الجنسية أو الإعاقات التي يعانون منها أو تنوّع النظام العصبي لديهم أو مظهرهم الخارجي أو حجمهم أو انتمائهم العرقي أو جنسيتهم أو عِرقهم أو عمرهم أو دينهم أو أيّ فئة أخرى محميّة. وليتمكّن الجميع من الحضور إلى الفعالية، ستتوفّر حمّامات للجنسين في كلّ أنحاء المكان.&lt;br&gt;&lt;br&gt; نحن لا نقبل أن يتعرّض الضيوف للتحرّش بأيّ شكل من الأشكال.&lt;br&gt; تأخذ Google مسألة مخالفة سياستها على محمل الجد وتردّ على هذه المخالفات بالطُرق المناسبة. للمزيد من المعلومات حول إرشادات المنتدى المتعلّقة بفعاليات Google وسياسة مكافحة التحرّش، يُرجى الانتقال إلى &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;هذا الرابط&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">سيتمّ بثّ العرضين التقديميين الرئيسيّين وكلّ \"الجلسات\" بشكل مباشر على الصفحة الرئيسية لموقع الويب الخاص بالفعالية طوال أيام المؤتمر الثلاثة. في حال انهماكك في العمل أو إقامتك في بلد يتّبع توقيتًا زمنيًا مختلفًا، يمكنك مشاهدة تسجيلات الجلسات في وقت لاحق على &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;قناة Google Developers على YouTube‏&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">نعم. يستضيف مطوّرو البرامج من حول العالم كلّ عام &lt;a href=\"https://events.google.com/io/extended\"&gt;فعاليات Google I/O Extended‏&lt;/a&gt;. وخلال هذه الفعاليات، تستطيع الجهات المنظِّمة بث المحتوى مباشرةً واستضافة جلساتهم الخاصة من ضمنها الهاكاثونات والدروس التطبيقية حول الترميز والعروض التوضيحية وغيرها.&lt;br&gt; وإذا أردت المشاركة في فعالية I/O Extended كمضيف هذا العام، يمكنك اتّباع هذه الخطوات للبدء في ذلك:&lt;br&gt;&lt;br&gt;  يُرجى قراءة &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;دليل الجهات المنظِّمة&lt;/a&gt; للحصول على نصائح واقتراحات حول كيفية استضافة فعالية ناجحة.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;سجِّل&lt;/a&gt; الفعالية العامة التي تريدها على موقع الويب الخاص بمؤتمر I/O لتصل إلى جمهور أكبر.&lt;br&gt;&lt;br&gt; استخدِم علامة التصنيف ‎#io19extended الرسمية في كلّ المشارَكات المتعلّقة بفعالية I/O Extended على وسائل التواصل الاجتماعي لتسهيل العثور عليها&lt;br&gt;&lt;br&gt; ملاحظة: يمكن لمستضيفي I/O Extended طلب حذف معلوماتهم الشخصية و/أو بيانات الفعالية بعد انتهائها عبر توجيه رسالة إلكترونية إلى العنوان io19@google.com.&lt;‏br&gt; إذا أردت حضور فعالية I/O Extended ببساطة، تصفَّح &lt;a href=\"https://events.google.com/io/extended\"&gt;الخريطة&lt;/a&gt; لإيجاد فعالية تقع بالقرب منك والردّ على الدعوة.&lt;br&gt; إذا كان لديك أسئلة حول برنامج I/O Extended، يمكنك التواصل معنا على البريد الإلكتروني io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">عرض الجلسات</string>\n    <string name=\"wifi_install_success\">تمّ حفظ شبكة Wi-Fi.</string>\n    <string name=\"wifi_install_clipboard_message\">تعذّر حفظ تفاصيل شبكة Wi-Fi.‏\\nوتمّ حفظ كلمة المرور في الحافظة بدلاً من ذلك.</string>\n    <string name=\"event_sessions_title\">الجلسات</string>\n    <string name=\"event_sandbox_title\">وَضْع الحماية</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">ساعات العمل وتقييمات التطبيق</string>\n    <string name=\"event_afterhours_title\">أحداث ما بعد المؤتمر</string>\n    <string name=\"event_meals_title\">الوجبات</string>\n    <string name=\"event_sessions_description\">ابتداءً من شهر نيسان (أبريل)، سيتمكّن الضيوف الحاضرون من حجر مقاعد \"للجلسات\" قبل الفعالية على موقع الويب الخاص بمؤتمر I/O وعبر تطبيق المؤتمر المتوافق مع الأجهزة الجوّالة (ملاحظة: لن يتمكّن الضيوف من حجز عدد من المقاعد في \"الجلسات\" لأنّها ستكون متاحة فقط وفقًا لمبدأ الأولوية حسب الأسبقية). وتتوفّر المقاعد في الدروس التطبيقية حول الترميز ومراجعات التطبيقات وساعات العمل وفقًا للمبدأ نفسه.</string>\n    <string name=\"event_sandbox_description\">مساحات مخصّصة للاستكشاف والتعلّم واللعب باستخدام أحدث المنتجات والمنصّات عبر عروض توضيحية تفاعلية وأجهزة فعلية وغيرها.</string>\n    <string name=\"event_codelabs_description\">يمكنك تجربة \"الأكشاك الجاهزة للترميز\" للاطّلاع على مزيد من المعلومات عن آخر تقنيات Google المدهشة عبر برامج تعليمية تتحكّم بمستوى سرعتها، أو يمكنك جلب جهازك وإنجاز عملك في المنزل. وسيكون فريق عمل Google متوفّرًا لتقديم النصائح المفيدة والإرشادات إذا واجهت أيّ صعوبات.</string>\n    <string name=\"event_officehours_description\">يمكنك أن تتعرّف على خبراء Google شخصيًّا ضمن ساعات العمل ليجيبوا عن أسئلتك التقنية. وتمكنّك تقييمات التطبيق من الحصول على نصائح بشأن مشاريعك المحدّدة لأيّ تطبيق.</string>\n    <string name=\"event_afterhours_description\">بعد انتهاء \"الجلسات\"، يُرجى البقاء في شورلاين لِلَيْلَتَيْن يتمّ فيهما تقديم الطعام والشراب والتسلية. سنقيم حفلة في الليلة الأولى في مساحة Sandbox، وفي الليلة الثانية سنقيم حفلة حصريّة في المدرّج.</string>\n    <string name=\"event_meals_description\">سيتمّ تقديم وجبات الفطور والغداء والوجبات الخفيفة للضيوف مجانًا طوال أيام المؤتمر الثلاثة. وسيتمّ أيضًا تقديم وجبة العشاء في اليومَين الأول والثاني خلال \"فعاليات ما بعد المؤتمر\".</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">التطبيقات ذات الصلة</string>\n    <string name=\"event_types_header\">أنواع الأحداث</string>\n    <string name=\"settings_time_zone_label\">تجري الأحداث بتوقيت المحيط الهادئ (UTC-8).</string>\n    <string name=\"settings_enable_notifications\">تفعيل الإشعارات</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">إرسال إحصاءات الاستخدام المجهولة المصدر</string>\n    <string name=\"settings_tos\">بنود الخدمة</string>\n    <string name=\"settings_privacy_policy\">سياسة الخصوصية</string>\n    <string name=\"settings_oss_licenses\">تراخيص البرامج المفتوحة المصدر</string>\n    <string name=\"settings_theme_title\">اختيار تصميم</string>\n    <string name=\"settings_theme_system\">إعداد تلقائي للنظام</string>\n    <string name=\"settings_theme_light\">فاتح</string>\n    <string name=\"settings_theme_dark\">غامق</string>\n    <string name=\"settings_theme_battery\">الضبط حسب ميزة \"توفير شحن البطارية\"</string>\n    <string name=\"built_with_material_components\">تمّ إنشاء التطبيق عبر Material Components.</string>\n    <string name=\"wifi_network_and_password\">الشبكة: %1$s\\nكلمة المرور: %2$s</string>\n    <string name=\"join_network\">الانضمام إلى الشبكة</string>\n    <string name=\"assistant_app_description\">ما عليك سوى قول \"Hey Google, talk to Google I/O 19\".</string>\n    <string name=\"assistant_app_description2\">ما عليك سوى قول \"Hey Google, talk to Google I/O 19\".</string>\n    <string name=\"speaker_link_website\">موقع الويب</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">Github</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">الفعاليات</string>\n    <string name=\"no_network_connection\">لا يتوفّر اتصال بالإنترنت.</string>\n    <string name=\"navigate_up\">الانتقال إلى الأعلى</string>\n    <string name=\"no_network_description\">لاستخدام ميزة Explore I/O، يُرجى محاولة:\\n\\n - إيقاف \"وضع الطائرة\"\\n\\n - تفعيل بيانات الجوّال أو  شبكة Wi-Fi‏\\n\\n - التحقّق من الإشارة في منطقتك.</string>\n    <string name=\"phone_does_not_support_arcore_title\">لا يمكنك استخدام ARCore على هاتفك.</string>\n    <string name=\"phone_does_not_support_arcore_message\">يُرجى استخدام جهاز آخر أو استعارة جهاز من صديق.</string>\n    <string name=\"codelabs_information\">يمكنك تعلُّم تقنيات Google الأخيرة والرائعة عبر برامج تعليمية يمكنك التحكّم بوتيرتها في أكشاك الترميز أو يمكنك إحضار جهازك وإنجاز عملك في المنزل. تفتح هذه الأكشاك أبوابها يوميًا ما عدا خلال أوّل عرض تقديمي رئيسي.</string>\n    <string name=\"codelabs_building\">مبنى تقديم الدروس التطبيقية حول الترميز</string>\n    <string name=\"codelabs_website\">موقع الويب لدروس تطبيقية حول الترميز</string>\n    <string name=\"codelab_duration\">المدة: %1$d دقيقة</string>\n    <string name=\"start_codelab\">بدء الدرس التطبيقي حول الترميز</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Planen</string>\n    <string name=\"title_home\">Startseite</string>\n    <string name=\"title_map\">Karte</string>\n    <string name=\"title_explore_io\">I/O erkunden</string>\n    <string name=\"title_info\">Info</string>\n    <string name=\"filters\">Filter</string>\n    <string name=\"category_heading_tracks\">Themen</string>\n    <string name=\"category_heading_types\">Art der Veranstaltung</string>\n    <string name=\"reset\">Zurücksetzen</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d Veranstaltung</item>\n        <item quantity=\"other\">%1$d Veranstaltungen</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Ihre markierten und reservierten Veranstaltungen</string>\n    <string name=\"starred_and_reserved_short\">Meine Veranstaltungen</string>\n    <string name=\"search_schedule_hint\">Zeitplan durchsuchen</string>\n    <string name=\"search_schedule_no_results\">Keine Ergebnisse gefunden</string>\n    <string name=\"agenda\">Terminübersicht</string>\n    <string name=\"event_starred\">Veranstaltung wurde Ihren markierten Elementen hinzugefügt</string>\n    <string name=\"event_unstarred\">Veranstaltung aus markierten Elementen entfernt</string>\n    <string name=\"event_star_error\">Fehler beim Hinzufügen der Veranstaltung zu markierten Elementen</string>\n    <string name=\"reservation_error\">Fehler beim Ändern der Reservierung. Warten Sie, bis vorangegangene Anfragen abgeschlossen sind oder versuchen Sie es später noch einmal.</string>\n    <string name=\"reservation_request_succeeded\">Reservierung angefragt.</string>\n    <string name=\"reservation_cancel_succeeded\">Reservierung storniert: \"&lt;b&gt;%s&lt;/b&gt;.\"</string>\n    <string name=\"reservation_new\">Ihr Platz für \"&lt;b&gt;%s&lt;/b&gt;\" ist reserviert.</string>\n    <string name=\"reservation_replaced\">Veranstaltung getauscht.</string>\n    <string name=\"waitlist_new\">Sie stehen auf der Warteliste.</string>\n    <string name=\"waitlist_cancel_succeeded\">Von Warteliste entfernt.</string>\n    <string name=\"got_it\">Ok</string>\n    <string name=\"dont_show\">Nicht anzeigen</string>\n    <string name=\"reservation_denied_cutoff\">Reservierung abgelehnt: zu kurz vor Startzeit.</string>\n    <string name=\"reservation_denied_clash\">Reservierung abgelehnt: Überschneidung mit anderer Reservierung.</string>\n    <string name=\"reservation_denied_unknown\">Reservierung abgelehnt: unbekannter Fehler.</string>\n    <string name=\"cancellation_denied_cutoff\">Stornierung abgelehnt: zu kurz vor Startzeit.</string>\n    <string name=\"cancellation_denied_unknown\">Stornierung abgelehnt: unbekannter Fehler.</string>\n    <string name=\"schedule_filters_empty\">Keine Termine gefunden</string>\n    <string name=\"reservation_reservable\">Platz reservieren</string>\n    <string name=\"reservation_reserved\">Reserviert</string>\n    <string name=\"reservation_waitlisted\">Auf der Warteliste</string>\n    <string name=\"reservation_waitlist_available\">Auf Warteliste setzen</string>\n    <string name=\"reservation_disabled\">Keine Reservierungen verfügbar</string>\n    <string name=\"reservation_pending\">Reservierung ausstehend</string>\n    <string name=\"schedule_hint_title\">Terminplan anpassen</string>\n    <string name=\"schedule_hint_star_event\">Zu markierten Veranstaltungen hinzufügen</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Platz für Sitzung reservieren</string>\n    <string name=\"rate_session\">Sitzung bewerten</string>\n    <string name=\"menu_item_session_location\">Sitzungsstandort</string>\n    <string name=\"menu_item_session_star\">Sitzung markieren</string>\n    <string name=\"menu_item_calendar\">Zum Kalender hinzufügen</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Referenten</string>\n    <string name=\"session_detail_related_header\">Ähnliche Veranstaltungen</string>\n    <string name=\"feedback_submit\">Senden</string>\n    <string name=\"feedback_thank_you\">Vielen Dank für Ihr Feedback!</string>\n    <string name=\"feedback_q1_text\">Wie würden Sie das Niveau der Sitzung allgemein bewerten?</string>\n    <string name=\"feedback_q2_text\">Wie würden Sie die Inhalte der Sitzung anhand Ihrer Erwartungen und der Beschreibung der Sitzung bewerten?</string>\n    <string name=\"feedback_q3_text\">Wie nützlich war die Sitzung für Ihre Projekte?</string>\n    <string name=\"feedback_q4_text\">Wie nützlich war die Sitzung für Ihre Projekte?</string>\n    <string name=\"feedback_q1_label_start\">Sehr grundlegend</string>\n    <string name=\"feedback_q2_label_start\">Uninteressant</string>\n    <string name=\"feedback_q3_label_start\">Schlecht</string>\n    <string name=\"feedback_q4_label_start\">Nicht besonders</string>\n    <string name=\"feedback_q1_label_end\">Ausgezeichnet</string>\n    <string name=\"feedback_q2_label_end\">Ausgezeichnet</string>\n    <string name=\"feedback_q3_label_end\">Äußerst relevant</string>\n    <string name=\"feedback_q4_label_end\">Äußerst</string>\n    <string name=\"a11y_show_navigation\">Navigationsmenü einblenden</string>\n    <string name=\"a11y_collapse_filters_sheet\">Filtertabelle minimieren</string>\n    <string name=\"a11y_clear_tag_filters\">Filter löschen</string>\n    <string name=\"a11y_filter_applied\">%1s Filter angewendet</string>\n    <string name=\"a11y_filter_not_applied\">%1s Filter nicht angewendet</string>\n    <string name=\"a11y_reservation_available\">Platz für Veranstaltung reservieren</string>\n    <string name=\"a11y_reservation_reserved\">Platz für Veranstaltung reserviert</string>\n    <string name=\"a11y_reservation_disabled\">Reservierung nicht verfügbar</string>\n    <string name=\"a11y_reservation_wait_list_available\">Auf Warteliste für Veranstaltung setzen</string>\n    <string name=\"a11y_reservation_wait_listed\">Auf Warteliste für Veranstaltung gesetzt</string>\n    <string name=\"a11y_reservation_pending\">Reservierung ausstehend</string>\n    <string name=\"a11y_starred\">Veranstaltung als Lesezeichen gespeichert</string>\n    <string name=\"a11y_unstarred\">Veranstaltung nicht als Lesezeichen gespeichert</string>\n    <string name=\"a11y_star\">Markieren</string>\n    <string name=\"a11y_play\">Video abspielen</string>\n    <string name=\"a11y_select_map_mode\">Kartenmodus auswählen</string>\n    <string name=\"a11y_search_schedule\">Zeitplan suchen</string>\n    <string name=\"welcome\">Willkommen!</string>\n    <string name=\"a11y_signed_in_content_description\">Angemeldet als %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Zum Anmelden tippen.</string>\n    <string name=\"dialog_sign_in_content\">Melden Sie sich an, um Veranstaltungen zu speichern, Plätze zu reservieren und Sitzungen zu bewerten (als Teilnehmer). Die Aktionen mit Ihrem Konto werden in der App und auf der Website synchronisiert.</string>\n    <string name=\"sign_in\">Anmelden</string>\n    <string name=\"firebase_auth_no_network_connection\">Keine Internetverbindung</string>\n    <string name=\"firebase_auth_unknown_error\">Unbekannter Fehler</string>\n    <string name=\"dialog_sign_out_content\">Alle gespeicherten Veranstaltungen, Platzreservierungen und Sitzungsbewertungen (von Teilnehmern) werden in Ihrem Konto synchronisiert.</string>\n    <string name=\"sign_out\">Abmelden</string>\n    <string name=\"manage_google_account\">Hier können Sie Ihr Google-Konto verwalten</string>\n    <string name=\"remove_reservation_title\">Reservierung entfernen?</string>\n    <string name=\"remove_reservation_content\">Sie sind dabei, Ihren Platz für \"%1$s\" zu stornieren. Wenn Sie Ihre Reservierung stornieren, aber kurzfristig doch noch teilnehmen möchten: Bei allen Sitzungen wird eine bestimmte Anzahl von Plätzen direkt vor Ort an die ersten eintreffenden Interessenten vergeben.</string>\n    <string name=\"cancel\">Abbrechen</string>\n    <string name=\"remove\">Entfernen</string>\n    <string name=\"swap_reservation_title\">Reservierung tauschen?</string>\n    <string name=\"swap_reservation_content\">Sie haben bereits eine Reservierung bzw. stehen auf der Warteliste für \"%1$s\". Es ist nur eine Reservierung pro Zeitblock zulässig. Möchten Sie den Tausch gegen \"%2$s\" vornehmen?</string>\n    <string name=\"swap\">Tauschen</string>\n    <string name=\"notifications_preference_dialog_title\">I/O-Benachrichtigungen</string>\n    <string name=\"notifications_preference_dialog_content\">Möchten Sie Benachrichtigungen zu I/O erhalten? Dann senden wir Ihnen Informationen zu Anfangszeiten von Sitzungen, Rahmenprogramm, Sitzungsaufzeichnungen und vieles mehr. Diese Einstellung können Sie unter \"Info &gt; Settings\" (Informationen &gt; Einstellungen) jederzeit ändern.</string>\n    <string name=\"no\">Nein</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"feed_not_available\">Keine Ankündigungen gefunden.</string>\n    <string name=\"feed_loading_error\">Feed konnte nicht geladen werden. Versuchen Sie es später noch einmal.</string>\n    <string name=\"feed_announcement_title\">Ankündigungen</string>\n    <string name=\"feed_upcoming_events\">Veranstaltungstipps</string>\n    <string name=\"feed_saved_events\">Gespeicherte Veranstaltungen</string>\n    <string name=\"feed_no_saved_events\">Keine gespeicherten Termine</string>\n    <string name=\"feed_view_all_events\">Alle Termine anzeigen</string>\n    <string name=\"feed_view_your_schedule\">Terminübersicht ansehen</string>\n    <string name=\"feed_watch_live_stream\">Livestream ansehen</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s Tag</item>\n        <item quantity=\"other\">%s Tage</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s  Stunde</item>\n        <item quantity=\"other\">%s Stunden</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s Minute</item>\n        <item quantity=\"other\">%s Minuten</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s Sekunde</item>\n        <item quantity=\"other\">%s Sekunden</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Sitzung teilen</string>\n    <string name=\"share_text_session_detail\">%1$s bei #io19 %2$s ansehen</string>\n    <string name=\"intent_chooser_session_detail\">Teilen</string>\n    <string name=\"map_variant_after_dark\">After Dark</string>\n    <string name=\"map_variant_concert\">Konzert</string>\n    <string name=\"map_variant_daytime\">Tagsüber</string>\n    <string name=\"enable_my_location\">\"Mein Standort\" aktivieren</string>\n    <string name=\"my_location_rationale\">Die App benötigt die Berechtigung zur Standortermittlung, um Ihren Standort auf der Karte anzuzeigen.</string>\n    <string name=\"onboarding_get_started\">Jetzt starten</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Willkommen bei Google I/O</string>\n    <string name=\"onboarding_date_location\">7.–9. Mai 2019\\nMountain View, CA, USA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Bald ist Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Zusammenfassung der I/O 19 ansehen und mit #io19 in den sozialen Netzwerken mehr erfahren</string>\n    <string name=\"onboarding_signin\">Melden Sie sich an, um I/O-Benachrichtigungen zu erhalten und als Teilnehmer Sitzplätze für Tagungen zu reservieren.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">Sitzung beginnt in %1$s Minute</item>\n        <item quantity=\"other\">Sitzung beginnt in %1$s Minuten</item>\n    </plurals>\n    <string name=\"expanded\">Maximiert</string>\n    <string name=\"collapsed\">Minimiert</string>\n    <string name=\"event_title\">Veranstaltung</string>\n    <string name=\"travel_title\">Anreise</string>\n    <string name=\"faq_title\">FAQ</string>\n    <string name=\"settings_title\">Einstellungen</string>\n    <string name=\"about_title\">Info</string>\n    <string name=\"travel_what_to_bring_title\">Was Sie für das Event mitbringen sollten</string>\n    <string name=\"travel_hotels_title\">Hotels</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Mountain View erreichen</string>\n    <string name=\"travel_getting_to_shoreline_title\">Mountain View erreichen</string>\n    <string name=\"travel_shuttle_service_title\">Shuttleservice</string>\n    <string name=\"travel_off_site_parking_title\">Parkplätze außerhalb des Geländes</string>\n    <string name=\"travel_for_public_transportation_title\">Öffentliche Verkehrsmittel</string>\n    <string name=\"travel_biking_title\">Mit dem Fahrrad</string>\n    <string name=\"travel_ridesharing_title\">Mitfahrportale</string>\n    <string name=\"travel_airport_transfers_title\">Flughafentransfer</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O ist ein Festival im Freien. Allein das macht I/O schon zu etwas ganz Besonderem. Das bedeutet aber auch, dass einige Dinge zu beachten sind. Die Tagungen finden in klimatisierten Zelten statt, aber Sonnenschutzmittel, Sonnenbrillen und zusätzliche Kleidung für die kälteren Abende werden empfohlen. I/O ist ein legeres Event. Beachte Sie das, wenn Sie überlegen, was Sie anziehen sollen.</string>\n    <string name=\"travel_hotels_description\">Wir haben in vielen örtlichen Hotels Zimmer reserviert. Die Liste der Hotels und die Verfügbarkeit der Zimmer werden regelmäßig aktualisiert. Bitte benutzen Sie die nachstehende Karte, um das für Sie beste Hotel zu finden. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Hotelkarte&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Hier sind die drei großen Flughäfen in der Bay Area mit internationalem Flugverkehr:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Francisco International Airport (SFO)&lt;/a&gt; ~24 Meilen&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Oakland International Airport (OAK)&lt;/a&gt; ~32 Meilen&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Jose International Airport (SJC)&lt;/a&gt; ~12 Meilen</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 hat sich verpflichtet, ein „Event ohne Parkplätze*“ zu sein, um Verkehrsstaus und CO2-Emissionen zu reduzieren. Diese Entscheidung wurde sorgfältig erwogen und wir bieten Ihnen viele kostenlose Optionen an, um zur Veranstaltung zu gelangen, ohne ein Fahrzeug zu benötigen.&lt;br&gt;&lt;br&gt;Je näher die Veranstaltung rückt, desto mehr Informationen erhalten Sie.&lt;br&gt;&lt;br&gt;*Behindertenparkplätze stehen zur Verfügung.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 hat sich verpflichtet, ein „Event ohne Parkplätze*“ zu sein, um Verkehrsstaus und CO2-Emissionen zu reduzieren. Diese Entscheidung wurde sorgfältig erwogen und wir bieten Ihnen viele kostenlose Optionen an, um zur Veranstaltung zu gelangen, ohne ein Fahrzeug zu benötigen.&lt;br&gt;&lt;br&gt;Je näher die Veranstaltung rückt, desto mehr Informationen erhalten Sie.&lt;br&gt;&lt;br&gt;*Behindertenparkplätze stehen zur Verfügung.</string>\n    <string name=\"travel_off_site_parking_description\">Kostenlose Parkplätze befinden sich im &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;. Shuttles von Avaya werden zu/von Google I/O zur Verfügung gestellt.&lt;br&gt;&lt;br&gt; Geben Sie bitte auf Ihrem Registrierungsformular an, ob Sie besondere Unterstützung benötigen. Das Planungsteam wird sich dann mit Ihnen in Verbindung setzen.</string>\n    <string name=\"travel_for_public_transportation_description\">Wir bieten Ihnen Prepaid-Tickets für den öffentlichen Nahverkehr an, die während der Voranmeldung zur Abholung zur Verfügung stehen. Die öffentlichen Verkehrsmittel in die Umgebung erreichen Sie über:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Regionales Eisenbahnsystem&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Stadtbahn, die die South Bay bedient&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Rapid Transit in der Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Regionalbahnsystem&lt;br&gt;&lt;br&gt; Öffentliche Verkehrsmittel führen nicht direkt zu Google I/O. Weitere Informationen zu den Haltestellen der Event-Shuttles zur Google I/O folgen.</string>\n    <string name=\"travel_biking_description\">Am Shoreline Amphitheatre stehen innerhalb von Parkplatz A kostenlose Fahrradparkplätze zur Verfügung. Die Silicon Valley Bicycle Coalition bietet sicheres Fahrradparken mit Valet-Service ab 7:00 Uhr morgens bis zum Veranstaltungsende am jeweiligen Tag. Es gibt zwei Wege zum Shoreline Amphitheatre, die sich gut für Radfahrer eignen, den Stevens Creek Trail und den Permanente Creek Trail.</string>\n    <string name=\"travel_ridesharing_description\">Am letzten Tag der Veranstaltung wird ein Flughafentransfer vom Google I/O zum SFO und SJC angeboten. An anderen Tagen werden KEINE Flughafentransfers angeboten.</string>\n    <string name=\"travel_airport_transfers_description\">Am letzten Tag der Veranstaltung wird ein Flughafentransfer vom Google I/O zum SFO und SJC angeboten. An anderen Tagen werden KEINE Flughafentransfers angeboten.</string>\n    <string name=\"faq_when_and_where_title\">Wann und wo findet die Google I/O 2019 statt?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Wie kann ich über Google I/O auf dem Laufenden bleiben?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Finden alle Veranstaltungen in englischer Sprache statt?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Kann ich Tagungen vor der Veranstaltung reservieren?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Wie kommt man am besten zum Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Wo und wann kann ich mein Ansteckschild abholen?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Ich möchte bei der Keynote-Veranstaltung in der ersten Reihe sitzen. Was kann ich tun?</string>\n    <string name=\"faq_what_should_i_wear_title\">Gibt es einen Dresscode?</string>\n    <string name=\"faq_onsite_food_options_title\">Ich esse gern etwas zwischendurch. Welche Möglichkeiten gibt es vor Ort dafür?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Wenn ich am Veranstaltungsort etwas verliere, wo finde ich es wieder?</string>\n    <string name=\"faq_after_dark_program_title\">Die After Dark-Programmpunkte klingen interessant. Sollte ich hingehen?</string>\n    <string name=\"faq_accessibility_needs_title\">Ist die Veranstaltung barrierefrei?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Wie unterstützen Sie werdende Mütter und Eltern, die am I/O teilnehmen?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google Community-Richtlinien für Veranstaltungen und Richtlinie gegen Belästigung</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Werden die Tagungen live übertragen? Was passiert, wenn ich die Veranstaltung nicht in Echtzeit verfolgen kann?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Ich möchte I/O mit meiner Community feiern.  Haben Sie Ideen dazu?</string>\n    <string name=\"faq_when_and_where_description\">Besuchen Sie die &lt;a href=\"https://events.google.com/io/\"&gt;Website von Google I/O 2019&lt;/a&gt; und den &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers Blog&lt;/a&gt;, um immer die neuesten Informationen zu Veranstaltungen, Referenten und allgemeinen Aktivitäten zu erhalten. Folgen Sie uns außerdem auf &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; und &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Über den offiziellen Hashtag &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; können Sie sich in sozialen Netzwerken mit anderen über die Google I/O 2019 austauschen. Außerdem erhalten alle registrierten Teilnehmer wichtige Informationen und Check-In-Hinweise vorab per E-Mail.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Besuchen Sie die &lt;a href=\"https://events.google.com/io/\"&gt;Website von Google I/O 2019&lt;/a&gt; und den &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers Blog&lt;/a&gt;, um immer die neuesten Informationen zu Veranstaltungen, Referenten und allgemeinen Aktivitäten zu erhalten. Folgen Sie uns außerdem auf &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; und &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Über den offiziellen Hashtag &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; können Sie sich in sozialen Netzwerken mit anderen über die Google I/O 2019 austauschen. Außerdem erhalten alle registrierten Teilnehmer wichtige Informationen und Check-In-Hinweise vorab per E-Mail.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Ja. So kann unsere Zielgruppe weltweit die Veranstaltungen verfolgen.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Ab April können Besucher vor Ort Sitzplätze für Tagungen vor der Veranstaltung auf der I/O-Website und auch über die I/O-Mobile App reservieren (Hinweis: Ein Teil der Tagungssitzplätze ist von der Reservierung ausgenommen. Diese werden nach der Reihenfolge des Eintreffens vergeben). Auch die Plätze für Codelabs, App Reviews und Office Hours werden nach der Reihenfolge des Eintreffens vergeben.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Im Abschnitt \"Travel\" (Reisen) finden Sie alle wichtigen Reisetipps, einschließlich Informationen zum Shuttle, Wegbeschreibungen fürs Auto und Fahrrad, Tipps für Mitfahrgelegenheiten und vieles mehr.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Wir geben die Ansteckschilder schon ab Montag, dem 06. Mai im Shoreline Amphitheatre aus, um den Check-in zu beschleunigen. Damit wir Ihnen Ihr Ansteckschild für die Google I/O ausstellen können, beachten Sie bitte die folgenden Punkte:&lt;br&gt; – Sie müssen einen Lichtbildausweis vorlegen. Dies kann ein Führerschein, Reisepass oder ein vergleichbares, amtliches Ausweisdokument sein. Wenn Sie sich nicht korrekt ausweisen können, erhalten Sie kein Ansteckschild und können nicht an der Konferenz teilnehmen. Der Name auf dem Ausweis muss exakt mit dem bei der Registrierung angegebenen Namen übereinstimmen. Als wissenschaftlicher Teilnehmer müssen Sie außerdem einen Nachweis darüber erbringen, dass Sie die Voraussetzungen erfüllen.&lt;br&gt; – Scannen Sie den QR-Code, den Sie per E-Mail für die Registrierung erhalten haben. Sie können diesen mit Ihrem Smartphone scannen, die E-Mail muss dazu nicht ausgedruckt werden. #Umweltschutz &lt;br&gt;&lt;br&gt;Ihr Ansteckschild ist nicht übertragbar, es darf also nicht an andere Personen weitergegeben oder gemeinsam mit anderen Personen genutzt werden. Wichtig dabei ist, dass die Ansteckschilder für die Google I/O nicht ersetzt werden können. Verlieren Sie Ihres also nicht, sonst werden Sie nicht wieder in den Konferenzbereich vorgelassen. Sie müssen Ihr Ansteckschild während der gesamten Google I/O tragen; dies gilt auch für die einzelnen Tagungen, Sandboxes und \"After Hours\". Auf Verlangen der Sicherheitskräfte müssen Sie Ihr Ansteckschild vorzeigen und sich ggf. zusätzlich ausweisen. Die Ansteckschilder für die Google I/O können Ihren Namen, den Namen Ihres Unternehmens bzw. Ihrer Organisation (falls angegeben) und ein Foto enthalten.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Bei den Keynotes ist zwar für jeden Teilnehmer ein Sitzplatz garantiert, aber die besten Plätze werden beim Abholen der Ansteckschilder am 06. Mai ab 7.00 Uhr nach der Reihenfolge des Eintreffens vergeben. Seien Sie also frühzeitig da.</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O ist eine Open-Air-Veranstaltung für Entwickler. Kleiden Sie sich leger und bequem, einen bestimmten Dresscode gibt es nicht. In der Bay Area kann es tagsüber sehr warm, abends aber kühl werden, denken Sie bei der Auswahl der Kleidung daran.</string>\n    <string name=\"faq_onsite_food_options_description\">Für das leibliche Wohl ist bestens gesorgt.  An allen drei Konferenztagen erhalten die Teilnehmer ein kostenloses Frühstück, Mittagessen und Snacks. Am ersten und zweiten Tag wird auch ein Abendessen während der After-Hour-Veranstaltungen angeboten.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Wir helfen Ihnen. Das Fundbüro befindet sich während der Veranstaltungszeiten am Konferenzinformationsschalter. Alle Gegenstände, die bis zum nächsten Tag nicht abgeholt wurden, werden dem Conference Security Office übergeben. Ein wichtiger Hinweis: Die Ansteckschilder für die Google I/O können NICHT ersetzt werden. Verlieren Sie Ihres also nicht, sonst werden Sie nicht wieder in den Konferenzbereich vorgelassen.</string>\n    <string name=\"faq_after_dark_program_description\">Das sind zwei Nächte, die Sie nicht verpassen sollten. Die Teilnehmer können am 08. Mai abends Musik, Spiele und mehr genießen. Am 09. Mai findet im Amphitheater ein exklusives Konzert statt. An beiden Abenden sind Speisen und Getränke erhältlich (alkoholische Getränke ab 21 Jahren). Beide After-Hour-Veranstaltungen finden im Shoreline Amphitheatre statt. Für den Eintritt ist Ihr Teilnehmerausweis erforderlich.</string>\n    <string name=\"faq_accessibility_needs_description\">Bei den Behindertenparkplätzen stehen auch Parkplätze für werdende Mütter zur Verfügung.&lt;br&gt; Stillende Mütter können mit ihrem Kind an der Konferenz teilnehmen. Am 07. und 08. Mai sind von 08:00 bis 20:00 Uhr und am 09. Mai von 08:00 bis 16:00 Uhr vier Wickelräume vorhanden. Anmeldeunterlagen werden vor den Zimmern der Mütter zur Verfügung stehen. Die Verwendung wird nach der Reihenfolge des Eintreffens vergeben. Weitere Informationen erhalten Sie am Informationsstand.&lt;br&gt;&lt;br&gt; Eltern, die Interesse an der Kinderbetreuung haben und die sich über unser Anmeldeformular angemeldet haben, erhalten eine Rückerstattung von 100 $ pro Tag (bis zu 300 $ insgesamt). Auch diese Plätze werden nach der Reihenfolge des Eintreffens vergeben. Unsere Rückerstattung der Kinderbetreuung wird von einem Drittanbieter angeboten. Wenn Ihr Antrag auf Kinderbetreuung vor Beginn der Konferenz von uns per E-Mail genehmigt und Ihre Anwesenheit vor Ort bestätigt wird, wird sich unser Anbieter innerhalb von 7 Werktagen nach der Google I/O mit den nächsten Schritten bei Ihnen melden. Dieser wird dann alle Auszahlungen für unsere Kinderbetreuungszahlungen leisten.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Bei den Behindertenparkplätzen stehen auch Parkplätze für werdende Mütter zur Verfügung.&lt;br&gt; Stillende Mütter können mit ihrem Kind an der Konferenz teilnehmen. Am 07. und 08. Mai sind von 08:00 bis 20:00 Uhr und am 09. Mai von 08:00 bis 16:00 Uhr vier Wickelräume vorhanden. Anmeldeunterlagen werden vor den Zimmern der Mütter zur Verfügung stehen. Die Verwendung wird nach der Reihenfolge des Eintreffens vergeben. Weitere Informationen erhalten Sie am Informationsstand.&lt;br&gt;&lt;br&gt; Eltern, die Interesse an der Kinderbetreuung haben und die sich über unser Anmeldeformular angemeldet haben, erhalten eine Rückerstattung von 100 $ pro Tag (bis zu 300 $ insgesamt). Auch diese Plätze werden nach der Reihenfolge des Eintreffens vergeben. Unsere Rückerstattung der Kinderbetreuung wird von einem Drittanbieter angeboten. Wenn Ihr Antrag auf Kinderbetreuung vor Beginn der Konferenz von uns per E-Mail genehmigt und Ihre Anwesenheit vor Ort bestätigt wird, wird sich unser Anbieter innerhalb von 7 Werktagen nach der Google I/O mit den nächsten Schritten bei Ihnen melden. Dieser wird dann alle Auszahlungen für unsere Kinderbetreuungszahlungen leisten.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google legt großen Wert darauf, ein belästigungsfreies und inklusives Veranstaltungserlebnis für alle zu bieten, unabhängig von Geschlechtsidentität und -ausdruck, sexueller Orientierung, Behinderungen, Neurodiversität, körperlicher Erscheinung, Körpergröße, ethnischer Herkunft, Nationalität, Rasse, Alter, Religion oder einer anderen geschützten Eigenschaft. Um die Veranstaltung so inklusiv wie möglich zu gestalten, werden geschlechtsneutrale Toiletten im gesamten Veranstaltungsort angeboten.&lt;br&gt;&lt;br&gt; Wir dulden keine Belästigung von Teilnehmern der Veranstaltung in irgendeiner Form.&lt;br&gt; Google nimmt Verstöße gegen die Richtlinien sehr ernst und wird entsprechend reagieren. Weitere Informationen zu den Google Community-Richtlinien und den Richtlinien zur Bekämpfung von Belästigungen &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;finden Sie hier&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Die beiden Keynotes und alle Tagungen werden während der drei Festivaltage auf der Homepage der Event-Website live übertragen. Wenn Sie zu dieser Zeit arbeiten müssen oder aus einem anderen Grund keine Zeit haben, können Sie sich später auf dem &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers YouTube-Kanal&lt;/a&gt; die Aufzeichnungen der Tagungen ansehen.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Ja! Jedes Jahr veranstalten Entwickler auf der ganzen Welt &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended-Events&lt;/a&gt;. Während dieser Veranstaltungen können Veranstalter diese live übertragen und ihre eigenen Tagungen veranstalten, darunter Hackathons, Codelabs, Demos und vieles mehr.&lt;br&gt; Wenn Sie dieses Jahr als Gastgeber für I/O Extended dabei sind, sollten Sie zuerst die folgenden Schritte ausführen:&lt;br&gt;&lt;br&gt; Lesen Sie sich die &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Organisator-Anleitung&lt;/a&gt; durch, um Tipps und Vorschläge für eine erfolgreiche Veranstaltung zu erhalten.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"Registrieren&lt;/a&gt; Sie sich für Ihre öffentliche Veranstaltung auf der I/O-Website, um die Sichtbarkeit zu erhöhen.&lt;br&gt;&lt;br&gt; Verwenden Sie den offiziellen Hashtag #io19extended für all Ihre Posts in sozialen Netzwerken im Zusammenhang mit I/O Extended, um leichter gefunden zu werden.&lt;br&gt;&lt;br&gt; Hinweis: Veranstalter von I/O Extended können nach Ende der Veranstaltung das Löschen ihrer persönlichen Daten und/oder Veranstaltungsdaten anfordern. Schicken Sie dazu eine E-Mail an io19@google.com.&lt;br&gt; Wenn Sie nur an einer I/O Extended-Veranstaltung teilnehmen möchten, suchen Sie auf &lt;a href=\"https://events.google.com/io/extended\"&gt;unserer Karte&lt;/a&gt; eine heraus, die in Ihrer Nähe stattfindet, und melden Sie sich an.&lt;br&gt; Wenn Sie Fragen zum Programm von I/O Extended haben, wenden Sie sich an io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Sitzungen anzeigen</string>\n    <string name=\"wifi_install_success\">WLAN gespeichert</string>\n    <string name=\"wifi_install_clipboard_message\">WLAN konnte nicht gespeichert werden.\\nDas Passwort wurde in der Zwischenablage gespeichert.</string>\n    <string name=\"event_sessions_title\">Sitzungen</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours und App-Rezensionen</string>\n    <string name=\"event_afterhours_title\">Rahmenprogramm</string>\n    <string name=\"event_meals_title\">Verpflegung</string>\n    <string name=\"event_sessions_description\">Ab April können Besucher vor Ort Sitzplätze für Tagungen vor der Veranstaltung auf der I/O-Website und auch über die I/O-Mobile App reservieren (Hinweis: Ein Teil der Tagungssitzplätze ist von der Reservierung ausgenommen. Diese werden nach der Reihenfolge des Eintreffens vergeben). Auch die Plätze für Codelabs, App Reviews und Office Hours werden nach der Reihenfolge des Eintreffens vergeben.</string>\n    <string name=\"event_sandbox_description\">Spezielle Bereiche zum Erkunden, Lernen und spielerischen Experimentieren mit unseren neuesten Produkten und Plattformen – anhand von interaktiven Demos, physischen Installationen und vielem mehr.</string>\n    <string name=\"event_codelabs_description\">Sammeln Sie an unseren Programmierständen praktische Erfahrungen. Hier finden Sie alles, was Sie brauchen, um mithilfe von Onlinekursen zum Selbststudium die neuesten und besten Google-Technologien kennenzulernen – oder bringen Sie Ihren eigenen Rechner mit und nehmen Sie sich Arbeit mit nach Hause. Die anwesenden Mitarbeiter von Google geben Ihnen gern nützliche Tipps und helfen Ihnen, wenn Sie mal nicht weiterkommen.</string>\n    <string name=\"event_officehours_description\">Im Rahmen der Office Hours haben Sie Gelegenheit, Experten von Google all Ihre technischen Fragen persönlich zu stellen, und bei den App Reviews erhalten Sie Beratung und Tipps zu Ihren spezifischen App-Projekten.</string>\n    <string name=\"event_afterhours_description\">An zwei Abenden findet nach dem Ende der Sitzungen in der Nähe des Shoreline ein Rahmenprogramm mit Essen, Getränken und Unterhaltung statt. Am ersten Abend gibt es eine Party in den Räumen von Sandbox und am zweiten veranstalten wir ein exklusives Konzert im Amphitheatre.</string>\n    <string name=\"event_meals_description\">Die Teilnehmer erhalten an allen drei Tagen der Konferenz kostenlos Frühstück, Mittagessen und Snacks. Während der After-Hours-Veranstaltungen an den ersten beiden Tagen wird auch ein Abendessen angeboten.</string>\n    <string name=\"wifi_header\">WLAN</string>\n    <string name=\"related_apps_header\">Ähnliche Apps</string>\n    <string name=\"event_types_header\">Veranstaltungsarten</string>\n    <string name=\"settings_time_zone_label\">Veranstaltungen in der Zeitzone \"Pacific Standard Time\" (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Benachrichtigungen aktivieren</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Anonyme Nutzungsstatistiken senden</string>\n    <string name=\"settings_tos\">Nutzungsbedingungen</string>\n    <string name=\"settings_privacy_policy\">Datenschutzerklärung</string>\n    <string name=\"settings_oss_licenses\">Open-Source-Lizenzen</string>\n    <string name=\"settings_theme_title\">Design auswählen</string>\n    <string name=\"settings_theme_system\">Systemvorgabe</string>\n    <string name=\"settings_theme_light\">Hell</string>\n    <string name=\"settings_theme_dark\">Dunkel</string>\n    <string name=\"settings_theme_battery\">Durch Energiesparmodus festgelegt</string>\n    <string name=\"built_with_material_components\">Erstellt mit Material Components.</string>\n    <string name=\"wifi_network_and_password\">Netzwerk: %1$s\\nPasswort: %2$s</string>\n    <string name=\"join_network\">Dem Netzwerk beitreten</string>\n    <string name=\"assistant_app_description\">Sagen Sie einfach: \"Hey Google, sprich mit Google I/O 19.\"</string>\n    <string name=\"assistant_app_description2\">Sagen Sie einfach: \"Hey Google, sprich mit Google I/O 19.\"</string>\n    <string name=\"speaker_link_website\">Website</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Veranstaltungen</string>\n    <string name=\"no_network_connection\">Keine Internetverbindung.</string>\n    <string name=\"navigate_up\">Nach oben</string>\n    <string name=\"no_network_description\">Versuchen Sie folgende Schritte, wenn Sie die Funktion \"I/O erkunden\" nutzen möchten:\\n\\n – Flugmodus deaktivieren\\n\\n – Mobile Daten oder WLAN aktivieren\\n\\n – Signalstärke überprüfen</string>\n    <string name=\"phone_does_not_support_arcore_title\">ARCore wird von Ihrem Smartphone nicht unterstützt</string>\n    <string name=\"phone_does_not_support_arcore_message\">Versuchen Sie es mit einem anderen Gerät</string>\n    <string name=\"codelabs_information\">Lernen Sie die neuesten und besten Google-Technologien durch Kurse zum Selbststudium an unseren Programmierständen kennen oder bringen Sie Ihren eigenen Rechner mit und nehmen Sie sich Ihre Arbeit mit nach Hause. Die Stände sind täglich geöffnet, außer während der ersten Keynote.</string>\n    <string name=\"codelabs_building\">Codelabs-Gebäude</string>\n    <string name=\"codelabs_website\">Codelabs-Website</string>\n    <string name=\"codelab_duration\">Dauer: %1$d Min.</string>\n    <string name=\"start_codelab\">Codelab starten</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-de-rAT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Planen</string>\n    <string name=\"title_home\">Startseite</string>\n    <string name=\"title_map\">Karte</string>\n    <string name=\"title_explore_io\">I/O erkunden</string>\n    <string name=\"title_info\">Info</string>\n    <string name=\"filters\">Filter</string>\n    <string name=\"category_heading_tracks\">Themen</string>\n    <string name=\"category_heading_types\">Art der Veranstaltung</string>\n    <string name=\"reset\">Zurücksetzen</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d Veranstaltung</item>\n        <item quantity=\"other\">%1$d Veranstaltungen</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Ihre markierten und reservierten Veranstaltungen</string>\n    <string name=\"starred_and_reserved_short\">Meine Veranstaltungen</string>\n    <string name=\"search_schedule_hint\">Zeitplan durchsuchen</string>\n    <string name=\"search_schedule_no_results\">Keine Ergebnisse gefunden</string>\n    <string name=\"agenda\">Terminübersicht</string>\n    <string name=\"event_starred\">Veranstaltung wurde Ihren markierten Elementen hinzugefügt</string>\n    <string name=\"event_unstarred\">Veranstaltung aus markierten Elementen entfernt</string>\n    <string name=\"event_star_error\">Fehler beim Hinzufügen der Veranstaltung zu markierten Elementen</string>\n    <string name=\"reservation_error\">Fehler beim Ändern der Reservierung. Warten Sie, bis vorangegangene Anfragen abgeschlossen sind oder versuchen Sie es später noch einmal.</string>\n    <string name=\"reservation_request_succeeded\">Reservierung angefragt.</string>\n    <string name=\"reservation_cancel_succeeded\">Reservierung storniert: \"&lt;b&gt;%s&lt;/b&gt;.\"</string>\n    <string name=\"reservation_new\">Ihr Platz für \"&lt;b&gt;%s&lt;/b&gt;\" ist reserviert.</string>\n    <string name=\"reservation_replaced\">Veranstaltung getauscht.</string>\n    <string name=\"waitlist_new\">Sie stehen auf der Warteliste.</string>\n    <string name=\"waitlist_cancel_succeeded\">Von Warteliste entfernt.</string>\n    <string name=\"got_it\">Ok</string>\n    <string name=\"dont_show\">Nicht anzeigen</string>\n    <string name=\"reservation_denied_cutoff\">Reservierung abgelehnt: zu kurz vor Startzeit.</string>\n    <string name=\"reservation_denied_clash\">Reservierung abgelehnt: Überschneidung mit anderer Reservierung.</string>\n    <string name=\"reservation_denied_unknown\">Reservierung abgelehnt: unbekannter Fehler.</string>\n    <string name=\"cancellation_denied_cutoff\">Stornierung abgelehnt: zu kurz vor Startzeit.</string>\n    <string name=\"cancellation_denied_unknown\">Stornierung abgelehnt: unbekannter Fehler.</string>\n    <string name=\"schedule_filters_empty\">Keine Termine gefunden</string>\n    <string name=\"reservation_reservable\">Platz reservieren</string>\n    <string name=\"reservation_reserved\">Reserviert</string>\n    <string name=\"reservation_waitlisted\">Auf der Warteliste</string>\n    <string name=\"reservation_waitlist_available\">Auf Warteliste setzen</string>\n    <string name=\"reservation_disabled\">Keine Reservierungen verfügbar</string>\n    <string name=\"reservation_pending\">Reservierung ausstehend</string>\n    <string name=\"schedule_hint_title\">Terminplan anpassen</string>\n    <string name=\"schedule_hint_star_event\">Zu markierten Veranstaltungen hinzufügen</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Platz für Sitzung reservieren</string>\n    <string name=\"rate_session\">Sitzung bewerten</string>\n    <string name=\"menu_item_session_location\">Sitzungsstandort</string>\n    <string name=\"menu_item_session_star\">Sitzung markieren</string>\n    <string name=\"menu_item_calendar\">Zum Kalender hinzufügen</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Referenten</string>\n    <string name=\"session_detail_related_header\">Ähnliche Veranstaltungen</string>\n    <string name=\"feedback_submit\">Senden</string>\n    <string name=\"feedback_thank_you\">Vielen Dank für Ihr Feedback!</string>\n    <string name=\"feedback_q1_text\">Wie würden Sie das Niveau der Sitzung allgemein bewerten?</string>\n    <string name=\"feedback_q2_text\">Wie würden Sie die Inhalte der Sitzung anhand Ihrer Erwartungen und der Beschreibung der Sitzung bewerten?</string>\n    <string name=\"feedback_q3_text\">Wie nützlich war die Sitzung für Ihre Projekte?</string>\n    <string name=\"feedback_q4_text\">Wie nützlich war die Sitzung für Ihre Projekte?</string>\n    <string name=\"feedback_q1_label_start\">Sehr grundlegend</string>\n    <string name=\"feedback_q2_label_start\">Uninteressant</string>\n    <string name=\"feedback_q3_label_start\">Schlecht</string>\n    <string name=\"feedback_q4_label_start\">Nicht besonders</string>\n    <string name=\"feedback_q1_label_end\">Ausgezeichnet</string>\n    <string name=\"feedback_q2_label_end\">Ausgezeichnet</string>\n    <string name=\"feedback_q3_label_end\">Äußerst relevant</string>\n    <string name=\"feedback_q4_label_end\">Äußerst</string>\n    <string name=\"a11y_show_navigation\">Navigationsmenü einblenden</string>\n    <string name=\"a11y_collapse_filters_sheet\">Filtertabelle minimieren</string>\n    <string name=\"a11y_clear_tag_filters\">Filter löschen</string>\n    <string name=\"a11y_filter_applied\">%1s Filter angewendet</string>\n    <string name=\"a11y_filter_not_applied\">%1s Filter nicht angewendet</string>\n    <string name=\"a11y_reservation_available\">Platz für Veranstaltung reservieren</string>\n    <string name=\"a11y_reservation_reserved\">Platz für Veranstaltung reserviert</string>\n    <string name=\"a11y_reservation_disabled\">Reservierung nicht verfügbar</string>\n    <string name=\"a11y_reservation_wait_list_available\">Auf Warteliste für Veranstaltung setzen</string>\n    <string name=\"a11y_reservation_wait_listed\">Auf Warteliste für Veranstaltung gesetzt</string>\n    <string name=\"a11y_reservation_pending\">Reservierung ausstehend</string>\n    <string name=\"a11y_starred\">Veranstaltung als Lesezeichen gespeichert</string>\n    <string name=\"a11y_unstarred\">Veranstaltung nicht als Lesezeichen gespeichert</string>\n    <string name=\"a11y_star\">Markieren</string>\n    <string name=\"a11y_play\">Video abspielen</string>\n    <string name=\"a11y_select_map_mode\">Kartenmodus auswählen</string>\n    <string name=\"a11y_search_schedule\">Zeitplan suchen</string>\n    <string name=\"welcome\">Willkommen!</string>\n    <string name=\"a11y_signed_in_content_description\">Angemeldet als %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Zum Anmelden tippen.</string>\n    <string name=\"dialog_sign_in_content\">Melden Sie sich an, um Veranstaltungen zu speichern, Plätze zu reservieren und Sitzungen zu bewerten (als Teilnehmer). Die Aktionen mit Ihrem Konto werden in der App und auf der Website synchronisiert.</string>\n    <string name=\"sign_in\">Anmelden</string>\n    <string name=\"firebase_auth_no_network_connection\">Keine Internetverbindung</string>\n    <string name=\"firebase_auth_unknown_error\">Unbekannter Fehler</string>\n    <string name=\"dialog_sign_out_content\">Alle gespeicherten Veranstaltungen, Platzreservierungen und Sitzungsbewertungen (von Teilnehmern) werden in Ihrem Konto synchronisiert.</string>\n    <string name=\"sign_out\">Abmelden</string>\n    <string name=\"manage_google_account\">Hier können Sie Ihr Google-Konto verwalten</string>\n    <string name=\"remove_reservation_title\">Reservierung entfernen?</string>\n    <string name=\"remove_reservation_content\">Sie sind dabei, Ihren Platz für \"%1$s\" zu stornieren. Wenn Sie Ihre Reservierung stornieren, aber kurzfristig doch noch teilnehmen möchten: Bei allen Sitzungen wird eine bestimmte Anzahl von Plätzen direkt vor Ort an die ersten eintreffenden Interessenten vergeben.</string>\n    <string name=\"cancel\">Abbrechen</string>\n    <string name=\"remove\">Entfernen</string>\n    <string name=\"swap_reservation_title\">Reservierung tauschen?</string>\n    <string name=\"swap_reservation_content\">Sie haben bereits eine Reservierung bzw. stehen auf der Warteliste für \"%1$s\". Es ist nur eine Reservierung pro Zeitblock zulässig. Möchten Sie den Tausch gegen \"%2$s\" vornehmen?</string>\n    <string name=\"swap\">Tauschen</string>\n    <string name=\"notifications_preference_dialog_title\">I/O-Benachrichtigungen</string>\n    <string name=\"notifications_preference_dialog_content\">Möchten Sie Benachrichtigungen zu I/O erhalten? Dann senden wir Ihnen Informationen zu Anfangszeiten von Sitzungen, Rahmenprogramm, Sitzungsaufzeichnungen und vieles mehr. Diese Einstellung können Sie unter \"Info &gt; Settings\" (Informationen &gt; Einstellungen) jederzeit ändern.</string>\n    <string name=\"no\">Nein</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"feed_not_available\">Keine Ankündigungen gefunden.</string>\n    <string name=\"feed_loading_error\">Feed konnte nicht geladen werden. Versuchen Sie es später noch einmal.</string>\n    <string name=\"feed_announcement_title\">Ankündigungen</string>\n    <string name=\"feed_upcoming_events\">Veranstaltungstipps</string>\n    <string name=\"feed_saved_events\">Gespeicherte Veranstaltungen</string>\n    <string name=\"feed_no_saved_events\">Keine gespeicherten Termine</string>\n    <string name=\"feed_view_all_events\">Alle Termine anzeigen</string>\n    <string name=\"feed_view_your_schedule\">Terminübersicht ansehen</string>\n    <string name=\"feed_watch_live_stream\">Livestream ansehen</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s Tag</item>\n        <item quantity=\"other\">%s Tage</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s  Stunde</item>\n        <item quantity=\"other\">%s Stunden</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s Minute</item>\n        <item quantity=\"other\">%s Minuten</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s Sekunde</item>\n        <item quantity=\"other\">%s Sekunden</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Sitzung teilen</string>\n    <string name=\"share_text_session_detail\">%1$s bei #io19 %2$s ansehen</string>\n    <string name=\"intent_chooser_session_detail\">Teilen</string>\n    <string name=\"map_variant_after_dark\">After Dark</string>\n    <string name=\"map_variant_concert\">Konzert</string>\n    <string name=\"map_variant_daytime\">Tagsüber</string>\n    <string name=\"enable_my_location\">\"Mein Standort\" aktivieren</string>\n    <string name=\"my_location_rationale\">Die App benötigt die Berechtigung zur Standortermittlung, um Ihren Standort auf der Karte anzuzeigen.</string>\n    <string name=\"onboarding_get_started\">Jetzt starten</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Willkommen bei Google I/O</string>\n    <string name=\"onboarding_date_location\">7.–9. Mai 2019\\nMountain View, CA, USA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Bald ist Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Zusammenfassung der I/O 19 ansehen und mit #io19 in den sozialen Netzwerken mehr erfahren</string>\n    <string name=\"onboarding_signin\">Melden Sie sich an, um I/O-Benachrichtigungen zu erhalten und als Teilnehmer Sitzplätze für Tagungen zu reservieren.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">Sitzung beginnt in %1$s Minute</item>\n        <item quantity=\"other\">Sitzung beginnt in %1$s Minuten</item>\n    </plurals>\n    <string name=\"expanded\">Maximiert</string>\n    <string name=\"collapsed\">Minimiert</string>\n    <string name=\"event_title\">Veranstaltung</string>\n    <string name=\"travel_title\">Anreise</string>\n    <string name=\"faq_title\">FAQ</string>\n    <string name=\"settings_title\">Einstellungen</string>\n    <string name=\"about_title\">Info</string>\n    <string name=\"travel_what_to_bring_title\">Was Sie für das Event mitbringen sollten</string>\n    <string name=\"travel_hotels_title\">Hotels</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Mountain View erreichen</string>\n    <string name=\"travel_getting_to_shoreline_title\">Mountain View erreichen</string>\n    <string name=\"travel_shuttle_service_title\">Shuttleservice</string>\n    <string name=\"travel_off_site_parking_title\">Parkplätze außerhalb des Geländes</string>\n    <string name=\"travel_for_public_transportation_title\">Öffentliche Verkehrsmittel</string>\n    <string name=\"travel_biking_title\">Mit dem Fahrrad</string>\n    <string name=\"travel_ridesharing_title\">Mitfahrportale</string>\n    <string name=\"travel_airport_transfers_title\">Flughafentransfer</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O ist ein Festival im Freien. Allein das macht I/O schon zu etwas ganz Besonderem. Das bedeutet aber auch, dass einige Dinge zu beachten sind. Die Tagungen finden in klimatisierten Zelten statt, aber Sonnenschutzmittel, Sonnenbrillen und zusätzliche Kleidung für die kälteren Abende werden empfohlen. I/O ist ein legeres Event. Beachte Sie das, wenn Sie überlegen, was Sie anziehen sollen.</string>\n    <string name=\"travel_hotels_description\">Wir haben in vielen örtlichen Hotels Zimmer reserviert. Die Liste der Hotels und die Verfügbarkeit der Zimmer werden regelmäßig aktualisiert. Bitte benutzen Sie die nachstehende Karte, um das für Sie beste Hotel zu finden. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Hotelkarte&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Hier sind die drei großen Flughäfen in der Bay Area mit internationalem Flugverkehr:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Francisco International Airport (SFO)&lt;/a&gt; ~24 Meilen&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Oakland International Airport (OAK)&lt;/a&gt; ~32 Meilen&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Jose International Airport (SJC)&lt;/a&gt; ~12 Meilen</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 hat sich verpflichtet, ein „Event ohne Parkplätze*“ zu sein, um Verkehrsstaus und CO2-Emissionen zu reduzieren. Diese Entscheidung wurde sorgfältig erwogen und wir bieten Ihnen viele kostenlose Optionen an, um zur Veranstaltung zu gelangen, ohne ein Fahrzeug zu benötigen.&lt;br&gt;&lt;br&gt;Je näher die Veranstaltung rückt, desto mehr Informationen erhalten Sie.&lt;br&gt;&lt;br&gt;*Behindertenparkplätze stehen zur Verfügung.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 hat sich verpflichtet, ein „Event ohne Parkplätze*“ zu sein, um Verkehrsstaus und CO2-Emissionen zu reduzieren. Diese Entscheidung wurde sorgfältig erwogen und wir bieten Ihnen viele kostenlose Optionen an, um zur Veranstaltung zu gelangen, ohne ein Fahrzeug zu benötigen.&lt;br&gt;&lt;br&gt;Je näher die Veranstaltung rückt, desto mehr Informationen erhalten Sie.&lt;br&gt;&lt;br&gt;*Behindertenparkplätze stehen zur Verfügung.</string>\n    <string name=\"travel_off_site_parking_description\">Kostenlose Parkplätze befinden sich im &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;. Shuttles von Avaya werden zu/von Google I/O zur Verfügung gestellt.&lt;br&gt;&lt;br&gt; Geben Sie bitte auf Ihrem Registrierungsformular an, ob Sie besondere Unterstützung benötigen. Das Planungsteam wird sich dann mit Ihnen in Verbindung setzen.</string>\n    <string name=\"travel_for_public_transportation_description\">Wir bieten Ihnen Prepaid-Tickets für den öffentlichen Nahverkehr an, die während der Voranmeldung zur Abholung zur Verfügung stehen. Die öffentlichen Verkehrsmittel in die Umgebung erreichen Sie über:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Regionales Eisenbahnsystem&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Stadtbahn, die die South Bay bedient&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Rapid Transit in der Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Regionalbahnsystem&lt;br&gt;&lt;br&gt; Öffentliche Verkehrsmittel führen nicht direkt zu Google I/O. Weitere Informationen zu den Haltestellen der Event-Shuttles zur Google I/O folgen.</string>\n    <string name=\"travel_biking_description\">Am Shoreline Amphitheatre stehen innerhalb von Parkplatz A kostenlose Fahrradparkplätze zur Verfügung. Die Silicon Valley Bicycle Coalition bietet sicheres Fahrradparken mit Valet-Service ab 7:00 Uhr morgens bis zum Veranstaltungsende am jeweiligen Tag. Es gibt zwei Wege zum Shoreline Amphitheatre, die sich gut für Radfahrer eignen, den Stevens Creek Trail und den Permanente Creek Trail.</string>\n    <string name=\"travel_ridesharing_description\">Am letzten Tag der Veranstaltung wird ein Flughafentransfer vom Google I/O zum SFO und SJC angeboten. An anderen Tagen werden KEINE Flughafentransfers angeboten.</string>\n    <string name=\"travel_airport_transfers_description\">Am letzten Tag der Veranstaltung wird ein Flughafentransfer vom Google I/O zum SFO und SJC angeboten. An anderen Tagen werden KEINE Flughafentransfers angeboten.</string>\n    <string name=\"faq_when_and_where_title\">Wann und wo findet die Google I/O 2019 statt?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Wie kann ich über Google I/O auf dem Laufenden bleiben?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Finden alle Veranstaltungen in englischer Sprache statt?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Kann ich Tagungen vor der Veranstaltung reservieren?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Wie kommt man am besten zum Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Wo und wann kann ich mein Ansteckschild abholen?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Ich möchte bei der Keynote-Veranstaltung in der ersten Reihe sitzen. Was kann ich tun?</string>\n    <string name=\"faq_what_should_i_wear_title\">Gibt es einen Dresscode?</string>\n    <string name=\"faq_onsite_food_options_title\">Ich esse gern etwas zwischendurch. Welche Möglichkeiten gibt es vor Ort dafür?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Wenn ich am Veranstaltungsort etwas verliere, wo finde ich es wieder?</string>\n    <string name=\"faq_after_dark_program_title\">Die After Dark-Programmpunkte klingen interessant. Sollte ich hingehen?</string>\n    <string name=\"faq_accessibility_needs_title\">Ist die Veranstaltung barrierefrei?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Wie unterstützen Sie werdende Mütter und Eltern, die am I/O teilnehmen?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google Community-Richtlinien für Veranstaltungen und Richtlinie gegen Belästigung</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Werden die Tagungen live übertragen? Was passiert, wenn ich die Veranstaltung nicht in Echtzeit verfolgen kann?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Ich möchte I/O mit meiner Community feiern.  Haben Sie Ideen dazu?</string>\n    <string name=\"faq_when_and_where_description\">Besuchen Sie die &lt;a href=\"https://events.google.com/io/\"&gt;Website von Google I/O 2019&lt;/a&gt; und den &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers Blog&lt;/a&gt;, um immer die neuesten Informationen zu Veranstaltungen, Referenten und allgemeinen Aktivitäten zu erhalten. Folgen Sie uns außerdem auf &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; und &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Über den offiziellen Hashtag &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; können Sie sich in sozialen Netzwerken mit anderen über die Google I/O 2019 austauschen. Außerdem erhalten alle registrierten Teilnehmer wichtige Informationen und Check-In-Hinweise vorab per E-Mail.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Besuchen Sie die &lt;a href=\"https://events.google.com/io/\"&gt;Website von Google I/O 2019&lt;/a&gt; und den &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers Blog&lt;/a&gt;, um immer die neuesten Informationen zu Veranstaltungen, Referenten und allgemeinen Aktivitäten zu erhalten. Folgen Sie uns außerdem auf &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; und &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Über den offiziellen Hashtag &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; können Sie sich in sozialen Netzwerken mit anderen über die Google I/O 2019 austauschen. Außerdem erhalten alle registrierten Teilnehmer wichtige Informationen und Check-In-Hinweise vorab per E-Mail.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Ja. So kann unsere Zielgruppe weltweit die Veranstaltungen verfolgen.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Ab April können Besucher vor Ort Sitzplätze für Tagungen vor der Veranstaltung auf der I/O-Website und auch über die I/O-Mobile App reservieren (Hinweis: Ein Teil der Tagungssitzplätze ist von der Reservierung ausgenommen. Diese werden nach der Reihenfolge des Eintreffens vergeben). Auch die Plätze für Codelabs, App Reviews und Office Hours werden nach der Reihenfolge des Eintreffens vergeben.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Im Abschnitt \"Travel\" (Reisen) finden Sie alle wichtigen Reisetipps, einschließlich Informationen zum Shuttle, Wegbeschreibungen fürs Auto und Fahrrad, Tipps für Mitfahrgelegenheiten und vieles mehr.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Wir geben die Ansteckschilder schon ab Montag, dem 06. Mai im Shoreline Amphitheatre aus, um den Check-in zu beschleunigen. Damit wir Ihnen Ihr Ansteckschild für die Google I/O ausstellen können, beachten Sie bitte die folgenden Punkte:&lt;br&gt; – Sie müssen einen Lichtbildausweis vorlegen. Dies kann ein Führerschein, Reisepass oder ein vergleichbares, amtliches Ausweisdokument sein. Wenn Sie sich nicht korrekt ausweisen können, erhalten Sie kein Ansteckschild und können nicht an der Konferenz teilnehmen. Der Name auf dem Ausweis muss exakt mit dem bei der Registrierung angegebenen Namen übereinstimmen. Als wissenschaftlicher Teilnehmer müssen Sie außerdem einen Nachweis darüber erbringen, dass Sie die Voraussetzungen erfüllen.&lt;br&gt; – Scannen Sie den QR-Code, den Sie per E-Mail für die Registrierung erhalten haben. Sie können diesen mit Ihrem Smartphone scannen, die E-Mail muss dazu nicht ausgedruckt werden. #Umweltschutz &lt;br&gt;&lt;br&gt;Ihr Ansteckschild ist nicht übertragbar, es darf also nicht an andere Personen weitergegeben oder gemeinsam mit anderen Personen genutzt werden. Wichtig dabei ist, dass die Ansteckschilder für die Google I/O nicht ersetzt werden können. Verlieren Sie Ihres also nicht, sonst werden Sie nicht wieder in den Konferenzbereich vorgelassen. Sie müssen Ihr Ansteckschild während der gesamten Google I/O tragen; dies gilt auch für die einzelnen Tagungen, Sandboxes und \"After Hours\". Auf Verlangen der Sicherheitskräfte müssen Sie Ihr Ansteckschild vorzeigen und sich ggf. zusätzlich ausweisen. Die Ansteckschilder für die Google I/O können Ihren Namen, den Namen Ihres Unternehmens bzw. Ihrer Organisation (falls angegeben) und ein Foto enthalten.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Bei den Keynotes ist zwar für jeden Teilnehmer ein Sitzplatz garantiert, aber die besten Plätze werden beim Abholen der Ansteckschilder am 06. Mai ab 7.00 Uhr nach der Reihenfolge des Eintreffens vergeben. Seien Sie also frühzeitig da.</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O ist eine Open-Air-Veranstaltung für Entwickler. Kleiden Sie sich leger und bequem, einen bestimmten Dresscode gibt es nicht. In der Bay Area kann es tagsüber sehr warm, abends aber kühl werden, denken Sie bei der Auswahl der Kleidung daran.</string>\n    <string name=\"faq_onsite_food_options_description\">Für das leibliche Wohl ist bestens gesorgt.  An allen drei Konferenztagen erhalten die Teilnehmer ein kostenloses Frühstück, Mittagessen und Snacks. Am ersten und zweiten Tag wird auch ein Abendessen während der After-Hour-Veranstaltungen angeboten.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Wir helfen Ihnen. Das Fundbüro befindet sich während der Veranstaltungszeiten am Konferenzinformationsschalter. Alle Gegenstände, die bis zum nächsten Tag nicht abgeholt wurden, werden dem Conference Security Office übergeben. Ein wichtiger Hinweis: Die Ansteckschilder für die Google I/O können NICHT ersetzt werden. Verlieren Sie Ihres also nicht, sonst werden Sie nicht wieder in den Konferenzbereich vorgelassen.</string>\n    <string name=\"faq_after_dark_program_description\">Das sind zwei Nächte, die Sie nicht verpassen sollten. Die Teilnehmer können am 08. Mai abends Musik, Spiele und mehr genießen. Am 09. Mai findet im Amphitheater ein exklusives Konzert statt. An beiden Abenden sind Speisen und Getränke erhältlich (alkoholische Getränke ab 21 Jahren). Beide After-Hour-Veranstaltungen finden im Shoreline Amphitheatre statt. Für den Eintritt ist Ihr Teilnehmerausweis erforderlich.</string>\n    <string name=\"faq_accessibility_needs_description\">Bei den Behindertenparkplätzen stehen auch Parkplätze für werdende Mütter zur Verfügung.&lt;br&gt; Stillende Mütter können mit ihrem Kind an der Konferenz teilnehmen. Am 07. und 08. Mai sind von 08:00 bis 20:00 Uhr und am 09. Mai von 08:00 bis 16:00 Uhr vier Wickelräume vorhanden. Anmeldeunterlagen werden vor den Zimmern der Mütter zur Verfügung stehen. Die Verwendung wird nach der Reihenfolge des Eintreffens vergeben. Weitere Informationen erhalten Sie am Informationsstand.&lt;br&gt;&lt;br&gt; Eltern, die Interesse an der Kinderbetreuung haben und die sich über unser Anmeldeformular angemeldet haben, erhalten eine Rückerstattung von 100 $ pro Tag (bis zu 300 $ insgesamt). Auch diese Plätze werden nach der Reihenfolge des Eintreffens vergeben. Unsere Rückerstattung der Kinderbetreuung wird von einem Drittanbieter angeboten. Wenn Ihr Antrag auf Kinderbetreuung vor Beginn der Konferenz von uns per E-Mail genehmigt und Ihre Anwesenheit vor Ort bestätigt wird, wird sich unser Anbieter innerhalb von 7 Werktagen nach der Google I/O mit den nächsten Schritten bei Ihnen melden. Dieser wird dann alle Auszahlungen für unsere Kinderbetreuungszahlungen leisten.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Bei den Behindertenparkplätzen stehen auch Parkplätze für werdende Mütter zur Verfügung.&lt;br&gt; Stillende Mütter können mit ihrem Kind an der Konferenz teilnehmen. Am 07. und 08. Mai sind von 08:00 bis 20:00 Uhr und am 09. Mai von 08:00 bis 16:00 Uhr vier Wickelräume vorhanden. Anmeldeunterlagen werden vor den Zimmern der Mütter zur Verfügung stehen. Die Verwendung wird nach der Reihenfolge des Eintreffens vergeben. Weitere Informationen erhalten Sie am Informationsstand.&lt;br&gt;&lt;br&gt; Eltern, die Interesse an der Kinderbetreuung haben und die sich über unser Anmeldeformular angemeldet haben, erhalten eine Rückerstattung von 100 $ pro Tag (bis zu 300 $ insgesamt). Auch diese Plätze werden nach der Reihenfolge des Eintreffens vergeben. Unsere Rückerstattung der Kinderbetreuung wird von einem Drittanbieter angeboten. Wenn Ihr Antrag auf Kinderbetreuung vor Beginn der Konferenz von uns per E-Mail genehmigt und Ihre Anwesenheit vor Ort bestätigt wird, wird sich unser Anbieter innerhalb von 7 Werktagen nach der Google I/O mit den nächsten Schritten bei Ihnen melden. Dieser wird dann alle Auszahlungen für unsere Kinderbetreuungszahlungen leisten.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google legt großen Wert darauf, ein belästigungsfreies und inklusives Veranstaltungserlebnis für alle zu bieten, unabhängig von Geschlechtsidentität und -ausdruck, sexueller Orientierung, Behinderungen, Neurodiversität, körperlicher Erscheinung, Körpergröße, ethnischer Herkunft, Nationalität, Rasse, Alter, Religion oder einer anderen geschützten Eigenschaft. Um die Veranstaltung so inklusiv wie möglich zu gestalten, werden geschlechtsneutrale Toiletten im gesamten Veranstaltungsort angeboten.&lt;br&gt;&lt;br&gt; Wir dulden keine Belästigung von Teilnehmern der Veranstaltung in irgendeiner Form.&lt;br&gt; Google nimmt Verstöße gegen die Richtlinien sehr ernst und wird entsprechend reagieren. Weitere Informationen zu den Google Community-Richtlinien und den Richtlinien zur Bekämpfung von Belästigungen &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;finden Sie hier&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Die beiden Keynotes und alle Tagungen werden während der drei Festivaltage auf der Homepage der Event-Website live übertragen. Wenn Sie zu dieser Zeit arbeiten müssen oder aus einem anderen Grund keine Zeit haben, können Sie sich später auf dem &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers YouTube-Kanal&lt;/a&gt; die Aufzeichnungen der Tagungen ansehen.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Ja! Jedes Jahr veranstalten Entwickler auf der ganzen Welt &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended-Events&lt;/a&gt;. Während dieser Veranstaltungen können Veranstalter diese live übertragen und ihre eigenen Tagungen veranstalten, darunter Hackathons, Codelabs, Demos und vieles mehr.&lt;br&gt; Wenn Sie dieses Jahr als Gastgeber für I/O Extended dabei sind, sollten Sie zuerst die folgenden Schritte ausführen:&lt;br&gt;&lt;br&gt; Lesen Sie sich die &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Organisator-Anleitung&lt;/a&gt; durch, um Tipps und Vorschläge für eine erfolgreiche Veranstaltung zu erhalten.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"Registrieren&lt;/a&gt; Sie sich für Ihre öffentliche Veranstaltung auf der I/O-Website, um die Sichtbarkeit zu erhöhen.&lt;br&gt;&lt;br&gt; Verwenden Sie den offiziellen Hashtag #io19extended für all Ihre Posts in sozialen Netzwerken im Zusammenhang mit I/O Extended, um leichter gefunden zu werden.&lt;br&gt;&lt;br&gt; Hinweis: Veranstalter von I/O Extended können nach Ende der Veranstaltung das Löschen ihrer persönlichen Daten und/oder Veranstaltungsdaten anfordern. Schicken Sie dazu eine E-Mail an io19@google.com.&lt;br&gt; Wenn Sie nur an einer I/O Extended-Veranstaltung teilnehmen möchten, suchen Sie auf &lt;a href=\"https://events.google.com/io/extended\"&gt;unserer Karte&lt;/a&gt; eine heraus, die in Ihrer Nähe stattfindet, und melden Sie sich an.&lt;br&gt; Wenn Sie Fragen zum Programm von I/O Extended haben, wenden Sie sich an io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Sitzungen anzeigen</string>\n    <string name=\"wifi_install_success\">WLAN gespeichert</string>\n    <string name=\"wifi_install_clipboard_message\">WLAN konnte nicht gespeichert werden.\\nDas Passwort wurde in der Zwischenablage gespeichert.</string>\n    <string name=\"event_sessions_title\">Sitzungen</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours und App-Rezensionen</string>\n    <string name=\"event_afterhours_title\">Rahmenprogramm</string>\n    <string name=\"event_meals_title\">Verpflegung</string>\n    <string name=\"event_sessions_description\">Ab April können Besucher vor Ort Sitzplätze für Tagungen vor der Veranstaltung auf der I/O-Website und auch über die I/O-Mobile App reservieren (Hinweis: Ein Teil der Tagungssitzplätze ist von der Reservierung ausgenommen. Diese werden nach der Reihenfolge des Eintreffens vergeben). Auch die Plätze für Codelabs, App Reviews und Office Hours werden nach der Reihenfolge des Eintreffens vergeben.</string>\n    <string name=\"event_sandbox_description\">Spezielle Bereiche zum Erkunden, Lernen und spielerischen Experimentieren mit unseren neuesten Produkten und Plattformen – anhand von interaktiven Demos, physischen Installationen und vielem mehr.</string>\n    <string name=\"event_codelabs_description\">Sammeln Sie an unseren Programmierständen praktische Erfahrungen. Hier finden Sie alles, was Sie brauchen, um mithilfe von Onlinekursen zum Selbststudium die neuesten und besten Google-Technologien kennenzulernen – oder bringen Sie Ihren eigenen Rechner mit und nehmen Sie sich Arbeit mit nach Hause. Die anwesenden Mitarbeiter von Google geben Ihnen gern nützliche Tipps und helfen Ihnen, wenn Sie mal nicht weiterkommen.</string>\n    <string name=\"event_officehours_description\">Im Rahmen der Office Hours haben Sie Gelegenheit, Experten von Google all Ihre technischen Fragen persönlich zu stellen, und bei den App Reviews erhalten Sie Beratung und Tipps zu Ihren spezifischen App-Projekten.</string>\n    <string name=\"event_afterhours_description\">An zwei Abenden findet nach dem Ende der Sitzungen in der Nähe des Shoreline ein Rahmenprogramm mit Essen, Getränken und Unterhaltung statt. Am ersten Abend gibt es eine Party in den Räumen von Sandbox und am zweiten veranstalten wir ein exklusives Konzert im Amphitheatre.</string>\n    <string name=\"event_meals_description\">Die Teilnehmer erhalten an allen drei Tagen der Konferenz kostenlos Frühstück, Mittagessen und Snacks. Während der After-Hours-Veranstaltungen an den ersten beiden Tagen wird auch ein Abendessen angeboten.</string>\n    <string name=\"wifi_header\">WLAN</string>\n    <string name=\"related_apps_header\">Ähnliche Apps</string>\n    <string name=\"event_types_header\">Veranstaltungsarten</string>\n    <string name=\"settings_time_zone_label\">Veranstaltungen in der Zeitzone \"Pacific Standard Time\" (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Benachrichtigungen aktivieren</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Anonyme Nutzungsstatistiken senden</string>\n    <string name=\"settings_tos\">Nutzungsbedingungen</string>\n    <string name=\"settings_privacy_policy\">Datenschutzerklärung</string>\n    <string name=\"settings_oss_licenses\">Open-Source-Lizenzen</string>\n    <string name=\"settings_theme_title\">Design auswählen</string>\n    <string name=\"settings_theme_system\">Systemvorgabe</string>\n    <string name=\"settings_theme_light\">Hell</string>\n    <string name=\"settings_theme_dark\">Dunkel</string>\n    <string name=\"settings_theme_battery\">Durch Energiesparmodus festgelegt</string>\n    <string name=\"built_with_material_components\">Erstellt mit Material Components.</string>\n    <string name=\"wifi_network_and_password\">Netzwerk: %1$s\\nPasswort: %2$s</string>\n    <string name=\"join_network\">Dem Netzwerk beitreten</string>\n    <string name=\"assistant_app_description\">Sagen Sie einfach: \"Hey Google, sprich mit Google I/O 19.\"</string>\n    <string name=\"assistant_app_description2\">Sagen Sie einfach: \"Hey Google, sprich mit Google I/O 19.\"</string>\n    <string name=\"speaker_link_website\">Website</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Veranstaltungen</string>\n    <string name=\"no_network_connection\">Keine Internetverbindung.</string>\n    <string name=\"navigate_up\">Nach oben</string>\n    <string name=\"no_network_description\">Versuchen Sie folgende Schritte, wenn Sie die Funktion \"I/O erkunden\" nutzen möchten:\\n\\n – Flugmodus deaktivieren\\n\\n – Mobile Daten oder WLAN aktivieren\\n\\n – Signalstärke überprüfen</string>\n    <string name=\"phone_does_not_support_arcore_title\">ARCore wird von Ihrem Smartphone nicht unterstützt</string>\n    <string name=\"phone_does_not_support_arcore_message\">Versuchen Sie es mit einem anderen Gerät</string>\n    <string name=\"codelabs_information\">Lernen Sie die neuesten und besten Google-Technologien durch Kurse zum Selbststudium an unseren Programmierständen kennen oder bringen Sie Ihren eigenen Rechner mit und nehmen Sie sich Ihre Arbeit mit nach Hause. Die Stände sind täglich geöffnet, außer während der ersten Keynote.</string>\n    <string name=\"codelabs_building\">Codelabs-Gebäude</string>\n    <string name=\"codelabs_website\">Codelabs-Website</string>\n    <string name=\"codelab_duration\">Dauer: %1$d Min.</string>\n    <string name=\"start_codelab\">Codelab starten</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-de-rCH/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Planen</string>\n    <string name=\"title_home\">Startseite</string>\n    <string name=\"title_map\">Karte</string>\n    <string name=\"title_explore_io\">I/O erkunden</string>\n    <string name=\"title_info\">Info</string>\n    <string name=\"filters\">Filter</string>\n    <string name=\"category_heading_tracks\">Themen</string>\n    <string name=\"category_heading_types\">Art der Veranstaltung</string>\n    <string name=\"reset\">Zurücksetzen</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d Veranstaltung</item>\n        <item quantity=\"other\">%1$d Veranstaltungen</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Ihre markierten und reservierten Veranstaltungen</string>\n    <string name=\"starred_and_reserved_short\">Meine Veranstaltungen</string>\n    <string name=\"search_schedule_hint\">Zeitplan durchsuchen</string>\n    <string name=\"search_schedule_no_results\">Keine Ergebnisse gefunden</string>\n    <string name=\"agenda\">Terminübersicht</string>\n    <string name=\"event_starred\">Veranstaltung wurde Ihren markierten Elementen hinzugefügt</string>\n    <string name=\"event_unstarred\">Veranstaltung aus markierten Elementen entfernt</string>\n    <string name=\"event_star_error\">Fehler beim Hinzufügen der Veranstaltung zu markierten Elementen</string>\n    <string name=\"reservation_error\">Fehler beim Ändern der Reservierung. Warten Sie, bis vorangegangene Anfragen abgeschlossen sind oder versuchen Sie es später noch einmal.</string>\n    <string name=\"reservation_request_succeeded\">Reservierung angefragt.</string>\n    <string name=\"reservation_cancel_succeeded\">Reservierung storniert: \"&lt;b&gt;%s&lt;/b&gt;.\"</string>\n    <string name=\"reservation_new\">Ihr Platz für \"&lt;b&gt;%s&lt;/b&gt;\" ist reserviert.</string>\n    <string name=\"reservation_replaced\">Veranstaltung getauscht.</string>\n    <string name=\"waitlist_new\">Sie stehen auf der Warteliste.</string>\n    <string name=\"waitlist_cancel_succeeded\">Von Warteliste entfernt.</string>\n    <string name=\"got_it\">Ok</string>\n    <string name=\"dont_show\">Nicht anzeigen</string>\n    <string name=\"reservation_denied_cutoff\">Reservierung abgelehnt: zu kurz vor Startzeit.</string>\n    <string name=\"reservation_denied_clash\">Reservierung abgelehnt: Überschneidung mit anderer Reservierung.</string>\n    <string name=\"reservation_denied_unknown\">Reservierung abgelehnt: unbekannter Fehler.</string>\n    <string name=\"cancellation_denied_cutoff\">Stornierung abgelehnt: zu kurz vor Startzeit.</string>\n    <string name=\"cancellation_denied_unknown\">Stornierung abgelehnt: unbekannter Fehler.</string>\n    <string name=\"schedule_filters_empty\">Keine Termine gefunden</string>\n    <string name=\"reservation_reservable\">Platz reservieren</string>\n    <string name=\"reservation_reserved\">Reserviert</string>\n    <string name=\"reservation_waitlisted\">Auf der Warteliste</string>\n    <string name=\"reservation_waitlist_available\">Auf Warteliste setzen</string>\n    <string name=\"reservation_disabled\">Keine Reservierungen verfügbar</string>\n    <string name=\"reservation_pending\">Reservierung ausstehend</string>\n    <string name=\"schedule_hint_title\">Terminplan anpassen</string>\n    <string name=\"schedule_hint_star_event\">Zu markierten Veranstaltungen hinzufügen</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Platz für Sitzung reservieren</string>\n    <string name=\"rate_session\">Sitzung bewerten</string>\n    <string name=\"menu_item_session_location\">Sitzungsstandort</string>\n    <string name=\"menu_item_session_star\">Sitzung markieren</string>\n    <string name=\"menu_item_calendar\">Zum Kalender hinzufügen</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Referenten</string>\n    <string name=\"session_detail_related_header\">Ähnliche Veranstaltungen</string>\n    <string name=\"feedback_submit\">Senden</string>\n    <string name=\"feedback_thank_you\">Vielen Dank für Ihr Feedback!</string>\n    <string name=\"feedback_q1_text\">Wie würden Sie das Niveau der Sitzung allgemein bewerten?</string>\n    <string name=\"feedback_q2_text\">Wie würden Sie die Inhalte der Sitzung anhand Ihrer Erwartungen und der Beschreibung der Sitzung bewerten?</string>\n    <string name=\"feedback_q3_text\">Wie nützlich war die Sitzung für Ihre Projekte?</string>\n    <string name=\"feedback_q4_text\">Wie nützlich war die Sitzung für Ihre Projekte?</string>\n    <string name=\"feedback_q1_label_start\">Sehr grundlegend</string>\n    <string name=\"feedback_q2_label_start\">Uninteressant</string>\n    <string name=\"feedback_q3_label_start\">Schlecht</string>\n    <string name=\"feedback_q4_label_start\">Nicht besonders</string>\n    <string name=\"feedback_q1_label_end\">Ausgezeichnet</string>\n    <string name=\"feedback_q2_label_end\">Ausgezeichnet</string>\n    <string name=\"feedback_q3_label_end\">Äusserst relevant</string>\n    <string name=\"feedback_q4_label_end\">Äusserst</string>\n    <string name=\"a11y_show_navigation\">Navigationsmenü einblenden</string>\n    <string name=\"a11y_collapse_filters_sheet\">Filtertabelle minimieren</string>\n    <string name=\"a11y_clear_tag_filters\">Filter löschen</string>\n    <string name=\"a11y_filter_applied\">%1s Filter angewendet</string>\n    <string name=\"a11y_filter_not_applied\">%1s Filter nicht angewendet</string>\n    <string name=\"a11y_reservation_available\">Platz für Veranstaltung reservieren</string>\n    <string name=\"a11y_reservation_reserved\">Platz für Veranstaltung reserviert</string>\n    <string name=\"a11y_reservation_disabled\">Reservierung nicht verfügbar</string>\n    <string name=\"a11y_reservation_wait_list_available\">Auf Warteliste für Veranstaltung setzen</string>\n    <string name=\"a11y_reservation_wait_listed\">Auf Warteliste für Veranstaltung gesetzt</string>\n    <string name=\"a11y_reservation_pending\">Reservierung ausstehend</string>\n    <string name=\"a11y_starred\">Veranstaltung als Lesezeichen gespeichert</string>\n    <string name=\"a11y_unstarred\">Veranstaltung nicht als Lesezeichen gespeichert</string>\n    <string name=\"a11y_star\">Markieren</string>\n    <string name=\"a11y_play\">Video abspielen</string>\n    <string name=\"a11y_select_map_mode\">Kartenmodus auswählen</string>\n    <string name=\"a11y_search_schedule\">Zeitplan suchen</string>\n    <string name=\"welcome\">Willkommen!</string>\n    <string name=\"a11y_signed_in_content_description\">Angemeldet als %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Zum Anmelden tippen.</string>\n    <string name=\"dialog_sign_in_content\">Melden Sie sich an, um Veranstaltungen zu speichern, Plätze zu reservieren und Sitzungen zu bewerten (als Teilnehmer). Die Aktionen mit Ihrem Konto werden in der App und auf der Website synchronisiert.</string>\n    <string name=\"sign_in\">Anmelden</string>\n    <string name=\"firebase_auth_no_network_connection\">Keine Internetverbindung</string>\n    <string name=\"firebase_auth_unknown_error\">Unbekannter Fehler</string>\n    <string name=\"dialog_sign_out_content\">Alle gespeicherten Veranstaltungen, Platzreservierungen und Sitzungsbewertungen (von Teilnehmern) werden in Ihrem Konto synchronisiert.</string>\n    <string name=\"sign_out\">Abmelden</string>\n    <string name=\"manage_google_account\">Hier können Sie Ihr Google-Konto verwalten</string>\n    <string name=\"remove_reservation_title\">Reservierung entfernen?</string>\n    <string name=\"remove_reservation_content\">Sie sind dabei, Ihren Platz für \"%1$s\" zu stornieren. Wenn Sie Ihre Reservierung stornieren, aber kurzfristig doch noch teilnehmen möchten: Bei allen Sitzungen wird eine bestimmte Anzahl von Plätzen direkt vor Ort an die ersten eintreffenden Interessenten vergeben.</string>\n    <string name=\"cancel\">Abbrechen</string>\n    <string name=\"remove\">Entfernen</string>\n    <string name=\"swap_reservation_title\">Reservierung tauschen?</string>\n    <string name=\"swap_reservation_content\">Sie haben bereits eine Reservierung bzw. stehen auf der Warteliste für \"%1$s\". Es ist nur eine Reservierung pro Zeitblock zulässig. Möchten Sie den Tausch gegen \"%2$s\" vornehmen?</string>\n    <string name=\"swap\">Tauschen</string>\n    <string name=\"notifications_preference_dialog_title\">I/O-Benachrichtigungen</string>\n    <string name=\"notifications_preference_dialog_content\">Möchten Sie Benachrichtigungen zu I/O erhalten? Dann senden wir Ihnen Informationen zu Anfangszeiten von Sitzungen, Rahmenprogramm, Sitzungsaufzeichnungen und vieles mehr. Diese Einstellung können Sie unter \"Info &gt; Settings\" (Informationen &gt; Einstellungen) jederzeit ändern.</string>\n    <string name=\"no\">Nein</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"feed_not_available\">Keine Ankündigungen gefunden.</string>\n    <string name=\"feed_loading_error\">Feed konnte nicht geladen werden. Versuchen Sie es später noch einmal.</string>\n    <string name=\"feed_announcement_title\">Ankündigungen</string>\n    <string name=\"feed_upcoming_events\">Veranstaltungstipps</string>\n    <string name=\"feed_saved_events\">Gespeicherte Veranstaltungen</string>\n    <string name=\"feed_no_saved_events\">Keine gespeicherten Termine</string>\n    <string name=\"feed_view_all_events\">Alle Termine anzeigen</string>\n    <string name=\"feed_view_your_schedule\">Terminübersicht ansehen</string>\n    <string name=\"feed_watch_live_stream\">Livestream ansehen</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s Tag</item>\n        <item quantity=\"other\">%s Tage</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s  Stunde</item>\n        <item quantity=\"other\">%s Stunden</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s Minute</item>\n        <item quantity=\"other\">%s Minuten</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s Sekunde</item>\n        <item quantity=\"other\">%s Sekunden</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Sitzung teilen</string>\n    <string name=\"share_text_session_detail\">%1$s bei #io19 %2$s ansehen</string>\n    <string name=\"intent_chooser_session_detail\">Teilen</string>\n    <string name=\"map_variant_after_dark\">After Dark</string>\n    <string name=\"map_variant_concert\">Konzert</string>\n    <string name=\"map_variant_daytime\">Tagsüber</string>\n    <string name=\"enable_my_location\">\"Mein Standort\" aktivieren</string>\n    <string name=\"my_location_rationale\">Die App benötigt die Berechtigung zur Standortermittlung, um Ihren Standort auf der Karte anzuzeigen.</string>\n    <string name=\"onboarding_get_started\">Jetzt starten</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Willkommen bei Google I/O</string>\n    <string name=\"onboarding_date_location\">7.–9. Mai 2019\\nMountain View, CA, USA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Bald ist Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Zusammenfassung der I/O 19 ansehen und mit #io19 in den sozialen Netzwerken mehr erfahren</string>\n    <string name=\"onboarding_signin\">Melden Sie sich an, um I/O-Benachrichtigungen zu erhalten und als Teilnehmer Sitzplätze für Tagungen zu reservieren.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">Sitzung beginnt in %1$s Minute</item>\n        <item quantity=\"other\">Sitzung beginnt in %1$s Minuten</item>\n    </plurals>\n    <string name=\"expanded\">Maximiert</string>\n    <string name=\"collapsed\">Minimiert</string>\n    <string name=\"event_title\">Veranstaltung</string>\n    <string name=\"travel_title\">Anreise</string>\n    <string name=\"faq_title\">FAQ</string>\n    <string name=\"settings_title\">Einstellungen</string>\n    <string name=\"about_title\">Info</string>\n    <string name=\"travel_what_to_bring_title\">Was Sie für das Event mitbringen sollten</string>\n    <string name=\"travel_hotels_title\">Hotels</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Mountain View erreichen</string>\n    <string name=\"travel_getting_to_shoreline_title\">Mountain View erreichen</string>\n    <string name=\"travel_shuttle_service_title\">Shuttleservice</string>\n    <string name=\"travel_off_site_parking_title\">Parkplätze ausserhalb des Geländes</string>\n    <string name=\"travel_for_public_transportation_title\">Öffentliche Verkehrsmittel</string>\n    <string name=\"travel_biking_title\">Mit dem Fahrrad</string>\n    <string name=\"travel_ridesharing_title\">Mitfahrportale</string>\n    <string name=\"travel_airport_transfers_title\">Flughafentransfer</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O ist ein Festival im Freien. Allein das macht I/O schon zu etwas ganz Besonderem. Das bedeutet aber auch, dass einige Dinge zu beachten sind. Die Tagungen finden in klimatisierten Zelten statt, aber Sonnenschutzmittel, Sonnenbrillen und zusätzliche Kleidung für die kälteren Abende werden empfohlen. I/O ist ein legeres Event. Beachte Sie das, wenn Sie überlegen, was Sie anziehen sollen.</string>\n    <string name=\"travel_hotels_description\">Wir haben in vielen örtlichen Hotels Zimmer reserviert. Die Liste der Hotels und die Verfügbarkeit der Zimmer werden regelmässig aktualisiert. Bitte benutzen Sie die nachstehende Karte, um das für Sie beste Hotel zu finden. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Hotelkarte&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Hier sind die drei grossen Flughäfen in der Bay Area mit internationalem Flugverkehr:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Francisco International Airport (SFO)&lt;/a&gt; ~24 Meilen&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Oakland International Airport (OAK)&lt;/a&gt; ~32 Meilen&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Jose International Airport (SJC)&lt;/a&gt; ~12 Meilen</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 hat sich verpflichtet, ein „Event ohne Parkplätze*“ zu sein, um Verkehrsstaus und CO2-Emissionen zu reduzieren. Diese Entscheidung wurde sorgfältig erwogen und wir bieten Ihnen viele kostenlose Optionen an, um zur Veranstaltung zu gelangen, ohne ein Fahrzeug zu benötigen.&lt;br&gt;&lt;br&gt;Je näher die Veranstaltung rückt, desto mehr Informationen erhalten Sie.&lt;br&gt;&lt;br&gt;*Behindertenparkplätze stehen zur Verfügung.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 hat sich verpflichtet, ein „Event ohne Parkplätze*“ zu sein, um Verkehrsstaus und CO2-Emissionen zu reduzieren. Diese Entscheidung wurde sorgfältig erwogen und wir bieten Ihnen viele kostenlose Optionen an, um zur Veranstaltung zu gelangen, ohne ein Fahrzeug zu benötigen.&lt;br&gt;&lt;br&gt;Je näher die Veranstaltung rückt, desto mehr Informationen erhalten Sie.&lt;br&gt;&lt;br&gt;*Behindertenparkplätze stehen zur Verfügung.</string>\n    <string name=\"travel_off_site_parking_description\">Kostenlose Parkplätze befinden sich im &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;. Shuttles von Avaya werden zu/von Google I/O zur Verfügung gestellt.&lt;br&gt;&lt;br&gt; Geben Sie bitte auf Ihrem Registrierungsformular an, ob Sie besondere Unterstützung benötigen. Das Planungsteam wird sich dann mit Ihnen in Verbindung setzen.</string>\n    <string name=\"travel_for_public_transportation_description\">Wir bieten Ihnen Prepaid-Tickets für den öffentlichen Nahverkehr an, die während der Voranmeldung zur Abholung zur Verfügung stehen. Die öffentlichen Verkehrsmittel in die Umgebung erreichen Sie über:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Regionales Eisenbahnsystem&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Stadtbahn, die die South Bay bedient&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Rapid Transit in der Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Regionalbahnsystem&lt;br&gt;&lt;br&gt; Öffentliche Verkehrsmittel führen nicht direkt zu Google I/O. Weitere Informationen zu den Haltestellen der Event-Shuttles zur Google I/O folgen.</string>\n    <string name=\"travel_biking_description\">Am Shoreline Amphitheatre stehen innerhalb von Parkplatz A kostenlose Fahrradparkplätze zur Verfügung. Die Silicon Valley Bicycle Coalition bietet sicheres Fahrradparken mit Valet-Service ab 7:00 Uhr morgens bis zum Veranstaltungsende am jeweiligen Tag. Es gibt zwei Wege zum Shoreline Amphitheatre, die sich gut für Radfahrer eignen, den Stevens Creek Trail und den Permanente Creek Trail.</string>\n    <string name=\"travel_ridesharing_description\">Am letzten Tag der Veranstaltung wird ein Flughafentransfer vom Google I/O zum SFO und SJC angeboten. An anderen Tagen werden KEINE Flughafentransfers angeboten.</string>\n    <string name=\"travel_airport_transfers_description\">Am letzten Tag der Veranstaltung wird ein Flughafentransfer vom Google I/O zum SFO und SJC angeboten. An anderen Tagen werden KEINE Flughafentransfers angeboten.</string>\n    <string name=\"faq_when_and_where_title\">Wann und wo findet die Google I/O 2019 statt?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Wie kann ich über Google I/O auf dem Laufenden bleiben?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Finden alle Veranstaltungen in englischer Sprache statt?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Kann ich Tagungen vor der Veranstaltung reservieren?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Wie kommt man am besten zum Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Wo und wann kann ich mein Ansteckschild abholen?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Ich möchte bei der Keynote-Veranstaltung in der ersten Reihe sitzen. Was kann ich tun?</string>\n    <string name=\"faq_what_should_i_wear_title\">Gibt es einen Dresscode?</string>\n    <string name=\"faq_onsite_food_options_title\">Ich esse gern etwas zwischendurch. Welche Möglichkeiten gibt es vor Ort dafür?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Wenn ich am Veranstaltungsort etwas verliere, wo finde ich es wieder?</string>\n    <string name=\"faq_after_dark_program_title\">Die After Dark-Programmpunkte klingen interessant. Sollte ich hingehen?</string>\n    <string name=\"faq_accessibility_needs_title\">Ist die Veranstaltung barrierefrei?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Wie unterstützen Sie werdende Mütter und Eltern, die am I/O teilnehmen?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google Community-Richtlinien für Veranstaltungen und Richtlinie gegen Belästigung</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Werden die Tagungen live übertragen? Was passiert, wenn ich die Veranstaltung nicht in Echtzeit verfolgen kann?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Ich möchte I/O mit meiner Community feiern.  Haben Sie Ideen dazu?</string>\n    <string name=\"faq_when_and_where_description\">Besuchen Sie die &lt;a href=\"https://events.google.com/io/\"&gt;Website von Google I/O 2019&lt;/a&gt; und den &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers Blog&lt;/a&gt;, um immer die neuesten Informationen zu Veranstaltungen, Referenten und allgemeinen Aktivitäten zu erhalten. Folgen Sie uns ausserdem auf &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; und &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Über den offiziellen Hashtag &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; können Sie sich in sozialen Netzwerken mit anderen über die Google I/O 2019 austauschen. Ausserdem erhalten alle registrierten Teilnehmer wichtige Informationen und Check-In-Hinweise vorab per E-Mail.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Besuchen Sie die &lt;a href=\"https://events.google.com/io/\"&gt;Website von Google I/O 2019&lt;/a&gt; und den &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers Blog&lt;/a&gt;, um immer die neuesten Informationen zu Veranstaltungen, Referenten und allgemeinen Aktivitäten zu erhalten. Folgen Sie uns ausserdem auf &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; und &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Über den offiziellen Hashtag &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; können Sie sich in sozialen Netzwerken mit anderen über die Google I/O 2019 austauschen. Ausserdem erhalten alle registrierten Teilnehmer wichtige Informationen und Check-In-Hinweise vorab per E-Mail.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Ja. So kann unsere Zielgruppe weltweit die Veranstaltungen verfolgen.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Ab April können Besucher vor Ort Sitzplätze für Tagungen vor der Veranstaltung auf der I/O-Website und auch über die I/O-Mobile App reservieren (Hinweis: Ein Teil der Tagungssitzplätze ist von der Reservierung ausgenommen. Diese werden nach der Reihenfolge des Eintreffens vergeben). Auch die Plätze für Codelabs, App Reviews und Office Hours werden nach der Reihenfolge des Eintreffens vergeben.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Im Abschnitt \"Travel\" (Reisen) finden Sie alle wichtigen Reisetipps, einschliesslich Informationen zum Shuttle, Wegbeschreibungen fürs Auto und Fahrrad, Tipps für Mitfahrgelegenheiten und vieles mehr.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Wir geben die Ansteckschilder schon ab Montag, dem 06. Mai im Shoreline Amphitheatre aus, um den Check-in zu beschleunigen. Damit wir Ihnen Ihr Ansteckschild für die Google I/O ausstellen können, beachten Sie bitte die folgenden Punkte:&lt;br&gt; – Sie müssen einen Lichtbildausweis vorlegen. Dies kann ein Führerschein, Reisepass oder ein vergleichbares, amtliches Ausweisdokument sein. Wenn Sie sich nicht korrekt ausweisen können, erhalten Sie kein Ansteckschild und können nicht an der Konferenz teilnehmen. Der Name auf dem Ausweis muss exakt mit dem bei der Registrierung angegebenen Namen übereinstimmen. Als wissenschaftlicher Teilnehmer müssen Sie ausserdem einen Nachweis darüber erbringen, dass Sie die Voraussetzungen erfüllen.&lt;br&gt; – Scannen Sie den QR-Code, den Sie per E-Mail für die Registrierung erhalten haben. Sie können diesen mit Ihrem Smartphone scannen, die E-Mail muss dazu nicht ausgedruckt werden. #Umweltschutz &lt;br&gt;&lt;br&gt;Ihr Ansteckschild ist nicht übertragbar, es darf also nicht an andere Personen weitergegeben oder gemeinsam mit anderen Personen genutzt werden. Wichtig dabei ist, dass die Ansteckschilder für die Google I/O nicht ersetzt werden können. Verlieren Sie Ihres also nicht, sonst werden Sie nicht wieder in den Konferenzbereich vorgelassen. Sie müssen Ihr Ansteckschild während der gesamten Google I/O tragen; dies gilt auch für die einzelnen Tagungen, Sandboxes und \"After Hours\". Auf Verlangen der Sicherheitskräfte müssen Sie Ihr Ansteckschild vorzeigen und sich ggf. zusätzlich ausweisen. Die Ansteckschilder für die Google I/O können Ihren Namen, den Namen Ihres Unternehmens bzw. Ihrer Organisation (falls angegeben) und ein Foto enthalten.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Bei den Keynotes ist zwar für jeden Teilnehmer ein Sitzplatz garantiert, aber die besten Plätze werden beim Abholen der Ansteckschilder am 06. Mai ab 7.00 Uhr nach der Reihenfolge des Eintreffens vergeben. Seien Sie also frühzeitig da.</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O ist eine Open-Air-Veranstaltung für Entwickler. Kleiden Sie sich leger und bequem, einen bestimmten Dresscode gibt es nicht. In der Bay Area kann es tagsüber sehr warm, abends aber kühl werden, denken Sie bei der Auswahl der Kleidung daran.</string>\n    <string name=\"faq_onsite_food_options_description\">Für das leibliche Wohl ist bestens gesorgt.  An allen drei Konferenztagen erhalten die Teilnehmer ein kostenloses Frühstück, Mittagessen und Snacks. Am ersten und zweiten Tag wird auch ein Abendessen während der After-Hour-Veranstaltungen angeboten.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Wir helfen Ihnen. Das Fundbüro befindet sich während der Veranstaltungszeiten am Konferenzinformationsschalter. Alle Gegenstände, die bis zum nächsten Tag nicht abgeholt wurden, werden dem Conference Security Office übergeben. Ein wichtiger Hinweis: Die Ansteckschilder für die Google I/O können NICHT ersetzt werden. Verlieren Sie Ihres also nicht, sonst werden Sie nicht wieder in den Konferenzbereich vorgelassen.</string>\n    <string name=\"faq_after_dark_program_description\">Das sind zwei Nächte, die Sie nicht verpassen sollten. Die Teilnehmer können am 08. Mai abends Musik, Spiele und mehr geniessen. Am 09. Mai findet im Amphitheater ein exklusives Konzert statt. An beiden Abenden sind Speisen und Getränke erhältlich (alkoholische Getränke ab 21 Jahren). Beide After-Hour-Veranstaltungen finden im Shoreline Amphitheatre statt. Für den Eintritt ist Ihr Teilnehmerausweis erforderlich.</string>\n    <string name=\"faq_accessibility_needs_description\">Bei den Behindertenparkplätzen stehen auch Parkplätze für werdende Mütter zur Verfügung.&lt;br&gt; Stillende Mütter können mit ihrem Kind an der Konferenz teilnehmen. Am 07. und 08. Mai sind von 08:00 bis 20:00 Uhr und am 09. Mai von 08:00 bis 16:00 Uhr vier Wickelräume vorhanden. Anmeldeunterlagen werden vor den Zimmern der Mütter zur Verfügung stehen. Die Verwendung wird nach der Reihenfolge des Eintreffens vergeben. Weitere Informationen erhalten Sie am Informationsstand.&lt;br&gt;&lt;br&gt; Eltern, die Interesse an der Kinderbetreuung haben und die sich über unser Anmeldeformular angemeldet haben, erhalten eine Rückerstattung von 100 $ pro Tag (bis zu 300 $ insgesamt). Auch diese Plätze werden nach der Reihenfolge des Eintreffens vergeben. Unsere Rückerstattung der Kinderbetreuung wird von einem Drittanbieter angeboten. Wenn Ihr Antrag auf Kinderbetreuung vor Beginn der Konferenz von uns per E-Mail genehmigt und Ihre Anwesenheit vor Ort bestätigt wird, wird sich unser Anbieter innerhalb von 7 Werktagen nach der Google I/O mit den nächsten Schritten bei Ihnen melden. Dieser wird dann alle Auszahlungen für unsere Kinderbetreuungszahlungen leisten.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Bei den Behindertenparkplätzen stehen auch Parkplätze für werdende Mütter zur Verfügung.&lt;br&gt; Stillende Mütter können mit ihrem Kind an der Konferenz teilnehmen. Am 07. und 08. Mai sind von 08:00 bis 20:00 Uhr und am 09. Mai von 08:00 bis 16:00 Uhr vier Wickelräume vorhanden. Anmeldeunterlagen werden vor den Zimmern der Mütter zur Verfügung stehen. Die Verwendung wird nach der Reihenfolge des Eintreffens vergeben. Weitere Informationen erhalten Sie am Informationsstand.&lt;br&gt;&lt;br&gt; Eltern, die Interesse an der Kinderbetreuung haben und die sich über unser Anmeldeformular angemeldet haben, erhalten eine Rückerstattung von 100 $ pro Tag (bis zu 300 $ insgesamt). Auch diese Plätze werden nach der Reihenfolge des Eintreffens vergeben. Unsere Rückerstattung der Kinderbetreuung wird von einem Drittanbieter angeboten. Wenn Ihr Antrag auf Kinderbetreuung vor Beginn der Konferenz von uns per E-Mail genehmigt und Ihre Anwesenheit vor Ort bestätigt wird, wird sich unser Anbieter innerhalb von 7 Werktagen nach der Google I/O mit den nächsten Schritten bei Ihnen melden. Dieser wird dann alle Auszahlungen für unsere Kinderbetreuungszahlungen leisten.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google legt grossen Wert darauf, ein belästigungsfreies und inklusives Veranstaltungserlebnis für alle zu bieten, unabhängig von Geschlechtsidentität und -ausdruck, sexueller Orientierung, Behinderungen, Neurodiversität, körperlicher Erscheinung, Körpergrösse, ethnischer Herkunft, Nationalität, Rasse, Alter, Religion oder einer anderen geschützten Eigenschaft. Um die Veranstaltung so inklusiv wie möglich zu gestalten, werden geschlechtsneutrale Toiletten im gesamten Veranstaltungsort angeboten.&lt;br&gt;&lt;br&gt; Wir dulden keine Belästigung von Teilnehmern der Veranstaltung in irgendeiner Form.&lt;br&gt; Google nimmt Verstösse gegen die Richtlinien sehr ernst und wird entsprechend reagieren. Weitere Informationen zu den Google Community-Richtlinien und den Richtlinien zur Bekämpfung von Belästigungen &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;finden Sie hier&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Die beiden Keynotes und alle Tagungen werden während der drei Festivaltage auf der Homepage der Event-Website live übertragen. Wenn Sie zu dieser Zeit arbeiten müssen oder aus einem anderen Grund keine Zeit haben, können Sie sich später auf dem &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers YouTube-Kanal&lt;/a&gt; die Aufzeichnungen der Tagungen ansehen.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Ja! Jedes Jahr veranstalten Entwickler auf der ganzen Welt &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended-Events&lt;/a&gt;. Während dieser Veranstaltungen können Veranstalter diese live übertragen und ihre eigenen Tagungen veranstalten, darunter Hackathons, Codelabs, Demos und vieles mehr.&lt;br&gt; Wenn Sie dieses Jahr als Gastgeber für I/O Extended dabei sind, sollten Sie zuerst die folgenden Schritte ausführen:&lt;br&gt;&lt;br&gt; Lesen Sie sich die &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Organisator-Anleitung&lt;/a&gt; durch, um Tipps und Vorschläge für eine erfolgreiche Veranstaltung zu erhalten.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"Registrieren&lt;/a&gt; Sie sich für Ihre öffentliche Veranstaltung auf der I/O-Website, um die Sichtbarkeit zu erhöhen.&lt;br&gt;&lt;br&gt; Verwenden Sie den offiziellen Hashtag #io19extended für all Ihre Posts in sozialen Netzwerken im Zusammenhang mit I/O Extended, um leichter gefunden zu werden.&lt;br&gt;&lt;br&gt; Hinweis: Veranstalter von I/O Extended können nach Ende der Veranstaltung das Löschen ihrer persönlichen Daten und/oder Veranstaltungsdaten anfordern. Schicken Sie dazu eine E-Mail an io19@google.com.&lt;br&gt; Wenn Sie nur an einer I/O Extended-Veranstaltung teilnehmen möchten, suchen Sie auf &lt;a href=\"https://events.google.com/io/extended\"&gt;unserer Karte&lt;/a&gt; eine heraus, die in Ihrer Nähe stattfindet, und melden Sie sich an.&lt;br&gt; Wenn Sie Fragen zum Programm von I/O Extended haben, wenden Sie sich an io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Sitzungen anzeigen</string>\n    <string name=\"wifi_install_success\">WLAN gespeichert</string>\n    <string name=\"wifi_install_clipboard_message\">WLAN konnte nicht gespeichert werden.\\nDas Passwort wurde in der Zwischenablage gespeichert.</string>\n    <string name=\"event_sessions_title\">Sitzungen</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours und App-Rezensionen</string>\n    <string name=\"event_afterhours_title\">Rahmenprogramm</string>\n    <string name=\"event_meals_title\">Verpflegung</string>\n    <string name=\"event_sessions_description\">Ab April können Besucher vor Ort Sitzplätze für Tagungen vor der Veranstaltung auf der I/O-Website und auch über die I/O-Mobile App reservieren (Hinweis: Ein Teil der Tagungssitzplätze ist von der Reservierung ausgenommen. Diese werden nach der Reihenfolge des Eintreffens vergeben). Auch die Plätze für Codelabs, App Reviews und Office Hours werden nach der Reihenfolge des Eintreffens vergeben.</string>\n    <string name=\"event_sandbox_description\">Spezielle Bereiche zum Erkunden, Lernen und spielerischen Experimentieren mit unseren neuesten Produkten und Plattformen – anhand von interaktiven Demos, physischen Installationen und vielem mehr.</string>\n    <string name=\"event_codelabs_description\">Sammeln Sie an unseren Programmierständen praktische Erfahrungen. Hier finden Sie alles, was Sie brauchen, um mithilfe von Onlinekursen zum Selbststudium die neuesten und besten Google-Technologien kennenzulernen – oder bringen Sie Ihren eigenen Rechner mit und nehmen Sie sich Arbeit mit nach Hause. Die anwesenden Mitarbeiter von Google geben Ihnen gern nützliche Tipps und helfen Ihnen, wenn Sie mal nicht weiterkommen.</string>\n    <string name=\"event_officehours_description\">Im Rahmen der Office Hours haben Sie Gelegenheit, Experten von Google all Ihre technischen Fragen persönlich zu stellen, und bei den App Reviews erhalten Sie Beratung und Tipps zu Ihren spezifischen App-Projekten.</string>\n    <string name=\"event_afterhours_description\">An zwei Abenden findet nach dem Ende der Sitzungen in der Nähe des Shoreline ein Rahmenprogramm mit Essen, Getränken und Unterhaltung statt. Am ersten Abend gibt es eine Party in den Räumen von Sandbox und am zweiten veranstalten wir ein exklusives Konzert im Amphitheatre.</string>\n    <string name=\"event_meals_description\">Die Teilnehmer erhalten an allen drei Tagen der Konferenz kostenlos Frühstück, Mittagessen und Snacks. Während der After-Hours-Veranstaltungen an den ersten beiden Tagen wird auch ein Abendessen angeboten.</string>\n    <string name=\"wifi_header\">WLAN</string>\n    <string name=\"related_apps_header\">Ähnliche Apps</string>\n    <string name=\"event_types_header\">Veranstaltungsarten</string>\n    <string name=\"settings_time_zone_label\">Veranstaltungen in der Zeitzone \"Pacific Standard Time\" (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Benachrichtigungen aktivieren</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Anonyme Nutzungsstatistiken senden</string>\n    <string name=\"settings_tos\">Nutzungsbedingungen</string>\n    <string name=\"settings_privacy_policy\">Datenschutzerklärung</string>\n    <string name=\"settings_oss_licenses\">Open-Source-Lizenzen</string>\n    <string name=\"settings_theme_title\">Design auswählen</string>\n    <string name=\"settings_theme_system\">Systemvorgabe</string>\n    <string name=\"settings_theme_light\">Hell</string>\n    <string name=\"settings_theme_dark\">Dunkel</string>\n    <string name=\"settings_theme_battery\">Durch Energiesparmodus festgelegt</string>\n    <string name=\"built_with_material_components\">Erstellt mit Material Components.</string>\n    <string name=\"wifi_network_and_password\">Netzwerk: %1$s\\nPasswort: %2$s</string>\n    <string name=\"join_network\">Dem Netzwerk beitreten</string>\n    <string name=\"assistant_app_description\">Sagen Sie einfach: \"Hey Google, sprich mit Google I/O 19.\"</string>\n    <string name=\"assistant_app_description2\">Sagen Sie einfach: \"Hey Google, sprich mit Google I/O 19.\"</string>\n    <string name=\"speaker_link_website\">Website</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Veranstaltungen</string>\n    <string name=\"no_network_connection\">Keine Internetverbindung.</string>\n    <string name=\"navigate_up\">Nach oben</string>\n    <string name=\"no_network_description\">Versuchen Sie folgende Schritte, wenn Sie die Funktion \"I/O erkunden\" nutzen möchten:\\n\\n – Flugmodus deaktivieren\\n\\n – Mobile Daten oder WLAN aktivieren\\n\\n – Signalstärke überprüfen</string>\n    <string name=\"phone_does_not_support_arcore_title\">ARCore wird von Ihrem Smartphone nicht unterstützt</string>\n    <string name=\"phone_does_not_support_arcore_message\">Versuchen Sie es mit einem anderen Gerät</string>\n    <string name=\"codelabs_information\">Lernen Sie die neuesten und besten Google-Technologien durch Kurse zum Selbststudium an unseren Programmierständen kennen oder bringen Sie Ihren eigenen Rechner mit und nehmen Sie sich Ihre Arbeit mit nach Hause. Die Stände sind täglich geöffnet, ausser während der ersten Keynote.</string>\n    <string name=\"codelabs_building\">Codelabs-Gebäude</string>\n    <string name=\"codelabs_website\">Codelabs-Website</string>\n    <string name=\"codelab_duration\">Dauer: %1$d Min.</string>\n    <string name=\"start_codelab\">Codelab starten</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rAR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rBO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rCL/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rCO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rCR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rDO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rEC/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rGT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rHN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rMX/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rNI/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rPA/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rPE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rPR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rPY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rSV/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rUS/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rUY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-es-rVE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programa</string>\n    <string name=\"title_home\">Página principal</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explora I/O</string>\n    <string name=\"title_info\">Información</string>\n    <string name=\"filters\">Filtrar</string>\n    <string name=\"category_heading_tracks\">Temas</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Restablecer</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Tus eventos reservados y destacados con estrellas</string>\n    <string name=\"starred_and_reserved_short\">Tus eventos</string>\n    <string name=\"search_schedule_hint\">Buscar en el programa</string>\n    <string name=\"search_schedule_no_results\">No hay resultados</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Se agregó el evento a tus elementos con estrellas</string>\n    <string name=\"event_unstarred\">Se quitó el evento de los elementos destacados con estrellas</string>\n    <string name=\"event_star_error\">Se produjo un error cuando se agregó el evento a los elementos destacados con estrellas</string>\n    <string name=\"reservation_error\">Se produjo un error cuando se hicieron cambios en la reserva. Espera a que las solicitudes anteriores terminen o vuelve a intentarlo más tarde.</string>\n    <string name=\"reservation_request_succeeded\">Se solicitó la reserva.</string>\n    <string name=\"reservation_cancel_succeeded\">Se canceló la reserva \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Se reservó tu puesto para \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Se reemplazó el evento.</string>\n    <string name=\"waitlist_new\">Estás en la lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Ya no estás en la lista de espera.</string>\n    <string name=\"got_it\">Entendido</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Se rechazó la reserva debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"reservation_denied_clash\">Se rechazó la reserva debido a que se superpone con otra.</string>\n    <string name=\"reservation_denied_unknown\">Se rechazó la reserva debido a un error desconocido.</string>\n    <string name=\"cancellation_denied_cutoff\">Se rechazó la cancelación debido a que la hora de inicio está demasiado próxima.</string>\n    <string name=\"cancellation_denied_unknown\">Se rechazó la cancelación debido a un error desconocido.</string>\n    <string name=\"schedule_filters_empty\">No se encontraron eventos.</string>\n    <string name=\"reservation_reservable\">Reservar puesto</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">En lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Unirse a la lista de espera</string>\n    <string name=\"reservation_disabled\">No hay reservas disponibles</string>\n    <string name=\"reservation_pending\">Reserva pendiente</string>\n    <string name=\"schedule_hint_title\">Personaliza tu programa</string>\n    <string name=\"schedule_hint_star_event\">Agregar a tus eventos destacados con estrellas</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar un puesto en la sesión</string>\n    <string name=\"rate_session\">Calificar sesión</string>\n    <string name=\"menu_item_session_location\">Ubicación de la sesión</string>\n    <string name=\"menu_item_session_star\">Destacar la sesión con estrella</string>\n    <string name=\"menu_item_calendar\">Agregar al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Expositores</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">¡Gracias por tus comentarios!</string>\n    <string name=\"feedback_q1_text\">¿Cómo calificarías la calidad general de la sesión?</string>\n    <string name=\"feedback_q2_text\">¿Cómo describirías el contenido de la sesión según tus expectativas y su descripción?</string>\n    <string name=\"feedback_q3_text\">¿Qué relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q4_text\">¿Cuánta relevancia tuvo la sesión para tus proyectos?</string>\n    <string name=\"feedback_q1_label_start\">Muy básica</string>\n    <string name=\"feedback_q2_label_start\">Pobre</string>\n    <string name=\"feedback_q3_label_start\">Malos</string>\n    <string name=\"feedback_q4_label_start\">Poca</string>\n    <string name=\"feedback_q1_label_end\">Extraordinarios</string>\n    <string name=\"feedback_q2_label_end\">Extraordinario</string>\n    <string name=\"feedback_q3_label_end\">Mucha</string>\n    <string name=\"feedback_q4_label_end\">Mucha</string>\n    <string name=\"a11y_show_navigation\">Mostrar el menú de navegación</string>\n    <string name=\"a11y_collapse_filters_sheet\">Colocar la hoja de filtros más abajo</string>\n    <string name=\"a11y_clear_tag_filters\">Borrar filtros</string>\n    <string name=\"a11y_filter_applied\">Se aplicó el filtro %1s</string>\n    <string name=\"a11y_filter_not_applied\">No se aplicó el filtro %1s</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">La reserva no está disponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Unirse a la lista de espera del evento</string>\n    <string name=\"a11y_reservation_wait_listed\">En la lista de espera del evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendiente</string>\n    <string name=\"a11y_starred\">Se agregó el evento a los favoritos</string>\n    <string name=\"a11y_unstarred\">No se agregó el evento a los favoritos</string>\n    <string name=\"a11y_star\">Destacar</string>\n    <string name=\"a11y_play\">Reproducir video</string>\n    <string name=\"a11y_select_map_mode\">Seleccionar el modo Mapa</string>\n    <string name=\"a11y_search_schedule\">Buscar programa</string>\n    <string name=\"welcome\">¡Te damos la bienvenida!</string>\n    <string name=\"a11y_signed_in_content_description\">Accediste como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Presiona para acceder.</string>\n    <string name=\"dialog_sign_in_content\">Accede a tu cuenta para guardar eventos, reservar puestos y calificar sesiones (si asistes a ellas). Las acciones se sincronizarán en la app y el sitio desde tu cuenta.</string>\n    <string name=\"sign_in\">Acceder</string>\n    <string name=\"firebase_auth_no_network_connection\">No hay conexión a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Error desconocido</string>\n    <string name=\"dialog_sign_out_content\">Todos los eventos guardados, las reservas de puestos y las calificaciones de sesiones (si asistes a ellas) permanecerán sincronizados con tu cuenta.</string>\n    <string name=\"sign_out\">Salir</string>\n    <string name=\"manage_google_account\">Administrar tu Cuenta de Google</string>\n    <string name=\"remove_reservation_title\">¿Deseas quitar la reserva?</string>\n    <string name=\"remove_reservation_content\">Estás a punto de abandonar tu puesto para \"%1$s\". Si decides no reservar un puesto, pero aún quieres asistir, todas las sesiones contarán con puestos disponibles en el sitio para las primeras personas que lleguen y los ocupen.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Quitar</string>\n    <string name=\"swap_reservation_title\">¿Deseas intercambiar la reserva?</string>\n    <string name=\"swap_reservation_content\">¿Ya tienes una reserva para \"%1$s\" o estás en la lista de espera? Solo se permite una reserva por bloque de tiempo. ¿Deseas cambiarte a \"%2$s\"?</string>\n    <string name=\"swap\">Cambiar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificaciones de I/O</string>\n    <string name=\"notifications_preference_dialog_content\">¿Deseas recibir notificaciones sobre I/O? Enviaremos información sobre las horas de inicio de las sesiones, los eventos posteriores a las sesiones, las grabaciones de las sesiones y mucho más. Puedes cambiar esta configuración en cualquier momento en \"Información &gt; Configuración\".</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"feed_not_available\">No se encontraron anuncios.</string>\n    <string name=\"feed_loading_error\">No se pudo cargar el feed. Vuelve a intentarlo más tarde.</string>\n    <string name=\"feed_announcement_title\">Anuncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos guardados</string>\n    <string name=\"feed_no_saved_events\">Sin eventos guardados</string>\n    <string name=\"feed_view_all_events\">Ver todos los eventos</string>\n    <string name=\"feed_view_your_schedule\">Mira tu programa</string>\n    <string name=\"feed_watch_live_stream\">Mira la transmisión en vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s día</item>\n        <item quantity=\"other\">%s días</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartir sesión</string>\n    <string name=\"share_text_session_detail\">Mira la sesión %1$s en #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartir</string>\n    <string name=\"map_variant_after_dark\">Después de la oscuridad</string>\n    <string name=\"map_variant_concert\">Concierto</string>\n    <string name=\"map_variant_daytime\">Durante el día</string>\n    <string name=\"enable_my_location\">Habilitar mi ubicación</string>\n    <string name=\"my_location_rationale\">Para mostrar tu ubicación en el mapa, la app necesita el permiso correspondiente.</string>\n    <string name=\"onboarding_get_started\">Comenzar</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Te damos la bienvenida a Google I/O</string>\n    <string name=\"onboarding_date_location\">Del 7 al 9 de mayo de 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Se acerca Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Mira el resumen de I/O 2019 y consulta el hashtag #io19 en las redes sociales</string>\n    <string name=\"onboarding_signin\">Accede para recibir notificaciones de I/O. Los asistentes pueden reservar asientos en las sesiones.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sesión comenzará en %1$s minuto</item>\n        <item quantity=\"other\">La sesión comenzará en %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandida</string>\n    <string name=\"collapsed\">Contraída</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viajes</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"settings_title\">Configuración</string>\n    <string name=\"about_title\">Acerca de</string>\n    <string name=\"travel_what_to_bring_title\">Qué debes traer al evento</string>\n    <string name=\"travel_hotels_title\">Hoteles</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Conoce Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Conoce Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servicio de transporte</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamientos fuera del sitio</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">En bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Transporte compartido</string>\n    <string name=\"travel_airport_transfers_title\">Transporte desde el aeropuerto</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O es un festival al aire libre. Si bien es una parte importante de lo que hace especial a I/O, también significa que hay que considerar algunos aspectos. Las sesiones se realizarán en tiendas climatizadas, pero se recomienda el uso de protector solar, lentes de sol y traer ropa de abrigo para la tarde. Cuando decidas qué ropa usar, ten presente que I/O es un evento informal.</string>\n    <string name=\"travel_hotels_description\">Tenemos habitaciones en varios hoteles locales. La lista de hoteles y la disponibilidad de habitaciones se actualizará con frecuencia. Usa el mapa que se muestra a continuación para que encuentres el hotel que se adapte mejor a tus necesidades. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hoteles&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estos son los tres aeropuertos más grandes en Bay Area que ofrecen servicios de aerolíneas internacionales:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San Francisco (SFO)&lt;/a&gt; aproximadamente a 24 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de Oakland (OAK)&lt;/a&gt; aproximadamente a 32 millas&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aeropuerto Internacional de San José (SJC)&lt;/a&gt; aproximadamente a 12 millas</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 se comprometió a ser un “Evento sin estacionamiento*”, en un esfuerzo por reducir la congestión del tráfico y reducir las emisiones de carbón. Esta decisión se consideró cuidadosamente y te ofrecemos varias opciones para que puedas llegar al evento sin necesidad de un vehículo.&lt;br&gt;&lt;br&gt;Te proporcionaremos más información a medida que el evento se aproxime.&lt;br&gt;&lt;br&gt;* Los estacionamientos destinados a personas con discapacidad estarán habilitados.</string>\n    <string name=\"travel_off_site_parking_description\">Se proporcionará estacionamiento sin costo fuera del sitio en &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;, además de transporte de Avaya desde o hacia Google I/O.&lt;br&gt;&lt;br&gt; En tu formulario de registro, indica si tienes alguna necesidad de asistencia especial para que el equipo de planificación se comunique contigo directamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofreceremos pases de trasporte público prepagos, disponibles para ser retirados durante la preinscripción. Se puede acceder al transporte público del área de las siguientes maneras:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Sistema de trenes ligeros en el área de South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Transporte público rápido a Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema de trenes regional&lt;br&gt;&lt;br&gt; No hay medios de transporte público que se dirijan directamente a Google I/O. Mantente atento a fin de obtener información sobre las ubicaciones exactas del transporte que ofrece Google I/O para el evento.</string>\n    <string name=\"travel_biking_description\">En el estacionamiento A, del anfiteatro Shoreline, existen estacionamientos para bicicletas sin costo. La agrupación “Silicon Valley Bicycle Coalition” proporcionará un servicio de estacionamiento seguro para tu bicicleta desde las 7 a.m. hasta el día de finalización del evento.&lt;br&gt;&lt;br&gt; Consulta Google Maps a fin de obtener instrucciones sobre cómo llegar y ver las mejores rutas de bicicletas. Existen dos caminos, Stevens Creek y Permanente Creek, que son convenientes para los ciclistas que se dirigen al anfiteatro Shoreline.</string>\n    <string name=\"travel_ridesharing_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"travel_airport_transfers_description\">Se proporcionará transporte a los aeropuertos de SFO y SJC desde Google I/O en el último día del evento. NO se proporcionarán en otras fechas.</string>\n    <string name=\"faq_when_and_where_title\">¿Cuándo y dónde se celebrará Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">¿Cómo puedo conocer las novedades sobre Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">¿Todas las sesiones serán en inglés?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">¿Puedo reservar sesiones antes del evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">¿Cuál es la mejor forma de llegar al anfiteatro Shoreline?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">¿Cuándo y dónde puedo recoger mi credencial?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Me gustaría estar en primera fila durante la presentación principal. ¿Alguna sugerencia?</string>\n    <string name=\"faq_what_should_i_wear_title\">¿Cómo debo vestirme?</string>\n    <string name=\"faq_onsite_food_options_title\">Suelo comer bocadillos. ¿Cuáles son las opciones gastronómicas en las instalaciones?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si pierdo algo en las instalaciones, ¿dónde puedo encontrarlo?</string>\n    <string name=\"faq_after_dark_program_title\">Los programas nocturnos parecen ser divertidos. ¿Debo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">¿Se pueden adaptar a mis necesidades de accesibilidad?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">¿Qué tipo de asistencia prestan a las mujeres embarazadas y a los padres que asisten a I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Lineamientos de la Comunidad y política contra el acoso en los eventos de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">¿Las sesiones se transmitirán en vivo? ¿Existen alternativas si no puedo seguir el evento en tiempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quiero celebrar I/O con mi comunidad.  ¿Tienen algunas ideas?</string>\n    <string name=\"faq_when_and_where_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para conocer todas las novedades de las sesiones, los oradores y las actividades en general, visita con regularidad &lt;a href=\"https://events.google.com/io/\"&gt;el sitio web de Google I/O 2019&lt;/a&gt; y el &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog de Google Developers&lt;/a&gt;. También puedes seguirnos en &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; y &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Además, puedes seguirnos y participar de la conversación en medios sociales sobre Google I/O 2019 con el hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Asimismo, enviaremos información importante por correo electrónico a todos los asistentes registrados junto con instrucciones para el registro de entrada antes del festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sí, para que nuestro público mundial pueda seguir el evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consulta la sección de Viajes para ver todas las sugerencias de medios de transporte que necesites, incluida información de servicios de transporte, instrucciones sobre cómo llegar en auto o bicicleta, sugerencias de transporte compartido, entre otros.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar el proceso de registro de entrada, comenzaremos a entregar las credenciales el lunes 6 de mayo en el anfiteatro Shoreline. Para poder darte tu credencial de Google I/O, tomaremos las siguientes medidas:&lt;br&gt; Verificar tu ID con foto. Aceptamos licencias emitidas por el Gobierno, pasaportes y otras formas de identificación. Si no tienes una identificación adecuada, no podrás recibir tu credencial y no se te permitirá ingresar a la conferencia. El nombre que aparece en el ID debe coincidir con el de tu perfil de registro. Si eres asistente del área académica, recuerda llevar una prueba de elegibilidad contigo.&lt;br&gt; Escanea el código QR de registro que recibiste por correo electrónico. Puedes presentarlo directamente en tu teléfono, no hace falta que imprimas el mensaje. #cuidemoselmedioambiente &lt;br&gt;&lt;br&gt;No puedes compartir tu credencial ni dársela o entregársela a terceros. Las credenciales de Google I/O no son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia. Debes llevar la credencial para poder entrar a Google I/O, sus sesiones, zonas de prueba y eventos nocturnos. Si el personal de seguridad lo solicita, deberás mostrar o proporcionar identificación adicional. Es posible que las credenciales de Google I/O incluyan tu nombre o el de tu organización o empresa (si corresponde) y tu foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos los asistentes podrán disfrutar de las presentaciones principales, pero los mejores asientos se otorgarán a los primeros en recoger su credencial el 6 de mayo a partir de las 7:00 a.m. ¡Asegúrate de llegar temprano!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O es un evento al aire libre para desarrolladores, así que asegúrate de usar ropa informal y cómoda. El evento no tiene código de vestimenta. Cuando elijas tu atuendo, ten presente que el clima en Bay Area puede ser caluroso durante el día y fresca en la noche.</string>\n    <string name=\"faq_onsite_food_options_description\">Te tenemos buenas noticias porque también nos gusta la comida.  Se ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante los tres días de la conferencia. También se ofrecerá cena los días 1 y 2 durante los eventos nocturnos.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">¡No te preocupes! La estación de objetos perdidos estará ubicada en la mesa de información de la conferencia durante el evento. Todos los artículos que se encuentren en la noche se entregarán a la oficina de seguridad de la conferencia. Nota: Las credenciales de Google I/O NO son reemplazables, así que procura no perder la tuya o no podrás volver a ingresar a la conferencia.</string>\n    <string name=\"faq_after_dark_program_description\">Son dos noches que no te quieres perder. Se invita a los asistentes a disfrutar de música, juegos y mucho más durante la tarde del 8 de mayo y a un concierto exclusivo en el anfiteatro el 9 de mayo. Existirá disponibilidad de comidas y bebidas en ambas noches (las bebidas alcohólicas estarán disponibles solo para asistentes que tengan al menos 21 años). Ambos eventos nocturnos se realizarán en el anfiteatro Shoreline y se solicita tu credencial de asistente para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Tendremos estacionamientos para embarazadas en el área de necesidad de asistencia especial.&lt;br&gt; Las madres con niños en período de lactancia son bienvenidas a la conferencia con sus hijos. Habrá cuatro salas abiertas para madres los días 7 y 8 desde las 8 a.m. hasta las 8 p.m. y el 9 de mayo desde las 8 a.m. hasta las 4 p.m. El uso de las salas es por orden de llegada y habrá hojas de registro disponibles frente a ellas. Consulta la mesa de información de la conferencia a fin de obtener más información.&lt;br&gt;&lt;br&gt; Se ofrecerá un reembolso de USD 100 por día (sin exceder un total de USD 300) a los padres que asistan y que expresen su interés en el servicio de cuidado de niños mediante nuestro formulario de registro. El servicio es por orden de llegada. Este reembolso por el cuidado de niños está a cargo de un proveedor externo. Si tu asistencia al evento está confirmada y antes del inicio de la conferencia recibes un correo electrónico indicándote que aprobamos tu solicitud para cuidar niños, nuestro proveedor se comunicará contigo a fin de informarte los pasos siguientes en un plazo de 7 días hábiles después de Google I/O, Ellos administrarán todos los gastos realizados en el servicio de cuidado de niños.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google se dedica a proporcionar una experiencia de eventos inclusiva y libre de acoso para todo el mundo, sin importar la identidad y expresión de género, la orientación sexual, la discapacidad, la neurodiversidad, la apariencia física, el tamaño del cuerpo, la etnia, la nacionalidad, el origen étnico, la edad, la religión o alguna otra categoría protegida. Los baños del establecimiento durante el evento serán unisex, en un esfuerzo por hacer que el evento sea lo más inclusivo posible.&lt;br&gt;&lt;br&gt; No toleramos el acoso de ninguna forma a los participantes del evento.&lt;br&gt; Google se toma muy en serio los incumplimientos de las políticas y responderá de forma adecuada. Obtén más información sobre los Lineamientos de la Comunidad y política contra el acoso en los eventos de Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;aquí&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Tanto las dos presentaciones principales como todas las sesiones se transmitirán en vivo en la página principal del sitio web del evento durante los tres días que dure el festival. Si estás ocupado en el trabajo o la diferencia horaria te impide seguir el evento en vivo, puedes mirar las grabaciones de la sesión en diferido en el &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal de YouTube de Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sí. Cada año, los desarrolladores de todo el mundo organizan&lt;a href=\"https://events.google.com/io/extended\"&gt;eventos de Google I/O Extended&lt;/a&gt;. Durante estos eventos, los organizadores pueden realizar transmisiones en vivo y realizar sus propias sesiones, que incluyen hackatones, Codelabs, demostraciones, entre otros.&lt;br&gt; Aquí te presentamos los pasos que debes seguir para comenzar, si te unes a nosotros como un anfitrión de I/O Extended este año:&lt;br&gt;&lt;br&gt; Lee la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guía del organizador&lt;/a&gt; si deseas obtener sugerencias sobre cómo organizar un evento exitoso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; tu evento público en el sitio web de I/O y aumenta su visibilidad.&lt;br&gt;&lt;br&gt; Si deseas ser visible, usa el hashtag oficial #io19extended hashtag en todas tus publicaciones de redes sociales relacionadas con I/O Extended.&lt;br&gt;&lt;br&gt; Nota: Los anfitriones de I/O Extended puede solicitar la eliminación de sus datos personales o del evento después de la finalización del mismo mediante un correo electrónico a io19@google.com.&lt;br&gt; Si simplemente deseas asistir al evento de I/O Extended, explora &lt;a href=\"https://events.google.com/io/extended\"&gt;nuestro mapa&lt;/a&gt; a fin de encontrar un evento cerca de ti y confirma tu asistencia.&lt;br&gt; Si tienes preguntas sobre el programa de I/O Extended, escríbenos a io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sesiones</string>\n    <string name=\"wifi_install_success\">Se guardó la red Wi-Fi</string>\n    <string name=\"wifi_install_clipboard_message\">No se pudo guardar la red Wi-Fi\\nEn su lugar, se guardó la contraseña en el portapapeles.</string>\n    <string name=\"event_sessions_title\">Sesiones</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours y App Reviews</string>\n    <string name=\"event_afterhours_title\">After Hours</string>\n    <string name=\"event_meals_title\">Comidas</string>\n    <string name=\"event_sessions_description\">Desde abril, los asistentes presenciales pueden reservar asientos de forma anticipada en las sesiones del evento en el sitio web de I/O y también mediante la app para dispositivos móviles de I/O. (Nota: Algunos de los asientos de las sesiones estarán exentos de este medio de reserva y estarán disponibles en el sitio por orden de llegada). La asistencia a Codelabs, reseñas de apps y Office Hours es por orden de llegada.</string>\n    <string name=\"event_sandbox_description\">Espacios exclusivos para explorar, interactuar y aprender con nuestros productos y plataformas más recientes mediante demostraciones interactivas, instalaciones físicas y mucho más.</string>\n    <string name=\"event_codelabs_description\">Obtén experiencia práctica en nuestros quioscos listos para que codifiques. Aquí encontrarás instructivos autodidácticos que te brindarán toda la información que necesitas sobre las mejores y más recientes tecnologías de Google. También puedes traer tu propio equipo para que te lleves tu trabajo a casa. El personal de Google estará presente para proporcionarte asesoría útil, así como instrucciones si tienes alguna dificultad.</string>\n    <string name=\"event_officehours_description\">Los eventos Office Hours son tu oportunidad de reunirte personalmente con expertos de Google para hacer preguntas técnicas. En App Reviews tendrás la oportunidad de obtener asesoría y sugerencias sobre tus proyectos específicos relacionados con apps.</string>\n    <string name=\"event_afterhours_description\">Los eventos After Sessions se llevan a cabo al final del día en las cercanías de Shoreline Amphitheatre. Consta de dos noches de comida, bebidas y diversión. La primera noche, la fiesta se realiza en el espacio de Sandbox. La segunda, tendremos un concierto exclusivo en el anfiteatro.</string>\n    <string name=\"event_meals_description\">Se les ofrecerá desayuno, almuerzo y refrigerios gratuitos a los asistentes durante todos los días de la conferencia. También se ofrecerá cena los días 1 y 2 durante las salidas nocturnas.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Apps relacionadas</string>\n    <string name=\"event_types_header\">Tipos de eventos</string>\n    <string name=\"settings_time_zone_label\">Eventos en zona horaria del Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Habilitar notificaciones</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estadísticas anónimas de uso</string>\n    <string name=\"settings_tos\">Condiciones del servicio</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidad</string>\n    <string name=\"settings_oss_licenses\">Licencias de código abierto</string>\n    <string name=\"settings_theme_title\">Elegir tema</string>\n    <string name=\"settings_theme_system\">Valor predeterminado del sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Oscuro</string>\n    <string name=\"settings_theme_battery\">Configurar según el Ahorro de batería</string>\n    <string name=\"built_with_material_components\">Compilada con Material Components</string>\n    <string name=\"wifi_network_and_password\">Red: %1$s\\nContraseña: %2$s</string>\n    <string name=\"join_network\">Unirme a la red</string>\n    <string name=\"assistant_app_description\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"assistant_app_description2\">Solo di “Ok Google, habla con Google I/O 19”.</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sin conexión a Internet</string>\n    <string name=\"navigate_up\">Navegar hacia arriba</string>\n    <string name=\"no_network_description\">Para usar Explora I/O, haz lo siguiente:\\n\\n- Desactiva el modo de avión.\\n\\n- Activa los datos móviles.\\n\\n- Revisa la intensidad de señal en tu área.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Tu teléfono no es compatible con ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prueba con otro dispositivo o pídele a un amigo que te preste el suyo</string>\n    <string name=\"codelabs_information\">Obtén información sobre las más recientes y mejores tecnologías de Google mediante instructivos de autoaprendizaje en nuestros quioscos listos para programar. También puedes traer tu propia computadora y llevarte trabajo a casa. Los quioscos se abren diariamente, excepto durante la primera presentación principal.</string>\n    <string name=\"codelabs_building\">Edificio de Codelabs</string>\n    <string name=\"codelabs_website\">Sitio web de Codelabs</string>\n    <string name=\"codelab_duration\">Duración: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">زمان‌بندی</string>\n    <string name=\"title_home\">صفحه اصلی</string>\n    <string name=\"title_map\">نقشه</string>\n    <string name=\"title_explore_io\">کاوش I/O</string>\n    <string name=\"title_info\">اطلاعات</string>\n    <string name=\"filters\">فیلترها</string>\n    <string name=\"category_heading_tracks\">موضوعات</string>\n    <string name=\"category_heading_types\">انواع</string>\n    <string name=\"reset\">بازنشانی</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d رویداد</item>\n        <item quantity=\"other\">%1$d رویداد</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">رویدادهای ستاره‌دار و رزروشده</string>\n    <string name=\"starred_and_reserved_short\">رویدادهای شما</string>\n    <string name=\"search_schedule_hint\">جستجوی زمان‌بندی</string>\n    <string name=\"search_schedule_no_results\">نتیجه‌ای پیدا نشد</string>\n    <string name=\"agenda\">برنامه</string>\n    <string name=\"event_starred\">رویداد به موارد ستاره‌دار اضافه شد</string>\n    <string name=\"event_unstarred\">رویداد از موارد ستاره‌دار برداشته شد</string>\n    <string name=\"event_star_error\">خطا هنگام اضافه‌کردن رویداد به موارد ستاره‌دار</string>\n    <string name=\"reservation_error\">خطا هنگام ایجاد تغییر در رزرو. منتظر بمانید تا درخواست‌های قبلی تکمیل شود یا بعداً دوباره امتحان کنید.</string>\n    <string name=\"reservation_request_succeeded\">رزرو درخواست شد.</string>\n    <string name=\"reservation_cancel_succeeded\">رزرو لغو شد: «&lt;b&gt;%s&lt;/b&gt;.»</string>\n    <string name=\"reservation_new\">صندلی‌تان برای «&lt;b&gt;%s&lt;/b&gt;» رزرو شد.</string>\n    <string name=\"reservation_replaced\">رویداد جایگزین شد.</string>\n    <string name=\"waitlist_new\">در فهرست انتظار قرار گرفتید.</string>\n    <string name=\"waitlist_cancel_succeeded\">از فهرست انتظار برداشته شدید.</string>\n    <string name=\"got_it\">متوجه شدم</string>\n    <string name=\"dont_show\">نشان داده نشود</string>\n    <string name=\"reservation_denied_cutoff\">رزرو رد شد: فاصله زمانی بسیار کم تا زمان شروع.</string>\n    <string name=\"reservation_denied_clash\">رزرو رد شد: تداخل با رزروی دیگر</string>\n    <string name=\"reservation_denied_unknown\">رزرو رد شد: خطای ناشناس.</string>\n    <string name=\"cancellation_denied_cutoff\">لغو رد شد: فاصله زمانی بسیار کم تا زمان شروع.</string>\n    <string name=\"cancellation_denied_unknown\">لغو رد شد: خطای ناشناس.</string>\n    <string name=\"schedule_filters_empty\">رویدادی یافت نشد.</string>\n    <string name=\"reservation_reservable\">رزرو صندلی</string>\n    <string name=\"reservation_reserved\">رزرو شد</string>\n    <string name=\"reservation_waitlisted\">در فهرست انتظار قرار گرفت</string>\n    <string name=\"reservation_waitlist_available\">پیوستن به فهرست انتظار</string>\n    <string name=\"reservation_disabled\">رزرو در دسترس نیست</string>\n    <string name=\"reservation_pending\">رزرو درحالت انتظار</string>\n    <string name=\"schedule_hint_title\">سفارشی‌ساختن زمان‌بندی</string>\n    <string name=\"schedule_hint_star_event\">اضافه‌کردن به رویدادهای ستاره‌دار</string>\n    <string name=\"schedule_hint_reserve_session_seat\">رزروکردن صندلی جلسه</string>\n    <string name=\"rate_session\">رتبه‌بندی جلسه</string>\n    <string name=\"menu_item_session_location\">موقعیت مکانی جلسه</string>\n    <string name=\"menu_item_session_star\">ستاره‌دارکردن جلسه</string>\n    <string name=\"menu_item_calendar\">افزودن به تقویم</string>\n    <string name=\"speaker_delimiter\">،</string>\n    <string name=\"session_detail_speakers_header\">بلندگو</string>\n    <string name=\"session_detail_related_header\">رویدادهای مرتبط</string>\n    <string name=\"feedback_submit\">ارسال</string>\n    <string name=\"feedback_thank_you\">از بازخوردتان متشکریم!</string>\n    <string name=\"feedback_q1_text\">به کیفیت کلی «جلسه» چه رتبه‌ای می‌دهید؟</string>\n    <string name=\"feedback_q2_text\">محتوای «جلسه» را براساس انتظاراتتان/توضیحات جلسه، چگونه توصیف می‌کنید؟</string>\n    <string name=\"feedback_q3_text\">«جلسه» چقدر با پروژه‌هایتان مرتبط بود؟</string>\n    <string name=\"feedback_q4_text\">«جلسه» چقدر با پروژه‌هایتان مرتبط بود؟</string>\n    <string name=\"feedback_q1_label_start\">بسیار ابتدایی</string>\n    <string name=\"feedback_q2_label_start\">ضعیف</string>\n    <string name=\"feedback_q3_label_start\">ضعیف</string>\n    <string name=\"feedback_q4_label_start\">نه چندان</string>\n    <string name=\"feedback_q1_label_end\">عالی</string>\n    <string name=\"feedback_q2_label_end\">عالی</string>\n    <string name=\"feedback_q3_label_end\">خیلی زیاد</string>\n    <string name=\"feedback_q4_label_end\">خیلی زیاد</string>\n    <string name=\"a11y_show_navigation\">نمایش منوی پیمایش</string>\n    <string name=\"a11y_collapse_filters_sheet\">پایین‌آوردن برگه فیلترها</string>\n    <string name=\"a11y_clear_tag_filters\">پاک‌کردن فیلترها</string>\n    <string name=\"a11y_filter_applied\">فیلتر %1s اعمال شد</string>\n    <string name=\"a11y_filter_not_applied\">فیلتر %1s اعمال نشد</string>\n    <string name=\"a11y_reservation_available\">رزرو رویداد</string>\n    <string name=\"a11y_reservation_reserved\">رویداد رزرو شد</string>\n    <string name=\"a11y_reservation_disabled\">رزروکردن دردسترس نیست</string>\n    <string name=\"a11y_reservation_wait_list_available\">به فهرست انتظار رویداد بپیوندید</string>\n    <string name=\"a11y_reservation_wait_listed\">در فهرست انتظار رویداد</string>\n    <string name=\"a11y_reservation_pending\">رزرو درحالت انتظار</string>\n    <string name=\"a11y_starred\">رویداد نشانک‌گذاری شد</string>\n    <string name=\"a11y_unstarred\">رویداد نشانک‌گذاری نشد</string>\n    <string name=\"a11y_star\">ستاره</string>\n    <string name=\"a11y_play\">پخش ویدیو</string>\n    <string name=\"a11y_select_map_mode\">انتخاب حالت نقشه</string>\n    <string name=\"a11y_search_schedule\">جستجوی زمان‌بندی</string>\n    <string name=\"welcome\">خوش آمدید!</string>\n    <string name=\"a11y_signed_in_content_description\">به‌عنوان %s به سیستم وارد شده‌اید.</string>\n    <string name=\"a11y_signed_out_content_description\">برای وارد شدن لمس کنید.</string>\n    <string name=\"dialog_sign_in_content\">برای ذخیره‌کردن رویدادها، رزروکردن صندلی و رتبه‌بندی جلسات (اگر شرکت‌کننده هستید)، وارد سیستم شوید.</string>\n    <string name=\"sign_in\">ورود به سیستم</string>\n    <string name=\"firebase_auth_no_network_connection\">اتصال اینترنت قطع است.</string>\n    <string name=\"firebase_auth_unknown_error\">خطای ناشناس</string>\n    <string name=\"dialog_sign_out_content\">همه رویدادهای ذخیره‌شده، صندلی‌های رزرو‌شده و جلسات رتبه‌بندی‌شده (اگر شرکت‌کننده هستید)، با حسابتان هم‌گام باقی می‌ماند.</string>\n    <string name=\"sign_out\">خروج از سیستم</string>\n    <string name=\"manage_google_account\">مدیریت حساب Google</string>\n    <string name=\"remove_reservation_title\">رزرو حذف شود؟</string>\n    <string name=\"remove_reservation_content\">درحال واگذارکردن صندلی‌تان در «%1$s» هستید. اگر تصمیم ندارید صندلی رزرو کنید اما همچنان می‌خواهید شرکت کنید، بخشی از صندلی‌های همه جلسات به‌ترتیب ورود شرکت‌کنندگان، درمحل دردسترس خواهد بود.</string>\n    <string name=\"cancel\">لغو</string>\n    <string name=\"remove\">حذف</string>\n    <string name=\"swap_reservation_title\">رزرو تعویض شود؟</string>\n    <string name=\"swap_reservation_content\">از قبل برای «%1$s» رزرو کرده‌اید/در فهرست انتظار قرار دارید؟. فقط یک رزرو به‌ازای هر بخش زمانی ممکن است. می‌خواهید با «%2$s» تعویض کنید؟</string>\n    <string name=\"swap\">تعویض</string>\n    <string name=\"notifications_preference_dialog_title\">اعلان I/O</string>\n    <string name=\"notifications_preference_dialog_content\">می‌خواهید اعلان‌های مربوط به I/O را دریافت کنید؟ اطلاعات مربوط به زمان شروع جلسه، رویدادهای پس از ساعات کاری، موارد ضبط‌شده جلسات و غیره را برایتان ارسال می‌کنیم. هرزمان خواستید می‌توانید این تنظیمات را در «اطلاعات &gt; تنظیمات» تغییر دهید.</string>\n    <string name=\"no\">نه</string>\n    <string name=\"yes\">بله</string>\n    <string name=\"feed_not_available\">اعلامیه‌ای پیدا نشد.</string>\n    <string name=\"feed_loading_error\">فید بارگیری نشد. بعداً دوباره امتحان کنید.</string>\n    <string name=\"feed_announcement_title\">اعلامیه‌ها</string>\n    <string name=\"feed_upcoming_events\">رویدادهای آینده</string>\n    <string name=\"feed_saved_events\">رویدادهای ذخیره‌شده</string>\n    <string name=\"feed_no_saved_events\">رویداد ذخیره‌شده‌ای وجود ندارد</string>\n    <string name=\"feed_view_all_events\">مشاهده همه رویدادها</string>\n    <string name=\"feed_view_your_schedule\">مشاهده زمان‌بندی</string>\n    <string name=\"feed_watch_live_stream\">تماشای جریان مستقیم</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s روز</item>\n        <item quantity=\"other\">%s روز</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s ساعت</item>\n        <item quantity=\"other\">%s ساعت</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s دقیقه</item>\n        <item quantity=\"other\">%s دقیقه</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s ثانیه</item>\n        <item quantity=\"other\">%s ثانیه</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">هم‌رسانی جلسه</string>\n    <string name=\"share_text_session_detail\">«%1$s» را در #io19 %2$s بررسی کنید</string>\n    <string name=\"intent_chooser_session_detail\">هم‌رسانی</string>\n    <string name=\"map_variant_after_dark\">شبانگاهی</string>\n    <string name=\"map_variant_concert\">کنسرت</string>\n    <string name=\"map_variant_daytime\">روز</string>\n    <string name=\"enable_my_location\">فعال کردن مکان من</string>\n    <string name=\"my_location_rationale\">برنامه برای نشان دادن مکان شما روی نقشه، به مجوز مکان نیاز دارد.</string>\n    <string name=\"onboarding_get_started\">شروع به کار</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">به Google I/O خوش‌آمدید</string>\n    <string name=\"onboarding_date_location\">۷ تا ۹ مه ۲۰۱۹‏\\nماونتین ویو، کالیفرنیا</string>\n    <string name=\"onboarding_label_days\">روز</string>\n    <string name=\"onboarding_label_hours\">ساعت</string>\n    <string name=\"onboarding_label_mins\">دقیقه</string>\n    <string name=\"onboarding_label_seconds\">ثانیه</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O به‌زودی برگزار می‌شود</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">خلاصه I/O \\'19 را تماشا کنید و #io19 را در شبکه‌های اجتماعی بررسی کنید</string>\n    <string name=\"onboarding_signin\">برای دریافت اعلان‌های مربوط به I/O، وارد سیستم شوید. شرکت‌کنندگان می‌توانند برای شرکت در جلسات، صندلی رزرو کنند.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">جلسه ظرف %1$s دقیقه شروع می‌شود</item>\n        <item quantity=\"other\">جلسه ظرف %1$s دقیقه شروع می‌شود</item>\n    </plurals>\n    <string name=\"expanded\">بزرگ‌شده</string>\n    <string name=\"collapsed\">کوچک‌شده</string>\n    <string name=\"event_title\">رویداد</string>\n    <string name=\"travel_title\">سفر</string>\n    <string name=\"faq_title\">سؤالات متداول</string>\n    <string name=\"settings_title\">تنظیمات</string>\n    <string name=\"about_title\">درباره</string>\n    <string name=\"travel_what_to_bring_title\">آنچه برای شرکت در رویداد باید با خود بیاورید</string>\n    <string name=\"travel_hotels_title\">هتل‌ها</string>\n    <string name=\"travel_getting_to_mountain_view_title\">رسیدن به مانتین ویو</string>\n    <string name=\"travel_getting_to_shoreline_title\">رسیدن به مانتین ویو</string>\n    <string name=\"travel_shuttle_service_title\">سرویس رفت‌وبرگشت</string>\n    <string name=\"travel_off_site_parking_title\">پارکینگ خارج از محل</string>\n    <string name=\"travel_for_public_transportation_title\">حمل‌ونقل عمومی</string>\n    <string name=\"travel_biking_title\">دوچرخه‌سواری</string>\n    <string name=\"travel_ridesharing_title\">هم‌پیمایی</string>\n    <string name=\"travel_airport_transfers_title\">حمل‌ونقل برای فرودگاه</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O جشنواره‌ای در فضای باز است. این امر تا حد زیادی I/O را تبدیل به رویدادی خاص کرده است، اما درعین حال باید به بعضی نکات نیز توجه کرد. جلسات در داخل چادرهایی با قابلیت کنترل شرایط آب‌وهوا برگزار می‌شود، ولی استفاده از کرم ضد آفتاب، عینک آفتابی، و لباس اضافه برای استفاده در شب توصیه می‌شود. هنگام انتخاب لباس به یاد داشته باشید که I/O رویدادی غیررسمی است.</string>\n    <string name=\"travel_hotels_description\">ما در بسیاری از هتل‌های محلی اتاق داریم. فهرست هتل‌ها و دردسترس بودن اتاق‌ها مرتباً به‌روزرسانی می‌شود. لطفاً برای پیدا کردن مناسب‌ترین هتل، از نقشه زیر استفاده کنید. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;نقشه هتل&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">سه فرودگاه اصلی Bay Area با خدمات خط هوایی بین‌المللی:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Francisco International Airport (SFO)&lt;/a&gt; حدود ۲۴ مایل&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Oakland International Airport (OAK)&lt;/a&gt; حدود ۳۲ مایل&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Jose International Airport (SJC)&lt;/a&gt; حدود ۱۲ مایل</string>\n    <string name=\"travel_getting_to_shoreline_description\">برای کاهش تراکم ترافیک و کاهش انتشار کربن، Google I/O ۲۰۱۹ متعهد شده است «رویدادی بدون پارکینگ*» باشد. این تصمیم به‌دقت بررسی شده است و گزینه‌های رایگان متعددی را برای رسیدن به محل رویداد بدون نیاز به وسیله نقلیه در اختیار شما قرار می‌دهیم.&lt;br&gt;‏&lt;br&gt;با نزدیک‌تر شدن زمان رویداد، اطلاعات بیشتری ارائه خواهیم کرد.&lt;br&gt;‏&lt;br&gt;*پارکینگ ویژه ناتوانان دردسترس خواهد بود.</string>\n    <string name=\"travel_shuttle_service_description\">برای کاهش تراکم ترافیک و کاهش انتشار کربن، Google I/O ۲۰۱۹ متعهد شده است «رویدادی بدون پارکینگ*» باشد. این تصمیم به‌دقت بررسی شده است و گزینه‌های رایگان متعددی را برای رسیدن به محل رویداد بدون نیاز به وسیله نقلیه در اختیار شما قرار می‌دهیم.&lt;br&gt;‏&lt;br&gt;با نزدیک‌تر شدن زمان رویداد، اطلاعات بیشتری ارائه خواهیم کرد.&lt;br&gt;‏&lt;br&gt;*پارکینگ ویژه ناتوانان دردسترس خواهد بود.</string>\n    <string name=\"travel_off_site_parking_description\">پارکینگ رایگان خارج از محل در &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;‏استادیوم Avaya‏&lt;/a&gt; دردسترس خواهد بود. سرویس‌های رفت‌وبرگشت از Avaya به/از Google I/O ارائه می‌شود. &lt;br&gt;&lt;br&gt; اگر نیاز به هرگونه ADA یا کمک خاصی دارید، لطفاً در فرم ثبت‌نامتان ذکر کنید تا تیم برنامه‌ریزی برای پیگیری مستقیماً با شما تماس بگیرد.</string>\n    <string name=\"travel_for_public_transportation_description\">مجوزهای حمل‌ونقل عمومی پیش‌پرداخت‌شده قبل از ثبت‌نام تحویل داده می‌شود. حمل‌ونقل عمومی در ناحیه ازطریق این موارد، قابل دسترسی است:&lt;br&gt;‏&lt;br&gt; ‏&lt;a href=\"http://www.caltrain.com/\"&gt;‏Caltrain‏&lt;/a&gt;: سیستم راه‌آهن منطقه‌ای&lt;br&gt;‏&lt;br&gt; ‏&lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;‏VTA‏&lt;/a&gt;: قطار سبُک شهری که در South Bay کار می‌کند&lt;br&gt;‏&lt;br&gt; ‏&lt;a href=\"https://www.bart.gov/\"&gt;‏BART‏&lt;/a&gt;: «حمل‌ونقل سریع در Bay Area»‏&lt;br&gt;&lt;br&gt; ‏&lt;a href=\"https://www.amtrak.com/home.html\"&gt;‏AMTRAK‏&lt;/a&gt;: سیستم راه‌آهن منطقه‌ای&lt;br&gt;‏&lt;br&gt;وسایل حمل‌ونقل عمومی مستقیماً به Google I/O نمی‌رود. برای اطلاع از مکان‌های دقیق سرویس‌های حمل‌ونقل که سرویس‌های رفت‌و‌برگشت رویداد Google I/O ارائه می‌کند، با ما درارتباط باشید.</string>\n    <string name=\"travel_biking_description\">پارکینگ رایگان برای دوچرخه در پارکینگ A در آمفی‌تئاتر Shoreline دردسترس خواهد بود. Silicon Valley Bicycle Coalition از ساعت ۷ صبح تا پایان رویداد در هر روز، خدمات پارکینگ وله امن برای دوچرخه ارايه می‌دهد.&lt;br&gt;‏&lt;br&gt; برای اطلاع از بهترین مسیرها و راه‌های دوچرخه‌سواری، Google Maps را بررسی کنید. دو مسیر Stevens Creek Trail و Permanente Creek Trail برای دوچرخه‌سوارانی که به‌سمت آمفی‌تئاتر Shoreline می‌روند، مناسب است.</string>\n    <string name=\"travel_ridesharing_description\">در آخرین روز رویداد، سرویس حمل‌ونقل از Google I/O به فرودگاه SFO و SJC ارائه خواهد شد. سرویس‌های حمل‌ونقل فرودگاه در هیچ تاریخ دیگری ارائه نخواهد شد.</string>\n    <string name=\"travel_airport_transfers_description\">در آخرین روز رویداد، سرویس حمل‌ونقل از Google I/O به فرودگاه SFO و SJC ارائه خواهد شد. سرویس‌های حمل‌ونقل فرودگاه در هیچ تاریخ دیگری ارائه نخواهد شد.</string>\n    <string name=\"faq_when_and_where_title\">Google I/O ۲۰۱۹ کِی و کجا برگزار می‌شود؟</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">چگونه از جدیدترین مطالب درباره Google I/O مطلع شوم؟</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">آیا همه «جلسات» به زبان انگلیسی برگزار می‌شود؟</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">آیا می‌توانم قبل از رویداد، جای خود را در جلسات رزرو کنم؟</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">بهترین راه برای رسیدن به آمفی‌تئاتر Shoreline چیست؟</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">نشانم را کِی و کجا تحویل بگیرم؟</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">جداً مایلم هنگام سخنرانی اصلی در ردیف جلو بنشینم. به چه نکاتی باید توجه کنم؟</string>\n    <string name=\"faq_what_should_i_wear_title\">چه باید بپوشم؟</string>\n    <string name=\"faq_onsite_food_options_title\">دوست دارم میان‌وعده صرف کنم. چه نوع غذاهایی درمحل قابل‌دسترسی است؟</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">اگر چیزی را درمحل گم کنم، کجا می‌توانم آن را پیدا کنم؟</string>\n    <string name=\"faq_after_dark_program_title\">برنامه‌های «شبانگاهی» جالب به نظر می‌رسد. خوب است شرکت کنم؟</string>\n    <string name=\"faq_accessibility_needs_title\">آیا می‌توانید نیازهای من را درزمینه دسترس‌پذیری برطرف کنید؟</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">چگونه از مادران باردار و والدینی که در I/O شرکت می‌کنند پشتیبانی می‌شود؟</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">دستورالعمل‌های انجمن رویداد Google و خط‌مشی جلوگیری از آزار و اذیت</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">آیا جلسات پخش جریانی مستقیم خواهد شد؟ اگر نتوانم رویداد را به‌طور هم‌زمان دنبال کنم چه می‌شود؟</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">می‌خواهم I/O را با انجمنم جشن بگیرم!  ایده‌ای دارید؟</string>\n    <string name=\"faq_when_and_where_description\">برای کسب جدیدترین اطلاعات درباره جلسات و سخنران‌ها و کلیات فعالیت‌ها، حتماً مرتب به &lt;a href=\"https://events.google.com/io/\"&gt;وب‌سایت Google I/O ۲۰۱۹‏&lt;/a&gt; و &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;وبلاگ Google Developers‏&lt;/a&gt; سر بزنید و ما را در &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; و &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; دنبال کنید. همچنین می‌توانید ازطریق هشتگ رسمی &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; گفتگوهایی را که در شبکه‌های اجتماعی درباره Google I/O 2019 انجام می‌شود دنبال کنید و به آن‌ها بپیوندید. همچنین، پیش از آغاز جشنواره، اطلاعات مهم را به‌همراه دستورالعمل‌های اعلام حضور ازطریق ایمیل برای همه شرکت‌کنندگان ثبت‌شده ارسال می‌کنیم.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">برای کسب جدیدترین اطلاعات درباره جلسات و سخنران‌ها و کلیات فعالیت‌ها، حتماً مرتب به &lt;a href=\"https://events.google.com/io/\"&gt;وب‌سایت Google I/O ۲۰۱۹‏&lt;/a&gt; و &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;وبلاگ Google Developers‏&lt;/a&gt; سر بزنید و ما را در &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; و &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; دنبال کنید. همچنین می‌توانید ازطریق هشتگ رسمی &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; گفتگوهایی را که در شبکه‌های اجتماعی درباره Google I/O 2019 انجام می‌شود دنبال کنید و به آن‌ها بپیوندید. همچنین، پیش از آغاز جشنواره، اطلاعات مهم را به‌همراه دستورالعمل‌های اعلام حضور ازطریق ایمیل برای همه شرکت‌کنندگان ثبت‌شده ارسال می‌کنیم.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">بله. به این ترتیب بینندگان ما در سراسر جهان می‌توانند جلسات را دنبال کنند.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">از ماه آوریل، شرکت‌کنندگان حضوری می‌توانند پیش از رویداد، صندلی‌شان را برای شرکت در «جلسات» در وب‌سایت I/O و نیز ازطریق برنامه دستگاه همراه I/O رزرو کنند (توجه: تعدادی از صندلی‌های «جلسه» قابل رزرو نخواهند بود و به افرادی که زودتر در محل حضور پیدا کنند اختصاص خواهند یافت). شرکت در Codelabs، «مرور برنامه»، و «ساعات اداری» با رعایت نوبت در محل انجام می‌شود.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">برای اطلاع از همه نکات لازم مربوط به حمل‌ونقل شامل اطلاعات رفت‌وبرگشت، مسیرهای رانندگی و دوچرخه‌سواری، هم‌سفری، و غیره، بخش «سفر» را بررسی کنید!</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">برای تسریع فرایند اعلام حضور، تحویل نشان‌ها را از روز دوشنبه، ۶ مه در آمفی‌تئاتر Shoreline آغاز می‌کنیم. برای اینکه نشان Google I/O را به شما بدهیم، باید:&lt;br&gt; - مدرک شناسایی عکس‌دارتان را تأیید کنیم. مجوزهای دولتی، گذرنامه، و سایر انواع مدارک شناسایی برای ما قابل قبول است. اگر مدرک شناسایی مناسب نداشته باشید، نشان را دریافت نخواهید کرد و اجازه حضور در کنفرانس را نخواهید داشت. نام مندرج در مدرک شناسایی باید دقیقاً با نمایه ثبت‌نامتان مطابقت داشته باشد. اگر شرکت‌کننده «آکادمیک» هستید، لطفاً مدرک اثبات واجد شرایط بودنتان را به‌همراه بیاورید.&lt;br&gt; - کد QR ثبت‌نام را که ازطریق ایمیل دریافت کرده‌اید، اسکن کنید. نیازی به چاپ کردن ایمیل نیست و می‌توانید آن را از تلفنتان اسکن کنید! #savetheenvironment ‏&lt;br&gt;‏&lt;br&gt;لطفاً توجه داشته باشید که نباید نشانتان را با کسی به‌اشتراک بگذارید، آن را به کسی بدهید، یا به‌هرصورت دیگری در اختیار دیگران قرار دهید. نشان Google I/O قابل تعویض نیست، بنابراین مراقب باشید آن را گم نکنید چون اگر گم کنید اجازه حضور در کنفرانس را نخواهید داشت. برای دریافت اجازه ورود به Google I/O ازجمله «جلسات»، «جعبه‌های ایمنی»، و «پس از ساعات کاری»، باید نشان Google I/O را همراه داشته باشید. اگر نگهبانی مدرک شناسایی دیگری خواست، لطفاً آن را نشان دهید یا ارائه کنید. نشان Google I/O می‌تواند شامل نام، شرکت، یا سازمان (درصورتی که ارائه شود)، و عکستان باشد.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">همه افراد حتماً برای استفاده از «سخنرانی‌های اصلی»، صندلی خواهند داشت ولی بهترین صندلی‌ها به کسانی اختصاص می‌یابد که در زمان دریافت نشان، که از ساعت ۷ صبح روز ۶ مه آغاز می‌شود، زودتر از سایرین حضور پیدا کنند. بنابراین سعی کنید زود در محل حاضر شوید!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O رویدادی در زمینه برنامه‌نویسی است که در فضای باز برگزار می‌شود، بنابراین با لباس راحت و غیررسمی حضور پیدا کنید. هیچ قانون خاصی برای پوشش وجود ندارد. Bay Area ممکن است درطول روز بسیار گرم باشد و شب‌ها خنک باشد، بنابراین هنگام انتخاب لباستان این نکات را در نظر داشته باشید.</string>\n    <string name=\"faq_onsite_food_options_description\">خبر خوب، ما هم غذا خوردن را دوست داریم!  طی هر سه روز برگزاری کنفرانس، از شرکت‌کنندگان با صبحانه، ناهار، و میان‌وعده رایگان پذیرایی می‌شود. در روزهای اول و دوم، طی رویدادهای «پس از ساعات کاری»، شام نیز دردسترس خواهد بود.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">هوایتان را داریم! ایستگاه اشیای گم‌شده و پیداشده طی ساعات برگزاری رویداد در کنار «میز اطلاعات کنفرانس» قرار خواهد داشت. همه وسایلی که هنگام شب در محل جا گذاشته شده است، به «دفتر نگهبانی کنفرانس» تحویل داده می‌شود. نکته مهم: نشان Google I/O قابل تعویض نیست، بنابراین مراقب باشید آن را گم نکنید، در غیر این صورت اجازه حضور در کنفرانس را نخواهید داشت.</string>\n    <string name=\"faq_after_dark_program_description\">این دو شب را از دست ندهید! از شرکت‌کنندگان برای لذت بردن از موسیقی، بازی، و موارد دیگر در شب ۸ مه و حضور در کنسرتی انحصاری در آمفی‌تئاتر در روز ۹ مه دعوت می‌شود. غذا و نوشیدنی در هر دو شب دردسترس خواهد بود (نوشیدنی‌های الکلی برای افراد ۲۱ سال به بالا). هردو رویداد «پس از ساعات کاری» در آمفی‌تئاتر Shoreline برگزار می‌شود و همراه داشتن نشان شرکت‌کننده برای ورود الزامی است.</string>\n    <string name=\"faq_accessibility_needs_description\">جای پارک ویژه مادران باردار در قسمت ADA دردسترس خواهد بود.&lt;br&gt; مادرانی که نوزاد شیرخواره دارند می‌توانند همراه با فرزندشان در کنفرانس شرکت کنند. چهار اتاق ویژه مادران در روزهای ۷ و ۸ مه از ۸ صبح تا ۸ شب و در روز ۹ مه از ۸ صبح تا ۴ بعدازظهر باز خواهد بود. برگه‌های ثبت‌نام روبروی اتاق‌های مادران دردسترس خواهد بود و اتاق‌ها با رعایت نوبت مورداستفاده قرار می‌گیرد. لطفاً برای کسب اطلاعات بیشتر به میز اطلاعات کنفرانس مراجعه کنید.&lt;br&gt;&lt;br&gt; مبلغ ۱۰۰ دلار آمریکا به‌عنوان هزینه مراقبت از کودک در هر روز (درمجموع حداکثر ۳۰۰ دلار آمریکا) به والدینی که ازطریق فرم ثبت‌نام نسبت به مراقبت از کودکان ابراز تمایل کرده باشند پرداخت می‌شود و با رعایت نوبت قابل دسترسی است. هزینه مراقبت از کودک را ارائه‌دهنده شخص ثالث تأمین می‌کند. اگر پیش از آغاز کنفرانس، درخواستتان برای مراقبت از کودکان را ازطریق ایمیل تأیید کنیم و حضورتان در محل نیز تأیید شود، ارائه‌دهنده ظرف ۷ روز کاری پس از Google I/O برای انجام مراحل بعدی با شما تماس می‌گیرد. آن‌ها همه هزینه‌های مراقبت از کودکان را مدیریت خواهند کرد.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">جای پارک ویژه مادران باردار در قسمت ADA دردسترس خواهد بود.&lt;br&gt; مادرانی که نوزاد شیرخواره دارند می‌توانند همراه با فرزندشان در کنفرانس شرکت کنند. چهار اتاق ویژه مادران در روزهای ۷ و ۸ مه از ۸ صبح تا ۸ شب و در روز ۹ مه از ۸ صبح تا ۴ بعدازظهر باز خواهد بود. برگه‌های ثبت‌نام روبروی اتاق‌های مادران دردسترس خواهد بود و اتاق‌ها با رعایت نوبت مورداستفاده قرار می‌گیرد. لطفاً برای کسب اطلاعات بیشتر به میز اطلاعات کنفرانس مراجعه کنید.&lt;br&gt;&lt;br&gt; مبلغ ۱۰۰ دلار آمریکا به‌عنوان هزینه مراقبت از کودک در هر روز (درمجموع حداکثر ۳۰۰ دلار آمریکا) به والدینی که ازطریق فرم ثبت‌نام نسبت به مراقبت از کودکان ابراز تمایل کرده باشند پرداخت می‌شود و با رعایت نوبت قابل دسترسی است. هزینه مراقبت از کودک را ارائه‌دهنده شخص ثالث تأمین می‌کند. اگر پیش از آغاز کنفرانس، درخواستتان برای مراقبت از کودکان را ازطریق ایمیل تأیید کنیم و حضورتان در محل نیز تأیید شود، ارائه‌دهنده ظرف ۷ روز کاری پس از Google I/O برای انجام مراحل بعدی با شما تماس می‌گیرد. آن‌ها همه هزینه‌های مراقبت از کودکان را مدیریت خواهند کرد.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google می‌کوشد برای همه افرادی که در رویداد شرکت می‌کنند، فارغ از هویت جنسیتی و نحوه ابراز جنسیت، گرایش جنسی، ناتوانی، تنوع عصب‌شناختی، ظاهر، اندازه بدن، قومیت، ملیت، نژاد، سن، مذهب، یا سایر مقوله‌های حفاظت‌شده، تجربه‌ای فراگیر و عاری از آزار و اذیت ایجاد کند. در راستای هرچه فراگیرتر کردن این رویداد، سرویس‌های بهداشتی بدون جنسیت در سراسر محل برگزاری دردسترس خواهد بود.&lt;br&gt;&lt;br&gt; ما هیچ‌گونه آزار و اذیت شرکت‌کنندگان رویداد را تحمل نمی‌کنیم.&lt;br&gt; نقض خط‌مشی ما برخورد جدی و پاسخ مناسب Google را به‌ دنبال خواهد داشت. برای کسب اطلاعات بیشتر درباره «دستورالعمل‌های انجمن رویداد Google» و «خط‌مشی جلوگیری از آزار و اذیت»، &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;اینجا&lt;/a&gt; را ببینید.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">در طول این جشنواره سه‌روزه، دو سخنرانی اصلی و تمامی جلسات در صفحه اصلی وب‌سایت رویداد، پخش جریانی مستقیم خواهد شد. اگر مشغول کار هستید یا در آن سوی سیاره زندگی می‌کنید و با جلسات اختلاف زمانی دارید، می‌توانید بعداً در &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;‏کانال YouTube ‏Google Developers‏&lt;/a&gt; جلسات را به‌طور ضبط‌شده تماشا کنید.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">بله! هرسال، برنامه‌نویسان سراسر دنیا میزبان &lt;a href=\"https://events.google.com/io/extended\"&gt;رویدادهای Google I/O Extended‏&lt;/a&gt; هستند. درطول این رویدادها، سازمان‌دهندگان می‌توانند رویداد را پخش جریانی مستقیم کنند و جلساتی شامل هکاتون، codlab‏، نسخه نمایشی و غیره را برگزار کنند.&lt;br&gt; اگر امسال به‌عنوان میزبان I/O Extended به ما ملحق می‌شوید، برای شروع به‌کار باید مراحل زیر را دنبال کنید: &lt;br&gt;&lt;br&gt;  برای دریافت نکات و پیشنهادهایی درباره نحوه میزبانی رویدادی موفق، &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;دستورالعمل سازمان‌دهنده&lt;/a&gt; را به‌طور کامل مطالعه کنید. برای نمایان‌شدن بیشتر، رویداد عمومی‌تان را در وب‌سایت I/O‏ &lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;ثبت کنید&lt;/a&gt; ‏&lt;br&gt;&lt;br&gt; برای قابلیت شناسایی آسان‌تر، از هشتگ رسمی #io19extended در همه پست‌های اجتماعی مرتبط با I/O Extended استفاده کنید.&lt;br&gt;&lt;br&gt; توجه: میزبان‌های I/O Extended می‌توانند با ارسال ایمیل به io19@google.com درخواست کنند که داده‌های شخصی‌شان و/یا داده‌های مربوط به رویداد پس از پایان رویداد حذف شود.&lt;br&gt; اگر می‌خواهید در رویداد I/O Extended شرکت کنید، برای پیدا کردن رویدادی در نزدیکی شما &lt;a href=\"https://events.google.com/io/extended\"&gt;نقشه ما&lt;/a&gt; را مرور کنید و به دعوت پاسخ دهید.&lt;br&gt; اگر درباره برنامه I/O Extended سؤالی دارید، ازطریق io19extended\\-external@google.com با ما تماس بگیرید.</string>\n    <string name=\"view_sessions_text\">مشاهده جلسات</string>\n    <string name=\"wifi_install_success\">شبکه Wifi ذخیره شد</string>\n    <string name=\"wifi_install_clipboard_message\">شبکه wifi ذخیره نشد.\\nبه جای آن، گذرواژه در بریده‌دان ذخیره شد.</string>\n    <string name=\"event_sessions_title\">جلسات</string>\n    <string name=\"event_sandbox_title\">جعبه ایمنی</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">ساعت اداری و بازبینی برنامه</string>\n    <string name=\"event_afterhours_title\">پس از ساعات کاری</string>\n    <string name=\"event_meals_title\">غذا</string>\n    <string name=\"event_sessions_description\">از ماه آوریل، شرکت‌کنندگان حضوری می‌توانند پیش از رویداد، صندلی‌شان را برای شرکت در «جلسات» در وب‌سایت I/O و نیز ازطریق برنامه دستگاه همراه I/O رزرو کنند (توجه: تعدادی از صندلی‌های «جلسه» قابل رزرو نخواهند بود و به افرادی که زودتر در محل حضور پیدا کنند اختصاص خواهند یافت). شرکت در Codelabs، «مرور برنامه»، و «ساعات اداری» با رعایت نوبت در محل انجام می‌شود.</string>\n    <string name=\"event_sandbox_description\">فضای ویژه برای کاوش، یادگیری و بازی با جدیدترین محصولات و پلتفورم‌های ما ازطریق برنامه‌های نمایشی تعاملی، نصب فیزیکی و غیره.</string>\n    <string name=\"event_codelabs_description\">در کیوسک‌های آماده به کدگذاری ما، تجربه عملی کسب کنید. در اینجا هرچه که برای آشنایی با جدیدترین و بهترین فناوری‌های Google نیاز دارید ازطریق آموزش‌های خودگام در اختیارتان قرار می‌گیرد، یا می‌توانید دستگاه خودتان را بیاورید و کار را به منزل ببرید. کارکنان Google آماده ارائه راهنمایی‌های مفید هستند و اگر دچار مشکل شدید شما را راهنمایی خواهند کرد.</string>\n    <string name=\"event_officehours_description\">ساعات اداری فرصتی برای ملاقات رو در رو با کارشناسان Google و مطرح کردن همه سؤالات فنی شما است، و «بازبینی برنامه» نیز فرصتی است که ازطریق آن می‌توانید درخصوص پروژه‌های خاص مربوط به برنامه‌ خود، مشاوره و راهنمایی دریافت کنید.</string>\n    <string name=\"event_afterhours_description\">پس از پایان «جلسات»، دو شب برای صرف غذا و نوشیدنی و سرگرمی در Shoreline حضور داشته باشید. در شب اول، مهمانی در فضای Sandbox برگزار می‌شود و در شب دوم، در «آمفی‌تئاتر» کنسرت انحصاری خواهیم داشت.</string>\n    <string name=\"event_meals_description\">طی هر سه روز برگزاری کنفرانس، از شرکت‌کنندگان با صبحانه، ناهار، و میان‌وعده رایگان پذیرایی می‌شود. در روزهای اول و دوم، طی رویدادهای «پس از ساعات کاری»، شام نیز دردسترس خواهد بود.</string>\n    <string name=\"wifi_header\">Wifi</string>\n    <string name=\"related_apps_header\">برنامه‌های مرتبط</string>\n    <string name=\"event_types_header\">انواع رویداد</string>\n    <string name=\"settings_time_zone_label\">زمان رویدادها به منطقه زمانی Pacific ‏(UTC-8)</string>\n    <string name=\"settings_enable_notifications\">فعال‌کردن اعلان‌ها</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">ارسال آمار کاربرد به‌طور ناشناس</string>\n    <string name=\"settings_tos\">شرایط و ضوابط</string>\n    <string name=\"settings_privacy_policy\">خط‌مشی حریم خصوصی</string>\n    <string name=\"settings_oss_licenses\">مجوز‌های منبع‌آزاد</string>\n    <string name=\"settings_theme_title\">انتخاب طرح زمینه</string>\n    <string name=\"settings_theme_system\">پیش‌فرض سیستم</string>\n    <string name=\"settings_theme_light\">روشن</string>\n    <string name=\"settings_theme_dark\">تیره</string>\n    <string name=\"settings_theme_battery\">تنظیم‌شده با بهینه‌سازی باتری</string>\n    <string name=\"built_with_material_components\">ساخته‌شده با Material Components.</string>\n    <string name=\"wifi_network_and_password\">شبکه: %1$s\\nگذرواژه: %2$s</string>\n    <string name=\"join_network\">پیوستن به شبکه</string>\n    <string name=\"assistant_app_description\">فقط بگویید «Hey Google, talk to Google I/O 19»!</string>\n    <string name=\"assistant_app_description2\">فقط بگویید «Hey Google, talk to Google I/O 19»!</string>\n    <string name=\"speaker_link_website\">وب‌سایت</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">رویدادها</string>\n    <string name=\"no_network_connection\">به اینترنت متصل نیستید.</string>\n    <string name=\"navigate_up\">پیمایش به بالا</string>\n    <string name=\"no_network_description\">برای استفاده از «کاوش I/O»، روش‌های زیر را امتحان کنید:\\n\\n - خاموش کردن حالت هواپیما\\n\\n - روشن کردن داده تلفن همراه یا Wi-Fi‏\\n\\n - بررسی سیگنال در منطقه‌تان</string>\n    <string name=\"phone_does_not_support_arcore_title\">تلفنتان از ARCore پشتیبانی نمی‌کند</string>\n    <string name=\"phone_does_not_support_arcore_message\">دستگاه دیگری را امتحان کنید یا از دوستتان قرض بگیرید</string>\n    <string name=\"codelabs_information\">ازطریق آموزش‌های خودگام در کیوسک‌های آماده برای کدگذاری ما، با جدیدترین و بهترین فناوری‌های Google آشنا شوید یا دستگاه خودتان را بیاورید و کار را به منزل ببرید. کیوسک‌ها هر روز باز هستند، مگر درطول سخنرانی اصلی.</string>\n    <string name=\"codelabs_building\">ساختمان Codelabs</string>\n    <string name=\"codelabs_website\">وب‌سایت Codelabs</string>\n    <string name=\"codelab_duration\">مدت: %1$d دقیقه</string>\n    <string name=\"start_codelab\">شروع codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programmation</string>\n    <string name=\"title_home\">Accueil</string>\n    <string name=\"title_map\">Plan</string>\n    <string name=\"title_explore_io\">Explorer la conférence I/O</string>\n    <string name=\"title_info\">Informations</string>\n    <string name=\"filters\">Filtres</string>\n    <string name=\"category_heading_tracks\">Thèmes</string>\n    <string name=\"category_heading_types\">Types</string>\n    <string name=\"reset\">Réinitialiser</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d événement</item>\n        <item quantity=\"other\">%1$d événements</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Vos événements favoris et réservés</string>\n    <string name=\"starred_and_reserved_short\">Vos événements</string>\n    <string name=\"search_schedule_hint\">Rechercher dans le programme</string>\n    <string name=\"search_schedule_no_results\">Aucun résultat</string>\n    <string name=\"agenda\">Planning</string>\n    <string name=\"event_starred\">Événement ajouté à vos favoris</string>\n    <string name=\"event_unstarred\">Événement supprimé de vos favoris</string>\n    <string name=\"event_star_error\">Erreur lors de l\\'ajout de l\\'événement aux favoris</string>\n    <string name=\"reservation_error\">Erreur lors de la modification de la réservation. Attendez que les demandes précédentes se terminent ou réessayez plus tard.</string>\n    <string name=\"reservation_request_succeeded\">Réservation demandée.</string>\n    <string name=\"reservation_cancel_succeeded\">Réservation annulée : \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Votre place a été réservée pour \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Événement remplacé.</string>\n    <string name=\"waitlist_new\">Vous avez été mis sur liste d\\'attente.</string>\n    <string name=\"waitlist_cancel_succeeded\">Retiré de la liste d\\'attente.</string>\n    <string name=\"got_it\">OK</string>\n    <string name=\"dont_show\">Ne pas afficher</string>\n    <string name=\"reservation_denied_cutoff\">Réservation refusée : l\\'heure de début est trop proche.</string>\n    <string name=\"reservation_denied_clash\">Réservation refusée : conflit avec une autre réservation.</string>\n    <string name=\"reservation_denied_unknown\">Réservation refusée : erreur inconnue.</string>\n    <string name=\"cancellation_denied_cutoff\">Annulation refusée : l\\'heure de début est trop proche.</string>\n    <string name=\"cancellation_denied_unknown\">Annulation refusée : erreur inconnue.</string>\n    <string name=\"schedule_filters_empty\">Aucun événement trouvé.</string>\n    <string name=\"reservation_reservable\">Réserver la place</string>\n    <string name=\"reservation_reserved\">Réservé</string>\n    <string name=\"reservation_waitlisted\">Sur liste d\\'attente</string>\n    <string name=\"reservation_waitlist_available\">Rejoindre la liste d\\'attente</string>\n    <string name=\"reservation_disabled\">Réservations indisponibles</string>\n    <string name=\"reservation_pending\">Réservation en attente</string>\n    <string name=\"schedule_hint_title\">Personnaliser votre programme</string>\n    <string name=\"schedule_hint_star_event\">Ajouter à vos événements favoris</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Réserver une place pour cette session</string>\n    <string name=\"rate_session\">Noter la séance</string>\n    <string name=\"menu_item_session_location\">Lieu de la séance</string>\n    <string name=\"menu_item_session_star\">Ajouter la session aux favoris</string>\n    <string name=\"menu_item_calendar\">Ajouter à l\\'agenda</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Intervenants</string>\n    <string name=\"session_detail_related_header\">Événements associés</string>\n    <string name=\"feedback_submit\">Envoyer</string>\n    <string name=\"feedback_thank_you\">Merci de vos commentaires.</string>\n    <string name=\"feedback_q1_text\">Qu\\'avez-vous pensé de la qualité globale de la session ?</string>\n    <string name=\"feedback_q2_text\">Comment décririez-vous les contenus de la session par rapport à vos attentes/la description de la session ?</string>\n    <string name=\"feedback_q3_text\">La session était-elle pertinente par rapport à vos projets ?</string>\n    <string name=\"feedback_q4_text\">La session était-elle pertinente par rapport à vos projets ?</string>\n    <string name=\"feedback_q1_label_start\">Médiocre</string>\n    <string name=\"feedback_q2_label_start\">Médiocres</string>\n    <string name=\"feedback_q3_label_start\">Médiocres</string>\n    <string name=\"feedback_q4_label_start\">Pas vraiment pertinente</string>\n    <string name=\"feedback_q1_label_end\">Exceptionnels</string>\n    <string name=\"feedback_q2_label_end\">Exceptionnels</string>\n    <string name=\"feedback_q3_label_end\">Très pertinente</string>\n    <string name=\"feedback_q4_label_end\">Très pertinente</string>\n    <string name=\"a11y_show_navigation\">Afficher le menu de navigation</string>\n    <string name=\"a11y_collapse_filters_sheet\">Réduire le panneau des filtres</string>\n    <string name=\"a11y_clear_tag_filters\">Effacer les filtres</string>\n    <string name=\"a11y_filter_applied\">Le filtre %1s a été appliqué</string>\n    <string name=\"a11y_filter_not_applied\">Le filtre %1s n\\'a pas été appliqué</string>\n    <string name=\"a11y_reservation_available\">Réserver l\\'événement</string>\n    <string name=\"a11y_reservation_reserved\">Événement réservé</string>\n    <string name=\"a11y_reservation_disabled\">Réservation indisponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Rejoindre la liste d\\'attente de l\\'événement</string>\n    <string name=\"a11y_reservation_wait_listed\">Sur la liste d\\'attente de l\\'événement</string>\n    <string name=\"a11y_reservation_pending\">Réservation en attente</string>\n    <string name=\"a11y_starred\">Événement ajouté aux favoris</string>\n    <string name=\"a11y_unstarred\">Événement non ajouté aux favoris</string>\n    <string name=\"a11y_star\">Ajouter aux favoris</string>\n    <string name=\"a11y_play\">Voir la vidéo</string>\n    <string name=\"a11y_select_map_mode\">Sélectionner le mode Plan</string>\n    <string name=\"a11y_search_schedule\">Rechercher dans le programme</string>\n    <string name=\"welcome\">Bienvenue</string>\n    <string name=\"a11y_signed_in_content_description\">Connecté en tant que %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Appuyez ici pour vous connecter.</string>\n    <string name=\"dialog_sign_in_content\">Connectez-vous pour enregistrer des événements, réserver des places et noter des sessions (auxquelles vous avez participé). Les actions seront synchronisées entre votre compte, l\\'application et le site.</string>\n    <string name=\"sign_in\">Se connecter</string>\n    <string name=\"firebase_auth_no_network_connection\">Aucune connexion Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Erreur inconnue</string>\n    <string name=\"dialog_sign_out_content\">L\\'ensemble des événements enregistrés, des places réservées et des notes des sessions (auxquelles vous avez participé) restent synchronisés avec votre compte.</string>\n    <string name=\"sign_out\">Déconnexion</string>\n    <string name=\"manage_google_account\">Gérer votre compte Google</string>\n    <string name=\"remove_reservation_title\">Supprimer la réservation ?</string>\n    <string name=\"remove_reservation_content\">Vous êtes sur le point de renoncer à votre place pour \"%1$s\". Si vous décidez de vous y rendre quand même sans réservation, toutes les sessions disposent de places disponibles selon la règle du \"premier arrivé, premier servi\".</string>\n    <string name=\"cancel\">Annuler</string>\n    <string name=\"remove\">Supprimer</string>\n    <string name=\"swap_reservation_title\">Échanger la réservation ?</string>\n    <string name=\"swap_reservation_content\">Vous disposez déjà d\\'une réservation/place sur liste d\\'attente pour \"%1$s\". Une seule réservation par créneau horaire est autorisée. Voulez-vous l\\'échanger contre \"%2$s\" ?</string>\n    <string name=\"swap\">Échanger</string>\n    <string name=\"notifications_preference_dialog_title\">Notifications I/O</string>\n    <string name=\"notifications_preference_dialog_content\">Souhaitez-vous recevoir des notifications sur I/O ? Nous vous enverrons des informations sur les heures de début des sessions, les animations après-événement, les enregistrements de session, etc. Vous pouvez modifier ce paramètre depuis \"Infos &gt; Paramètres\" à tout moment.</string>\n    <string name=\"no\">Non</string>\n    <string name=\"yes\">Oui</string>\n    <string name=\"feed_not_available\">Aucune annonce trouvée.</string>\n    <string name=\"feed_loading_error\">Impossible de charger le flux. Réessayez plus tard.</string>\n    <string name=\"feed_announcement_title\">Annonces</string>\n    <string name=\"feed_upcoming_events\">Événements à venir</string>\n    <string name=\"feed_saved_events\">Événements enregistrés</string>\n    <string name=\"feed_no_saved_events\">Aucun événement enregistré</string>\n    <string name=\"feed_view_all_events\">Afficher tous les événements</string>\n    <string name=\"feed_view_your_schedule\">Consulter votre planning</string>\n    <string name=\"feed_watch_live_stream\">Regarder en direct</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s jour</item>\n        <item quantity=\"other\">%s jours</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s heure</item>\n        <item quantity=\"other\">%s heures</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minute</item>\n        <item quantity=\"other\">%s minutes</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s seconde</item>\n        <item quantity=\"other\">%s secondes</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Partager la séance</string>\n    <string name=\"share_text_session_detail\">Voir « %1$s » à #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Partage</string>\n    <string name=\"map_variant_after_dark\">After Dark</string>\n    <string name=\"map_variant_concert\">Concert</string>\n    <string name=\"map_variant_daytime\">Journée</string>\n    <string name=\"enable_my_location\">Activer la localisation</string>\n    <string name=\"my_location_rationale\">L\\'application doit disposer de l\\'autorisation d\\'accéder à votre position pour afficher celle-ci sur la carte.</string>\n    <string name=\"onboarding_get_started\">Commencer</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Bienvenue dans Google I/O</string>\n    <string name=\"onboarding_date_location\">Du 7 au 9 mai 2019\\nMountain View, Californie</string>\n    <string name=\"onboarding_label_days\">J</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O approche à grands pas</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Regardez un résumé de la conférence I/O 2019 et recherchez le hashtag #io19 sur les réseaux sociaux</string>\n    <string name=\"onboarding_signin\">Connectez-vous pour recevoir les notifications relatives à la conférence I/O. En tant que participant, vous pourrez également réserver vos places aux sessions.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">Début de la session dans %1$s minute</item>\n        <item quantity=\"other\">Début de la session dans %1$s minutes</item>\n    </plurals>\n    <string name=\"expanded\">Élément développé</string>\n    <string name=\"collapsed\">Élément réduit</string>\n    <string name=\"event_title\">Événement</string>\n    <string name=\"travel_title\">Voyage</string>\n    <string name=\"faq_title\">FAQ</string>\n    <string name=\"settings_title\">Paramètres</string>\n    <string name=\"about_title\">À propos</string>\n    <string name=\"travel_what_to_bring_title\">Ce que vous devez emmener à l\\'événement</string>\n    <string name=\"travel_hotels_title\">Hôtels</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Se rendre à Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Se rendre à Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Service de navette</string>\n    <string name=\"travel_off_site_parking_title\">Parking hors site</string>\n    <string name=\"travel_for_public_transportation_title\">Transports en commun</string>\n    <string name=\"travel_biking_title\">Vélo</string>\n    <string name=\"travel_ridesharing_title\">Partage de taxi</string>\n    <string name=\"travel_airport_transfers_title\">Transferts vers l\\'aéroport</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O est un festival en plein air. Cette particularité, qui fait tout le charme d\\'I/O, implique toutefois une légère organisation au préalable. Même si les sessions se tiendront dans des tentes climatisées, nous vous recommandons d\\'apporter de l\\'écran solaire, des lunettes de soleil, ainsi qu\\'un vêtement chaud à porter en soirée lorsque les températures deviennent plus fraîches. I/O est un événement décontracté. Choisissez donc votre tenue en conséquence.</string>\n    <string name=\"travel_hotels_description\">Nous avons réservé des groupes de chambres dans de nombreux hôtels locaux. La liste des hôtels et chambres disponibles sera mise à jour régulièrement. Utilisez le plan ci-dessous pour trouver l\\'hôtel qui vous convient le mieux. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Plan des hôtels&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Voici les trois principaux aéroports de la baie de San Francisco proposant des vols internationaux :&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international de San Francisco (SFO)&lt;/a&gt; ~39 kilomètres&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international d\\'Oakland (OAK)&lt;/a&gt; ~52 kilomètres&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international de San Jose (SJC)&lt;/a&gt; ~20 kilomètres</string>\n    <string name=\"travel_getting_to_shoreline_description\">Afin de réduire à la fois le risque d\\'embouteillages et notre empreinte carbone, nous avons fait de Google I/O 2019 un \"événement sans parking*\". Nous avons longuement réfléchi avant de prendre cette décision, et nous vous offrons en retour de nombreuses options gratuites pour vous rendre à l\\'événement sans avoir besoin de véhicule.&lt;br&gt;&lt;br&gt;Nous vous communiquerons des informations complémentaires à ce sujet à l\\'approche de l\\'événement.&lt;br&gt;&lt;br&gt;*Des places de parking pour handicapés seront disponibles.</string>\n    <string name=\"travel_shuttle_service_description\">Afin de réduire à la fois le risque d\\'embouteillages et notre empreinte carbone, nous avons fait de Google I/O 2019 un \"événement sans parking*\". Nous avons longuement réfléchi avant de prendre cette décision, et nous vous offrons en retour de nombreuses options gratuites pour vous rendre à l\\'événement sans avoir besoin de véhicule.&lt;br&gt;&lt;br&gt;Nous vous communiquerons des informations complémentaires à ce sujet à l\\'approche de l\\'événement.&lt;br&gt;&lt;br&gt;*Des places de parking pour handicapés seront disponibles.</string>\n    <string name=\"travel_off_site_parking_description\">Parking hors site gratuit au &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;stade Avaya&lt;/a&gt;. Des navettes seront proposées entre le stade Avaya et Google I/O.&lt;br&gt;&lt;br&gt; Si vous avez des besoins d\\'assistance spécifiques, veuillez l\\'indiquer sur le formulaire d\\'inscription. L\\'équipe responsable de l\\'organisation vous contactera directement.</string>\n    <string name=\"travel_for_public_transportation_description\">Au moment de votre pré-inscription, vous pourrez collecter des cartes de transport en commun prépayées. Vous pouvez vous rendre à proximité du site avec les transports en commun suivants :&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt; : Réseau de trains régionaux &lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt; : Train léger desservant South Bay &lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt; : Bay Area Rapid Transit &lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt; : Réseau de trains régionaux&lt;br&gt;&lt;br&gt; Les transports en commun ne permettent pas de se rendre directement à la conférence Google I/O. Des informations supplémentaires seront bientôt disponibles concernant les lieux desservis par les navettes de Google I/O.</string>\n    <string name=\"travel_biking_description\">Un parking à vélos gratuit sera disponible au Shoreline Amphitheatre dans le parking A. L\\'association Silicon Valley Bicycle Coalition proposera chaque jour un service de stationnement surveillé pour votre vélo de 7h jusqu\\'à la fin de l\\'événement.&lt;br&gt;&lt;br&gt; Utilisez Google Maps pour connaître les meilleurs itinéraires pour vélos et trouver votre route. Deux pistes cyclables, le Stevens Creek Trail et le Permanente Creek Trail, permettent de se rendre facilement au Shoreline Amphitheatre.</string>\n    <string name=\"travel_ridesharing_description\">Le dernier jour de la conférence, des transferts seront proposés entre Google I/O et les aéroports de San Francisco et San Jose. Aucun transfert ne sera disponible les autres jours.</string>\n    <string name=\"travel_airport_transfers_description\">Le dernier jour de la conférence, des transferts seront proposés entre Google I/O et les aéroports de San Francisco et San Jose. Aucun transfert ne sera disponible les autres jours.</string>\n    <string name=\"faq_when_and_where_title\">Où et quand aura lieu l\\'édition 2019 de la conférence Google I/O ?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Comment puis-je me tenir informé des dernières actualités relatives à Google I/O ?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Toutes les sessions seront-elles en anglais ?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Puis-je réserver des sessions avant la conférence ?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Quel est le meilleur moyen de se rendre au Shoreline Amphitheatre ?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Où et quand puis-je récupérer mon badge ?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">J\\'aimerais vraiment être assis au premier rang lors de la présentation. Que me conseillez-vous ?</string>\n    <string name=\"faq_what_should_i_wear_title\">Quel est le code vestimentaire ?</string>\n    <string name=\"faq_onsite_food_options_title\">J\\'aime grignoter. Que pourrai-je manger sur le site ?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si je perds un objet sur le site, où pourrai-je le retrouver ?</string>\n    <string name=\"faq_after_dark_program_title\">Les programmes After Dark ont l\\'air intéressants ! Devrais-je y participer ?</string>\n    <string name=\"faq_accessibility_needs_title\">J\\'ai des besoins spéciaux en termes d\\'accessibilité. Pouvez-vous y répondre ?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Quelles mesures prenez-vous pour aider les femmes enceintes et les parents qui assistent à I/O ?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Règlement de la communauté et politique anti-harcèlement de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Les sessions seront-elles retransmises en direct ? Que faire si je ne peux pas suivre l\\'événement en temps réel ?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">J\\'aimerais célébrer I/O avec ma communauté.  Auriez-vous une suggestion ?</string>\n    <string name=\"faq_when_and_where_description\">Pour connaître les dernières informations relatives aux sessions, aux intervenants et aux activités, consultez le &lt;a href=\"https://events.google.com/io/\"&gt;site Web de l\\'édition 2019 de Google I/O&lt;/a&gt; et le &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog Google Developers&lt;/a&gt;. Suivez-nous également sur &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; et &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Vous pouvez aussi suivre et rejoindre les discussions relatives à l\\'édition 2019 de Google I/O sur les réseaux sociaux à l\\'aide du hashtag officiel &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. De plus, nous envoyons par e-mail aux participants inscrits toutes les informations importantes ainsi que des instructions afin qu\\'ils puissent préparer leur arrivée.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Pour connaître les dernières informations relatives aux sessions, aux intervenants et aux activités, consultez le &lt;a href=\"https://events.google.com/io/\"&gt;site Web de l\\'édition 2019 de Google I/O&lt;/a&gt; et le &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog Google Developers&lt;/a&gt;. Suivez-nous également sur &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; et &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Vous pouvez aussi suivre et rejoindre les discussions relatives à l\\'édition 2019 de Google I/O sur les réseaux sociaux à l\\'aide du hashtag officiel &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. De plus, nous envoyons par e-mail aux participants inscrits toutes les informations importantes ainsi que des instructions afin qu\\'ils puissent préparer leur arrivée.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Oui. Notre audience mondiale pourra ainsi suivre la conférence.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Dès le mois d\\'avril, les personnes venant assister à la conférence en personne peuvent réserver à l\\'avance leurs places aux différentes sessions sur le site Web de Google I/O ou via l\\'application I/O (remarque : un certain nombre de places ne pourront pas être réservées et seront disponibles le jour même sur le principe du \"premier arrivé, premier servi\"). Les événements Codelabs, App Reviews et Office Hours ne seront accessibles que sur le principe du \"premier arrivé, premier servi\".</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consultez la section Déplacements pour obtenir des conseils relatifs aux transports, y compris des informations sur les navettes, des itinéraires routiers et cyclables, des conseils de covoiturage, et bien plus encore !</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Pour accélérer le processus d\\'enregistrement, nous débuterons la distribution des badges le lundi 6 mai au Shoreline Amphitheatre. Avant de vous donner votre badge Google I/O, nous devrons procéder aux opérations suivantes :&lt;br&gt; - Vérifier votre pièce d\\'identité avec photo : nous acceptons les permis officiels, les passeports et d\\'autres pièces d\\'identité. Si vous ne disposez pas d\\'une pièce d\\'identité conforme, vous ne recevrez pas votre badge et vous ne pourrez pas assister à l\\'événement. Le nom indiqué sur votre pièce d\\'identité doit être identique à celui de votre profil d\\'enregistrement. Si vous êtes un universitaire, n\\'oubliez pas d\\'apporter la preuve que vous pouvez participer à cet événement.&lt;br&gt; - Scanner le code QR d\\'enregistrement que vous avez reçu par e-mail : vous n\\'avez pas besoin d\\'imprimer l\\'e-mail. Nous pouvons scanner votre code directement sur votre téléphone ! #savetheenvironment &lt;br&gt;&lt;br&gt;Veuillez noter que vous n\\'avez pas le droit de donner ou fournir de quelque manière que ce soit votre badge à une tierce personne, ni de le partager avec elle. Les badges Google I/O ne sont pas remplaçables. Ne perdez pas le vôtre, sans quoi vous ne pourrez plus assister à la conférence. Vous devez porter votre badge pour accéder à Google I/O, y compris aux sessions, aux espaces Sandbox et aux événements After Hours. Si un agent de la sécurité vous le demande, nous vous prions de bien vouloir présenter ou fournir une autre pièce d\\'identité. Les badges Google I/O peuvent comporter votre nom, le nom de votre entreprise ou organisation (si vous l\\'avez fourni) et votre photo.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Tous les participants pourront assister aux présentations. Toutefois, les places seront attribuées selon le principe du \"premier arrivé, premier servi\" lors de la distribution des badges qui commencera à 7h le 6 mai. Alors, veillez à ne pas arriver trop tard !</string>\n    <string name=\"faq_what_should_i_wear_description\">La conférence pour les développeurs Google I/O a lieu en extérieur. Vous pouvez donc porter des vêtements confortables et décontractés. Nous n\\'imposons pas de code vestimentaire. La région de la baie de San Francisco peut connaître des températures très élevées pendant la journée et plus fraîches le soir. Tenez compte de ces informations lors de la préparation de votre valise.</string>\n    <string name=\"faq_onsite_food_options_description\">Bonne nouvelle, nous aussi nous aimons manger !  Le petit-déjeuner, le déjeuner et des en-cas seront servis gratuitement aux participants tous les jours de la conférence Google I/O. Le dîner sera également offert les premier et deuxième jours pendant les événements After Hours.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Nous avons tout prévu ! Un service des objets trouvés sera disponible au bureau d\\'information de la conférence pendant toute la durée de l\\'événement. Tout objet trouvé dans la nuit sera remis au service de sécurité de la conférence. Remarque : les badges Google I/O ne sont pas remplaçables. Ne perdez pas le vôtre, sans quoi vous ne pourrez plus assister à la conférence.</string>\n    <string name=\"faq_after_dark_program_description\">Ces deux soirées ne sont à manquer sous aucun prétexte ! Musique et jeux seront organisés le 8 mai pour tous les participants, et un concert exclusif aura lieu le 9 mai au Shoreline Amphitheatre. Nourriture et boissons seront également disponibles à chacune de ces soirées (les boissons alcoolisées sont réservées au personnes âgées de 21 ans et plus). Les deux événements After Hours se tiendront au Shoreline Amphitheatre. Vous devrez présenter votre badge à l\\'entrée.</string>\n    <string name=\"faq_accessibility_needs_description\">Des places de parking réservées aux femmes enceintes seront disponibles dans la zone pour les personnes à mobilité réduite.&lt;br&gt; Les mères qui allaitent sont les bienvenues à la conférence avec leur enfant. Quatre salons d\\'allaitement seront ouverts les 7 et 8 mai de 8h à 20h, et le 9 mai de 8h à 16h. Des feuilles d\\'inscription seront disponibles devant les salons d\\'allaitement, qui pourront être utilisés selon le principe du \"premier arrivé, premier servi\". Veuillez vous renseigner auprès du bureau d\\'information pour en savoir plus.&lt;br&gt;&lt;br&gt; Les parents qui expriment un besoin de garde d\\'enfant dans leur formulaire d\\'inscription à l\\'événement pourront bénéficier d\\'un remboursement de leurs frais à hauteur de 100 $ par jour (pour un maximum de 300 $), selon le principe du \"premier arrivé, premier servi\". Notre offre de remboursement des frais de garde d\\'enfant est proposée par un fournisseur tiers. Si nous acceptons votre demande par e-mail avant le début de la conférence et que votre présence sur le site est confirmée, notre fournisseur vous contactera sous 7 jours ouvrés au terme de Google I/O pour vous faire part des démarches à suivre. Ce fournisseur tiers est chargé d\\'administrer les remboursements de frais de garde d\\'enfant pour nous.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Des places de parking réservées aux femmes enceintes seront disponibles dans la zone pour les personnes à mobilité réduite.&lt;br&gt; Les mères qui allaitent sont les bienvenues à la conférence avec leur enfant. Quatre salons d\\'allaitement seront ouverts les 7 et 8 mai de 8h à 20h, et le 9 mai de 8h à 16h. Des feuilles d\\'inscription seront disponibles devant les salons d\\'allaitement, qui pourront être utilisés selon le principe du \"premier arrivé, premier servi\". Veuillez vous renseigner auprès du bureau d\\'information pour en savoir plus.&lt;br&gt;&lt;br&gt; Les parents qui expriment un besoin de garde d\\'enfant dans leur formulaire d\\'inscription à l\\'événement pourront bénéficier d\\'un remboursement de leurs frais à hauteur de 100 $ par jour (pour un maximum de 300 $), selon le principe du \"premier arrivé, premier servi\". Notre offre de remboursement des frais de garde d\\'enfant est proposée par un fournisseur tiers. Si nous acceptons votre demande par e-mail avant le début de la conférence et que votre présence sur le site est confirmée, notre fournisseur vous contactera sous 7 jours ouvrés au terme de Google I/O pour vous faire part des démarches à suivre. Ce fournisseur tiers est chargé d\\'administrer les remboursements de frais de garde d\\'enfant pour nous.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google s\\'engage à offrir à tous les participants une expérience inclusive ne laissant aucune place au harcèlement, indépendamment de leur identité et expression de genre, orientation sexuelle, handicap, neurodiversité, apparence physique, corpulence, ethnicité, nationalité, race, âge, religion, ou de toute autre catégorie protégée. À des fins d\\'inclusion supplémentaires, des toilettes neutres seront disponibles partout sur le site.&lt;br&gt;&lt;br&gt; Nous ne tolérons aucune forme de harcèlement à l\\'encontre des participants à l\\'événement.&lt;br&gt; Google considère toute violation à son règlement comme extrêmement sérieuse et y réagira en conséquence. Pour en savoir plus sur le règlement de la communauté et la politique anti-harcèlement de Google, veuillez consulter &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;cette page&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Les deux présentations ainsi que l\\'ensemble des sessions seront diffusées en direct sur la page d\\'accueil du site Web de l\\'événement pendant les trois jours. Si vous n\\'êtes pas disponible ou si le décalage horaire est trop important, sachez que vous pourrez visionner ultérieurement les enregistrements de sessions sur la &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;chaîne YouTube Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Oui. Chaque année, les développeurs du monde entier organisent leurs propres &lt;a href=\"https://events.google.com/io/extended\"&gt;événements Google I/O Extended&lt;/a&gt;. Durant ces événements, la conférence est diffusée en direct et des sessions spéciales sont organisées, telles que des hackathons, des ateliers de programmation, des démonstrations, et bien plus encore.&lt;br&gt; Si vous souhaitez être l\\'hôte d\\'un événement I/O Extended cette année, voici les démarches que vous devez suivre pour commencer :&lt;br&gt;&lt;br&gt; Consultez le &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guide de l\\'organisateur&lt;/a&gt; pour obtenir des conseils et suggestions vous aidant à créer un événement réussi.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Enregistrez&lt;/a&gt; votre événement public sur le site Web I/O pour une meilleure visibilité.&lt;br&gt;&lt;br&gt; Utilisez le hashtag officiel #io19extended dans toutes vos publications sur les réseaux sociaux en lien avec I/O Extended pour que votre événement soit plus facilement trouvable.&lt;br&gt;&lt;br&gt; Remarque : En tant qu\\'hôte d\\'un événement I/O Extended, vous pouvez demander à ce que vos données à caractère personnel et/ou les informations de votre événement soient effacées au terme de celui-ci en envoyant un e-mail à io19@google.com.&lt;br&gt; Si vous souhaitez simplement assister à un événement I/O Extended, consultez &lt;a href=\"https://events.google.com/io/extended\"&gt;notre plan&lt;/a&gt; pour en trouver un près de chez vous et répondez à l\\'invitation !&lt;br&gt; Pour toute question sur le programme I/O Extended, contactez-nous à l\\'adresse io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Afficher les sessions</string>\n    <string name=\"wifi_install_success\">Réseau Wi-Fi enregistré</string>\n    <string name=\"wifi_install_clipboard_message\">Impossible d\\'enregistrer le réseau Wi-Fi.\\nMot de passe copié dans le presse-papiers.</string>\n    <string name=\"event_sessions_title\">Sessions</string>\n    <string name=\"event_sandbox_title\">Bac à sable</string>\n    <string name=\"event_codelabs_title\">Ateliers de programmation</string>\n    <string name=\"event_officehours_title\">Permanences et avis sur les applications</string>\n    <string name=\"event_afterhours_title\">Après-événement</string>\n    <string name=\"event_meals_title\">Repas</string>\n    <string name=\"event_sessions_description\">Dès le mois d\\'avril, les personnes venant assister à la conférence en personne peuvent réserver à l\\'avance leurs places aux différentes sessions sur le site Web de Google I/O ou via l\\'application I/O (remarque : un certain nombre de places ne pourront pas être réservées et seront disponibles le jour même sur le principe du \"premier arrivé, premier servi\"). Les événements Codelabs, App Reviews et Office Hours ne seront accessibles que sur le principe du \"premier arrivé, premier servi\".</string>\n    <string name=\"event_sandbox_description\">Espaces dédiés permettant de découvrir, de tester et d\\'apprendre à utiliser nos derniers produits et plates-formes grâce à des démonstrations interactives, des installations physiques, etc.</string>\n    <string name=\"event_codelabs_description\">Nos kiosques de programmation vous permettent d\\'acquérir une expérience pratique. Vous y trouverez tout le nécessaire pour découvrir les technologies les plus récentes et performantes de Google grâce à des didacticiels d\\'autoformation. Vous pouvez également apporter votre propre ordinateur et terminer votre travail à la maison. Le personnel de Google sera à votre disposition pour vous donner des conseils utiles et vous guider si vous êtes bloqué.</string>\n    <string name=\"event_officehours_description\">Les permanences vous donnent l\\'occasion de rencontrer individuellement des experts de Google pour poser toutes vos questions techniques. Quant aux avis sur les applications, ils vous permettent de recevoir des conseils et des astuces sur vos projets d\\'applications spécifiques.</string>\n    <string name=\"event_afterhours_description\">Une fois les sessions terminées, restez dans les parages pour profiter de deux soirées avec repas, boissons et bons moments en perspective. Lors de la première, les participants se réuniront au niveau de l\\'espace de bac à sable et, lors de la seconde, un concert sera donné en exclusivité dans l\\'Amphitheatre.</string>\n    <string name=\"event_meals_description\">Le petit-déjeuner, le déjeuner et des en-cas seront servis gratuitement aux participants tous les jours de la conférence Google I/O. Le dîner sera également offert les premier et deuxième jours pendant les événements After Hours.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Applications associées</string>\n    <string name=\"event_types_header\">Types d\\'événement</string>\n    <string name=\"settings_time_zone_label\">Événements dans le fuseau horaire du Pacifique (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Activer les notifications</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Envoyer des statistiques d\\'utilisation anonymes</string>\n    <string name=\"settings_tos\">Conditions d\\'utilisation</string>\n    <string name=\"settings_privacy_policy\">Règles de confidentialité</string>\n    <string name=\"settings_oss_licenses\">Licences Open Source</string>\n    <string name=\"settings_theme_title\">Sélectionner un thème</string>\n    <string name=\"settings_theme_system\">Paramètres par défaut</string>\n    <string name=\"settings_theme_light\">Clair</string>\n    <string name=\"settings_theme_dark\">Foncé</string>\n    <string name=\"settings_theme_battery\">Défini par l\\'économiseur de batterie</string>\n    <string name=\"built_with_material_components\">Créée avec Material Components.</string>\n    <string name=\"wifi_network_and_password\">Réseau : %1$s\\nMot de passe : %2$s</string>\n    <string name=\"join_network\">Rejoindre le réseau</string>\n    <string name=\"assistant_app_description\">Dites \"Ok Google, parle à Google I/O 19\" !</string>\n    <string name=\"assistant_app_description2\">Dites \"Ok Google, parle à Google I/O 19\" !</string>\n    <string name=\"speaker_link_website\">Site Web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Événements</string>\n    <string name=\"no_network_connection\">Aucune connexion Internet.</string>\n    <string name=\"navigate_up\">Remonter</string>\n    <string name=\"no_network_description\">Pour utiliser Explore I/O, procédez comme suit :\\n\\n - Désactivez le mode Avion.\\n\\n - Activez un réseau de données mobiles ou Wi-Fi.\\n\\n - Vérifiez le signal aux alentours.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Votre téléphone n\\'est pas compatible avec ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Essayez avec un autre appareil, ou empruntez celui d\\'un ami</string>\n    <string name=\"codelabs_information\">Découvrez les technologies les plus récentes et performantes de Google grâce à des tutoriels d\\'autoformation accessibles dans nos kiosques de programmation. Vous pouvez également apporter votre propre ordinateur et terminer votre travail à la maison. Les kiosques sont ouverts tous les jours, sauf pendant la première présentation.</string>\n    <string name=\"codelabs_building\">Bâtiment accueillant les ateliers de programmation</string>\n    <string name=\"codelabs_website\">Site Web Codelabs</string>\n    <string name=\"codelab_duration\">Durée : %1$d min</string>\n    <string name=\"start_codelab\">Démarrer l\\'atelier de programmation</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-fr-rCH/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programmation</string>\n    <string name=\"title_home\">Accueil</string>\n    <string name=\"title_map\">Plan</string>\n    <string name=\"title_explore_io\">Explorer la conférence I/O</string>\n    <string name=\"title_info\">Informations</string>\n    <string name=\"filters\">Filtres</string>\n    <string name=\"category_heading_tracks\">Thèmes</string>\n    <string name=\"category_heading_types\">Types</string>\n    <string name=\"reset\">Réinitialiser</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d événement</item>\n        <item quantity=\"other\">%1$d événements</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Vos événements favoris et réservés</string>\n    <string name=\"starred_and_reserved_short\">Vos événements</string>\n    <string name=\"search_schedule_hint\">Rechercher dans le programme</string>\n    <string name=\"search_schedule_no_results\">Aucun résultat</string>\n    <string name=\"agenda\">Planning</string>\n    <string name=\"event_starred\">Événement ajouté à vos favoris</string>\n    <string name=\"event_unstarred\">Événement supprimé de vos favoris</string>\n    <string name=\"event_star_error\">Erreur lors de l\\'ajout de l\\'événement aux favoris</string>\n    <string name=\"reservation_error\">Erreur lors de la modification de la réservation. Attendez que les demandes précédentes se terminent ou réessayez plus tard.</string>\n    <string name=\"reservation_request_succeeded\">Réservation demandée.</string>\n    <string name=\"reservation_cancel_succeeded\">Réservation annulée : \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Votre place a été réservée pour \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Événement remplacé.</string>\n    <string name=\"waitlist_new\">Vous avez été mis sur liste d\\'attente.</string>\n    <string name=\"waitlist_cancel_succeeded\">Retiré de la liste d\\'attente.</string>\n    <string name=\"got_it\">OK</string>\n    <string name=\"dont_show\">Ne pas afficher</string>\n    <string name=\"reservation_denied_cutoff\">Réservation refusée : l\\'heure de début est trop proche.</string>\n    <string name=\"reservation_denied_clash\">Réservation refusée : conflit avec une autre réservation.</string>\n    <string name=\"reservation_denied_unknown\">Réservation refusée : erreur inconnue.</string>\n    <string name=\"cancellation_denied_cutoff\">Annulation refusée : l\\'heure de début est trop proche.</string>\n    <string name=\"cancellation_denied_unknown\">Annulation refusée : erreur inconnue.</string>\n    <string name=\"schedule_filters_empty\">Aucun événement trouvé.</string>\n    <string name=\"reservation_reservable\">Réserver la place</string>\n    <string name=\"reservation_reserved\">Réservé</string>\n    <string name=\"reservation_waitlisted\">Sur liste d\\'attente</string>\n    <string name=\"reservation_waitlist_available\">Rejoindre la liste d\\'attente</string>\n    <string name=\"reservation_disabled\">Réservations indisponibles</string>\n    <string name=\"reservation_pending\">Réservation en attente</string>\n    <string name=\"schedule_hint_title\">Personnaliser votre programme</string>\n    <string name=\"schedule_hint_star_event\">Ajouter à vos événements favoris</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Réserver une place pour cette session</string>\n    <string name=\"rate_session\">Noter la séance</string>\n    <string name=\"menu_item_session_location\">Lieu de la séance</string>\n    <string name=\"menu_item_session_star\">Ajouter la session aux favoris</string>\n    <string name=\"menu_item_calendar\">Ajouter à l\\'agenda</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Intervenants</string>\n    <string name=\"session_detail_related_header\">Événements associés</string>\n    <string name=\"feedback_submit\">Envoyer</string>\n    <string name=\"feedback_thank_you\">Merci de vos commentaires.</string>\n    <string name=\"feedback_q1_text\">Qu\\'avez-vous pensé de la qualité globale de la session ?</string>\n    <string name=\"feedback_q2_text\">Comment décririez-vous les contenus de la session par rapport à vos attentes/la description de la session ?</string>\n    <string name=\"feedback_q3_text\">La session était-elle pertinente par rapport à vos projets ?</string>\n    <string name=\"feedback_q4_text\">La session était-elle pertinente par rapport à vos projets ?</string>\n    <string name=\"feedback_q1_label_start\">Médiocre</string>\n    <string name=\"feedback_q2_label_start\">Médiocres</string>\n    <string name=\"feedback_q3_label_start\">Médiocres</string>\n    <string name=\"feedback_q4_label_start\">Pas vraiment pertinente</string>\n    <string name=\"feedback_q1_label_end\">Exceptionnels</string>\n    <string name=\"feedback_q2_label_end\">Exceptionnels</string>\n    <string name=\"feedback_q3_label_end\">Très pertinente</string>\n    <string name=\"feedback_q4_label_end\">Très pertinente</string>\n    <string name=\"a11y_show_navigation\">Afficher le menu de navigation</string>\n    <string name=\"a11y_collapse_filters_sheet\">Réduire le panneau des filtres</string>\n    <string name=\"a11y_clear_tag_filters\">Effacer les filtres</string>\n    <string name=\"a11y_filter_applied\">Le filtre %1s a été appliqué</string>\n    <string name=\"a11y_filter_not_applied\">Le filtre %1s n\\'a pas été appliqué</string>\n    <string name=\"a11y_reservation_available\">Réserver l\\'événement</string>\n    <string name=\"a11y_reservation_reserved\">Événement réservé</string>\n    <string name=\"a11y_reservation_disabled\">Réservation indisponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Rejoindre la liste d\\'attente de l\\'événement</string>\n    <string name=\"a11y_reservation_wait_listed\">Sur la liste d\\'attente de l\\'événement</string>\n    <string name=\"a11y_reservation_pending\">Réservation en attente</string>\n    <string name=\"a11y_starred\">Événement ajouté aux favoris</string>\n    <string name=\"a11y_unstarred\">Événement non ajouté aux favoris</string>\n    <string name=\"a11y_star\">Ajouter aux favoris</string>\n    <string name=\"a11y_play\">Voir la vidéo</string>\n    <string name=\"a11y_select_map_mode\">Sélectionner le mode Plan</string>\n    <string name=\"a11y_search_schedule\">Rechercher dans le programme</string>\n    <string name=\"welcome\">Bienvenue</string>\n    <string name=\"a11y_signed_in_content_description\">Connecté en tant que %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Appuyez ici pour vous connecter.</string>\n    <string name=\"dialog_sign_in_content\">Connectez-vous pour enregistrer des événements, réserver des places et noter des sessions (auxquelles vous avez participé). Les actions seront synchronisées entre votre compte, l\\'application et le site.</string>\n    <string name=\"sign_in\">Se connecter</string>\n    <string name=\"firebase_auth_no_network_connection\">Aucune connexion Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Erreur inconnue</string>\n    <string name=\"dialog_sign_out_content\">L\\'ensemble des événements enregistrés, des places réservées et des notes des sessions (auxquelles vous avez participé) restent synchronisés avec votre compte.</string>\n    <string name=\"sign_out\">Déconnexion</string>\n    <string name=\"manage_google_account\">Gérer votre compte Google</string>\n    <string name=\"remove_reservation_title\">Supprimer la réservation ?</string>\n    <string name=\"remove_reservation_content\">Vous êtes sur le point de renoncer à votre place pour \"%1$s\". Si vous décidez de vous y rendre quand même sans réservation, toutes les sessions disposent de places disponibles selon la règle du \"premier arrivé, premier servi\".</string>\n    <string name=\"cancel\">Annuler</string>\n    <string name=\"remove\">Supprimer</string>\n    <string name=\"swap_reservation_title\">Échanger la réservation ?</string>\n    <string name=\"swap_reservation_content\">Vous disposez déjà d\\'une réservation/place sur liste d\\'attente pour \"%1$s\". Une seule réservation par créneau horaire est autorisée. Voulez-vous l\\'échanger contre \"%2$s\" ?</string>\n    <string name=\"swap\">Échanger</string>\n    <string name=\"notifications_preference_dialog_title\">Notifications I/O</string>\n    <string name=\"notifications_preference_dialog_content\">Souhaitez-vous recevoir des notifications sur I/O ? Nous vous enverrons des informations sur les heures de début des sessions, les animations après-événement, les enregistrements de session, etc. Vous pouvez modifier ce paramètre depuis \"Infos &gt; Paramètres\" à tout moment.</string>\n    <string name=\"no\">Non</string>\n    <string name=\"yes\">Oui</string>\n    <string name=\"feed_not_available\">Aucune annonce trouvée.</string>\n    <string name=\"feed_loading_error\">Impossible de charger le flux. Réessayez plus tard.</string>\n    <string name=\"feed_announcement_title\">Annonces</string>\n    <string name=\"feed_upcoming_events\">Événements à venir</string>\n    <string name=\"feed_saved_events\">Événements enregistrés</string>\n    <string name=\"feed_no_saved_events\">Aucun événement enregistré</string>\n    <string name=\"feed_view_all_events\">Afficher tous les événements</string>\n    <string name=\"feed_view_your_schedule\">Consulter votre planning</string>\n    <string name=\"feed_watch_live_stream\">Regarder en direct</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s jour</item>\n        <item quantity=\"other\">%s jours</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s heure</item>\n        <item quantity=\"other\">%s heures</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minute</item>\n        <item quantity=\"other\">%s minutes</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s seconde</item>\n        <item quantity=\"other\">%s secondes</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Partager la séance</string>\n    <string name=\"share_text_session_detail\">Voir « %1$s » à #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Partage</string>\n    <string name=\"map_variant_after_dark\">After Dark</string>\n    <string name=\"map_variant_concert\">Concert</string>\n    <string name=\"map_variant_daytime\">Journée</string>\n    <string name=\"enable_my_location\">Activer la localisation</string>\n    <string name=\"my_location_rationale\">L\\'application doit disposer de l\\'autorisation d\\'accéder à votre position pour afficher celle-ci sur la carte.</string>\n    <string name=\"onboarding_get_started\">Commencer</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Bienvenue dans Google I/O</string>\n    <string name=\"onboarding_date_location\">Du 7 au 9 mai 2019\\nMountain View, Californie</string>\n    <string name=\"onboarding_label_days\">J</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O approche à grands pas</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Regardez un résumé de la conférence I/O 2019 et recherchez le hashtag #io19 sur les réseaux sociaux</string>\n    <string name=\"onboarding_signin\">Connectez-vous pour recevoir les notifications relatives à la conférence I/O. En tant que participant, vous pourrez également réserver vos places aux sessions.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">Début de la session dans %1$s minute</item>\n        <item quantity=\"other\">Début de la session dans %1$s minutes</item>\n    </plurals>\n    <string name=\"expanded\">Élément développé</string>\n    <string name=\"collapsed\">Élément réduit</string>\n    <string name=\"event_title\">Événement</string>\n    <string name=\"travel_title\">Voyage</string>\n    <string name=\"faq_title\">FAQ</string>\n    <string name=\"settings_title\">Paramètres</string>\n    <string name=\"about_title\">À propos</string>\n    <string name=\"travel_what_to_bring_title\">Ce que vous devez emmener à l\\'événement</string>\n    <string name=\"travel_hotels_title\">Hôtels</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Se rendre à Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Se rendre à Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Service de navette</string>\n    <string name=\"travel_off_site_parking_title\">Parking hors site</string>\n    <string name=\"travel_for_public_transportation_title\">Transports en commun</string>\n    <string name=\"travel_biking_title\">Vélo</string>\n    <string name=\"travel_ridesharing_title\">Partage de taxi</string>\n    <string name=\"travel_airport_transfers_title\">Transferts vers l\\'aéroport</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O est un festival en plein air. Cette particularité, qui fait tout le charme d\\'I/O, implique toutefois une légère organisation au préalable. Même si les sessions se tiendront dans des tentes climatisées, nous vous recommandons d\\'apporter de l\\'écran solaire, des lunettes de soleil, ainsi qu\\'un vêtement chaud à porter en soirée lorsque les températures deviennent plus fraîches. I/O est un événement décontracté. Choisissez donc votre tenue en conséquence.</string>\n    <string name=\"travel_hotels_description\">Nous avons réservé des groupes de chambres dans de nombreux hôtels locaux. La liste des hôtels et chambres disponibles sera mise à jour régulièrement. Utilisez le plan ci-dessous pour trouver l\\'hôtel qui vous convient le mieux. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Plan des hôtels&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Voici les trois principaux aéroports de la baie de San Francisco proposant des vols internationaux :&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international de San Francisco (SFO)&lt;/a&gt; ~39 kilomètres&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international d\\'Oakland (OAK)&lt;/a&gt; ~52 kilomètres&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international de San Jose (SJC)&lt;/a&gt; ~20 kilomètres</string>\n    <string name=\"travel_getting_to_shoreline_description\">Afin de réduire à la fois le risque d\\'embouteillages et notre empreinte carbone, nous avons fait de Google I/O 2019 un \"événement sans parking*\". Nous avons longuement réfléchi avant de prendre cette décision, et nous vous offrons en retour de nombreuses options gratuites pour vous rendre à l\\'événement sans avoir besoin de véhicule.&lt;br&gt;&lt;br&gt;Nous vous communiquerons des informations complémentaires à ce sujet à l\\'approche de l\\'événement.&lt;br&gt;&lt;br&gt;*Des places de parking pour handicapés seront disponibles.</string>\n    <string name=\"travel_shuttle_service_description\">Afin de réduire à la fois le risque d\\'embouteillages et notre empreinte carbone, nous avons fait de Google I/O 2019 un \"événement sans parking*\". Nous avons longuement réfléchi avant de prendre cette décision, et nous vous offrons en retour de nombreuses options gratuites pour vous rendre à l\\'événement sans avoir besoin de véhicule.&lt;br&gt;&lt;br&gt;Nous vous communiquerons des informations complémentaires à ce sujet à l\\'approche de l\\'événement.&lt;br&gt;&lt;br&gt;*Des places de parking pour handicapés seront disponibles.</string>\n    <string name=\"travel_off_site_parking_description\">Parking hors site gratuit au &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;stade Avaya&lt;/a&gt;. Des navettes seront proposées entre le stade Avaya et Google I/O.&lt;br&gt;&lt;br&gt; Si vous avez des besoins d\\'assistance spécifiques, veuillez l\\'indiquer sur le formulaire d\\'inscription. L\\'équipe responsable de l\\'organisation vous contactera directement.</string>\n    <string name=\"travel_for_public_transportation_description\">Au moment de votre pré-inscription, vous pourrez collecter des cartes de transport en commun prépayées. Vous pouvez vous rendre à proximité du site avec les transports en commun suivants :&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt; : Réseau de trains régionaux &lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt; : Train léger desservant South Bay &lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt; : Bay Area Rapid Transit &lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt; : Réseau de trains régionaux&lt;br&gt;&lt;br&gt; Les transports en commun ne permettent pas de se rendre directement à la conférence Google I/O. Des informations supplémentaires seront bientôt disponibles concernant les lieux desservis par les navettes de Google I/O.</string>\n    <string name=\"travel_biking_description\">Un parking à vélos gratuit sera disponible au Shoreline Amphitheatre dans le parking A. L\\'association Silicon Valley Bicycle Coalition proposera chaque jour un service de stationnement surveillé pour votre vélo de 7h jusqu\\'à la fin de l\\'événement.&lt;br&gt;&lt;br&gt; Utilisez Google Maps pour connaître les meilleurs itinéraires pour vélos et trouver votre route. Deux pistes cyclables, le Stevens Creek Trail et le Permanente Creek Trail, permettent de se rendre facilement au Shoreline Amphitheatre.</string>\n    <string name=\"travel_ridesharing_description\">Le dernier jour de la conférence, des transferts seront proposés entre Google I/O et les aéroports de San Francisco et San Jose. Aucun transfert ne sera disponible les autres jours.</string>\n    <string name=\"travel_airport_transfers_description\">Le dernier jour de la conférence, des transferts seront proposés entre Google I/O et les aéroports de San Francisco et San Jose. Aucun transfert ne sera disponible les autres jours.</string>\n    <string name=\"faq_when_and_where_title\">Où et quand aura lieu l\\'édition 2019 de la conférence Google I/O ?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Comment puis-je me tenir informé des dernières actualités relatives à Google I/O ?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Toutes les sessions seront-elles en anglais ?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Puis-je réserver des sessions avant la conférence ?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Quel est le meilleur moyen de se rendre au Shoreline Amphitheatre ?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Où et quand puis-je récupérer mon badge ?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">J\\'aimerais vraiment être assis au premier rang lors de la présentation. Que me conseillez-vous ?</string>\n    <string name=\"faq_what_should_i_wear_title\">Quel est le code vestimentaire ?</string>\n    <string name=\"faq_onsite_food_options_title\">J\\'aime grignoter. Que pourrai-je manger sur le site ?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si je perds un objet sur le site, où pourrai-je le retrouver ?</string>\n    <string name=\"faq_after_dark_program_title\">Les programmes After Dark ont l\\'air intéressants ! Devrais-je y participer ?</string>\n    <string name=\"faq_accessibility_needs_title\">J\\'ai des besoins spéciaux en termes d\\'accessibilité. Pouvez-vous y répondre ?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Quelles mesures prenez-vous pour aider les femmes enceintes et les parents qui assistent à I/O ?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Règlement de la communauté et politique anti-harcèlement de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Les sessions seront-elles retransmises en direct ? Que faire si je ne peux pas suivre l\\'événement en temps réel ?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">J\\'aimerais célébrer I/O avec ma communauté.  Auriez-vous une suggestion ?</string>\n    <string name=\"faq_when_and_where_description\">Pour connaître les dernières informations relatives aux sessions, aux intervenants et aux activités, consultez le &lt;a href=\"https://events.google.com/io/\"&gt;site Web de l\\'édition 2019 de Google I/O&lt;/a&gt; et le &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog Google Developers&lt;/a&gt;. Suivez-nous également sur &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; et &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Vous pouvez aussi suivre et rejoindre les discussions relatives à l\\'édition 2019 de Google I/O sur les réseaux sociaux à l\\'aide du hashtag officiel &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. De plus, nous envoyons par e-mail aux participants inscrits toutes les informations importantes ainsi que des instructions afin qu\\'ils puissent préparer leur arrivée.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Pour connaître les dernières informations relatives aux sessions, aux intervenants et aux activités, consultez le &lt;a href=\"https://events.google.com/io/\"&gt;site Web de l\\'édition 2019 de Google I/O&lt;/a&gt; et le &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog Google Developers&lt;/a&gt;. Suivez-nous également sur &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; et &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Vous pouvez aussi suivre et rejoindre les discussions relatives à l\\'édition 2019 de Google I/O sur les réseaux sociaux à l\\'aide du hashtag officiel &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. De plus, nous envoyons par e-mail aux participants inscrits toutes les informations importantes ainsi que des instructions afin qu\\'ils puissent préparer leur arrivée.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Oui. Notre audience mondiale pourra ainsi suivre la conférence.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Dès le mois d\\'avril, les personnes venant assister à la conférence en personne peuvent réserver à l\\'avance leurs places aux différentes sessions sur le site Web de Google I/O ou via l\\'application I/O (remarque : un certain nombre de places ne pourront pas être réservées et seront disponibles le jour même sur le principe du \"premier arrivé, premier servi\"). Les événements Codelabs, App Reviews et Office Hours ne seront accessibles que sur le principe du \"premier arrivé, premier servi\".</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consultez la section Déplacements pour obtenir des conseils relatifs aux transports, y compris des informations sur les navettes, des itinéraires routiers et cyclables, des conseils de covoiturage, et bien plus encore !</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Pour accélérer le processus d\\'enregistrement, nous débuterons la distribution des badges le lundi 6 mai au Shoreline Amphitheatre. Avant de vous donner votre badge Google I/O, nous devrons procéder aux opérations suivantes :&lt;br&gt; - Vérifier votre pièce d\\'identité avec photo : nous acceptons les permis officiels, les passeports et d\\'autres pièces d\\'identité. Si vous ne disposez pas d\\'une pièce d\\'identité conforme, vous ne recevrez pas votre badge et vous ne pourrez pas assister à l\\'événement. Le nom indiqué sur votre pièce d\\'identité doit être identique à celui de votre profil d\\'enregistrement. Si vous êtes un universitaire, n\\'oubliez pas d\\'apporter la preuve que vous pouvez participer à cet événement.&lt;br&gt; - Scanner le code QR d\\'enregistrement que vous avez reçu par e-mail : vous n\\'avez pas besoin d\\'imprimer l\\'e-mail. Nous pouvons scanner votre code directement sur votre téléphone ! #savetheenvironment &lt;br&gt;&lt;br&gt;Veuillez noter que vous n\\'avez pas le droit de donner ou fournir de quelque manière que ce soit votre badge à une tierce personne, ni de le partager avec elle. Les badges Google I/O ne sont pas remplaçables. Ne perdez pas le vôtre, sans quoi vous ne pourrez plus assister à la conférence. Vous devez porter votre badge pour accéder à Google I/O, y compris aux sessions, aux espaces Sandbox et aux événements After Hours. Si un agent de la sécurité vous le demande, nous vous prions de bien vouloir présenter ou fournir une autre pièce d\\'identité. Les badges Google I/O peuvent comporter votre nom, le nom de votre entreprise ou organisation (si vous l\\'avez fourni) et votre photo.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Tous les participants pourront assister aux présentations. Toutefois, les places seront attribuées selon le principe du \"premier arrivé, premier servi\" lors de la distribution des badges qui commencera à 7h le 6 mai. Alors, veillez à ne pas arriver trop tard !</string>\n    <string name=\"faq_what_should_i_wear_description\">La conférence pour les développeurs Google I/O a lieu en extérieur. Vous pouvez donc porter des vêtements confortables et décontractés. Nous n\\'imposons pas de code vestimentaire. La région de la baie de San Francisco peut connaître des températures très élevées pendant la journée et plus fraîches le soir. Tenez compte de ces informations lors de la préparation de votre valise.</string>\n    <string name=\"faq_onsite_food_options_description\">Bonne nouvelle, nous aussi nous aimons manger !  Le petit-déjeuner, le déjeuner et des en-cas seront servis gratuitement aux participants tous les jours de la conférence Google I/O. Le dîner sera également offert les premier et deuxième jours pendant les événements After Hours.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Nous avons tout prévu ! Un service des objets trouvés sera disponible au bureau d\\'information de la conférence pendant toute la durée de l\\'événement. Tout objet trouvé dans la nuit sera remis au service de sécurité de la conférence. Remarque : les badges Google I/O ne sont pas remplaçables. Ne perdez pas le vôtre, sans quoi vous ne pourrez plus assister à la conférence.</string>\n    <string name=\"faq_after_dark_program_description\">Ces deux soirées ne sont à manquer sous aucun prétexte ! Musique et jeux seront organisés le 8 mai pour tous les participants, et un concert exclusif aura lieu le 9 mai au Shoreline Amphitheatre. Nourriture et boissons seront également disponibles à chacune de ces soirées (les boissons alcoolisées sont réservées au personnes âgées de 21 ans et plus). Les deux événements After Hours se tiendront au Shoreline Amphitheatre. Vous devrez présenter votre badge à l\\'entrée.</string>\n    <string name=\"faq_accessibility_needs_description\">Des places de parking réservées aux femmes enceintes seront disponibles dans la zone pour les personnes à mobilité réduite.&lt;br&gt; Les mères qui allaitent sont les bienvenues à la conférence avec leur enfant. Quatre salons d\\'allaitement seront ouverts les 7 et 8 mai de 8h à 20h, et le 9 mai de 8h à 16h. Des feuilles d\\'inscription seront disponibles devant les salons d\\'allaitement, qui pourront être utilisés selon le principe du \"premier arrivé, premier servi\". Veuillez vous renseigner auprès du bureau d\\'information pour en savoir plus.&lt;br&gt;&lt;br&gt; Les parents qui expriment un besoin de garde d\\'enfant dans leur formulaire d\\'inscription à l\\'événement pourront bénéficier d\\'un remboursement de leurs frais à hauteur de 100 $ par jour (pour un maximum de 300 $), selon le principe du \"premier arrivé, premier servi\". Notre offre de remboursement des frais de garde d\\'enfant est proposée par un fournisseur tiers. Si nous acceptons votre demande par e-mail avant le début de la conférence et que votre présence sur le site est confirmée, notre fournisseur vous contactera sous 7 jours ouvrés au terme de Google I/O pour vous faire part des démarches à suivre. Ce fournisseur tiers est chargé d\\'administrer les remboursements de frais de garde d\\'enfant pour nous.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Des places de parking réservées aux femmes enceintes seront disponibles dans la zone pour les personnes à mobilité réduite.&lt;br&gt; Les mères qui allaitent sont les bienvenues à la conférence avec leur enfant. Quatre salons d\\'allaitement seront ouverts les 7 et 8 mai de 8h à 20h, et le 9 mai de 8h à 16h. Des feuilles d\\'inscription seront disponibles devant les salons d\\'allaitement, qui pourront être utilisés selon le principe du \"premier arrivé, premier servi\". Veuillez vous renseigner auprès du bureau d\\'information pour en savoir plus.&lt;br&gt;&lt;br&gt; Les parents qui expriment un besoin de garde d\\'enfant dans leur formulaire d\\'inscription à l\\'événement pourront bénéficier d\\'un remboursement de leurs frais à hauteur de 100 $ par jour (pour un maximum de 300 $), selon le principe du \"premier arrivé, premier servi\". Notre offre de remboursement des frais de garde d\\'enfant est proposée par un fournisseur tiers. Si nous acceptons votre demande par e-mail avant le début de la conférence et que votre présence sur le site est confirmée, notre fournisseur vous contactera sous 7 jours ouvrés au terme de Google I/O pour vous faire part des démarches à suivre. Ce fournisseur tiers est chargé d\\'administrer les remboursements de frais de garde d\\'enfant pour nous.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google s\\'engage à offrir à tous les participants une expérience inclusive ne laissant aucune place au harcèlement, indépendamment de leur identité et expression de genre, orientation sexuelle, handicap, neurodiversité, apparence physique, corpulence, ethnicité, nationalité, race, âge, religion, ou de toute autre catégorie protégée. À des fins d\\'inclusion supplémentaires, des toilettes neutres seront disponibles partout sur le site.&lt;br&gt;&lt;br&gt; Nous ne tolérons aucune forme de harcèlement à l\\'encontre des participants à l\\'événement.&lt;br&gt; Google considère toute violation à son règlement comme extrêmement sérieuse et y réagira en conséquence. Pour en savoir plus sur le règlement de la communauté et la politique anti-harcèlement de Google, veuillez consulter &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;cette page&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Les deux présentations ainsi que l\\'ensemble des sessions seront diffusées en direct sur la page d\\'accueil du site Web de l\\'événement pendant les trois jours. Si vous n\\'êtes pas disponible ou si le décalage horaire est trop important, sachez que vous pourrez visionner ultérieurement les enregistrements de sessions sur la &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;chaîne YouTube Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Oui. Chaque année, les développeurs du monde entier organisent leurs propres &lt;a href=\"https://events.google.com/io/extended\"&gt;événements Google I/O Extended&lt;/a&gt;. Durant ces événements, la conférence est diffusée en direct et des sessions spéciales sont organisées, telles que des hackathons, des ateliers de programmation, des démonstrations, et bien plus encore.&lt;br&gt; Si vous souhaitez être l\\'hôte d\\'un événement I/O Extended cette année, voici les démarches que vous devez suivre pour commencer :&lt;br&gt;&lt;br&gt; Consultez le &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guide de l\\'organisateur&lt;/a&gt; pour obtenir des conseils et suggestions vous aidant à créer un événement réussi.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Enregistrez&lt;/a&gt; votre événement public sur le site Web I/O pour une meilleure visibilité.&lt;br&gt;&lt;br&gt; Utilisez le hashtag officiel #io19extended dans toutes vos publications sur les réseaux sociaux en lien avec I/O Extended pour que votre événement soit plus facilement trouvable.&lt;br&gt;&lt;br&gt; Remarque : En tant qu\\'hôte d\\'un événement I/O Extended, vous pouvez demander à ce que vos données à caractère personnel et/ou les informations de votre événement soient effacées au terme de celui-ci en envoyant un e-mail à io19@google.com.&lt;br&gt; Si vous souhaitez simplement assister à un événement I/O Extended, consultez &lt;a href=\"https://events.google.com/io/extended\"&gt;notre plan&lt;/a&gt; pour en trouver un près de chez vous et répondez à l\\'invitation !&lt;br&gt; Pour toute question sur le programme I/O Extended, contactez-nous à l\\'adresse io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Afficher les sessions</string>\n    <string name=\"wifi_install_success\">Réseau Wi-Fi enregistré</string>\n    <string name=\"wifi_install_clipboard_message\">Impossible d\\'enregistrer le réseau Wi-Fi.\\nMot de passe copié dans le presse-papiers.</string>\n    <string name=\"event_sessions_title\">Sessions</string>\n    <string name=\"event_sandbox_title\">Bac à sable</string>\n    <string name=\"event_codelabs_title\">Ateliers de programmation</string>\n    <string name=\"event_officehours_title\">Permanences et avis sur les applications</string>\n    <string name=\"event_afterhours_title\">Après-événement</string>\n    <string name=\"event_meals_title\">Repas</string>\n    <string name=\"event_sessions_description\">Dès le mois d\\'avril, les personnes venant assister à la conférence en personne peuvent réserver à l\\'avance leurs places aux différentes sessions sur le site Web de Google I/O ou via l\\'application I/O (remarque : un certain nombre de places ne pourront pas être réservées et seront disponibles le jour même sur le principe du \"premier arrivé, premier servi\"). Les événements Codelabs, App Reviews et Office Hours ne seront accessibles que sur le principe du \"premier arrivé, premier servi\".</string>\n    <string name=\"event_sandbox_description\">Espaces dédiés permettant de découvrir, de tester et d\\'apprendre à utiliser nos derniers produits et plates-formes grâce à des démonstrations interactives, des installations physiques, etc.</string>\n    <string name=\"event_codelabs_description\">Nos kiosques de programmation vous permettent d\\'acquérir une expérience pratique. Vous y trouverez tout le nécessaire pour découvrir les technologies les plus récentes et performantes de Google grâce à des didacticiels d\\'autoformation. Vous pouvez également apporter votre propre ordinateur et terminer votre travail à la maison. Le personnel de Google sera à votre disposition pour vous donner des conseils utiles et vous guider si vous êtes bloqué.</string>\n    <string name=\"event_officehours_description\">Les permanences vous donnent l\\'occasion de rencontrer individuellement des experts de Google pour poser toutes vos questions techniques. Quant aux avis sur les applications, ils vous permettent de recevoir des conseils et des astuces sur vos projets d\\'applications spécifiques.</string>\n    <string name=\"event_afterhours_description\">Une fois les sessions terminées, restez dans les parages pour profiter de deux soirées avec repas, boissons et bons moments en perspective. Lors de la première, les participants se réuniront au niveau de l\\'espace de bac à sable et, lors de la seconde, un concert sera donné en exclusivité dans l\\'Amphitheatre.</string>\n    <string name=\"event_meals_description\">Le petit-déjeuner, le déjeuner et des en-cas seront servis gratuitement aux participants tous les jours de la conférence Google I/O. Le dîner sera également offert les premier et deuxième jours pendant les événements After Hours.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Applications associées</string>\n    <string name=\"event_types_header\">Types d\\'événement</string>\n    <string name=\"settings_time_zone_label\">Événements dans le fuseau horaire du Pacifique (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Activer les notifications</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Envoyer des statistiques d\\'utilisation anonymes</string>\n    <string name=\"settings_tos\">Conditions d\\'utilisation</string>\n    <string name=\"settings_privacy_policy\">Règles de confidentialité</string>\n    <string name=\"settings_oss_licenses\">Licences Open Source</string>\n    <string name=\"settings_theme_title\">Sélectionner un thème</string>\n    <string name=\"settings_theme_system\">Paramètres par défaut</string>\n    <string name=\"settings_theme_light\">Clair</string>\n    <string name=\"settings_theme_dark\">Foncé</string>\n    <string name=\"settings_theme_battery\">Défini par l\\'économiseur de batterie</string>\n    <string name=\"built_with_material_components\">Créée avec Material Components.</string>\n    <string name=\"wifi_network_and_password\">Réseau : %1$s\\nMot de passe : %2$s</string>\n    <string name=\"join_network\">Rejoindre le réseau</string>\n    <string name=\"assistant_app_description\">Dites \"Ok Google, parle à Google I/O 19\" !</string>\n    <string name=\"assistant_app_description2\">Dites \"Ok Google, parle à Google I/O 19\" !</string>\n    <string name=\"speaker_link_website\">Site Web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Événements</string>\n    <string name=\"no_network_connection\">Aucune connexion Internet.</string>\n    <string name=\"navigate_up\">Remonter</string>\n    <string name=\"no_network_description\">Pour utiliser Explore I/O, procédez comme suit :\\n\\n - Désactivez le mode Avion.\\n\\n - Activez un réseau de données mobiles ou Wi-Fi.\\n\\n - Vérifiez le signal aux alentours.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Votre téléphone n\\'est pas compatible avec ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Essayez avec un autre appareil, ou empruntez celui d\\'un ami</string>\n    <string name=\"codelabs_information\">Découvrez les technologies les plus récentes et performantes de Google grâce à des tutoriels d\\'autoformation accessibles dans nos kiosques de programmation. Vous pouvez également apporter votre propre ordinateur et terminer votre travail à la maison. Les kiosques sont ouverts tous les jours, sauf pendant la première présentation.</string>\n    <string name=\"codelabs_building\">Bâtiment accueillant les ateliers de programmation</string>\n    <string name=\"codelabs_website\">Site Web Codelabs</string>\n    <string name=\"codelab_duration\">Durée : %1$d min</string>\n    <string name=\"start_codelab\">Démarrer l\\'atelier de programmation</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-gsw/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Planen</string>\n    <string name=\"title_home\">Startseite</string>\n    <string name=\"title_map\">Karte</string>\n    <string name=\"title_explore_io\">I/O erkunden</string>\n    <string name=\"title_info\">Info</string>\n    <string name=\"filters\">Filter</string>\n    <string name=\"category_heading_tracks\">Themen</string>\n    <string name=\"category_heading_types\">Art der Veranstaltung</string>\n    <string name=\"reset\">Zurücksetzen</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d Veranstaltung</item>\n        <item quantity=\"other\">%1$d Veranstaltungen</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Ihre markierten und reservierten Veranstaltungen</string>\n    <string name=\"starred_and_reserved_short\">Meine Veranstaltungen</string>\n    <string name=\"search_schedule_hint\">Zeitplan durchsuchen</string>\n    <string name=\"search_schedule_no_results\">Keine Ergebnisse gefunden</string>\n    <string name=\"agenda\">Terminübersicht</string>\n    <string name=\"event_starred\">Veranstaltung wurde Ihren markierten Elementen hinzugefügt</string>\n    <string name=\"event_unstarred\">Veranstaltung aus markierten Elementen entfernt</string>\n    <string name=\"event_star_error\">Fehler beim Hinzufügen der Veranstaltung zu markierten Elementen</string>\n    <string name=\"reservation_error\">Fehler beim Ändern der Reservierung. Warten Sie, bis vorangegangene Anfragen abgeschlossen sind oder versuchen Sie es später noch einmal.</string>\n    <string name=\"reservation_request_succeeded\">Reservierung angefragt.</string>\n    <string name=\"reservation_cancel_succeeded\">Reservierung storniert: \"&lt;b&gt;%s&lt;/b&gt;.\"</string>\n    <string name=\"reservation_new\">Ihr Platz für \"&lt;b&gt;%s&lt;/b&gt;\" ist reserviert.</string>\n    <string name=\"reservation_replaced\">Veranstaltung getauscht.</string>\n    <string name=\"waitlist_new\">Sie stehen auf der Warteliste.</string>\n    <string name=\"waitlist_cancel_succeeded\">Von Warteliste entfernt.</string>\n    <string name=\"got_it\">Ok</string>\n    <string name=\"dont_show\">Nicht anzeigen</string>\n    <string name=\"reservation_denied_cutoff\">Reservierung abgelehnt: zu kurz vor Startzeit.</string>\n    <string name=\"reservation_denied_clash\">Reservierung abgelehnt: Überschneidung mit anderer Reservierung.</string>\n    <string name=\"reservation_denied_unknown\">Reservierung abgelehnt: unbekannter Fehler.</string>\n    <string name=\"cancellation_denied_cutoff\">Stornierung abgelehnt: zu kurz vor Startzeit.</string>\n    <string name=\"cancellation_denied_unknown\">Stornierung abgelehnt: unbekannter Fehler.</string>\n    <string name=\"schedule_filters_empty\">Keine Termine gefunden</string>\n    <string name=\"reservation_reservable\">Platz reservieren</string>\n    <string name=\"reservation_reserved\">Reserviert</string>\n    <string name=\"reservation_waitlisted\">Auf der Warteliste</string>\n    <string name=\"reservation_waitlist_available\">Auf Warteliste setzen</string>\n    <string name=\"reservation_disabled\">Keine Reservierungen verfügbar</string>\n    <string name=\"reservation_pending\">Reservierung ausstehend</string>\n    <string name=\"schedule_hint_title\">Terminplan anpassen</string>\n    <string name=\"schedule_hint_star_event\">Zu markierten Veranstaltungen hinzufügen</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Platz für Sitzung reservieren</string>\n    <string name=\"rate_session\">Sitzung bewerten</string>\n    <string name=\"menu_item_session_location\">Sitzungsstandort</string>\n    <string name=\"menu_item_session_star\">Sitzung markieren</string>\n    <string name=\"menu_item_calendar\">Zum Kalender hinzufügen</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Referenten</string>\n    <string name=\"session_detail_related_header\">Ähnliche Veranstaltungen</string>\n    <string name=\"feedback_submit\">Senden</string>\n    <string name=\"feedback_thank_you\">Vielen Dank für Ihr Feedback!</string>\n    <string name=\"feedback_q1_text\">Wie würden Sie das Niveau der Sitzung allgemein bewerten?</string>\n    <string name=\"feedback_q2_text\">Wie würden Sie die Inhalte der Sitzung anhand Ihrer Erwartungen und der Beschreibung der Sitzung bewerten?</string>\n    <string name=\"feedback_q3_text\">Wie nützlich war die Sitzung für Ihre Projekte?</string>\n    <string name=\"feedback_q4_text\">Wie nützlich war die Sitzung für Ihre Projekte?</string>\n    <string name=\"feedback_q1_label_start\">Sehr grundlegend</string>\n    <string name=\"feedback_q2_label_start\">Uninteressant</string>\n    <string name=\"feedback_q3_label_start\">Schlecht</string>\n    <string name=\"feedback_q4_label_start\">Nicht besonders</string>\n    <string name=\"feedback_q1_label_end\">Ausgezeichnet</string>\n    <string name=\"feedback_q2_label_end\">Ausgezeichnet</string>\n    <string name=\"feedback_q3_label_end\">Äußerst relevant</string>\n    <string name=\"feedback_q4_label_end\">Äußerst</string>\n    <string name=\"a11y_show_navigation\">Navigationsmenü einblenden</string>\n    <string name=\"a11y_collapse_filters_sheet\">Filtertabelle minimieren</string>\n    <string name=\"a11y_clear_tag_filters\">Filter löschen</string>\n    <string name=\"a11y_filter_applied\">%1s Filter angewendet</string>\n    <string name=\"a11y_filter_not_applied\">%1s Filter nicht angewendet</string>\n    <string name=\"a11y_reservation_available\">Platz für Veranstaltung reservieren</string>\n    <string name=\"a11y_reservation_reserved\">Platz für Veranstaltung reserviert</string>\n    <string name=\"a11y_reservation_disabled\">Reservierung nicht verfügbar</string>\n    <string name=\"a11y_reservation_wait_list_available\">Auf Warteliste für Veranstaltung setzen</string>\n    <string name=\"a11y_reservation_wait_listed\">Auf Warteliste für Veranstaltung gesetzt</string>\n    <string name=\"a11y_reservation_pending\">Reservierung ausstehend</string>\n    <string name=\"a11y_starred\">Veranstaltung als Lesezeichen gespeichert</string>\n    <string name=\"a11y_unstarred\">Veranstaltung nicht als Lesezeichen gespeichert</string>\n    <string name=\"a11y_star\">Markieren</string>\n    <string name=\"a11y_play\">Video abspielen</string>\n    <string name=\"a11y_select_map_mode\">Kartenmodus auswählen</string>\n    <string name=\"a11y_search_schedule\">Zeitplan suchen</string>\n    <string name=\"welcome\">Willkommen!</string>\n    <string name=\"a11y_signed_in_content_description\">Angemeldet als %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Zum Anmelden tippen.</string>\n    <string name=\"dialog_sign_in_content\">Melden Sie sich an, um Veranstaltungen zu speichern, Plätze zu reservieren und Sitzungen zu bewerten (als Teilnehmer). Die Aktionen mit Ihrem Konto werden in der App und auf der Website synchronisiert.</string>\n    <string name=\"sign_in\">Anmelden</string>\n    <string name=\"firebase_auth_no_network_connection\">Keine Internetverbindung</string>\n    <string name=\"firebase_auth_unknown_error\">Unbekannter Fehler</string>\n    <string name=\"dialog_sign_out_content\">Alle gespeicherten Veranstaltungen, Platzreservierungen und Sitzungsbewertungen (von Teilnehmern) werden in Ihrem Konto synchronisiert.</string>\n    <string name=\"sign_out\">Abmelden</string>\n    <string name=\"manage_google_account\">Hier können Sie Ihr Google-Konto verwalten</string>\n    <string name=\"remove_reservation_title\">Reservierung entfernen?</string>\n    <string name=\"remove_reservation_content\">Sie sind dabei, Ihren Platz für \"%1$s\" zu stornieren. Wenn Sie Ihre Reservierung stornieren, aber kurzfristig doch noch teilnehmen möchten: Bei allen Sitzungen wird eine bestimmte Anzahl von Plätzen direkt vor Ort an die ersten eintreffenden Interessenten vergeben.</string>\n    <string name=\"cancel\">Abbrechen</string>\n    <string name=\"remove\">Entfernen</string>\n    <string name=\"swap_reservation_title\">Reservierung tauschen?</string>\n    <string name=\"swap_reservation_content\">Sie haben bereits eine Reservierung bzw. stehen auf der Warteliste für \"%1$s\". Es ist nur eine Reservierung pro Zeitblock zulässig. Möchten Sie den Tausch gegen \"%2$s\" vornehmen?</string>\n    <string name=\"swap\">Tauschen</string>\n    <string name=\"notifications_preference_dialog_title\">I/O-Benachrichtigungen</string>\n    <string name=\"notifications_preference_dialog_content\">Möchten Sie Benachrichtigungen zu I/O erhalten? Dann senden wir Ihnen Informationen zu Anfangszeiten von Sitzungen, Rahmenprogramm, Sitzungsaufzeichnungen und vieles mehr. Diese Einstellung können Sie unter \"Info &gt; Settings\" (Informationen &gt; Einstellungen) jederzeit ändern.</string>\n    <string name=\"no\">Nein</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"feed_not_available\">Keine Ankündigungen gefunden.</string>\n    <string name=\"feed_loading_error\">Feed konnte nicht geladen werden. Versuchen Sie es später noch einmal.</string>\n    <string name=\"feed_announcement_title\">Ankündigungen</string>\n    <string name=\"feed_upcoming_events\">Veranstaltungstipps</string>\n    <string name=\"feed_saved_events\">Gespeicherte Veranstaltungen</string>\n    <string name=\"feed_no_saved_events\">Keine gespeicherten Termine</string>\n    <string name=\"feed_view_all_events\">Alle Termine anzeigen</string>\n    <string name=\"feed_view_your_schedule\">Terminübersicht ansehen</string>\n    <string name=\"feed_watch_live_stream\">Livestream ansehen</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s Tag</item>\n        <item quantity=\"other\">%s Tage</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s  Stunde</item>\n        <item quantity=\"other\">%s Stunden</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s Minute</item>\n        <item quantity=\"other\">%s Minuten</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s Sekunde</item>\n        <item quantity=\"other\">%s Sekunden</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Sitzung teilen</string>\n    <string name=\"share_text_session_detail\">%1$s bei #io19 %2$s ansehen</string>\n    <string name=\"intent_chooser_session_detail\">Teilen</string>\n    <string name=\"map_variant_after_dark\">After Dark</string>\n    <string name=\"map_variant_concert\">Konzert</string>\n    <string name=\"map_variant_daytime\">Tagsüber</string>\n    <string name=\"enable_my_location\">\"Mein Standort\" aktivieren</string>\n    <string name=\"my_location_rationale\">Die App benötigt die Berechtigung zur Standortermittlung, um Ihren Standort auf der Karte anzuzeigen.</string>\n    <string name=\"onboarding_get_started\">Jetzt starten</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Willkommen bei Google I/O</string>\n    <string name=\"onboarding_date_location\">7.–9. Mai 2019\\nMountain View, CA, USA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Bald ist Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Zusammenfassung der I/O 19 ansehen und mit #io19 in den sozialen Netzwerken mehr erfahren</string>\n    <string name=\"onboarding_signin\">Melden Sie sich an, um I/O-Benachrichtigungen zu erhalten und als Teilnehmer Sitzplätze für Tagungen zu reservieren.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">Sitzung beginnt in %1$s Minute</item>\n        <item quantity=\"other\">Sitzung beginnt in %1$s Minuten</item>\n    </plurals>\n    <string name=\"expanded\">Maximiert</string>\n    <string name=\"collapsed\">Minimiert</string>\n    <string name=\"event_title\">Veranstaltung</string>\n    <string name=\"travel_title\">Anreise</string>\n    <string name=\"faq_title\">FAQ</string>\n    <string name=\"settings_title\">Einstellungen</string>\n    <string name=\"about_title\">Info</string>\n    <string name=\"travel_what_to_bring_title\">Was Sie für das Event mitbringen sollten</string>\n    <string name=\"travel_hotels_title\">Hotels</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Mountain View erreichen</string>\n    <string name=\"travel_getting_to_shoreline_title\">Mountain View erreichen</string>\n    <string name=\"travel_shuttle_service_title\">Shuttleservice</string>\n    <string name=\"travel_off_site_parking_title\">Parkplätze außerhalb des Geländes</string>\n    <string name=\"travel_for_public_transportation_title\">Öffentliche Verkehrsmittel</string>\n    <string name=\"travel_biking_title\">Mit dem Fahrrad</string>\n    <string name=\"travel_ridesharing_title\">Mitfahrportale</string>\n    <string name=\"travel_airport_transfers_title\">Flughafentransfer</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O ist ein Festival im Freien. Allein das macht I/O schon zu etwas ganz Besonderem. Das bedeutet aber auch, dass einige Dinge zu beachten sind. Die Tagungen finden in klimatisierten Zelten statt, aber Sonnenschutzmittel, Sonnenbrillen und zusätzliche Kleidung für die kälteren Abende werden empfohlen. I/O ist ein legeres Event. Beachte Sie das, wenn Sie überlegen, was Sie anziehen sollen.</string>\n    <string name=\"travel_hotels_description\">Wir haben in vielen örtlichen Hotels Zimmer reserviert. Die Liste der Hotels und die Verfügbarkeit der Zimmer werden regelmäßig aktualisiert. Bitte benutzen Sie die nachstehende Karte, um das für Sie beste Hotel zu finden. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Hotelkarte&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Hier sind die drei großen Flughäfen in der Bay Area mit internationalem Flugverkehr:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Francisco International Airport (SFO)&lt;/a&gt; ~24 Meilen&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Oakland International Airport (OAK)&lt;/a&gt; ~32 Meilen&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Jose International Airport (SJC)&lt;/a&gt; ~12 Meilen</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 hat sich verpflichtet, ein „Event ohne Parkplätze*“ zu sein, um Verkehrsstaus und CO2-Emissionen zu reduzieren. Diese Entscheidung wurde sorgfältig erwogen und wir bieten Ihnen viele kostenlose Optionen an, um zur Veranstaltung zu gelangen, ohne ein Fahrzeug zu benötigen.&lt;br&gt;&lt;br&gt;Je näher die Veranstaltung rückt, desto mehr Informationen erhalten Sie.&lt;br&gt;&lt;br&gt;*Behindertenparkplätze stehen zur Verfügung.</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 hat sich verpflichtet, ein „Event ohne Parkplätze*“ zu sein, um Verkehrsstaus und CO2-Emissionen zu reduzieren. Diese Entscheidung wurde sorgfältig erwogen und wir bieten Ihnen viele kostenlose Optionen an, um zur Veranstaltung zu gelangen, ohne ein Fahrzeug zu benötigen.&lt;br&gt;&lt;br&gt;Je näher die Veranstaltung rückt, desto mehr Informationen erhalten Sie.&lt;br&gt;&lt;br&gt;*Behindertenparkplätze stehen zur Verfügung.</string>\n    <string name=\"travel_off_site_parking_description\">Kostenlose Parkplätze befinden sich im &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;. Shuttles von Avaya werden zu/von Google I/O zur Verfügung gestellt.&lt;br&gt;&lt;br&gt; Geben Sie bitte auf Ihrem Registrierungsformular an, ob Sie besondere Unterstützung benötigen. Das Planungsteam wird sich dann mit Ihnen in Verbindung setzen.</string>\n    <string name=\"travel_for_public_transportation_description\">Wir bieten Ihnen Prepaid-Tickets für den öffentlichen Nahverkehr an, die während der Voranmeldung zur Abholung zur Verfügung stehen. Die öffentlichen Verkehrsmittel in die Umgebung erreichen Sie über:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Regionales Eisenbahnsystem&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Stadtbahn, die die South Bay bedient&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Rapid Transit in der Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Regionalbahnsystem&lt;br&gt;&lt;br&gt; Öffentliche Verkehrsmittel führen nicht direkt zu Google I/O. Weitere Informationen zu den Haltestellen der Event-Shuttles zur Google I/O folgen.</string>\n    <string name=\"travel_biking_description\">Am Shoreline Amphitheatre stehen innerhalb von Parkplatz A kostenlose Fahrradparkplätze zur Verfügung. Die Silicon Valley Bicycle Coalition bietet sicheres Fahrradparken mit Valet-Service ab 7:00 Uhr morgens bis zum Veranstaltungsende am jeweiligen Tag. Es gibt zwei Wege zum Shoreline Amphitheatre, die sich gut für Radfahrer eignen, den Stevens Creek Trail und den Permanente Creek Trail.</string>\n    <string name=\"travel_ridesharing_description\">Am letzten Tag der Veranstaltung wird ein Flughafentransfer vom Google I/O zum SFO und SJC angeboten. An anderen Tagen werden KEINE Flughafentransfers angeboten.</string>\n    <string name=\"travel_airport_transfers_description\">Am letzten Tag der Veranstaltung wird ein Flughafentransfer vom Google I/O zum SFO und SJC angeboten. An anderen Tagen werden KEINE Flughafentransfers angeboten.</string>\n    <string name=\"faq_when_and_where_title\">Wann und wo findet die Google I/O 2019 statt?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Wie kann ich über Google I/O auf dem Laufenden bleiben?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Finden alle Veranstaltungen in englischer Sprache statt?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Kann ich Tagungen vor der Veranstaltung reservieren?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Wie kommt man am besten zum Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Wo und wann kann ich mein Ansteckschild abholen?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Ich möchte bei der Keynote-Veranstaltung in der ersten Reihe sitzen. Was kann ich tun?</string>\n    <string name=\"faq_what_should_i_wear_title\">Gibt es einen Dresscode?</string>\n    <string name=\"faq_onsite_food_options_title\">Ich esse gern etwas zwischendurch. Welche Möglichkeiten gibt es vor Ort dafür?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Wenn ich am Veranstaltungsort etwas verliere, wo finde ich es wieder?</string>\n    <string name=\"faq_after_dark_program_title\">Die After Dark-Programmpunkte klingen interessant. Sollte ich hingehen?</string>\n    <string name=\"faq_accessibility_needs_title\">Ist die Veranstaltung barrierefrei?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Wie unterstützen Sie werdende Mütter und Eltern, die am I/O teilnehmen?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google Community-Richtlinien für Veranstaltungen und Richtlinie gegen Belästigung</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Werden die Tagungen live übertragen? Was passiert, wenn ich die Veranstaltung nicht in Echtzeit verfolgen kann?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Ich möchte I/O mit meiner Community feiern.  Haben Sie Ideen dazu?</string>\n    <string name=\"faq_when_and_where_description\">Besuchen Sie die &lt;a href=\"https://events.google.com/io/\"&gt;Website von Google I/O 2019&lt;/a&gt; und den &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers Blog&lt;/a&gt;, um immer die neuesten Informationen zu Veranstaltungen, Referenten und allgemeinen Aktivitäten zu erhalten. Folgen Sie uns außerdem auf &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; und &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Über den offiziellen Hashtag &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; können Sie sich in sozialen Netzwerken mit anderen über die Google I/O 2019 austauschen. Außerdem erhalten alle registrierten Teilnehmer wichtige Informationen und Check-In-Hinweise vorab per E-Mail.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Besuchen Sie die &lt;a href=\"https://events.google.com/io/\"&gt;Website von Google I/O 2019&lt;/a&gt; und den &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers Blog&lt;/a&gt;, um immer die neuesten Informationen zu Veranstaltungen, Referenten und allgemeinen Aktivitäten zu erhalten. Folgen Sie uns außerdem auf &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; und &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Über den offiziellen Hashtag &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; können Sie sich in sozialen Netzwerken mit anderen über die Google I/O 2019 austauschen. Außerdem erhalten alle registrierten Teilnehmer wichtige Informationen und Check-In-Hinweise vorab per E-Mail.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Ja. So kann unsere Zielgruppe weltweit die Veranstaltungen verfolgen.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Ab April können Besucher vor Ort Sitzplätze für Tagungen vor der Veranstaltung auf der I/O-Website und auch über die I/O-Mobile App reservieren (Hinweis: Ein Teil der Tagungssitzplätze ist von der Reservierung ausgenommen. Diese werden nach der Reihenfolge des Eintreffens vergeben). Auch die Plätze für Codelabs, App Reviews und Office Hours werden nach der Reihenfolge des Eintreffens vergeben.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Im Abschnitt \"Travel\" (Reisen) finden Sie alle wichtigen Reisetipps, einschließlich Informationen zum Shuttle, Wegbeschreibungen fürs Auto und Fahrrad, Tipps für Mitfahrgelegenheiten und vieles mehr.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Wir geben die Ansteckschilder schon ab Montag, dem 06. Mai im Shoreline Amphitheatre aus, um den Check-in zu beschleunigen. Damit wir Ihnen Ihr Ansteckschild für die Google I/O ausstellen können, beachten Sie bitte die folgenden Punkte:&lt;br&gt; – Sie müssen einen Lichtbildausweis vorlegen. Dies kann ein Führerschein, Reisepass oder ein vergleichbares, amtliches Ausweisdokument sein. Wenn Sie sich nicht korrekt ausweisen können, erhalten Sie kein Ansteckschild und können nicht an der Konferenz teilnehmen. Der Name auf dem Ausweis muss exakt mit dem bei der Registrierung angegebenen Namen übereinstimmen. Als wissenschaftlicher Teilnehmer müssen Sie außerdem einen Nachweis darüber erbringen, dass Sie die Voraussetzungen erfüllen.&lt;br&gt; – Scannen Sie den QR-Code, den Sie per E-Mail für die Registrierung erhalten haben. Sie können diesen mit Ihrem Smartphone scannen, die E-Mail muss dazu nicht ausgedruckt werden. #Umweltschutz &lt;br&gt;&lt;br&gt;Ihr Ansteckschild ist nicht übertragbar, es darf also nicht an andere Personen weitergegeben oder gemeinsam mit anderen Personen genutzt werden. Wichtig dabei ist, dass die Ansteckschilder für die Google I/O nicht ersetzt werden können. Verlieren Sie Ihres also nicht, sonst werden Sie nicht wieder in den Konferenzbereich vorgelassen. Sie müssen Ihr Ansteckschild während der gesamten Google I/O tragen; dies gilt auch für die einzelnen Tagungen, Sandboxes und \"After Hours\". Auf Verlangen der Sicherheitskräfte müssen Sie Ihr Ansteckschild vorzeigen und sich ggf. zusätzlich ausweisen. Die Ansteckschilder für die Google I/O können Ihren Namen, den Namen Ihres Unternehmens bzw. Ihrer Organisation (falls angegeben) und ein Foto enthalten.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Bei den Keynotes ist zwar für jeden Teilnehmer ein Sitzplatz garantiert, aber die besten Plätze werden beim Abholen der Ansteckschilder am 06. Mai ab 7.00 Uhr nach der Reihenfolge des Eintreffens vergeben. Seien Sie also frühzeitig da.</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O ist eine Open-Air-Veranstaltung für Entwickler. Kleiden Sie sich leger und bequem, einen bestimmten Dresscode gibt es nicht. In der Bay Area kann es tagsüber sehr warm, abends aber kühl werden, denken Sie bei der Auswahl der Kleidung daran.</string>\n    <string name=\"faq_onsite_food_options_description\">Für das leibliche Wohl ist bestens gesorgt.  An allen drei Konferenztagen erhalten die Teilnehmer ein kostenloses Frühstück, Mittagessen und Snacks. Am ersten und zweiten Tag wird auch ein Abendessen während der After-Hour-Veranstaltungen angeboten.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Wir helfen Ihnen. Das Fundbüro befindet sich während der Veranstaltungszeiten am Konferenzinformationsschalter. Alle Gegenstände, die bis zum nächsten Tag nicht abgeholt wurden, werden dem Conference Security Office übergeben. Ein wichtiger Hinweis: Die Ansteckschilder für die Google I/O können NICHT ersetzt werden. Verlieren Sie Ihres also nicht, sonst werden Sie nicht wieder in den Konferenzbereich vorgelassen.</string>\n    <string name=\"faq_after_dark_program_description\">Das sind zwei Nächte, die Sie nicht verpassen sollten. Die Teilnehmer können am 08. Mai abends Musik, Spiele und mehr genießen. Am 09. Mai findet im Amphitheater ein exklusives Konzert statt. An beiden Abenden sind Speisen und Getränke erhältlich (alkoholische Getränke ab 21 Jahren). Beide After-Hour-Veranstaltungen finden im Shoreline Amphitheatre statt. Für den Eintritt ist Ihr Teilnehmerausweis erforderlich.</string>\n    <string name=\"faq_accessibility_needs_description\">Bei den Behindertenparkplätzen stehen auch Parkplätze für werdende Mütter zur Verfügung.&lt;br&gt; Stillende Mütter können mit ihrem Kind an der Konferenz teilnehmen. Am 07. und 08. Mai sind von 08:00 bis 20:00 Uhr und am 09. Mai von 08:00 bis 16:00 Uhr vier Wickelräume vorhanden. Anmeldeunterlagen werden vor den Zimmern der Mütter zur Verfügung stehen. Die Verwendung wird nach der Reihenfolge des Eintreffens vergeben. Weitere Informationen erhalten Sie am Informationsstand.&lt;br&gt;&lt;br&gt; Eltern, die Interesse an der Kinderbetreuung haben und die sich über unser Anmeldeformular angemeldet haben, erhalten eine Rückerstattung von 100 $ pro Tag (bis zu 300 $ insgesamt). Auch diese Plätze werden nach der Reihenfolge des Eintreffens vergeben. Unsere Rückerstattung der Kinderbetreuung wird von einem Drittanbieter angeboten. Wenn Ihr Antrag auf Kinderbetreuung vor Beginn der Konferenz von uns per E-Mail genehmigt und Ihre Anwesenheit vor Ort bestätigt wird, wird sich unser Anbieter innerhalb von 7 Werktagen nach der Google I/O mit den nächsten Schritten bei Ihnen melden. Dieser wird dann alle Auszahlungen für unsere Kinderbetreuungszahlungen leisten.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Bei den Behindertenparkplätzen stehen auch Parkplätze für werdende Mütter zur Verfügung.&lt;br&gt; Stillende Mütter können mit ihrem Kind an der Konferenz teilnehmen. Am 07. und 08. Mai sind von 08:00 bis 20:00 Uhr und am 09. Mai von 08:00 bis 16:00 Uhr vier Wickelräume vorhanden. Anmeldeunterlagen werden vor den Zimmern der Mütter zur Verfügung stehen. Die Verwendung wird nach der Reihenfolge des Eintreffens vergeben. Weitere Informationen erhalten Sie am Informationsstand.&lt;br&gt;&lt;br&gt; Eltern, die Interesse an der Kinderbetreuung haben und die sich über unser Anmeldeformular angemeldet haben, erhalten eine Rückerstattung von 100 $ pro Tag (bis zu 300 $ insgesamt). Auch diese Plätze werden nach der Reihenfolge des Eintreffens vergeben. Unsere Rückerstattung der Kinderbetreuung wird von einem Drittanbieter angeboten. Wenn Ihr Antrag auf Kinderbetreuung vor Beginn der Konferenz von uns per E-Mail genehmigt und Ihre Anwesenheit vor Ort bestätigt wird, wird sich unser Anbieter innerhalb von 7 Werktagen nach der Google I/O mit den nächsten Schritten bei Ihnen melden. Dieser wird dann alle Auszahlungen für unsere Kinderbetreuungszahlungen leisten.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google legt großen Wert darauf, ein belästigungsfreies und inklusives Veranstaltungserlebnis für alle zu bieten, unabhängig von Geschlechtsidentität und -ausdruck, sexueller Orientierung, Behinderungen, Neurodiversität, körperlicher Erscheinung, Körpergröße, ethnischer Herkunft, Nationalität, Rasse, Alter, Religion oder einer anderen geschützten Eigenschaft. Um die Veranstaltung so inklusiv wie möglich zu gestalten, werden geschlechtsneutrale Toiletten im gesamten Veranstaltungsort angeboten.&lt;br&gt;&lt;br&gt; Wir dulden keine Belästigung von Teilnehmern der Veranstaltung in irgendeiner Form.&lt;br&gt; Google nimmt Verstöße gegen die Richtlinien sehr ernst und wird entsprechend reagieren. Weitere Informationen zu den Google Community-Richtlinien und den Richtlinien zur Bekämpfung von Belästigungen &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;finden Sie hier&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Die beiden Keynotes und alle Tagungen werden während der drei Festivaltage auf der Homepage der Event-Website live übertragen. Wenn Sie zu dieser Zeit arbeiten müssen oder aus einem anderen Grund keine Zeit haben, können Sie sich später auf dem &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers YouTube-Kanal&lt;/a&gt; die Aufzeichnungen der Tagungen ansehen.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Ja! Jedes Jahr veranstalten Entwickler auf der ganzen Welt &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended-Events&lt;/a&gt;. Während dieser Veranstaltungen können Veranstalter diese live übertragen und ihre eigenen Tagungen veranstalten, darunter Hackathons, Codelabs, Demos und vieles mehr.&lt;br&gt; Wenn Sie dieses Jahr als Gastgeber für I/O Extended dabei sind, sollten Sie zuerst die folgenden Schritte ausführen:&lt;br&gt;&lt;br&gt; Lesen Sie sich die &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Organisator-Anleitung&lt;/a&gt; durch, um Tipps und Vorschläge für eine erfolgreiche Veranstaltung zu erhalten.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"Registrieren&lt;/a&gt; Sie sich für Ihre öffentliche Veranstaltung auf der I/O-Website, um die Sichtbarkeit zu erhöhen.&lt;br&gt;&lt;br&gt; Verwenden Sie den offiziellen Hashtag #io19extended für all Ihre Posts in sozialen Netzwerken im Zusammenhang mit I/O Extended, um leichter gefunden zu werden.&lt;br&gt;&lt;br&gt; Hinweis: Veranstalter von I/O Extended können nach Ende der Veranstaltung das Löschen ihrer persönlichen Daten und/oder Veranstaltungsdaten anfordern. Schicken Sie dazu eine E-Mail an io19@google.com.&lt;br&gt; Wenn Sie nur an einer I/O Extended-Veranstaltung teilnehmen möchten, suchen Sie auf &lt;a href=\"https://events.google.com/io/extended\"&gt;unserer Karte&lt;/a&gt; eine heraus, die in Ihrer Nähe stattfindet, und melden Sie sich an.&lt;br&gt; Wenn Sie Fragen zum Programm von I/O Extended haben, wenden Sie sich an io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Sitzungen anzeigen</string>\n    <string name=\"wifi_install_success\">WLAN gespeichert</string>\n    <string name=\"wifi_install_clipboard_message\">WLAN konnte nicht gespeichert werden.\\nDas Passwort wurde in der Zwischenablage gespeichert.</string>\n    <string name=\"event_sessions_title\">Sitzungen</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours und App-Rezensionen</string>\n    <string name=\"event_afterhours_title\">Rahmenprogramm</string>\n    <string name=\"event_meals_title\">Verpflegung</string>\n    <string name=\"event_sessions_description\">Ab April können Besucher vor Ort Sitzplätze für Tagungen vor der Veranstaltung auf der I/O-Website und auch über die I/O-Mobile App reservieren (Hinweis: Ein Teil der Tagungssitzplätze ist von der Reservierung ausgenommen. Diese werden nach der Reihenfolge des Eintreffens vergeben). Auch die Plätze für Codelabs, App Reviews und Office Hours werden nach der Reihenfolge des Eintreffens vergeben.</string>\n    <string name=\"event_sandbox_description\">Spezielle Bereiche zum Erkunden, Lernen und spielerischen Experimentieren mit unseren neuesten Produkten und Plattformen – anhand von interaktiven Demos, physischen Installationen und vielem mehr.</string>\n    <string name=\"event_codelabs_description\">Sammeln Sie an unseren Programmierständen praktische Erfahrungen. Hier finden Sie alles, was Sie brauchen, um mithilfe von Onlinekursen zum Selbststudium die neuesten und besten Google-Technologien kennenzulernen – oder bringen Sie Ihren eigenen Rechner mit und nehmen Sie sich Arbeit mit nach Hause. Die anwesenden Mitarbeiter von Google geben Ihnen gern nützliche Tipps und helfen Ihnen, wenn Sie mal nicht weiterkommen.</string>\n    <string name=\"event_officehours_description\">Im Rahmen der Office Hours haben Sie Gelegenheit, Experten von Google all Ihre technischen Fragen persönlich zu stellen, und bei den App Reviews erhalten Sie Beratung und Tipps zu Ihren spezifischen App-Projekten.</string>\n    <string name=\"event_afterhours_description\">An zwei Abenden findet nach dem Ende der Sitzungen in der Nähe des Shoreline ein Rahmenprogramm mit Essen, Getränken und Unterhaltung statt. Am ersten Abend gibt es eine Party in den Räumen von Sandbox und am zweiten veranstalten wir ein exklusives Konzert im Amphitheatre.</string>\n    <string name=\"event_meals_description\">Die Teilnehmer erhalten an allen drei Tagen der Konferenz kostenlos Frühstück, Mittagessen und Snacks. Während der After-Hours-Veranstaltungen an den ersten beiden Tagen wird auch ein Abendessen angeboten.</string>\n    <string name=\"wifi_header\">WLAN</string>\n    <string name=\"related_apps_header\">Ähnliche Apps</string>\n    <string name=\"event_types_header\">Veranstaltungsarten</string>\n    <string name=\"settings_time_zone_label\">Veranstaltungen in der Zeitzone \"Pacific Standard Time\" (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Benachrichtigungen aktivieren</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Anonyme Nutzungsstatistiken senden</string>\n    <string name=\"settings_tos\">Nutzungsbedingungen</string>\n    <string name=\"settings_privacy_policy\">Datenschutzerklärung</string>\n    <string name=\"settings_oss_licenses\">Open-Source-Lizenzen</string>\n    <string name=\"settings_theme_title\">Design auswählen</string>\n    <string name=\"settings_theme_system\">Systemvorgabe</string>\n    <string name=\"settings_theme_light\">Hell</string>\n    <string name=\"settings_theme_dark\">Dunkel</string>\n    <string name=\"settings_theme_battery\">Durch Energiesparmodus festgelegt</string>\n    <string name=\"built_with_material_components\">Erstellt mit Material Components.</string>\n    <string name=\"wifi_network_and_password\">Netzwerk: %1$s\\nPasswort: %2$s</string>\n    <string name=\"join_network\">Dem Netzwerk beitreten</string>\n    <string name=\"assistant_app_description\">Sagen Sie einfach: \"Hey Google, sprich mit Google I/O 19.\"</string>\n    <string name=\"assistant_app_description2\">Sagen Sie einfach: \"Hey Google, sprich mit Google I/O 19.\"</string>\n    <string name=\"speaker_link_website\">Website</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Veranstaltungen</string>\n    <string name=\"no_network_connection\">Keine Internetverbindung.</string>\n    <string name=\"navigate_up\">Nach oben</string>\n    <string name=\"no_network_description\">Versuchen Sie folgende Schritte, wenn Sie die Funktion \"I/O erkunden\" nutzen möchten:\\n\\n – Flugmodus deaktivieren\\n\\n – Mobile Daten oder WLAN aktivieren\\n\\n – Signalstärke überprüfen</string>\n    <string name=\"phone_does_not_support_arcore_title\">ARCore wird von Ihrem Smartphone nicht unterstützt</string>\n    <string name=\"phone_does_not_support_arcore_message\">Versuchen Sie es mit einem anderen Gerät</string>\n    <string name=\"codelabs_information\">Lernen Sie die neuesten und besten Google-Technologien durch Kurse zum Selbststudium an unseren Programmierständen kennen oder bringen Sie Ihren eigenen Rechner mit und nehmen Sie sich Ihre Arbeit mit nach Hause. Die Stände sind täglich geöffnet, außer während der ersten Keynote.</string>\n    <string name=\"codelabs_building\">Codelabs-Gebäude</string>\n    <string name=\"codelabs_website\">Codelabs-Website</string>\n    <string name=\"codelab_duration\">Dauer: %1$d Min.</string>\n    <string name=\"start_codelab\">Codelab starten</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-h600dp/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <dimen name=\"countdown_height\">400dp</dimen>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Orari</string>\n    <string name=\"title_home\">Home</string>\n    <string name=\"title_map\">Mappa</string>\n    <string name=\"title_explore_io\">Scopri l\\'I/O</string>\n    <string name=\"title_info\">Informazioni</string>\n    <string name=\"filters\">Filtri</string>\n    <string name=\"category_heading_tracks\">Argomenti</string>\n    <string name=\"category_heading_types\">Tipi</string>\n    <string name=\"reset\">Reimposta</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventi</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">I tuoi eventi speciali e prenotati</string>\n    <string name=\"starred_and_reserved_short\">I tuoi eventi</string>\n    <string name=\"search_schedule_hint\">Cerca nel programma</string>\n    <string name=\"search_schedule_no_results\">Nessun risultato trovato</string>\n    <string name=\"agenda\">Agenda</string>\n    <string name=\"event_starred\">Evento aggiunto a Speciali</string>\n    <string name=\"event_unstarred\">Evento rimosso da speciali</string>\n    <string name=\"event_star_error\">Errore durante l\\'aggiunta dell\\'evento a speciali</string>\n    <string name=\"reservation_error\">Errore durante le modifiche alla prenotazione. Attendi il completamento delle precedenti richieste o riprova più tardi.</string>\n    <string name=\"reservation_request_succeeded\">Prenotazione richiesta.</string>\n    <string name=\"reservation_cancel_succeeded\">Prenotazione annullata: \"&lt;b&gt;%s&lt;/b&gt;.\"</string>\n    <string name=\"reservation_new\">Il tuo posto è stato prenotato per \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Evento sostituito.</string>\n    <string name=\"waitlist_new\">Il tuo nome è stato inserito in lista d\\'attesa.</string>\n    <string name=\"waitlist_cancel_succeeded\">Rimosso dalla lista d\\'attesa.</string>\n    <string name=\"got_it\">OK</string>\n    <string name=\"dont_show\">Non mostrare</string>\n    <string name=\"reservation_denied_cutoff\">Prenotazione negata: troppo vicino all\\'orario di inizio.</string>\n    <string name=\"reservation_denied_clash\">Prenotazione negata: conflitto con un\\'altra prenotazione</string>\n    <string name=\"reservation_denied_unknown\">Prenotazione negata: errore sconosciuto.</string>\n    <string name=\"cancellation_denied_cutoff\">Cancellazione negata: troppo vicino all\\'orario di inizio.</string>\n    <string name=\"cancellation_denied_unknown\">Cancellazione negata: errore sconosciuto.</string>\n    <string name=\"schedule_filters_empty\">Nessun evento trovato.</string>\n    <string name=\"reservation_reservable\">Prenota il posto</string>\n    <string name=\"reservation_reserved\">Prenotato</string>\n    <string name=\"reservation_waitlisted\">In lista d\\'attesa</string>\n    <string name=\"reservation_waitlist_available\">Iscriviti alla lista d\\'attesa</string>\n    <string name=\"reservation_disabled\">Prenotazioni non disponibili</string>\n    <string name=\"reservation_pending\">Prenotazione in attesa</string>\n    <string name=\"schedule_hint_title\">Personalizza il tuo programma</string>\n    <string name=\"schedule_hint_star_event\">Aggiungi ai tuoi eventi speciali</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Prenota un posto nella sessione</string>\n    <string name=\"rate_session\">Valuta sessione</string>\n    <string name=\"menu_item_session_location\">Località sessione</string>\n    <string name=\"menu_item_session_star\">Aggiungi sessione a speciali</string>\n    <string name=\"menu_item_calendar\">Aggiungi al calendario</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Altoparlanti</string>\n    <string name=\"session_detail_related_header\">Eventi correlati</string>\n    <string name=\"feedback_submit\">Invia</string>\n    <string name=\"feedback_thank_you\">Grazie per il feedback.</string>\n    <string name=\"feedback_q1_text\">Come valuti la qualità complessiva della sessione?</string>\n    <string name=\"feedback_q2_text\">Come descriveresti il contenuto della sessione in relazione alle tue aspettative e alla descrizione della sessione?</string>\n    <string name=\"feedback_q3_text\">Quanto pertinente è stata la sessione in relazione ai tuoi progetti?</string>\n    <string name=\"feedback_q4_text\">Quanto è stata pertinente la Sessione rispetto ai tuoi progetti?</string>\n    <string name=\"feedback_q1_label_start\">Molto basilare</string>\n    <string name=\"feedback_q2_label_start\">Scadente</string>\n    <string name=\"feedback_q3_label_start\">Scadente</string>\n    <string name=\"feedback_q4_label_start\">Non particolarmente</string>\n    <string name=\"feedback_q1_label_end\">Eccellente</string>\n    <string name=\"feedback_q2_label_end\">Eccellente</string>\n    <string name=\"feedback_q3_label_end\">Moltissimo</string>\n    <string name=\"feedback_q4_label_end\">Moltissimo</string>\n    <string name=\"a11y_show_navigation\">Mostra il menu di navigazione</string>\n    <string name=\"a11y_collapse_filters_sheet\">Abbassa foglio dei filtri</string>\n    <string name=\"a11y_clear_tag_filters\">Cancella filtri</string>\n    <string name=\"a11y_filter_applied\">Filtro %1s applicato</string>\n    <string name=\"a11y_filter_not_applied\">Filtro %1s non applicato</string>\n    <string name=\"a11y_reservation_available\">Prenota evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento prenotato</string>\n    <string name=\"a11y_reservation_disabled\">Prenotazione non disponibile</string>\n    <string name=\"a11y_reservation_wait_list_available\">Iscriviti alla lista d\\'attesa per l\\'evento</string>\n    <string name=\"a11y_reservation_wait_listed\">In lista d\\'attesa per l\\'evento</string>\n    <string name=\"a11y_reservation_pending\">Prenotazione in attesa</string>\n    <string name=\"a11y_starred\">Evento aggiunto ai preferiti</string>\n    <string name=\"a11y_unstarred\">Evento non aggiunto ai preferiti</string>\n    <string name=\"a11y_star\">Aggiungi a speciali</string>\n    <string name=\"a11y_play\">Riproduci video</string>\n    <string name=\"a11y_select_map_mode\">Seleziona modalità mappa</string>\n    <string name=\"a11y_search_schedule\">Cerca nel programma</string>\n    <string name=\"welcome\">Ti diamo il benvenuto!</string>\n    <string name=\"a11y_signed_in_content_description\">Accesso eseguito come %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Tocca per accedere.</string>\n    <string name=\"dialog_sign_in_content\">Accedi per salvare eventi, prenotare posti e valutare le sessioni (in caso di partecipazione). Le azioni verranno sincronizzate dal tuo account sull\\'app e il sito.</string>\n    <string name=\"sign_in\">Accedi</string>\n    <string name=\"firebase_auth_no_network_connection\">Nessuna connessione a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Errore sconosciuto</string>\n    <string name=\"dialog_sign_out_content\">Tutti gli eventi salvati, le prenotazioni dei posti e le valutazioni delle sessioni (in caso di partecipazione) rimangono sincronizzati con il tuo account.</string>\n    <string name=\"sign_out\">Esci</string>\n    <string name=\"manage_google_account\">Gestisci il tuo Account Google</string>\n    <string name=\"remove_reservation_title\">Rimuovere la prenotazione?</string>\n    <string name=\"remove_reservation_content\">Stai per rinunciare al tuo posto per \"%1$s\". Se decidi di non prenotare un posto, ma vuoi comunque partecipare, tutte le sessioni riservano alcuni posti che verranno assegnati in base all\\'ordine di arrivo.</string>\n    <string name=\"cancel\">Annulla</string>\n    <string name=\"remove\">Rimuovi</string>\n    <string name=\"swap_reservation_title\">Cambiare la prenotazione?</string>\n    <string name=\"swap_reservation_content\">Hai già una prenotazione o sei già in lista d\\'attesa per \"%1$s\"?. È consentita una sola prenotazione per fascia oraria. Vuoi cambiarla con \"%2$s\"?</string>\n    <string name=\"swap\">Cambia</string>\n    <string name=\"notifications_preference_dialog_title\">Notifiche I/O</string>\n    <string name=\"notifications_preference_dialog_content\">Vuoi ricevere notifiche su I/O? Ti invieremo informazioni su orari di inizio delle sessioni, eventi after hours, registrazioni delle sessioni e molto altro ancora. Puoi cambiare questa impostazione da \"Informazioni &gt; Impostazioni\" in qualsiasi momento.</string>\n    <string name=\"no\">No</string>\n    <string name=\"yes\">Sì</string>\n    <string name=\"feed_not_available\">Nessun annuncio trovato</string>\n    <string name=\"feed_loading_error\">Impossibile caricare il feed. Riprova più tardi.</string>\n    <string name=\"feed_announcement_title\">Annunci</string>\n    <string name=\"feed_upcoming_events\">Prossimi eventi</string>\n    <string name=\"feed_saved_events\">Eventi salvati</string>\n    <string name=\"feed_no_saved_events\">Nessun evento salvato</string>\n    <string name=\"feed_view_all_events\">Visualizza tutti gli eventi</string>\n    <string name=\"feed_view_your_schedule\">Visualizza il tuo programma</string>\n    <string name=\"feed_watch_live_stream\">Guarda live streaming</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s giorno</item>\n        <item quantity=\"other\">%s giorni</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s ora</item>\n        <item quantity=\"other\">%s ore</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minuti</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s secondo</item>\n        <item quantity=\"other\">%s secondi</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Condividi sessione</string>\n    <string name=\"share_text_session_detail\">Dai un\\'occhiata a \"%1$s\" alla pagina #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Condividi</string>\n    <string name=\"map_variant_after_dark\">Dopo il tramonto</string>\n    <string name=\"map_variant_concert\">Concerto</string>\n    <string name=\"map_variant_daytime\">Diurni</string>\n    <string name=\"enable_my_location\">Abilita la mia posizione</string>\n    <string name=\"my_location_rationale\">L\\'app necessita dell\\'autorizzazione di accesso alla posizione per mostrare la tua posizione sulla mappa.</string>\n    <string name=\"onboarding_get_started\">Inizia</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Ti diamo il benvenuto in Google I/O</string>\n    <string name=\"onboarding_date_location\">Dal 7 al 9 maggio 2019\\nMountain View, California</string>\n    <string name=\"onboarding_label_days\">G</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Il Google I/O sta arrivando</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Guarda il riepilogo dell\\'I/O \\'19 e scopri #io19 sui social</string>\n    <string name=\"onboarding_signin\">Accedi per ricevere le notifiche relative all\\'I/O. I partecipanti possono prenotare un posto per le sessioni.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">La sessione inizierà fra %1$s minuto</item>\n        <item quantity=\"other\">La sessione inizierà fra %1$s minuti</item>\n    </plurals>\n    <string name=\"expanded\">Espansa</string>\n    <string name=\"collapsed\">Compressa</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viaggi</string>\n    <string name=\"faq_title\">Domande frequenti</string>\n    <string name=\"settings_title\">Impostazioni</string>\n    <string name=\"about_title\">Informazioni</string>\n    <string name=\"travel_what_to_bring_title\">Cosa portare all\\'evento</string>\n    <string name=\"travel_hotels_title\">Hotel</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Raggiungere Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Raggiungere Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Servizio navetta</string>\n    <string name=\"travel_off_site_parking_title\">Parcheggio esterno</string>\n    <string name=\"travel_for_public_transportation_title\">Trasporti pubblici</string>\n    <string name=\"travel_biking_title\">Bici</string>\n    <string name=\"travel_ridesharing_title\">Car sharing</string>\n    <string name=\"travel_airport_transfers_title\">Trasferimenti all\\'aeroporto</string>\n    <string name=\"travel_what_to_bring_description\">Il Google I/O è un festival all\\'aperto. È questo che rende speciale l\\'I/O, anche se ci sono alcuni aspetti da considerare. Le sessioni si svolgeranno all\\'interno di tende chiuse climatizzate, ma consigliamo di portare con sé crema solare, occhiali da sole e un indumento più pesante per sera. L\\'I/O è un evento informale: ricordalo quando sceglierai cosa indossare.</string>\n    <string name=\"travel_hotels_description\">Sono disponibili diverse camere presso i vari hotel della zona. L\\'elenco degli hotel e delle stanze disponibili verrà aggiornato regolarmente. Utilizza la mappa di seguito per trovare il miglior hotel per te. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Hotel Map&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Di seguito i tre aeroporti internazionali principali della Bay Area:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=it\"&gt;Aeroporto Internazionale di San Francisco (SFO)&lt;/a&gt; ~39 km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=it\"&gt; Aeroporto Internazionale di Oakland (OAK)&lt;/a&gt; ~51 km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=it\"&gt;Aeroporto Internazionale di San Jose-Norman Y. Mineta (SJC)&lt;/a&gt; ~19 km</string>\n    <string name=\"travel_getting_to_shoreline_description\">Nel tentativo di ridurre la congestione del traffico e le emissioni di carbonio, è stato deciso che il Google I/O 2019 sarà un \"Evento senza parcheggi*.\" Abbia scelto attentamente questa soluzione e offriremo gratuitamente varie opzioni per arrivare all\\'evento senza che sia necessario un veicolo.&lt;br&gt;&lt;br&gt;Ulteriori informazioni saranno disponibili a ridosso dell\\'evento.&lt;br&gt;&lt;br&gt;*Sarà possibile un parcheggio per i disabili.</string>\n    <string name=\"travel_shuttle_service_description\">Nel tentativo di ridurre la congestione del traffico e le emissioni di carbonio, è stato deciso che il Google I/O 2019 sarà un \"Evento senza parcheggi*.\" Abbia scelto attentamente questa soluzione e offriremo gratuitamente varie opzioni per arrivare all\\'evento senza che sia necessario un veicolo.&lt;br&gt;&lt;br&gt;Ulteriori informazioni saranno disponibili a ridosso dell\\'evento.&lt;br&gt;&lt;br&gt;*Sarà possibile un parcheggio per i disabili.</string>\n    <string name=\"travel_off_site_parking_description\">Presso l\\'&lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt; sarà disponibile un parcheggio gratuito all\\'aperto. Le navette dall\\'Avaya Stadium saranno disponibili da e per il Google I/O.&lt;br&gt;&lt;br&gt; Indica sul modulo di registrazione se necessiti del parcheggio per disabili o di qualsiasi assistenza speciale: il team dell\\'organizzazione ti contatterà direttamente.</string>\n    <string name=\"travel_for_public_transportation_description\">Durante la preregistrazione sarà possibile ritirare i pass prepagati per il trasporto pubblico. È possibile raggiungere l\\'area con i seguenti servizi di trasporto pubblico:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Sistema ferroviario regionale&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Metrotranvia per South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Trasporto rapido per la Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Sistema ferroviario regionale&lt;br&gt;&lt;br&gt; Non è previsto alcun servizio di trasporto pubblico diretto per Google I/O. Continua a seguirci per conoscere le località esatte servite dalle navette per gli eventi di Google I/O.</string>\n    <string name=\"travel_biking_description\">Presso lo Shoreline Amphitheatre, nel Parking Lot A, è disponibile un parcheggio gratuito per biciclette. La Silicon Valley Bicycle Coalition fornirà un servizio parcheggiatori per la tua bicicletta, tutti i giorni dalle ore 7 fino al termine dell\\'evento.&lt;br&gt;&lt;br&gt; Controlla Google Maps per i migliori percorsi ciclabili e le indicazioni stradali. Lo Stevens Creek Trail e il Permanente Creek Trail sono due percorsi facilmente accessibili per tutti coloro che vorranno raggiungere in bicicletta lo Shoreline Amphitheatre.</string>\n    <string name=\"travel_ridesharing_description\">I trasferimenti per gli aeroporti di San Francisco e San Jose dal Google I/O saranno disponibili gli ultimi giorni dell\\'evento. I trasferimenti per l\\'aeroporto NON saranno disponibili per altre date.</string>\n    <string name=\"travel_airport_transfers_description\">I trasferimenti per gli aeroporti di San Francisco e San Jose dal Google I/O saranno disponibili gli ultimi giorni dell\\'evento. I trasferimenti per l\\'aeroporto NON saranno disponibili per altre date.</string>\n    <string name=\"faq_when_and_where_title\">Quando e dove si svolgerà il Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Dove posso trovare le ultime notizie sul Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Le sessioni saranno tutte in inglese?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Posso prenotare un posto per le sessioni prima dell\\'evento?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Qual è il modo migliore per raggiungere lo Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Quando e dove posso ritirare il mio badge?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Voglio assicurarmi un posto in prima fila durante l\\'Intervento principale. Qualche suggerimento?</string>\n    <string name=\"faq_what_should_i_wear_title\">Che cosa dovrei indossare?</string>\n    <string name=\"faq_onsite_food_options_title\">Mi piace fare degli spuntini. Quali opzioni avrò a disposizione durante l\\'evento?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Se perdo qualcosa, a chi mi posso rivolgere?</string>\n    <string name=\"faq_after_dark_program_title\">Il programma di eventi serali After Dark sembra divertente. Dovrei partecipare?</string>\n    <string name=\"faq_accessibility_needs_title\">Potete soddisfare le mie esigenze di accessibilità?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Come offrite assistenza alle mamme in attesa e ai genitori che partecipano all\\'I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Norme della community per gli eventi e Norme in materia di molestie di Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Le sessioni saranno trasmesse in live streaming? Cosa succede se non riesco a seguire l\\'evento in tempo reale?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Voglio partecipare all\\'I/O con la mia community!  Qualche idea?</string>\n    <string name=\"faq_when_and_where_description\">Per non perderti le ultime informazioni su sessioni, relatori e attività, visita spesso il &lt;a href=\"https://events.google.com/io/\"&gt;sito web del Google I/O 2019&lt;/a&gt;, il &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog di Google Developers&lt;/a&gt; e seguici su &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; e &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Puoi anche seguire e partecipare alla conversazione social su Google I/O 2019 tramite l\\'hashtag ufficiale &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Inoltre, invieremo via email importanti informazioni e istruzioni per il check-in prima del festival a tutti i partecipanti registrati.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Per non perderti le ultime informazioni su sessioni, relatori e attività, visita spesso il &lt;a href=\"https://events.google.com/io/\"&gt;sito web del Google I/O 2019&lt;/a&gt;, il &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog di Google Developers&lt;/a&gt; e seguici su &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; e &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Puoi anche seguire e partecipare alla conversazione social su Google I/O 2019 tramite l\\'hashtag ufficiale &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Inoltre, invieremo via email importanti informazioni e istruzioni per il check-in prima del festival a tutti i partecipanti registrati.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sì. Questo ci permette di rivolgerci a un pubblico internazionale.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">A partire da aprile, chi ha intenzione di partecipare fisicamente all\\'evento potrà prenotare in anticipo i posti per le sessioni sul sito web dell\\'I/O e tramite l\\'app per dispositivi mobili dell\\'I/O (nota: alcuni posti dedicati alla Sessione non potranno essere prenotati e saranno disponibili in base all\\'ordine di arrivo alla sede dell\\'evento). Sarà possibile partecipare agli eventi codelab, App Reviews e Office Hours in base all\\'ordine di arrivo alla sede dell\\'evento.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Nella sezione Viaggi puoi consultare i suggerimenti sui trasporti di cui necessiti, come le informazioni sulla navetta, le indicazioni in macchina e in bicicletta, i suggerimenti su come condividere il viaggio e molto altro.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Per velocizzare le procedure di accesso, il ritiro del badge sarà disponibile da lunedì 6 maggio presso lo Shoreline Amphitheatre. Per ricevere il badge di Google I/O, dovrai:&lt;br&gt; - Esibisci un documento d\\'identità con foto. Accettiamo patenti di guida ufficiali, passaporti e altre forme di identificazione. Se non disponi di questi documenti, non potremo rilasciare il badge e non avrai accesso alla conferenza. Il nome sul documento di identità deve corrispondere esattamente a quello indicato al momento della registrazione. Se hai un profilo accademico, ricorda che dovrai esibire un\\'attestazione di idoneità.&lt;br&gt; - Esegui la scansione del codice QR di registrazione che hai ricevuto via email. La scansione si può effettuare tramite telefono, non è necessario stampare l\\'email. #savetheenvironment &lt;br&gt;&lt;br&gt;Tieni presente che non è ammesso condividere, consegnare o fornire il tuo badge tramite qualsiasi mezzo ad altre persone. I badge di Google I/O non possono essere sostituiti, quindi in caso di smarrimento non potrai più accedere alla conferenza. Per avere accesso al Google I/O, dovrai indossare sempre il badge, anche per sessioni, sandbox ed eventi After Hours. Se richiesto dal personale di sicurezza, dovrai fornire documenti di identificazione aggiuntivi. I badge di Google I/O possono includere nome, organizzazione o società (se fornite) e fotografia.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Durante gli Interventi principali ci sarà posto per tutti, ma i posti migliori saranno assegnati in ordine di arrivo al momento del ritiro dei badge, che sarà disponibile a partire dal 6 maggio alle ore 7. Fai quindi in modo di arrivare presto.</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O è un evento per sviluppatori che si tiene all\\'aperto. Indossa quindi vestiti comodi e informali. Non è previsto un dress code obbligatorio. Per scegliere l\\'abbigliamento adatto, tieni presente che il clima della Bay Area può essere molto caldo durante il giorno e freddo la sera.</string>\n    <string name=\"faq_onsite_food_options_description\">Buone notizie, anche a noi piace mangiare.  Ai partecipanti verranno offerti gratuitamente colazione, pranzo e spuntini per tutti i tre giorni della conferenza. Il primo e il secondo giorno sarà inoltre possibile cenare durante gli eventi After Hours.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Non disperare: durante gli eventi sarà attivo l\\'ufficio oggetti smarriti all\\'Help Desk della conferenza. Qualsiasi oggetto lasciato dal giorno precedente verrà consegnato all\\'Ufficio sicurezza. Un dettaglio importante: il badge di Google I/O non può essere sostituito, quindi fai attenzione a non perderlo, altrimenti non potrai più accedere alla conferenza.</string>\n    <string name=\"faq_after_dark_program_description\">Due serate da non perdere. I partecipanti potranno ascoltare musica, giocare e fare molte altre attività durante la serata dell\\'8 maggio, mentre il 9 maggio potranno partecipare a un concerto esclusivo nell\\'anfiteatro. Cibo e bevande saranno disponibili per tutte le serate (le bevande alcoliche solo per gli invitati di almeno 21 anni). Entrambi gli After Hours avranno luogo allo Shoreline Amphitheatre. Mostra all\\'ingresso il tuo badge di partecipazione.</string>\n    <string name=\"faq_accessibility_needs_description\">Nell\\'area dedicata ai parcheggi per i disabili, sono disponibili anche parcheggi per le mamme in attesa.&lt;br&gt; Le mamme che stanno allattando sono benvenute a partecipare alla conferenza con i loro bambini. Ci saranno quattro sale per le mamme disponibili il 7 e l\\'8 maggio dalle ore 8 alle ore 20, e il 9 maggio dalle ore 8 alle ore 16. I fogli per registrarsi saranno disponibili di fronte alle sale per le mamme in base all\\'ordine di arrivo. Per ulteriori informazioni, rivolgersi all\\'Help Desk della conferenza.&lt;br&gt;&lt;br&gt; Ai genitori interessati ai servizi per l\\'infanzia che partecipano all\\'evento verranno offerti USD 100 (massimo USD 300) al giorno per il rimborso dei servizi per l\\'infanzia. Sarà possibile richiedere il rimborso in base all\\'ordine di arrivo attraverso il modulo di registrazione. Il nostro rimborso per i servizi per l\\'infanzia è offerto da un fornitore di terze parti. Se approveremo la tua richiesta relativa ai servizi per l\\'infanzia via email prima dell\\'inizio della conferenza e se confermi la tua presenza fisica all\\'evento, il nostro fornitore ti farà sapere i prossimi passaggi entro sette giorni lavorativi dopo il Google I/O. Gestiranno loro tutti i pagamenti relativi ai servizi per l\\'infanzia.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Nell\\'area dedicata ai parcheggi per i disabili, sono disponibili anche parcheggi per le mamme in attesa.&lt;br&gt; Le mamme che stanno allattando sono benvenute a partecipare alla conferenza con i loro bambini. Ci saranno quattro sale per le mamme disponibili il 7 e l\\'8 maggio dalle ore 8 alle ore 20, e il 9 maggio dalle ore 8 alle ore 16. I fogli per registrarsi saranno disponibili di fronte alle sale per le mamme in base all\\'ordine di arrivo. Per ulteriori informazioni, rivolgersi all\\'Help Desk della conferenza.&lt;br&gt;&lt;br&gt; Ai genitori interessati ai servizi per l\\'infanzia che partecipano all\\'evento verranno offerti USD 100 (massimo USD 300) al giorno per il rimborso dei servizi per l\\'infanzia. Sarà possibile richiedere il rimborso in base all\\'ordine di arrivo attraverso il modulo di registrazione. Il nostro rimborso per i servizi per l\\'infanzia è offerto da un fornitore di terze parti. Se approveremo la tua richiesta relativa ai servizi per l\\'infanzia via email prima dell\\'inizio della conferenza e se confermi la tua presenza fisica all\\'evento, il nostro fornitore ti farà sapere i prossimi passaggi entro sette giorni lavorativi dopo il Google I/O. Gestiranno loro tutti i pagamenti relativi ai servizi per l\\'infanzia.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Lo scopo di Google è quello di offrire un evento in cui non ci siano molestie e che sia inclusivo per tutti, a prescindere da identità ed espressione di genere, orientamento sessuale, disabilità, neurodiversità, aspetto fisico, corporatura, etnia, nazionalità, razza, età, religione o altre categorie protette. Cercando di rendere l\\'evento più inclusivo possibile, nella sede dell\\'evento saranno disponibili bagni unisex.&lt;br&gt;&lt;br&gt; Non tolleriamo nessuna forma di molestie nei confronti dei partecipanti all\\'evento.&lt;br&gt; Google prende molto seriamente le violazioni delle norme e reagirà di conseguenza. Per ulteriori informazioni sulle Norme della community per gli eventi e le Norme in materia di molestie di Google, consulta &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;questo articolo&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">I due Interventi principali e tutte le sessioni saranno presentati in live streaming sulla home page del sito web dell\\'evento durante i tre giorni del festival. Se stai lavorando o se ti trovi dall\\'altra parte del mondo in un fuso orario diverso, potrai guardare le registrazioni delle sessioni in seguito sul &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canale YouTube di Google Developers.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sì. Ogni anno, gli sviluppatori di tutto il mondo organizzano eventi &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended&lt;/a&gt; durante i quali possono trasmettere in live streaming e tenere una sessione, tra cui hackathon, codelab, demo e molte altre.&lt;br&gt; Se quest\\'anno ospiterai un I/O Extended, ecco i passaggi da eseguire per iniziare:&lt;br&gt;&lt;br&gt; Leggi attentamente la &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guida per gli organizzatori&lt;/a&gt; per i suggerimenti su come ospitare un evento di successo.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registra&lt;/a&gt; il tuo evento pubblico sul sito web dell\\'I/O per aumentarne la visibilità.&lt;br&gt;&lt;br&gt; Utilizza l\\'hashtag ufficiale #io19extended su tutti i post che pubblichi sui social collegati all\\'I/O Extended affinché sia più semplice rilevarli.&lt;br&gt;&lt;br&gt; Nota: gli organizzatori di un I/O Extended possono richiedere la cancellazione dei propri dati personali e/o dell\\'evento al termine dello stesso inviando un\\'email all\\'indirizzo io19@google.com.&lt;br&gt; Se vuoi semplicemente partecipare a un evento I/O Extended, sfoglia &lt;a href=\"https://events.google.com/io/extended\"&gt;la nostra mappa&lt;/a&gt; per trovarne uno vicino a te e rispondi all\\'invito.&lt;br&gt; Se hai domande relative al programma dell\\'I/O, contattaci all\\'indirizzo io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Visualizza le sessioni</string>\n    <string name=\"wifi_install_success\">Rete Wi-Fi salvata</string>\n    <string name=\"wifi_install_clipboard_message\">Impossibile salvare rete Wi-Fi.\\nPassword copiata negli appunti.</string>\n    <string name=\"event_sessions_title\">Sessioni</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelab</string>\n    <string name=\"event_officehours_title\">Office Hours e App Reviews</string>\n    <string name=\"event_afterhours_title\">Eventi after hours</string>\n    <string name=\"event_meals_title\">Pasti</string>\n    <string name=\"event_sessions_description\">A partire da aprile, chi ha intenzione di partecipare fisicamente all\\'evento potrà prenotare in anticipo i posti per le sessioni sul sito web dell\\'I/O e tramite l\\'app per dispositivi mobili dell\\'I/O (nota: alcuni posti dedicati alla Sessione non potranno essere prenotati e saranno disponibili in base all\\'ordine di arrivo alla sede dell\\'evento). Sarà possibile partecipare agli eventi codelab, App Reviews e Office Hours in base all\\'ordine di arrivo alla sede dell\\'evento.</string>\n    <string name=\"event_sandbox_description\">Spazi dedicati per esplorare, imparare a usare e sperimentare i nostri ultimi prodotti e piattaforme tramite dimostrazioni interattive, installazioni e molto altro ancora.</string>\n    <string name=\"event_codelabs_description\">Fai un\\'esperienza sul campo nei nostri chioschi a prova di codifica. Qui troverai tutto ciò che ti serve per conoscere le ultime e migliori tecnologie di Google attraverso tutorial di autoapprendimento; in alternativa, vieni con il tuo computer e portati a casa il lavoro. Lo staff di Google sarà a tua disposizione per darti utili consigli e fornirti indicazioni in caso di difficoltà.</string>\n    <string name=\"event_officehours_description\">Gli eventi Office Hours ti offrono l\\'opportunità di incontrare faccia a faccia gli esperti di Google e porre loro tutte le tue domande tecniche. Con le sessioni App Reviews avrai la possibilità di ricevere consigli e suggerimenti sui tuoi progetti specifici relativi alle app.</string>\n    <string name=\"event_afterhours_description\">Dopo che le sessioni del giorno saranno terminate, resta nei pressi dello Shoreline per due serate all\\'insegna di cibo, bevande e divertimento. La prima sera, la festa si terrà nello spazio del Sandbox, mentre il giorno successivo ci sarà un esclusivo concerto nello Shoreline Amphitheatre.</string>\n    <string name=\"event_meals_description\">Ai partecipanti verranno offerti gratuitamente colazione, pranzo e spuntini per tutti i tre giorni della conferenza. Il primo e il secondo giorno sarà inoltre possibile cenare durante gli eventi After Hours.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Applicazioni correlate</string>\n    <string name=\"event_types_header\">Tipi di evento</string>\n    <string name=\"settings_time_zone_label\">Eventi nel fuso orario del Pacifico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Attiva notifiche</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Invia statistiche anonime sull\\'utilizzo</string>\n    <string name=\"settings_tos\">Termini di servizio</string>\n    <string name=\"settings_privacy_policy\">Norme sulla privacy</string>\n    <string name=\"settings_oss_licenses\">Licenze open source</string>\n    <string name=\"settings_theme_title\">Scegli tema</string>\n    <string name=\"settings_theme_system\">Opzioni predefinite di sistema</string>\n    <string name=\"settings_theme_light\">Lieve</string>\n    <string name=\"settings_theme_dark\">Scuro</string>\n    <string name=\"settings_theme_battery\">Impostato da Risparmio energetico</string>\n    <string name=\"built_with_material_components\">Creata con Material Components.</string>\n    <string name=\"wifi_network_and_password\">Rete: %1$s\\nPassword: %2$s</string>\n    <string name=\"join_network\">Entra nella rete</string>\n    <string name=\"assistant_app_description\">Basta dire \"Hey Google, parla a Google I/O 19\".</string>\n    <string name=\"assistant_app_description2\">Basta dire \"Hey Google, parla a Google I/O 19\".</string>\n    <string name=\"speaker_link_website\">Sito web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventi</string>\n    <string name=\"no_network_connection\">Connessione a Internet assente</string>\n    <string name=\"navigate_up\">Torna indietro</string>\n    <string name=\"no_network_description\">Per utilizzare la funzionalità Scopri I/O, prova a:\\n\\n - Disattivare la modalità aereo\\n\\n - Attivare i dati mobili o il Wi-Fi\\n\\n - Controllare il segnale nella tua zona</string>\n    <string name=\"phone_does_not_support_arcore_title\">Il tuo telefono non supporta ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Prova a utilizzare un altro dispositivo o fattene prestare uno da un amico</string>\n    <string name=\"codelabs_information\">Scopri ulteriori informazioni sulle tecnologie Google più recenti e innovative attraverso tutorial di autoapprendimento nei nostri chioschi a prova di codifica; in alternativa, vieni con il tuo computer e portati il lavoro a casa. I chioschi sono sempre aperti, tranne durante il primo Intervento principale.</string>\n    <string name=\"codelabs_building\">Edificio codelab</string>\n    <string name=\"codelabs_website\">Sito web codelab</string>\n    <string name=\"codelab_duration\">Durata: %1$d min</string>\n    <string name=\"start_codelab\">Avvia codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">スケジュール</string>\n    <string name=\"title_home\">ホーム</string>\n    <string name=\"title_map\">地図</string>\n    <string name=\"title_explore_io\">I/O を探索</string>\n    <string name=\"title_info\">情報</string>\n    <string name=\"filters\">フィルタ</string>\n    <string name=\"category_heading_tracks\">トピック</string>\n    <string name=\"category_heading_types\">種類</string>\n    <string name=\"reset\">リセット</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"other\">%1$d 件のイベント</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">スター付きイベントと予約済みイベント</string>\n    <string name=\"starred_and_reserved_short\">あなたのイベント</string>\n    <string name=\"search_schedule_hint\">スケジュールを検索します</string>\n    <string name=\"search_schedule_no_results\">一致する検索結果はありません</string>\n    <string name=\"agenda\">予定リスト</string>\n    <string name=\"event_starred\">スター付きアイテムにイベントを追加しました</string>\n    <string name=\"event_unstarred\">スター付きアイテムから削除されたイベント</string>\n    <string name=\"event_star_error\">スター付きアイテムにイベントを追加する際にエラーが発生しました</string>\n    <string name=\"reservation_error\">予約を変更する際にエラーが発生しました。前のリクエストが完了するのを待つか、しばらくしてからもう一度お試しください。</string>\n    <string name=\"reservation_request_succeeded\">予約をリクエストしました。</string>\n    <string name=\"reservation_cancel_succeeded\">予約をキャンセルしました: 「&lt;b&gt;%s&lt;/b&gt;」</string>\n    <string name=\"reservation_new\">「&lt;b&gt;%s&lt;/b&gt;」の座席が予約されました。</string>\n    <string name=\"reservation_replaced\">イベントが置き換えられました。</string>\n    <string name=\"waitlist_new\">ウェイティング リストに登録されました。</string>\n    <string name=\"waitlist_cancel_succeeded\">ウェイティング リストから削除されました。</string>\n    <string name=\"got_it\">OK</string>\n    <string name=\"dont_show\">表示しない</string>\n    <string name=\"reservation_denied_cutoff\">予約が拒否されました: 開始時間に近すぎます。</string>\n    <string name=\"reservation_denied_clash\">予約が拒否されました: 別の予約と競合しています。</string>\n    <string name=\"reservation_denied_unknown\">予約が拒否されました: 不明なエラー。</string>\n    <string name=\"cancellation_denied_cutoff\">キャンセルが拒否されました: 開始時間に近すぎます。</string>\n    <string name=\"cancellation_denied_unknown\">キャンセルが拒否されました: 不明なエラー。</string>\n    <string name=\"schedule_filters_empty\">イベントは見つかりませんでした。</string>\n    <string name=\"reservation_reservable\">座席を予約</string>\n    <string name=\"reservation_reserved\">予約済み</string>\n    <string name=\"reservation_waitlisted\">ウェイティング リストに登録済み</string>\n    <string name=\"reservation_waitlist_available\">ウェイティング リストに加わる</string>\n    <string name=\"reservation_disabled\">予約できません</string>\n    <string name=\"reservation_pending\">予約保留中</string>\n    <string name=\"schedule_hint_title\">スケジュールをカスタマイズしましょう</string>\n    <string name=\"schedule_hint_star_event\">スター付きイベントに追加</string>\n    <string name=\"schedule_hint_reserve_session_seat\">セッションの座席を予約しましょう</string>\n    <string name=\"rate_session\">セッションを評価</string>\n    <string name=\"menu_item_session_location\">セッションの場所</string>\n    <string name=\"menu_item_session_star\">セッションにスターを付ける</string>\n    <string name=\"menu_item_calendar\">カレンダーに追加</string>\n    <string name=\"speaker_delimiter\">、</string>\n    <string name=\"session_detail_speakers_header\">スピーカー</string>\n    <string name=\"session_detail_related_header\">関連イベント</string>\n    <string name=\"feedback_submit\">送信</string>\n    <string name=\"feedback_thank_you\">ご協力ありがとうございました。</string>\n    <string name=\"feedback_q1_text\">セッションの全体的なレベルに対する評価を教えてください。</string>\n    <string name=\"feedback_q2_text\">ご自身の期待やセッションの説明と照らして、セッションの内容についてどう思われますか。</string>\n    <string name=\"feedback_q3_text\">ご自身のプロジェクトとこのセッションはどの程度関連性がありましたか。</string>\n    <string name=\"feedback_q4_text\">ご自身のプロジェクトとこのセッションはどの程度関連性がありましたか。</string>\n    <string name=\"feedback_q1_label_start\">非常に低い</string>\n    <string name=\"feedback_q2_label_start\">不満足</string>\n    <string name=\"feedback_q3_label_start\">悪い</string>\n    <string name=\"feedback_q4_label_start\">あまり関連性がなかった</string>\n    <string name=\"feedback_q1_label_end\">すばらしい</string>\n    <string name=\"feedback_q2_label_end\">すばらしい</string>\n    <string name=\"feedback_q3_label_end\">非常に関連性があった</string>\n    <string name=\"feedback_q4_label_end\">非常に当てはまる</string>\n    <string name=\"a11y_show_navigation\">ナビゲーション メニューを表示</string>\n    <string name=\"a11y_collapse_filters_sheet\">フィルタシートを下げる</string>\n    <string name=\"a11y_clear_tag_filters\">フィルタをクリア</string>\n    <string name=\"a11y_filter_applied\">%1s フィルタが適用されました</string>\n    <string name=\"a11y_filter_not_applied\">%1s フィルタが適用されていません</string>\n    <string name=\"a11y_reservation_available\">イベントを予約</string>\n    <string name=\"a11y_reservation_reserved\">予約済みイベント</string>\n    <string name=\"a11y_reservation_disabled\">予約できません</string>\n    <string name=\"a11y_reservation_wait_list_available\">イベントのウェイティング リストに登録する</string>\n    <string name=\"a11y_reservation_wait_listed\">イベントのウェイティング リストに登録中</string>\n    <string name=\"a11y_reservation_pending\">予約保留中</string>\n    <string name=\"a11y_starred\">ブックマークしたイベント</string>\n    <string name=\"a11y_unstarred\">ブックマークされていないイベント</string>\n    <string name=\"a11y_star\">スターを付ける</string>\n    <string name=\"a11y_play\">動画を再生</string>\n    <string name=\"a11y_select_map_mode\">マップモードを選択</string>\n    <string name=\"a11y_search_schedule\">スケジュールを検索</string>\n    <string name=\"welcome\">ようこそ</string>\n    <string name=\"a11y_signed_in_content_description\">%s としてログインしています。</string>\n    <string name=\"a11y_signed_out_content_description\">タップしてログインしてください。</string>\n    <string name=\"dialog_sign_in_content\">イベントの保存、座席の予約、セッションの評価（出席者の場合）を行うには、ログインしてください。アカウントでの操作はアプリとサイトの間で同期されます。</string>\n    <string name=\"sign_in\">ログイン</string>\n    <string name=\"firebase_auth_no_network_connection\">インターネットに接続されていません</string>\n    <string name=\"firebase_auth_unknown_error\">不明なエラー</string>\n    <string name=\"dialog_sign_out_content\">保存したイベント、座席の予約、セッションの評価（出席者の場合）は、すべてアカウントに同期されたままとなります。</string>\n    <string name=\"sign_out\">ログアウト</string>\n    <string name=\"manage_google_account\">Google アカウントを管理</string>\n    <string name=\"remove_reservation_title\">予約を削除しますか？</string>\n    <string name=\"remove_reservation_content\">「%1$s」の座席をキャンセルします。座席を予約しないで参加を希望する方向けに、先着順でご利用いただける座席をすべてのセッションで一部ご用意しています。</string>\n    <string name=\"cancel\">キャンセル</string>\n    <string name=\"remove\">削除</string>\n    <string name=\"swap_reservation_title\">予約を入れ替えますか？</string>\n    <string name=\"swap_reservation_content\">すでに「%1$s」を予約しているか、ウェイティング リストに登録されています。予約できるのは、時間ブロックごとに 1 セッションのみです。「%2$s」に予約を入れ替えますか？</string>\n    <string name=\"swap\">入れ替え</string>\n    <string name=\"notifications_preference_dialog_title\">I/O の通知</string>\n    <string name=\"notifications_preference_dialog_content\">I/O に関する通知を受け取りますか？セッションの開始時間、時間外イベント、セッションの録画などに関する情報をお送りいたします。この設定は、[情報] &gt; [設定] でいつでも変更できます。</string>\n    <string name=\"no\">いいえ</string>\n    <string name=\"yes\">はい</string>\n    <string name=\"feed_not_available\">お知らせが見つかりません。</string>\n    <string name=\"feed_loading_error\">フィードを読み込めませんでした。しばらくしてからもう一度お試しください。</string>\n    <string name=\"feed_announcement_title\">お知らせ</string>\n    <string name=\"feed_upcoming_events\">イベント予定</string>\n    <string name=\"feed_saved_events\">保存済みのイベント</string>\n    <string name=\"feed_no_saved_events\">保存したイベントなし</string>\n    <string name=\"feed_view_all_events\">イベントをすべて表示</string>\n    <string name=\"feed_view_your_schedule\">スケジュールを表示</string>\n    <string name=\"feed_watch_live_stream\">ライブ配信を視聴</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"other\">%s日</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"other\">%s時間</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"other\">%s分</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"other\">%s秒</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">セッションを共有</string>\n    <string name=\"share_text_session_detail\">#io19 %2$s で「%1$s」をご確認ください</string>\n    <string name=\"intent_chooser_session_detail\">共有</string>\n    <string name=\"map_variant_after_dark\">アフターダーク</string>\n    <string name=\"map_variant_concert\">コンサート</string>\n    <string name=\"map_variant_daytime\">日中</string>\n    <string name=\"enable_my_location\">現在地情報を有効にする</string>\n    <string name=\"my_location_rationale\">マップで現在地を表示するには、アプリに位置情報へのアクセスを許可する必要があります。</string>\n    <string name=\"onboarding_get_started\">使ってみる</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Google I/O へようこそ</string>\n    <string name=\"onboarding_date_location\">2019 年 5 月 7～9 日\\nカリフォルニア州マウンテン ビューで開催</string>\n    <string name=\"onboarding_label_days\">日</string>\n    <string name=\"onboarding_label_hours\">時間</string>\n    <string name=\"onboarding_label_mins\">分</string>\n    <string name=\"onboarding_label_seconds\">秒</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O が開催されます</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">I/O \\'19 のまとめ映像と、ソーシャル メディアで #io19 をチェック</string>\n    <string name=\"onboarding_signin\">ログインして I/O の通知を受け取ってください。参加者はセッションの座席を予約できます。</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"other\">あと %1$s 分でセッションが始まります</item>\n    </plurals>\n    <string name=\"expanded\">展開済み</string>\n    <string name=\"collapsed\">折りたたみ済み</string>\n    <string name=\"event_title\">イベント</string>\n    <string name=\"travel_title\">交通手段</string>\n    <string name=\"faq_title\">よくある質問</string>\n    <string name=\"settings_title\">設定</string>\n    <string name=\"about_title\">概要</string>\n    <string name=\"travel_what_to_bring_title\">イベントにお持ちいただくもの</string>\n    <string name=\"travel_hotels_title\">ホテル</string>\n    <string name=\"travel_getting_to_mountain_view_title\">マウンテン ビューへのアクセス</string>\n    <string name=\"travel_getting_to_shoreline_title\">マウンテン ビューへのアクセス</string>\n    <string name=\"travel_shuttle_service_title\">シャトル便</string>\n    <string name=\"travel_off_site_parking_title\">会場外駐車場</string>\n    <string name=\"travel_for_public_transportation_title\">公共交通機関</string>\n    <string name=\"travel_biking_title\">サイクリング</string>\n    <string name=\"travel_ridesharing_title\">カーシェアリング</string>\n    <string name=\"travel_airport_transfers_title\">空港送迎</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O は屋外で行われます。I/O が特別なイベントとして位置づけられているのはそのおかげですが、それと同時に考慮が必要な点がいくつかあります。セッションは温度と湿度が調節されたテント内で行われますが、日焼け止めやサングラスのほか、夕方の寒さに備えて羽織るものをお持ちいただくことをおすすめします。I/O はカジュアルなイベントなので、服装を決める際にはこの点に留意してください。</string>\n    <string name=\"travel_hotels_description\">現地の多数のホテルのご予約を承っております。ホテルと空室のリストは定期的に更新されます。下の地図からホテルをお探しください。&lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;ホテルマップ&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">ベイエリアの主な国際線発着空港は次の 3 つです。&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;サンフランシスコ国際空港（SFO）&lt;/a&gt; 約 38 km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;オークランド国際空港（OAK）&lt;/a&gt; 約 51 km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;サンノゼ国際空港（SJC）&lt;/a&gt; 約 19 km</string>\n    <string name=\"travel_getting_to_shoreline_description\">交通渋滞を緩和し、二酸化炭素排出量を軽減するため、Google I/O 2019 は「駐車禁止イベント*」にするよう取り組んでまいりました。これは慎重に検討を重ねてきた決定事項であり、自動車がなくてもイベント会場にアクセスできる無料オプションを多数用意しています。&lt;br&gt;&lt;br&gt;イベントが近くなりましたら、他の情報も提供してまいります。&lt;br&gt;&lt;br&gt;*身体障がい者用駐車場もご用意いたします。</string>\n    <string name=\"travel_shuttle_service_description\">交通渋滞を緩和し、二酸化炭素排出量を軽減するため、Google I/O 2019 は「駐車禁止イベント*」にするよう取り組んでまいりました。これは慎重に検討を重ねてきた決定事項であり、自動車がなくてもイベント会場にアクセスできる無料オプションを多数用意しています。&lt;br&gt;&lt;br&gt;イベントが近くなりましたら、他の情報も提供してまいります。&lt;br&gt;&lt;br&gt;*身体障がい者用駐車場もご用意いたします。</string>\n    <string name=\"travel_off_site_parking_description\">無料の会場外駐車場を &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt; に設けます。Avaya と Google I/O 間ではシャトル便を利用いただけます。&lt;br&gt;&lt;br&gt; 身体障がい者の方や特別な支援が必要な方は、登録フォームでお知らせいただければプランニング チームが直接フォローいたします。</string>\n    <string name=\"travel_for_public_transportation_description\">公共交通機関用のプリペイドパスをご用意しております。事前登録時にお渡しできます。エリアへは、次の公共交通機関を利用してアクセスできます。&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: 市内鉄道システム&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: サウスベイで営業する軽鉄道システム&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Bay Area Rapid Transit&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: 市内鉄道システム&lt;br&gt;&lt;br&gt; 公共交通機関では Google I/O の会場まで直接アクセスできません。Google I/O イベント シャトル便が運行される正確な位置については、別途お知らせいたしますのでもうしばらくお待ちください。</string>\n    <string name=\"travel_biking_description\">Shoreline Amphitheatre では、駐車場 A を無料の自転車駐輪場としてご利用いただけます。各日午前 7 時からイベント終了時まで、Silicon Valley Bicycle Coalition による係員付きの駐輪サービスで安全に自転車を保管します。&lt;br&gt;&lt;br&gt; 自転車用の最適な移動経路は、Google マップでご確認ください。自転車で Shoreline Amphitheatre にお越しになる場合は、Stevens Creek Trail と Permanente Creek Trail の 2 本の自転車道が便利です。</string>\n    <string name=\"travel_ridesharing_description\">イベント最終日には、Google I/O の会場からサンフランシスコ空港とサンノゼ空港への送迎も行います。その他の日には空港送迎はありません。</string>\n    <string name=\"travel_airport_transfers_description\">イベント最終日には、Google I/O の会場からサンフランシスコ空港とサンノゼ空港への送迎も行います。その他の日には空港送迎はありません。</string>\n    <string name=\"faq_when_and_where_title\">Google I/O 2019 はいつどこで開催されますか？</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Google I/O から最新情報を入手するにはどうすればよいですか？</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">セッションはすべて英語で行われますか？</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">イベントの前にセッションを予約できますか？</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Shoreline Amphitheatre へ行くにはどの方法が一番ですか？</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">バッジはいつどこで受け取ることができますか？</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">基調講演で前のほうに座りたいのですが、どうすれば席を確保できますか？</string>\n    <string name=\"faq_what_should_i_wear_title\">どのような服装で出席すればよいですか？</string>\n    <string name=\"faq_onsite_food_options_title\">軽食をとりたいのですが、会場にはどのような食べ物が用意されていますか？</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">会場で物を紛失した場合、どこに問い合わせればよいですか？</string>\n    <string name=\"faq_after_dark_program_title\">アフターダーク プログラムも楽しそうですが、参加した方がいいでしょうか？</string>\n    <string name=\"faq_accessibility_needs_title\">補助が必要ですがご対応いただけますか？</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">I/O に出席する妊婦と配偶者のサポートはどうなっていますか？</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google のイベント コミュニティ ガイドラインとハラスメント防止ポリシー</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">セッションはライブ配信されますか？リアルタイムでイベントを視聴できない場合はどうすればよいですか？</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">コミュニティとして I/O に祝意を表したいのですが、どうすればよいですか？</string>\n    <string name=\"faq_when_and_where_description\">セッション、講演者、アクティビティ全般の最新情報については、&lt;a href=\"https://events.google.com/io/\"&gt;Google I/O 2019 のウェブサイト&lt;/a&gt;や &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers ブログ&lt;/a&gt;で、&lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; や &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; の投稿を定期的にご確認ください。また、Google I/O 2019 に関するソーシャル投稿のフォローや会話への参加にお使いいただける公式ハッシュタグ &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; もご用意しました。さらに、イベント開催前には、重要な情報とチェックイン手順をご登録の参加者全員にメールでお知らせいたします。</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">セッション、講演者、アクティビティ全般の最新情報については、&lt;a href=\"https://events.google.com/io/\"&gt;Google I/O 2019 のウェブサイト&lt;/a&gt;や &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers ブログ&lt;/a&gt;で、&lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; や &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; の投稿を定期的にご確認ください。また、Google I/O 2019 に関するソーシャル投稿のフォローや会話への参加にお使いいただける公式ハッシュタグ &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; もご用意しました。さらに、イベント開催前には、重要な情報とチェックイン手順をご登録の参加者全員にメールでお知らせいたします。</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">はい。世界中の方にご参加いただけるよう、英語で行われます。</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">個人で参加される皆様は、4 月以降、I/O のウェブサイトか I/O モバイルアプリからセッションの座席を予約できます（注: セッションの座席の一部は予約制ではなく先着順で提供されます）。コードラボ、アプリレビュー、オフィスアワーの参加は先着順です。</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">交通機関に関するすべての情報については、会場へのアクセスのセクションをご確認ください。シャトル情報、自動車と自転車のルート、カー シェアリングなどが記載されています。</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">チェックイン手続きをスムーズに進めるため、5 月 6 日月曜日から Shoreline Amphitheatre にてバッジの受け取りを開始します。Google I/O バッジをお渡しする際には、次の手続きが必要となります。&lt;br&gt; - 写真付き身分証明書の確認。政府機関発行の運転免許証、パスポート、その身分証明書をご提示ください。適切な身分証明書をお持ちでない場合はバッジをお渡しできず、カンファレンスにご入場いただけません。身分証明書に記された名前と、登録プロフィールの名前は完全に一致する必要があります。学界からの参加者は、資格の証明を必ずご持参ください。&lt;br&gt; - メールでお送りした登録 QR コードのスキャン。QR コードは携帯電話からスキャンできます。メールを印刷する必要はありません。#savetheenvironment &lt;br&gt;&lt;br&gt;他人とのバッジの共有や譲渡などは行えません。Google I/O バッジの代替品は用意しておりませんので、紛失しないようご注意ください。紛失されると、カンファレンスに再入場できなくなります。セッション、サンドボックス、アフターアワーなどの Google I/O イベントに入場するには、Google I/O バッジを着用する必要があります。警備員から求められた場合は、バッジ以外の身分証明書をご提示いただきますようお願いいたします。Google I/O バッジには、氏名、会社名または所属組織（登録時にご記入いただいた場合）、写真などが記載されます。</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">基調講演には参加者全員分のお座席をご用意しておりますが、席順は 5 月 6 日の午前 7 時から始まるバッジの受け取り順となりますので、良い席をご希望の方は、お早めにお越しください。</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O はデベロッパー向けの屋外イベントですので、カジュアルな平服でお越しください。強制的なドレスコードはありません。ベイエリアは、昼間は非常に暑く、夕方になると気温が下がることを考慮して服装をお選びください。</string>\n    <string name=\"faq_onsite_food_options_description\">おまかせください。カンファレンスの 3 日間、朝食、昼食、軽食を無料でご提供いたします。1 日目と 2 日目のアフターアワー イベントでは夕食もご用意しております。</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">ご安心ください。イベント開催時間中は、遺失物取扱所を会場のインフォメーション デスクに設置いたします。すべての遺失物は翌朝にカンファレンスの警備事務局に移されます。重要: Google I/O バッジの代替品は用意しておりませんので、紛失しないようご注意ください。紛失されると、カンファレンスに再入場できなくなります。</string>\n    <string name=\"faq_after_dark_program_description\">2 夜にわたるお楽しみも！5 月 8 日の夜は音楽やゲーム、そして 5 月 9 日は円形劇場での参加者限定コンサートを満喫していただけます。どちらの夜にもお食事やお飲み物をご用意しております（21 歳以上の皆様にはお酒もございます）。どちらのアフターアワー イベントも Shoreline Amphitheatre で催されますが、入場には参加者バッジが必要です。</string>\n    <string name=\"faq_accessibility_needs_description\">身体障がい者用エリアに妊婦用の駐車スペースを設けます。&lt;br&gt; 妊娠している女性も、お子様と一緒に自由にカンファレンスにご参加いただけます。5 月 7 日と 8 日の午前 8 時～午後 8 時、そして 5 月 9 日の午前 8 時～午後 4 時には授乳室を 4 部屋ご用意します。登録用紙は授乳室の前に用意しており、先着順でご利用いただけます。詳細については、カンファレンス ヘルプデスクをご覧ください。&lt;br&gt;&lt;br&gt; 登録フォームにおいて育児に関心を示された育児中の方を対象に、1 日 $100 米ドル（合計で $300 米ドルまで）の育児費用還付を先着順で提供いたします。育児費用還付は第三者ベンダーを通じて提供されます。カンファレンス開始前、かつイベントへのご参加が確認される前に育児費用還付の申請が承認された場合は、Google I/O の開催後 7 営業日以内にベンダーから次の手続きをご連絡いたします。ベンダーが育児費用還付のすべての支払いを管理します。</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">身体障がい者用エリアに妊婦用の駐車スペースを設けます。&lt;br&gt; 妊娠している女性も、お子様と一緒に自由にカンファレンスにご参加いただけます。5 月 7 日と 8 日の午前 8 時～午後 8 時、そして 5 月 9 日の午前 8 時～午後 4 時には授乳室を 4 部屋ご用意します。登録用紙は授乳室の前に用意しており、先着順でご利用いただけます。詳細については、カンファレンス ヘルプデスクをご覧ください。&lt;br&gt;&lt;br&gt; 登録フォームにおいて育児に関心を示された育児中の方を対象に、1 日 $100 米ドル（合計で $300 米ドルまで）の育児費用還付を先着順で提供いたします。育児費用還付は第三者ベンダーを通じて提供されます。カンファレンス開始前、かつイベントへのご参加が確認される前に育児費用還付の申請が承認された場合は、Google I/O の開催後 7 営業日以内にベンダーから次の手続きをご連絡いたします。ベンダーが育児費用還付のすべての支払いを管理します。</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google では、性同一性、性表現、性的指向、障がい、神経多様性、身体的外観、身体の大きさ、民族、国籍、人種、年齢、宗教、その他の保護されたカテゴリに関係なく、誰もが嫌がらせを受けることのない包括的なイベント体験を提供できるよう取り組んでいます。できるだけさまざまな人々が参加できるイベントにする取り組みにおいて、会場全体にわたり男女の区別のないトイレを設けています。&lt;br&gt;&lt;br&gt; イベント参加者に対する嫌がらせは、いかなる種類のものであれ許容できません。&lt;br&gt; Google は、ポリシー違反を真剣に受け止め、適切に対応します。Google のイベント コミュニティ ガイドラインとハラスメント防止ポリシーの詳細については、&lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;こちら&lt;/a&gt;をご覧ください。</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">基調講演 2 題とすべてのセッションは、フェスティバル開催中の 3 日間、イベントサイトのホームページでライブ配信されます。お仕事などでご都合の付かない方や時差のある地域の方は、後ほど &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers の YouTube チャンネル&lt;/a&gt;で録画を配信しますので、そちらをご覧ください。</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">はい。世界中のデベロッパーが、毎年 &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended イベント&lt;/a&gt;を開催します。イベント主催者はライブ配信や、ハッカソン、コードラボ、デモなどのセッションを提供できます。&lt;br&gt; 今年、I/O Extended のホストとして参加する場合は、まず以下の手順を行ってください。&lt;br&gt;&lt;br&gt;  『&lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;主催者ガイド&lt;/a&gt;』で、イベントを成功に導くためのヒントとアドバイスに目を通す。&lt;br&gt;&lt;br&gt; 認知度の向上のため、I/O ウェブサイトに一般公開のイベントを&lt;a href=\"https://events.google.com/io/extended/form\"&gt;登録&lt;/a&gt;する。&lt;br&gt;&lt;br&gt; I/O Extended に関連したすべての SNS 配信で公式の #io19extended ハッシュタグを使用して、目に留まりやすくする。&lt;br&gt;&lt;br&gt; 注: I/O Extended のホストは、イベント終了後に io19@google.com 宛てにメールを送信して個人データやイベントデータの削除を要求できます。&lt;br&gt; I/O Extended イベントに参加するだけの場合は、&lt;a href=\"https://events.google.com/io/extended\"&gt;地図&lt;/a&gt;を参照して、お近くのイベントを見つけて参加を表明してください。&lt;br&gt; I/O Extended プログラムに関するご質問は、io19extended\\-external@google.com 宛てにお問い合わせください。</string>\n    <string name=\"view_sessions_text\">セッションを表示</string>\n    <string name=\"wifi_install_success\">Wi-Fi ネットワークを保存しました</string>\n    <string name=\"wifi_install_clipboard_message\">Wi-Fi ネットワークを保存できません。\\nパスワードをクリップボードに保存しました。</string>\n    <string name=\"event_sessions_title\">セッション</string>\n    <string name=\"event_sandbox_title\">サンドボックス</string>\n    <string name=\"event_codelabs_title\">Codelab</string>\n    <string name=\"event_officehours_title\">オフィスアワーとアプリレビュー</string>\n    <string name=\"event_afterhours_title\">時間外イベント</string>\n    <string name=\"event_meals_title\">お食事</string>\n    <string name=\"event_sessions_description\">個人で参加される皆様は、4 月以降、I/O のウェブサイトか I/O モバイルアプリからセッションの座席を予約できます（注: セッションの座席の一部は予約制ではなく先着順で提供されます）。コードラボ、アプリレビュー、オフィスアワーの参加は先着順です。</string>\n    <string name=\"event_sandbox_description\">インタラクティブなデモや物理的な設備で、Google の最新の製品やプラットフォームを探索、学習、実演するための専用スペースです。</string>\n    <string name=\"event_codelabs_description\">コーディング対応のキオスクで実際に体験することができます。会場には、自分のペースで進められるチュートリアルを通して Google の最先端テクノロジーを学習するために必要なすべてが用意されており、ご自身のマシンを持ち込んで課題を自宅に持ち帰ることもできます。現地の Google のスタッフが、アドバイスやお困りの場合のご案内をいたします。</string>\n    <string name=\"event_officehours_description\">オフィスアワーは、Google の専門家に一対一で技術的な質問をすることができる機会です。アプリレビューでは、特定のアプリ関連のプロジェクトに関するアドバイスとヒントを受けることができます。</string>\n    <string name=\"event_afterhours_description\">日中のセッションの終了後に、Shoreline 周辺でお食事やお飲み物などをお楽しみいただけるイベントを 2 日間ご用意しています。初日の夜にはサンドボックス スペースでパーティが行われます。2 日目の夜は Amphitheatre で参加者限定のコンサートを開催いたします。</string>\n    <string name=\"event_meals_description\">カンファレンスの 3 日間、朝食、昼食、軽食を無料でご提供いたします。1 日目と 2 日目のアフターアワー イベントでは夕食もご用意しております。</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">関連アプリ</string>\n    <string name=\"event_types_header\">イベントの種類</string>\n    <string name=\"settings_time_zone_label\">太平洋標準時（UTC-8）でのイベント</string>\n    <string name=\"settings_enable_notifications\">通知を有効にします</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">使用状況を匿名で送信</string>\n    <string name=\"settings_tos\">利用規約</string>\n    <string name=\"settings_privacy_policy\">プライバシー ポリシー</string>\n    <string name=\"settings_oss_licenses\">オープンソース ライセンス</string>\n    <string name=\"settings_theme_title\">テーマを選択</string>\n    <string name=\"settings_theme_system\">システムのデフォルト</string>\n    <string name=\"settings_theme_light\">ライト</string>\n    <string name=\"settings_theme_dark\">ダーク</string>\n    <string name=\"settings_theme_battery\">バッテリー セーバーが自動で設定</string>\n    <string name=\"built_with_material_components\">このアプリは Material Components で構築されています。</string>\n    <string name=\"wifi_network_and_password\">ネットワーク: %1$s\\nパスワード: %2$s</string>\n    <string name=\"join_network\">ネットワークに参加</string>\n    <string name=\"assistant_app_description\">「OK Google、Google I/O 19 と話したい」と言うだけで起動できます。</string>\n    <string name=\"assistant_app_description2\">「OK Google、Google I/O 19 と話したい」と言うだけで起動できます。</string>\n    <string name=\"speaker_link_website\">ウェブサイト</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">イベント</string>\n    <string name=\"no_network_connection\">インターネットに接続されていません。</string>\n    <string name=\"navigate_up\">上へ移動</string>\n    <string name=\"no_network_description\">Explore I/O を使用するには:\\n\\n - 機内モードをオフにしてください。\\n\\n - モバイルデータまたは Wi-Fi をオンにしてください。\\n\\n - 電波の状態を確認してください。</string>\n    <string name=\"phone_does_not_support_arcore_title\">スマートフォンが ARCore をサポートしていません</string>\n    <string name=\"phone_does_not_support_arcore_message\">別のデバイスを使用するか、ご友人からデバイスを借りてお試しください</string>\n    <string name=\"codelabs_information\">コーディング対応のキオスクでは、ご自身のペースで進められるチュートリアルで最先端の Google テクノロジーについて学ぶことができます。ご自身のマシンを持ち込んで作業し、作業内容を自宅に持ち帰っていただくことも可能です。キオスクは、最初の基調講演の時間帯を除いて毎日開いています。</string>\n    <string name=\"codelabs_building\">コードラボの会場</string>\n    <string name=\"codelabs_website\">コードラボのウェブサイト</string>\n    <string name=\"codelab_duration\">期間: %1$d 分</string>\n    <string name=\"start_codelab\">コードラボを開始</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">일정</string>\n    <string name=\"title_home\">홈</string>\n    <string name=\"title_map\">지도</string>\n    <string name=\"title_explore_io\">I/O 둘러보기</string>\n    <string name=\"title_info\">정보</string>\n    <string name=\"filters\">필터</string>\n    <string name=\"category_heading_tracks\">주제</string>\n    <string name=\"category_heading_types\">유형</string>\n    <string name=\"reset\">재설정</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"other\">이벤트 %1$d개</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">별표 표시 및 예약한 이벤트</string>\n    <string name=\"starred_and_reserved_short\">내 이벤트</string>\n    <string name=\"search_schedule_hint\">일정 검색</string>\n    <string name=\"search_schedule_no_results\">검색결과 없음</string>\n    <string name=\"agenda\">일정목록</string>\n    <string name=\"event_starred\">별표 표시한 항목에 이벤트를 추가했습니다.</string>\n    <string name=\"event_unstarred\">별표 표시한 항목에서 이벤트를 삭제했습니다.</string>\n    <string name=\"event_star_error\">별표 표시된 항목에 이벤트를 추가하는 중에 오류가 발생했습니다.</string>\n    <string name=\"reservation_error\">예약을 변경하는 중에 오류가 발생했습니다. 이전 요청이 완료될 때까지 기다리거나 나중에 다시 시도해 주세요.</string>\n    <string name=\"reservation_request_succeeded\">예약을 요청했습니다.</string>\n    <string name=\"reservation_cancel_succeeded\">\\'&lt;b&gt;%s&lt;/b&gt;\\' 예약을 취소했습니다.</string>\n    <string name=\"reservation_new\">\\'&lt;b&gt;%s&lt;/b&gt;\\'의 좌석을 예약했습니다.</string>\n    <string name=\"reservation_replaced\">이벤트를 교체했습니다.</string>\n    <string name=\"waitlist_new\">대기자 명단에 등록했습니다.</string>\n    <string name=\"waitlist_cancel_succeeded\">대기자 명단에서 삭제했습니다.</string>\n    <string name=\"got_it\">확인</string>\n    <string name=\"dont_show\">표시 안함</string>\n    <string name=\"reservation_denied_cutoff\">예약 거부됨: 시작 시간과 너무 가깝습니다.</string>\n    <string name=\"reservation_denied_clash\">예약 거부됨: 다른 예약과 충돌합니다.</string>\n    <string name=\"reservation_denied_unknown\">예약 거부됨: 알 수 없는 오류가 발생했습니다.</string>\n    <string name=\"cancellation_denied_cutoff\">취소 거부됨: 시작 시간과 너무 가깝습니다.</string>\n    <string name=\"cancellation_denied_unknown\">취소 거부됨: 알 수 없는 오류가 발생했습니다.</string>\n    <string name=\"schedule_filters_empty\">이벤트가 없습니다.</string>\n    <string name=\"reservation_reservable\">좌석 예약</string>\n    <string name=\"reservation_reserved\">예약됨</string>\n    <string name=\"reservation_waitlisted\">대기자 명단에 등록됨</string>\n    <string name=\"reservation_waitlist_available\">대기자 명단에 등록</string>\n    <string name=\"reservation_disabled\">예약 불가</string>\n    <string name=\"reservation_pending\">예약 대기 중</string>\n    <string name=\"schedule_hint_title\">일정 맞춤설정</string>\n    <string name=\"schedule_hint_star_event\">별표 표시한 이벤트에 추가</string>\n    <string name=\"schedule_hint_reserve_session_seat\">세션 좌석 예약</string>\n    <string name=\"rate_session\">세션 평가</string>\n    <string name=\"menu_item_session_location\">세션 위치</string>\n    <string name=\"menu_item_session_star\">세션 별표 표시</string>\n    <string name=\"menu_item_calendar\">캘린더에 추가</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">발표자</string>\n    <string name=\"session_detail_related_header\">관련 이벤트</string>\n    <string name=\"feedback_submit\">제출</string>\n    <string name=\"feedback_thank_you\">의견을 주셔서 감사합니다.</string>\n    <string name=\"feedback_q1_text\">전반적인 세션의 품질을 평가해 주세요.</string>\n    <string name=\"feedback_q2_text\">기대치 및 세션 설명을 기준으로 세션의 콘텐츠가 어땠는지 설명해 주세요.</string>\n    <string name=\"feedback_q3_text\">세션이 내 프로젝트와 얼마나 관련이 있었나요?</string>\n    <string name=\"feedback_q4_text\">세션이 내 프로젝트와 얼마나 관련이 있었나요?</string>\n    <string name=\"feedback_q1_label_start\">매우 기본적인 수준</string>\n    <string name=\"feedback_q2_label_start\">나쁨</string>\n    <string name=\"feedback_q3_label_start\">좋지 않음</string>\n    <string name=\"feedback_q4_label_start\">별로 관련 없음</string>\n    <string name=\"feedback_q1_label_end\">뛰어남</string>\n    <string name=\"feedback_q2_label_end\">뛰어남</string>\n    <string name=\"feedback_q3_label_end\">매우 관련 있음</string>\n    <string name=\"feedback_q4_label_end\">매우 관련 있음</string>\n    <string name=\"a11y_show_navigation\">탐색 메뉴 표시</string>\n    <string name=\"a11y_collapse_filters_sheet\">필터 시트 내리기</string>\n    <string name=\"a11y_clear_tag_filters\">필터 지우기</string>\n    <string name=\"a11y_filter_applied\">%1s 필터 적용됨</string>\n    <string name=\"a11y_filter_not_applied\">%1s 필터 적용되지 않음</string>\n    <string name=\"a11y_reservation_available\">이벤트 예약</string>\n    <string name=\"a11y_reservation_reserved\">이벤트 예약됨</string>\n    <string name=\"a11y_reservation_disabled\">예약 불가</string>\n    <string name=\"a11y_reservation_wait_list_available\">이벤트 대기자 명단 등록</string>\n    <string name=\"a11y_reservation_wait_listed\">이벤트 대기자 명단에 등록됨</string>\n    <string name=\"a11y_reservation_pending\">예약 대기 중</string>\n    <string name=\"a11y_starred\">북마크에 이벤트 추가함</string>\n    <string name=\"a11y_unstarred\">이벤트가 북마크에 추가되지 않음</string>\n    <string name=\"a11y_star\">별표</string>\n    <string name=\"a11y_play\">동영상 재생</string>\n    <string name=\"a11y_select_map_mode\">지도 모드 선택</string>\n    <string name=\"a11y_search_schedule\">일정 검색</string>\n    <string name=\"welcome\">환영합니다.</string>\n    <string name=\"a11y_signed_in_content_description\">로그인한 계정은 %s입니다.</string>\n    <string name=\"a11y_signed_out_content_description\">로그인하려면 탭하세요.</string>\n    <string name=\"dialog_sign_in_content\">이벤트를 저장하고, 좌석을 예약하고, 참석한 세션을 평가하려면 로그인하세요. 관련 작업이 앱과 사이트에서 계정과 동기화됩니다.</string>\n    <string name=\"sign_in\">로그인</string>\n    <string name=\"firebase_auth_no_network_connection\">인터넷에 연결되지 않음</string>\n    <string name=\"firebase_auth_unknown_error\">알 수 없는 오류</string>\n    <string name=\"dialog_sign_out_content\">모든 저장된 이벤트, 좌석 예약, 참석한 세션 평가가 계정에 동기화된 상태로 유지됩니다.</string>\n    <string name=\"sign_out\">로그아웃</string>\n    <string name=\"manage_google_account\">Google 계정 관리</string>\n    <string name=\"remove_reservation_title\">예약을 삭제하시겠습니까?</string>\n    <string name=\"remove_reservation_content\">\\'%1$s\\' 좌석 예약을 취소합니다. 좌석을 예약하지 않기로 했지만 참석하고 싶은 경우 모든 세션에 준비된 선착순 좌석을 이용하면 됩니다.</string>\n    <string name=\"cancel\">취소</string>\n    <string name=\"remove\">삭제</string>\n    <string name=\"swap_reservation_title\">예약을 바꾸시겠습니까?</string>\n    <string name=\"swap_reservation_content\">이미 \\'%1$s\\'에 대한 예약이 있거나 대기자 명단에 등록했습니다. 시간표 단위당 예약 하나만 허용됩니다. \\'%2$s\\' 예약을 바꾸시겠습니까?</string>\n    <string name=\"swap\">바꾸기</string>\n    <string name=\"notifications_preference_dialog_title\">I/O 알림</string>\n    <string name=\"notifications_preference_dialog_content\">I/O에 대한 알림을 받고 싶으신가요? 세션 시작 시간, 공식 일정 후 이벤트, 세션 녹화 등에 대한 정보를 보내드립니다. 언제든지 \\'정보 &gt; 설정\\'에서 알림 설정을 변경할 수 있습니다.</string>\n    <string name=\"no\">아니요</string>\n    <string name=\"yes\">예</string>\n    <string name=\"feed_not_available\">공지가 없습니다.</string>\n    <string name=\"feed_loading_error\">피드를 로드할 수 없습니다. 나중에 다시 시도하세요.</string>\n    <string name=\"feed_announcement_title\">공지</string>\n    <string name=\"feed_upcoming_events\">예정된 이벤트</string>\n    <string name=\"feed_saved_events\">저장된 이벤트</string>\n    <string name=\"feed_no_saved_events\">저장된 이벤트 없음</string>\n    <string name=\"feed_view_all_events\">모든 이벤트 보기</string>\n    <string name=\"feed_view_your_schedule\">일정 보기</string>\n    <string name=\"feed_watch_live_stream\">실시간 스트림 보기</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"other\">%s일</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"other\">%s시간</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"other\">%s분</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"other\">%s초</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">세션 공유</string>\n    <string name=\"share_text_session_detail\">#io19 %2$s에서 \\'%1$s\\' 확인해 보기</string>\n    <string name=\"intent_chooser_session_detail\">공유</string>\n    <string name=\"map_variant_after_dark\">저녁 시간</string>\n    <string name=\"map_variant_concert\">콘서트</string>\n    <string name=\"map_variant_daytime\">낮 시간</string>\n    <string name=\"enable_my_location\">내 위치 사용</string>\n    <string name=\"my_location_rationale\">지도에 위치를 표시하려면 앱에 위치 정보 액세스 권한이 필요합니다.</string>\n    <string name=\"onboarding_get_started\">시작하기</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Google I/O에 오신 것을 환영합니다.</string>\n    <string name=\"onboarding_date_location\">2019년 5월 7~9일,\\n캘리포니아 마운틴뷰</string>\n    <string name=\"onboarding_label_days\">일</string>\n    <string name=\"onboarding_label_hours\">시간</string>\n    <string name=\"onboarding_label_mins\">분</string>\n    <string name=\"onboarding_label_seconds\">초</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O가 곧 시작됩니다.</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">I/O 2019 요약 동영상을 시청하고 소셜 미디어에서 #io19를 확인해 보세요.</string>\n    <string name=\"onboarding_signin\">I/O 알림을 받으려면 로그인하세요. 참석자는 로그인하면 세션 좌석을 예약할 수 있습니다.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"other\">%1$s분 후 세션 시작</item>\n    </plurals>\n    <string name=\"expanded\">펼침</string>\n    <string name=\"collapsed\">접힘</string>\n    <string name=\"event_title\">이벤트</string>\n    <string name=\"travel_title\">이동 정보</string>\n    <string name=\"faq_title\">FAQ</string>\n    <string name=\"settings_title\">설정</string>\n    <string name=\"about_title\">정보</string>\n    <string name=\"travel_what_to_bring_title\">이벤트 준비물</string>\n    <string name=\"travel_hotels_title\">호텔</string>\n    <string name=\"travel_getting_to_mountain_view_title\">마운틴뷰 가는 법</string>\n    <string name=\"travel_getting_to_shoreline_title\">마운틴뷰 가는 법</string>\n    <string name=\"travel_shuttle_service_title\">셔틀 서비스</string>\n    <string name=\"travel_off_site_parking_title\">외부 주차장</string>\n    <string name=\"travel_for_public_transportation_title\">대중교통</string>\n    <string name=\"travel_biking_title\">자전거</string>\n    <string name=\"travel_ridesharing_title\">합승</string>\n    <string name=\"travel_airport_transfers_title\">공항 교통편</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O는 실외에서 열리는 페스티벌입니다. 바로 이 때문에도 I/O가 특별한 이벤트가 되었지만 몇 가지 고려해야 할 점이 있습니다. 세션은 냉방 시설이 가동되는 텐트에서 진행되지만 자외선 차단제, 선글라스, 저녁 시간을 위한 겉옷을 준비하는 것이 좋습니다. I/O는 간편한 복장으로 참석할 수 있는 이벤트이므로 의상을 결정할 때 이 점을 고려하세요.</string>\n    <string name=\"travel_hotels_description\">Google이 인근 지역의 수많은 호텔에 객실을 예약해 두었습니다. 호텔 및 예약 가능한 객실 목록은 정기적으로 업데이트됩니다. 아래 지도를 사용하여 가장 적합한 호텔을 찾아보세요. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;호텔 지도&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">베이 지역에는 주요 국제 공항이 3개 있습니다.&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;샌프란시스코 국제 공항(SFO)&lt;/a&gt;: 약 38km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;오클랜드 국제 공항(OAK)&lt;/a&gt;:약 51km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;산호세 국제 공항(SJC)&lt;/a&gt;: 약 19km</string>\n    <string name=\"travel_getting_to_shoreline_description\">교통 혼잡을 줄이고 탄소 배출을 낮추기 위해 Google I/O 2019는 \\'주차장 없는 이벤트*\\'로 개최됩니다. 심사숙고를 거친 결정이며 Google은 차량 없이 이벤트 장소에 도착할 수 있는 다양한 무료 옵션을 제공할 예정입니다.&lt;br&gt;&lt;br&gt;이벤트 개최일 무렵에 자세한 정보를 공유해 드립니다.&lt;br&gt;&lt;br&gt;*장애인 주차장은 제공됩니다.</string>\n    <string name=\"travel_shuttle_service_description\">교통 혼잡을 줄이고 탄소 배출을 낮추기 위해 Google I/O 2019는 \\'주차장 없는 이벤트*\\'로 개최됩니다. 심사숙고를 거친 결정이며 Google은 차량 없이 이벤트 장소에 도착할 수 있는 다양한 무료 옵션을 제공할 예정입니다.&lt;br&gt;&lt;br&gt;이벤트 개최일 무렵에 자세한 정보를 공유해 드립니다.&lt;br&gt;&lt;br&gt;*장애인 주차장은 제공됩니다.</string>\n    <string name=\"travel_off_site_parking_description\">&lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;아바야 스타디움&lt;/a&gt;의 외부 주자장이 무료로 제공됩니다. 아바야에서 셔틀을 통해 Google I/O 장소를 오갈 수 있습니다.&lt;br&gt;&lt;br&gt; 장애가 있거나 특별 지원 요구사항이 있는 경우 등록 양식에 기재해 주시면 I/O 기획팀에서 직접 연락을 드립니다.</string>\n    <string name=\"travel_for_public_transportation_description\">Google에서 선불 대중교통 패스를 제공하며 사전 등록 중에 패스를 수령할 수 있습니다. 다음을 통해 인근 지역의 대중교통 수단을 이용할 수 있습니다.&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: 지역 철도&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: 사우스베이를 운행하는 경전철&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: 베이 지역 고속철&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: 지역 철도&lt;br&gt;&lt;br&gt; Google I/O 장소로 바로 오는 대중교통 수단은 없습니다. Google I/O 이벤트 셔틀이 운행되는 정확한 대중교통 위치는 안내를 기다려 주세요.</string>\n    <string name=\"travel_biking_description\">쇼어라인 원형극장의 A 주차장에 무료로 자전거를 주차할 수 있습니다. 실리콘 밸리 자전거 연대가 매일 오전 7시부터 이벤트가 끝날 때까지 자전거를 안전하게 대신 주차해 드립니다.&lt;br&gt;&lt;br&gt; 최적의 자전거 경로를 확인하고 길을 찾으려면 Google 지도를 확인하세요. 자전거를 타고 쇼어라인 원형극장으로 오는 경우 스티븐스 크릭 트레일과 퍼머넌트 크릭 트레일 등 2가지 자전거 길을 이용하면 편리합니다.</string>\n    <string name=\"travel_ridesharing_description\">이벤트 마지막 날에 Google I/O에서 SFO 및 SJC 공항으로 향하는 교통편이 제공됩니다. 이날 외에는 공항 교통편이 제공되지 않습니다.</string>\n    <string name=\"travel_airport_transfers_description\">이벤트 마지막 날에 Google I/O에서 SFO 및 SJC 공항으로 향하는 교통편이 제공됩니다. 이날 외에는 공항 교통편이 제공되지 않습니다.</string>\n    <string name=\"faq_when_and_where_title\">Google I/O 2019가 언제 어디에서 열리나요?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Google I/O에 대한 최신 소식을 확인하려면 어떻게 해야 하나요?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">모든 세션이 영어로 진행되나요?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">이벤트 전에 세션을 예약할 수 있나요?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">쇼어라인 원형극장에 가는 가장 좋은 방법은 무엇인가요?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">배지는 언제 어디에서 수령할 수 있나요?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">기조연설을 할 때 앞자리에 앉고 싶은데 팁이 있나요?</string>\n    <string name=\"faq_what_should_i_wear_title\">어떤 옷을 입어야 하나요?</string>\n    <string name=\"faq_onsite_food_options_title\">간식을 즐기는 편인데 컨퍼런스 중에 음식이 어떻게 제공되나요?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">분실한 물건이 있으면 어디에서 찾을 수 있나요?</string>\n    <string name=\"faq_after_dark_program_title\">저녁 시간 프로그램이 재미있을 것 같은데 참석하는 게 좋을까요?</string>\n    <string name=\"faq_accessibility_needs_title\">Google에서 접근성 요구사항을 지원해 줄 수 있나요?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">I/O에 참석하는 임산부와 부모는 어떤 지원을 받을 수 있나요?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google 이벤트 커뮤니티 가이드라인 및 괴롭힘 방지 정책</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">세션이 실시간 스트리밍되나요? 실시간으로 이벤트를 볼 수 없으면 어떻게 해야 하나요?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">커뮤니티와 함께 I/O를 즐기고 싶습니다.  좋은 방법이 있을까요?</string>\n    <string name=\"faq_when_and_where_description\">세션, 발표자, 전체 활동에 대한 최신 정보를 확인하려면 &lt;a href=\"https://events.google.com/io/\"&gt;Google I/O 2019 웹사이트&lt;/a&gt;, &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers 블로그&lt;/a&gt;를 자주 방문하고 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt;, &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;을 팔로우하세요. 공식 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; 해시태그를 통해서도 Google I/O 2019에 대한 소셜 미디어 반응을 확인하고 대화를 나눌 있습니다. 또한 등록된 모든 참석자에게 페스티벌 전에 입장 안내와 함께 중요한 정보를 이메일로 보내드립니다.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">세션, 발표자, 전체 활동에 대한 최신 정보를 확인하려면 &lt;a href=\"https://events.google.com/io/\"&gt;Google I/O 2019 웹사이트&lt;/a&gt;, &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers 블로그&lt;/a&gt;를 자주 방문하고 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt;, &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;을 팔로우하세요. 공식 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; 해시태그를 통해서도 Google I/O 2019에 대한 소셜 미디어 반응을 확인하고 대화를 나눌 있습니다. 또한 등록된 모든 참석자에게 페스티벌 전에 입장 안내와 함께 중요한 정보를 이메일로 보내드립니다.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">예, 전 세계에서 방문하는 참석자들을 위해 영어로 제공됩니다.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">4월부터 개인 참석자는 I/O 웹사이트 및 I/O 모바일 앱을 통해 이벤트 전에 세션 좌석을 예약할 수 있습니다. 참고: 세션 좌석 중 일정 부분은 예약할 수 없으며 현장에서 선착순으로 제공됩니다. Codelab, 앱 리뷰, 실무자와의 만남은 현장에서 선착순으로 참석할 수 있습니다.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">셔틀 정보, 운전 및 자전거 경로, 합승 팁 등의 모든 교통수단 관련 팁은 이동 정보 섹션을 확인하세요.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">보다 신속한 입장을 위해 5월 6월 월요일에 쇼어라인 원형극장에서 배지 배포를 시작합니다. Google I/O 배지를 받으려면 다음이 필요합니다.&lt;br&gt; - 사진이 부착된 신분증을 확인해야 합니다. 정부 발급 신분증, 여권 및 기타 신분증을 사용할 수 있습니다. 적절한 신분증이 없다면 배지를 받을 수 없으며 컨퍼런스에 입장할 수 없습니다. 신분증의 이름이 등록 프로필의 이름과 정확하게 일치해야 합니다. 학교 관련 참석자인 경우 자격 요건을 증빙하는 자료를 지참해야 합니다.&lt;br&gt; - 이메일로 전송된 등록 QR 코드를 스캔해야 합니다. 휴대전화에서 스캔할 수 있으므로 이메일을 인쇄할 필요가 없습니다. #환경보호 &lt;br&gt;&lt;br&gt;배지를 다른 사람에게 공유하거나 건네주거나 제공해서는 안 된다는 점에 유의하세요. Google I/O 배지는 교체할 수 없으므로 분실할 경우 컨퍼런스에 다시 입장할 수 없습니다. 세션, 샌드박스, 공식 일정 후 이벤트를 포함하여 Google I/O에 입장하려면 Google I/O 배지를 착용해야 합니다. 보안팀에서 요청할 경우 신분증과 같은 추가 확인 수단을 제시하거나 제출해 주시기 바랍니다. Google I/O 배지에는 이름, 회사 또는 조직(등록 시 입력한 경우)과 사진이 포함될 수 있습니다.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">모두 착석할 수 있도록 기조연설 좌석이 충분히 마련되어 있지만 가장 좋은 좌석은 5월 6일 오전 7시에 시작되는 배지 수령 중에 선착순으로 배정되므로 일찍 오실수록 좋습니다.</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O는 실외에서 열리는 개발자 이벤트이므로 편안하고 간편한 복장을 추천합니다. 강제적인 복장 규정이 없습니다. 베이 지역은 낮 동안에는 매우 덥고 저녁에는 쌀쌀해질 수 있으므로 의상을 준비할 때 이 점을 고려하시기 바랍니다.</string>\n    <string name=\"faq_onsite_food_options_description\">좋은 소식입니다. Google도 간식을 즐긴답니다.  컨퍼런스가 진행되는 3일 내내 참석자에게 아침, 점심, 간식이 무료로 제공됩니다. 1일차와 2일차에는 공식 일정 후 이벤트 중에 저녁도 제공됩니다.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">분실물을 찾도록 도와드립니다. 이벤트 시간 중에 컨퍼런스 안내 데스크에서 분실물 보관 서비스를 제공합니다. 이 시간 내에 찾지 않은 분실물은 모두 컨퍼런스 보안 사무실로 전달됩니다. 중요한 점 한 가지가 있습니다. Google I/O 배지는 교체할 수 없으므로 분실할 경우 컨퍼런스에 다시 입장할 수 없습니다.</string>\n    <string name=\"faq_after_dark_program_description\">이틀 동안 저녁 시간에 열리는 이벤트를 놓치지 마세요. 참석자는 5월 8일 저녁에 음악, 게임 등을 즐길 수 있습니다. 5월 9일에는 원형극장에서 특별 콘서트가 열립니다. 양일간 저녁에 음식과 음료가 제공되며 주류는 만 21세 이상인 참석자에게만 제공됩니다. 공식 일정 후 이벤트는 쇼어라인 원형극장에서 열리며 입장하려면 참석자 배지가 필요합니다.</string>\n    <string name=\"faq_accessibility_needs_description\">장애인 구역에 임산부 주차 공간이 있습니다.&lt;br&gt; 수유 중인 어머니도 자녀와 함께 컨퍼런스에 참석할 수 있습니다. 모성보호실은 4개가 있으며 개방 시간은 5월 7일과 8일에는 오전 8시부터 오후 8시까지, 5월 9일에는 오전 8시부터 오후 4시까지입니다. 모성보호실 앞에 있는 신청 시트를 사용하여 선착순으로 이용할 수 있습니다. 자세한 내용은 컨퍼런스 안내 데스크에 문의해 주세요.&lt;br&gt;&lt;br&gt; 이벤트에 참석하는 부모가 등록 양식을 통해 탁아 비용 지원을 신청하면 일일 100달러(3일 합계 최대 300달러)의 지원금이 지급되며 선착순입니다. 탁아 지원금은 타사 공급업체를 통해 제공됩니다. 컨퍼런스가 시작되기 전에 Google이 이메일을 통해 탁아 비용 지원을 승인하고 참석자의 현장 참석 여부가 확인되면 Google I/O가 끝난 후 영업일 기준 7일 내에 공급업체가 연락하여 다음 단계를 안내합니다. 모든 탁아 지원금 절차는 공급업체에서 관리합니다.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">장애인 구역에 임산부 주차 공간이 있습니다.&lt;br&gt; 수유 중인 어머니도 자녀와 함께 컨퍼런스에 참석할 수 있습니다. 모성보호실은 4개가 있으며 개방 시간은 5월 7일과 8일에는 오전 8시부터 오후 8시까지, 5월 9일에는 오전 8시부터 오후 4시까지입니다. 모성보호실 앞에 있는 신청 시트를 사용하여 선착순으로 이용할 수 있습니다. 자세한 내용은 컨퍼런스 안내 데스크에 문의해 주세요.&lt;br&gt;&lt;br&gt; 이벤트에 참석하는 부모가 등록 양식을 통해 탁아 비용 지원을 신청하면 일일 100달러(3일 합계 최대 300달러)의 지원금이 지급되며 선착순입니다. 탁아 지원금은 타사 공급업체를 통해 제공됩니다. 컨퍼런스가 시작되기 전에 Google이 이메일을 통해 탁아 비용 지원을 승인하고 참석자의 현장 참석 여부가 확인되면 Google I/O가 끝난 후 영업일 기준 7일 내에 공급업체가 연락하여 다음 단계를 안내합니다. 모든 탁아 지원금 절차는 공급업체에서 관리합니다.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google은 성 정체성, 성 표현, 성적 지향, 장애, 신경다양성, 외모, 체형, 민족, 국적, 인종, 연령, 종교 또는 기타 보호되는 범주와 관계없이 모든 참석자를 위해 괴롭힘과 차별이 없는 이벤트 환경을 제공하고자 최선을 다합니다. 가능한 한 차별이 없는 이벤트를 만들기 위해 이벤트 장소 곳곳에서 성 중립 화장실을 제공합니다.&lt;br&gt;&lt;br&gt; Google은 어떠한 형태로도 이벤트 참석자의 괴롭힘을 용납하지 않습니다.&lt;br&gt; Google은 정책 위반을 매우 심각한 문제로 인식하며 적절하게 대응합니다. Google 이벤트 커뮤니티 가이드 및 괴롭힘 금지 정책에 대한 자세한 내용은 &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;여기&lt;/a&gt;를 참조하세요.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">3일간의 페스티벌 동안 두 번의 기조연설과 모든 세션이 이벤트 웹사이트 홈페이지에서 실시간 스트리밍됩니다. 업무 시간과 겹치거나 시차가 있는 해외에 거주하는 경우 나중에 &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers YouTube 채널&lt;/a&gt;에서 세션 녹화를 시청할 수 있습니다.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">예. 매년 전 세계 곳곳의 개발자들이 &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended 이벤트&lt;/a&gt;를 주최합니다. 이 이벤트 중에 주최자가 이벤트를 실시간 스트리밍하고 해커톤, Codelab, 데모 등의 자체 세션을 진행합니다.&lt;br&gt; 올해 I/O Extended 주최자로 참여하려면 다음 단계를 통해 시작해 보세요.&lt;br&gt;&lt;br&gt;  &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;주최자 가이드&lt;/a&gt;를 읽고 성공적인 이벤트를 주최하는 방법에 대한 팁과 권장사항을 확인합니다.&lt;br&gt;&lt;br&gt; 보다 많은 사람에게 노출될 수 있도록 I/O 웹사이트에 공개 이벤트를 &lt;a href=\"https://events.google.com/io/extended/form\"&gt;등록&lt;/a&gt;합니다.&lt;br&gt;&lt;br&gt; 보다 쉽게 검색할 수 있도록 I/O Extended와 관련된 모든 소셜 게시물에 공식 #io19extended 해시태그를 사용합니다. &lt;br&gt;&lt;br&gt; 참고: I/O Extended 주최자는 이벤트 종료 후에 이메일(io19@google.com)로 개인 또는 이벤트 데이터를 삭제해 달라고 요청할 수 있습니다.&lt;br&gt; I/O Extended 이벤트에 참석만 하고 싶은 경우에는 &lt;a href=\"https://events.google.com/io/extended\"&gt;지도&lt;/a&gt;에서 가까운 이벤트 장소를 찾아 참석 신청을 해 보세요.&lt;br&gt; I/O Extended 프로그램에 대한 질문은 io19extended\\-external@google.com에 문의해 주세요.</string>\n    <string name=\"view_sessions_text\">세션 보기</string>\n    <string name=\"wifi_install_success\">Wi-Fi 네트워크를 저장했습니다.</string>\n    <string name=\"wifi_install_clipboard_message\">Wi-Fi 네트워크를 저장할 수 없습니다.\\n비밀번호를 클립보드로 복사했습니다.</string>\n    <string name=\"event_sessions_title\">세션</string>\n    <string name=\"event_sandbox_title\">샌드박스</string>\n    <string name=\"event_codelabs_title\">Codelab</string>\n    <string name=\"event_officehours_title\">실무자와의 만남 및 앱 리뷰</string>\n    <string name=\"event_afterhours_title\">공식 일정 후 이벤트</string>\n    <string name=\"event_meals_title\">식사</string>\n    <string name=\"event_sessions_description\">4월부터 개인 참석자는 I/O 웹사이트 및 I/O 모바일 앱을 통해 이벤트 전에 세션 좌석을 예약할 수 있습니다. 참고: 세션 좌석 중 일정 부분은 예약할 수 없으며 현장에서 선착순으로 제공됩니다. Codelab, 앱 리뷰, 실무자와의 만남은 현장에서 선착순으로 참석할 수 있습니다.</string>\n    <string name=\"event_sandbox_description\">대화형 데모, 실제 설치 등을 통해 Google의 최신 제품과 플랫폼을 살펴보고 알아보고 직접 사용해 볼 수 있는 전용 공간입니다.</string>\n    <string name=\"event_codelabs_description\">바로 코딩할 수 있는 키오스크에서 실습해 보세요. 여기에서 자습형 가이드를 통해 높은 수준의 최신 Google 기술에 대해 알아보는 데 필요한 모든 도구를 제공하며, 직접 컴퓨터를 가져와서 실습하고 작업 결과를 가져갈 수도 있습니다. 현장에서 Google 직원이 유용한 조언을 드리고 실습 중에 막히는 부분이 있으면 방향을 제시해 드립니다.</string>\n    <string name=\"event_officehours_description\">실무자와의 만남 시간을 통해 Google 전문가와 1:1로 만나서 기술적인 질문을 할 수 있으며, 앱 리뷰 시간을 통해 구체적인 앱 관련 프로젝트에 대한 조언을 받고 팁을 얻을 수 있습니다.</string>\n    <string name=\"event_afterhours_description\">이틀 동안 세션 종료 후에 쇼어라인에 남아서 음식, 음료, 재미가 함께 하는 저녁을 즐겨 보세요. 첫날 저녁에는 샌드박스 공간에서 파티가 열리고, 둘째 날 저녁에는 원형극장에서 독점 콘서트가 열립니다.</string>\n    <string name=\"event_meals_description\">3일간의 컨퍼런스 동안 매일 무료로 참석자에게 아침, 점심, 간식이 제공됩니다. 1일차와 2일차에는 공식 일정 후 이벤트 중에 저녁도 제공됩니다.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">관련 앱</string>\n    <string name=\"event_types_header\">이벤트 유형</string>\n    <string name=\"settings_time_zone_label\">태평양 표준시 시간대 기준의 이벤트(UTC-8)</string>\n    <string name=\"settings_enable_notifications\">알림 사용</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">익명 사용 통계 보내기</string>\n    <string name=\"settings_tos\">서비스 약관</string>\n    <string name=\"settings_privacy_policy\">개인정보처리방침</string>\n    <string name=\"settings_oss_licenses\">오픈소스 라이선스</string>\n    <string name=\"settings_theme_title\">테마 선택</string>\n    <string name=\"settings_theme_system\">시스템 기본값</string>\n    <string name=\"settings_theme_light\">밝게</string>\n    <string name=\"settings_theme_dark\">어둡게</string>\n    <string name=\"settings_theme_battery\">절전 모드 설정</string>\n    <string name=\"built_with_material_components\">Material Components로 제작되었습니다.</string>\n    <string name=\"wifi_network_and_password\">네트워크: %1$s\\n비밀번호: %2$s</string>\n    <string name=\"join_network\">네트워크 연결</string>\n    <string name=\"assistant_app_description\">\"Hey Google, Google I/O 2019에 대해 얘기하자.\"라고 말하기만 하면 됩니다.</string>\n    <string name=\"assistant_app_description2\">\"Hey Google, Google I/O 2019에 대해 얘기하자.\"라고 말하기만 하면 됩니다.</string>\n    <string name=\"speaker_link_website\">웹사이트</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">이벤트</string>\n    <string name=\"no_network_connection\">인터넷에 연결되지 않았습니다.</string>\n    <string name=\"navigate_up\">위로 이동</string>\n    <string name=\"no_network_description\">I/O 둘러보기 기능을 이용하려면 다음과 같이 설정하세요.\\n\\n - 비행기 모드 사용 중지\\n\\n - 모바일 데이터 또는 Wi-Fi 사용 설정\\n\\n - 현재 위치의 통신 상태 확인</string>\n    <string name=\"phone_does_not_support_arcore_title\">ARCore를 지원하지 않는 휴대전화</string>\n    <string name=\"phone_does_not_support_arcore_message\">다른 기기를 사용하거나 친구의 기기를 빌려 보세요.</string>\n    <string name=\"codelabs_information\">바로 코딩할 수 있는 키오스크에서 사용자 주도형 학습을 통해 높은 수준의 최신 Google 기술을 알아보거나 직접 컴퓨터를 가져와서 실습하고 작업 결과를 가져갈 수도 있습니다. 키오스크는 첫 번째 기조연설 시간을 제외하고 매일 열립니다.</string>\n    <string name=\"codelabs_building\">Codelabs 장소</string>\n    <string name=\"codelabs_website\">Codelabs 웹사이트</string>\n    <string name=\"codelab_duration\">소요 시간: %1$d분</string>\n    <string name=\"start_codelab\">Codelab 시작하기</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-land/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <!-- Session Detail -->\n    <string name=\"session_detail_header_aspect\" translatable=\"false\">H,3:1</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-ldrtl/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <!-- Intrinsic height may vary. Use a large radius to ensure a semicircle. -->\n    <dimen name=\"nav_item_background_corner_radius_left\">100dp</dimen>\n    <dimen name=\"nav_item_background_corner_radius_right\">0dp</dimen>\n    <dimen name=\"nav_item_background_inset_left\">8dp</dimen>\n    <dimen name=\"nav_item_background_inset_right\">0dp</dimen>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-ln/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programmation</string>\n    <string name=\"title_home\">Accueil</string>\n    <string name=\"title_map\">Plan</string>\n    <string name=\"title_explore_io\">Explorer la conférence I/O</string>\n    <string name=\"title_info\">Informations</string>\n    <string name=\"filters\">Filtres</string>\n    <string name=\"category_heading_tracks\">Thèmes</string>\n    <string name=\"category_heading_types\">Types</string>\n    <string name=\"reset\">Réinitialiser</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d événement</item>\n        <item quantity=\"other\">%1$d événements</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Vos événements favoris et réservés</string>\n    <string name=\"starred_and_reserved_short\">Vos événements</string>\n    <string name=\"search_schedule_hint\">Rechercher dans le programme</string>\n    <string name=\"search_schedule_no_results\">Aucun résultat</string>\n    <string name=\"agenda\">Planning</string>\n    <string name=\"event_starred\">Événement ajouté à vos favoris</string>\n    <string name=\"event_unstarred\">Événement supprimé de vos favoris</string>\n    <string name=\"event_star_error\">Erreur lors de l\\'ajout de l\\'événement aux favoris</string>\n    <string name=\"reservation_error\">Erreur lors de la modification de la réservation. Attendez que les demandes précédentes se terminent ou réessayez plus tard.</string>\n    <string name=\"reservation_request_succeeded\">Réservation demandée.</string>\n    <string name=\"reservation_cancel_succeeded\">Réservation annulée : \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_new\">Votre place a été réservée pour \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Événement remplacé.</string>\n    <string name=\"waitlist_new\">Vous avez été mis sur liste d\\'attente.</string>\n    <string name=\"waitlist_cancel_succeeded\">Retiré de la liste d\\'attente.</string>\n    <string name=\"got_it\">OK</string>\n    <string name=\"dont_show\">Ne pas afficher</string>\n    <string name=\"reservation_denied_cutoff\">Réservation refusée : l\\'heure de début est trop proche.</string>\n    <string name=\"reservation_denied_clash\">Réservation refusée : conflit avec une autre réservation.</string>\n    <string name=\"reservation_denied_unknown\">Réservation refusée : erreur inconnue.</string>\n    <string name=\"cancellation_denied_cutoff\">Annulation refusée : l\\'heure de début est trop proche.</string>\n    <string name=\"cancellation_denied_unknown\">Annulation refusée : erreur inconnue.</string>\n    <string name=\"schedule_filters_empty\">Aucun événement trouvé.</string>\n    <string name=\"reservation_reservable\">Réserver la place</string>\n    <string name=\"reservation_reserved\">Réservé</string>\n    <string name=\"reservation_waitlisted\">Sur liste d\\'attente</string>\n    <string name=\"reservation_waitlist_available\">Rejoindre la liste d\\'attente</string>\n    <string name=\"reservation_disabled\">Réservations indisponibles</string>\n    <string name=\"reservation_pending\">Réservation en attente</string>\n    <string name=\"schedule_hint_title\">Personnaliser votre programme</string>\n    <string name=\"schedule_hint_star_event\">Ajouter à vos événements favoris</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Réserver une place pour cette session</string>\n    <string name=\"rate_session\">Noter la séance</string>\n    <string name=\"menu_item_session_location\">Lieu de la séance</string>\n    <string name=\"menu_item_session_star\">Ajouter la session aux favoris</string>\n    <string name=\"menu_item_calendar\">Ajouter à l\\'agenda</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Intervenants</string>\n    <string name=\"session_detail_related_header\">Événements associés</string>\n    <string name=\"feedback_submit\">Envoyer</string>\n    <string name=\"feedback_thank_you\">Merci de vos commentaires.</string>\n    <string name=\"feedback_q1_text\">Qu\\'avez-vous pensé de la qualité globale de la session ?</string>\n    <string name=\"feedback_q2_text\">Comment décririez-vous les contenus de la session par rapport à vos attentes/la description de la session ?</string>\n    <string name=\"feedback_q3_text\">La session était-elle pertinente par rapport à vos projets ?</string>\n    <string name=\"feedback_q4_text\">La session était-elle pertinente par rapport à vos projets ?</string>\n    <string name=\"feedback_q1_label_start\">Médiocre</string>\n    <string name=\"feedback_q2_label_start\">Médiocres</string>\n    <string name=\"feedback_q3_label_start\">Médiocres</string>\n    <string name=\"feedback_q4_label_start\">Pas vraiment pertinente</string>\n    <string name=\"feedback_q1_label_end\">Exceptionnels</string>\n    <string name=\"feedback_q2_label_end\">Exceptionnels</string>\n    <string name=\"feedback_q3_label_end\">Très pertinente</string>\n    <string name=\"feedback_q4_label_end\">Très pertinente</string>\n    <string name=\"a11y_show_navigation\">Afficher le menu de navigation</string>\n    <string name=\"a11y_collapse_filters_sheet\">Réduire le panneau des filtres</string>\n    <string name=\"a11y_clear_tag_filters\">Effacer les filtres</string>\n    <string name=\"a11y_filter_applied\">Le filtre %1s a été appliqué</string>\n    <string name=\"a11y_filter_not_applied\">Le filtre %1s n\\'a pas été appliqué</string>\n    <string name=\"a11y_reservation_available\">Réserver l\\'événement</string>\n    <string name=\"a11y_reservation_reserved\">Événement réservé</string>\n    <string name=\"a11y_reservation_disabled\">Réservation indisponible</string>\n    <string name=\"a11y_reservation_wait_list_available\">Rejoindre la liste d\\'attente de l\\'événement</string>\n    <string name=\"a11y_reservation_wait_listed\">Sur la liste d\\'attente de l\\'événement</string>\n    <string name=\"a11y_reservation_pending\">Réservation en attente</string>\n    <string name=\"a11y_starred\">Événement ajouté aux favoris</string>\n    <string name=\"a11y_unstarred\">Événement non ajouté aux favoris</string>\n    <string name=\"a11y_star\">Ajouter aux favoris</string>\n    <string name=\"a11y_play\">Voir la vidéo</string>\n    <string name=\"a11y_select_map_mode\">Sélectionner le mode Plan</string>\n    <string name=\"a11y_search_schedule\">Rechercher dans le programme</string>\n    <string name=\"welcome\">Bienvenue</string>\n    <string name=\"a11y_signed_in_content_description\">Connecté en tant que %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Appuyez ici pour vous connecter.</string>\n    <string name=\"dialog_sign_in_content\">Connectez-vous pour enregistrer des événements, réserver des places et noter des sessions (auxquelles vous avez participé). Les actions seront synchronisées entre votre compte, l\\'application et le site.</string>\n    <string name=\"sign_in\">Se connecter</string>\n    <string name=\"firebase_auth_no_network_connection\">Aucune connexion Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Erreur inconnue</string>\n    <string name=\"dialog_sign_out_content\">L\\'ensemble des événements enregistrés, des places réservées et des notes des sessions (auxquelles vous avez participé) restent synchronisés avec votre compte.</string>\n    <string name=\"sign_out\">Déconnexion</string>\n    <string name=\"manage_google_account\">Gérer votre compte Google</string>\n    <string name=\"remove_reservation_title\">Supprimer la réservation ?</string>\n    <string name=\"remove_reservation_content\">Vous êtes sur le point de renoncer à votre place pour \"%1$s\". Si vous décidez de vous y rendre quand même sans réservation, toutes les sessions disposent de places disponibles selon la règle du \"premier arrivé, premier servi\".</string>\n    <string name=\"cancel\">Annuler</string>\n    <string name=\"remove\">Supprimer</string>\n    <string name=\"swap_reservation_title\">Échanger la réservation ?</string>\n    <string name=\"swap_reservation_content\">Vous disposez déjà d\\'une réservation/place sur liste d\\'attente pour \"%1$s\". Une seule réservation par créneau horaire est autorisée. Voulez-vous l\\'échanger contre \"%2$s\" ?</string>\n    <string name=\"swap\">Échanger</string>\n    <string name=\"notifications_preference_dialog_title\">Notifications I/O</string>\n    <string name=\"notifications_preference_dialog_content\">Souhaitez-vous recevoir des notifications sur I/O ? Nous vous enverrons des informations sur les heures de début des sessions, les animations après-événement, les enregistrements de session, etc. Vous pouvez modifier ce paramètre depuis \"Infos &gt; Paramètres\" à tout moment.</string>\n    <string name=\"no\">Non</string>\n    <string name=\"yes\">Oui</string>\n    <string name=\"feed_not_available\">Aucune annonce trouvée.</string>\n    <string name=\"feed_loading_error\">Impossible de charger le flux. Réessayez plus tard.</string>\n    <string name=\"feed_announcement_title\">Annonces</string>\n    <string name=\"feed_upcoming_events\">Événements à venir</string>\n    <string name=\"feed_saved_events\">Événements enregistrés</string>\n    <string name=\"feed_no_saved_events\">Aucun événement enregistré</string>\n    <string name=\"feed_view_all_events\">Afficher tous les événements</string>\n    <string name=\"feed_view_your_schedule\">Consulter votre planning</string>\n    <string name=\"feed_watch_live_stream\">Regarder en direct</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s jour</item>\n        <item quantity=\"other\">%s jours</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s heure</item>\n        <item quantity=\"other\">%s heures</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minute</item>\n        <item quantity=\"other\">%s minutes</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s seconde</item>\n        <item quantity=\"other\">%s secondes</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Partager la séance</string>\n    <string name=\"share_text_session_detail\">Voir « %1$s » à #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Partage</string>\n    <string name=\"map_variant_after_dark\">After Dark</string>\n    <string name=\"map_variant_concert\">Concert</string>\n    <string name=\"map_variant_daytime\">Journée</string>\n    <string name=\"enable_my_location\">Activer la localisation</string>\n    <string name=\"my_location_rationale\">L\\'application doit disposer de l\\'autorisation d\\'accéder à votre position pour afficher celle-ci sur la carte.</string>\n    <string name=\"onboarding_get_started\">Commencer</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Bienvenue dans Google I/O</string>\n    <string name=\"onboarding_date_location\">Du 7 au 9 mai 2019\\nMountain View, Californie</string>\n    <string name=\"onboarding_label_days\">J</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">M</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O approche à grands pas</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Regardez un résumé de la conférence I/O 2019 et recherchez le hashtag #io19 sur les réseaux sociaux</string>\n    <string name=\"onboarding_signin\">Connectez-vous pour recevoir les notifications relatives à la conférence I/O. En tant que participant, vous pourrez également réserver vos places aux sessions.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">Début de la session dans %1$s minute</item>\n        <item quantity=\"other\">Début de la session dans %1$s minutes</item>\n    </plurals>\n    <string name=\"expanded\">Élément développé</string>\n    <string name=\"collapsed\">Élément réduit</string>\n    <string name=\"event_title\">Événement</string>\n    <string name=\"travel_title\">Voyage</string>\n    <string name=\"faq_title\">FAQ</string>\n    <string name=\"settings_title\">Paramètres</string>\n    <string name=\"about_title\">À propos</string>\n    <string name=\"travel_what_to_bring_title\">Ce que vous devez emmener à l\\'événement</string>\n    <string name=\"travel_hotels_title\">Hôtels</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Se rendre à Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Se rendre à Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Service de navette</string>\n    <string name=\"travel_off_site_parking_title\">Parking hors site</string>\n    <string name=\"travel_for_public_transportation_title\">Transports en commun</string>\n    <string name=\"travel_biking_title\">Vélo</string>\n    <string name=\"travel_ridesharing_title\">Partage de taxi</string>\n    <string name=\"travel_airport_transfers_title\">Transferts vers l\\'aéroport</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O est un festival en plein air. Cette particularité, qui fait tout le charme d\\'I/O, implique toutefois une légère organisation au préalable. Même si les sessions se tiendront dans des tentes climatisées, nous vous recommandons d\\'apporter de l\\'écran solaire, des lunettes de soleil, ainsi qu\\'un vêtement chaud à porter en soirée lorsque les températures deviennent plus fraîches. I/O est un événement décontracté. Choisissez donc votre tenue en conséquence.</string>\n    <string name=\"travel_hotels_description\">Nous avons réservé des groupes de chambres dans de nombreux hôtels locaux. La liste des hôtels et chambres disponibles sera mise à jour régulièrement. Utilisez le plan ci-dessous pour trouver l\\'hôtel qui vous convient le mieux. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Plan des hôtels&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Voici les trois principaux aéroports de la baie de San Francisco proposant des vols internationaux :&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international de San Francisco (SFO)&lt;/a&gt; ~39 kilomètres&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international d\\'Oakland (OAK)&lt;/a&gt; ~52 kilomètres&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Aéroport international de San Jose (SJC)&lt;/a&gt; ~20 kilomètres</string>\n    <string name=\"travel_getting_to_shoreline_description\">Afin de réduire à la fois le risque d\\'embouteillages et notre empreinte carbone, nous avons fait de Google I/O 2019 un \"événement sans parking*\". Nous avons longuement réfléchi avant de prendre cette décision, et nous vous offrons en retour de nombreuses options gratuites pour vous rendre à l\\'événement sans avoir besoin de véhicule.&lt;br&gt;&lt;br&gt;Nous vous communiquerons des informations complémentaires à ce sujet à l\\'approche de l\\'événement.&lt;br&gt;&lt;br&gt;*Des places de parking pour handicapés seront disponibles.</string>\n    <string name=\"travel_shuttle_service_description\">Afin de réduire à la fois le risque d\\'embouteillages et notre empreinte carbone, nous avons fait de Google I/O 2019 un \"événement sans parking*\". Nous avons longuement réfléchi avant de prendre cette décision, et nous vous offrons en retour de nombreuses options gratuites pour vous rendre à l\\'événement sans avoir besoin de véhicule.&lt;br&gt;&lt;br&gt;Nous vous communiquerons des informations complémentaires à ce sujet à l\\'approche de l\\'événement.&lt;br&gt;&lt;br&gt;*Des places de parking pour handicapés seront disponibles.</string>\n    <string name=\"travel_off_site_parking_description\">Parking hors site gratuit au &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;stade Avaya&lt;/a&gt;. Des navettes seront proposées entre le stade Avaya et Google I/O.&lt;br&gt;&lt;br&gt; Si vous avez des besoins d\\'assistance spécifiques, veuillez l\\'indiquer sur le formulaire d\\'inscription. L\\'équipe responsable de l\\'organisation vous contactera directement.</string>\n    <string name=\"travel_for_public_transportation_description\">Au moment de votre pré-inscription, vous pourrez collecter des cartes de transport en commun prépayées. Vous pouvez vous rendre à proximité du site avec les transports en commun suivants :&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt; : Réseau de trains régionaux &lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt; : Train léger desservant South Bay &lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt; : Bay Area Rapid Transit &lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt; : Réseau de trains régionaux&lt;br&gt;&lt;br&gt; Les transports en commun ne permettent pas de se rendre directement à la conférence Google I/O. Des informations supplémentaires seront bientôt disponibles concernant les lieux desservis par les navettes de Google I/O.</string>\n    <string name=\"travel_biking_description\">Un parking à vélos gratuit sera disponible au Shoreline Amphitheatre dans le parking A. L\\'association Silicon Valley Bicycle Coalition proposera chaque jour un service de stationnement surveillé pour votre vélo de 7h jusqu\\'à la fin de l\\'événement.&lt;br&gt;&lt;br&gt; Utilisez Google Maps pour connaître les meilleurs itinéraires pour vélos et trouver votre route. Deux pistes cyclables, le Stevens Creek Trail et le Permanente Creek Trail, permettent de se rendre facilement au Shoreline Amphitheatre.</string>\n    <string name=\"travel_ridesharing_description\">Le dernier jour de la conférence, des transferts seront proposés entre Google I/O et les aéroports de San Francisco et San Jose. Aucun transfert ne sera disponible les autres jours.</string>\n    <string name=\"travel_airport_transfers_description\">Le dernier jour de la conférence, des transferts seront proposés entre Google I/O et les aéroports de San Francisco et San Jose. Aucun transfert ne sera disponible les autres jours.</string>\n    <string name=\"faq_when_and_where_title\">Où et quand aura lieu l\\'édition 2019 de la conférence Google I/O ?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Comment puis-je me tenir informé des dernières actualités relatives à Google I/O ?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Toutes les sessions seront-elles en anglais ?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Puis-je réserver des sessions avant la conférence ?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Quel est le meilleur moyen de se rendre au Shoreline Amphitheatre ?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Où et quand puis-je récupérer mon badge ?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">J\\'aimerais vraiment être assis au premier rang lors de la présentation. Que me conseillez-vous ?</string>\n    <string name=\"faq_what_should_i_wear_title\">Quel est le code vestimentaire ?</string>\n    <string name=\"faq_onsite_food_options_title\">J\\'aime grignoter. Que pourrai-je manger sur le site ?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Si je perds un objet sur le site, où pourrai-je le retrouver ?</string>\n    <string name=\"faq_after_dark_program_title\">Les programmes After Dark ont l\\'air intéressants ! Devrais-je y participer ?</string>\n    <string name=\"faq_accessibility_needs_title\">J\\'ai des besoins spéciaux en termes d\\'accessibilité. Pouvez-vous y répondre ?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Quelles mesures prenez-vous pour aider les femmes enceintes et les parents qui assistent à I/O ?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Règlement de la communauté et politique anti-harcèlement de Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Les sessions seront-elles retransmises en direct ? Que faire si je ne peux pas suivre l\\'événement en temps réel ?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">J\\'aimerais célébrer I/O avec ma communauté.  Auriez-vous une suggestion ?</string>\n    <string name=\"faq_when_and_where_description\">Pour connaître les dernières informations relatives aux sessions, aux intervenants et aux activités, consultez le &lt;a href=\"https://events.google.com/io/\"&gt;site Web de l\\'édition 2019 de Google I/O&lt;/a&gt; et le &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog Google Developers&lt;/a&gt;. Suivez-nous également sur &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; et &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Vous pouvez aussi suivre et rejoindre les discussions relatives à l\\'édition 2019 de Google I/O sur les réseaux sociaux à l\\'aide du hashtag officiel &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. De plus, nous envoyons par e-mail aux participants inscrits toutes les informations importantes ainsi que des instructions afin qu\\'ils puissent préparer leur arrivée.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Pour connaître les dernières informations relatives aux sessions, aux intervenants et aux activités, consultez le &lt;a href=\"https://events.google.com/io/\"&gt;site Web de l\\'édition 2019 de Google I/O&lt;/a&gt; et le &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog Google Developers&lt;/a&gt;. Suivez-nous également sur &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; et &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Vous pouvez aussi suivre et rejoindre les discussions relatives à l\\'édition 2019 de Google I/O sur les réseaux sociaux à l\\'aide du hashtag officiel &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. De plus, nous envoyons par e-mail aux participants inscrits toutes les informations importantes ainsi que des instructions afin qu\\'ils puissent préparer leur arrivée.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Oui. Notre audience mondiale pourra ainsi suivre la conférence.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Dès le mois d\\'avril, les personnes venant assister à la conférence en personne peuvent réserver à l\\'avance leurs places aux différentes sessions sur le site Web de Google I/O ou via l\\'application I/O (remarque : un certain nombre de places ne pourront pas être réservées et seront disponibles le jour même sur le principe du \"premier arrivé, premier servi\"). Les événements Codelabs, App Reviews et Office Hours ne seront accessibles que sur le principe du \"premier arrivé, premier servi\".</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Consultez la section Déplacements pour obtenir des conseils relatifs aux transports, y compris des informations sur les navettes, des itinéraires routiers et cyclables, des conseils de covoiturage, et bien plus encore !</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Pour accélérer le processus d\\'enregistrement, nous débuterons la distribution des badges le lundi 6 mai au Shoreline Amphitheatre. Avant de vous donner votre badge Google I/O, nous devrons procéder aux opérations suivantes :&lt;br&gt; - Vérifier votre pièce d\\'identité avec photo : nous acceptons les permis officiels, les passeports et d\\'autres pièces d\\'identité. Si vous ne disposez pas d\\'une pièce d\\'identité conforme, vous ne recevrez pas votre badge et vous ne pourrez pas assister à l\\'événement. Le nom indiqué sur votre pièce d\\'identité doit être identique à celui de votre profil d\\'enregistrement. Si vous êtes un universitaire, n\\'oubliez pas d\\'apporter la preuve que vous pouvez participer à cet événement.&lt;br&gt; - Scanner le code QR d\\'enregistrement que vous avez reçu par e-mail : vous n\\'avez pas besoin d\\'imprimer l\\'e-mail. Nous pouvons scanner votre code directement sur votre téléphone ! #savetheenvironment &lt;br&gt;&lt;br&gt;Veuillez noter que vous n\\'avez pas le droit de donner ou fournir de quelque manière que ce soit votre badge à une tierce personne, ni de le partager avec elle. Les badges Google I/O ne sont pas remplaçables. Ne perdez pas le vôtre, sans quoi vous ne pourrez plus assister à la conférence. Vous devez porter votre badge pour accéder à Google I/O, y compris aux sessions, aux espaces Sandbox et aux événements After Hours. Si un agent de la sécurité vous le demande, nous vous prions de bien vouloir présenter ou fournir une autre pièce d\\'identité. Les badges Google I/O peuvent comporter votre nom, le nom de votre entreprise ou organisation (si vous l\\'avez fourni) et votre photo.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Tous les participants pourront assister aux présentations. Toutefois, les places seront attribuées selon le principe du \"premier arrivé, premier servi\" lors de la distribution des badges qui commencera à 7h le 6 mai. Alors, veillez à ne pas arriver trop tard !</string>\n    <string name=\"faq_what_should_i_wear_description\">La conférence pour les développeurs Google I/O a lieu en extérieur. Vous pouvez donc porter des vêtements confortables et décontractés. Nous n\\'imposons pas de code vestimentaire. La région de la baie de San Francisco peut connaître des températures très élevées pendant la journée et plus fraîches le soir. Tenez compte de ces informations lors de la préparation de votre valise.</string>\n    <string name=\"faq_onsite_food_options_description\">Bonne nouvelle, nous aussi nous aimons manger !  Le petit-déjeuner, le déjeuner et des en-cas seront servis gratuitement aux participants tous les jours de la conférence Google I/O. Le dîner sera également offert les premier et deuxième jours pendant les événements After Hours.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Nous avons tout prévu ! Un service des objets trouvés sera disponible au bureau d\\'information de la conférence pendant toute la durée de l\\'événement. Tout objet trouvé dans la nuit sera remis au service de sécurité de la conférence. Remarque : les badges Google I/O ne sont pas remplaçables. Ne perdez pas le vôtre, sans quoi vous ne pourrez plus assister à la conférence.</string>\n    <string name=\"faq_after_dark_program_description\">Ces deux soirées ne sont à manquer sous aucun prétexte ! Musique et jeux seront organisés le 8 mai pour tous les participants, et un concert exclusif aura lieu le 9 mai au Shoreline Amphitheatre. Nourriture et boissons seront également disponibles à chacune de ces soirées (les boissons alcoolisées sont réservées au personnes âgées de 21 ans et plus). Les deux événements After Hours se tiendront au Shoreline Amphitheatre. Vous devrez présenter votre badge à l\\'entrée.</string>\n    <string name=\"faq_accessibility_needs_description\">Des places de parking réservées aux femmes enceintes seront disponibles dans la zone pour les personnes à mobilité réduite.&lt;br&gt; Les mères qui allaitent sont les bienvenues à la conférence avec leur enfant. Quatre salons d\\'allaitement seront ouverts les 7 et 8 mai de 8h à 20h, et le 9 mai de 8h à 16h. Des feuilles d\\'inscription seront disponibles devant les salons d\\'allaitement, qui pourront être utilisés selon le principe du \"premier arrivé, premier servi\". Veuillez vous renseigner auprès du bureau d\\'information pour en savoir plus.&lt;br&gt;&lt;br&gt; Les parents qui expriment un besoin de garde d\\'enfant dans leur formulaire d\\'inscription à l\\'événement pourront bénéficier d\\'un remboursement de leurs frais à hauteur de 100 $ par jour (pour un maximum de 300 $), selon le principe du \"premier arrivé, premier servi\". Notre offre de remboursement des frais de garde d\\'enfant est proposée par un fournisseur tiers. Si nous acceptons votre demande par e-mail avant le début de la conférence et que votre présence sur le site est confirmée, notre fournisseur vous contactera sous 7 jours ouvrés au terme de Google I/O pour vous faire part des démarches à suivre. Ce fournisseur tiers est chargé d\\'administrer les remboursements de frais de garde d\\'enfant pour nous.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Des places de parking réservées aux femmes enceintes seront disponibles dans la zone pour les personnes à mobilité réduite.&lt;br&gt; Les mères qui allaitent sont les bienvenues à la conférence avec leur enfant. Quatre salons d\\'allaitement seront ouverts les 7 et 8 mai de 8h à 20h, et le 9 mai de 8h à 16h. Des feuilles d\\'inscription seront disponibles devant les salons d\\'allaitement, qui pourront être utilisés selon le principe du \"premier arrivé, premier servi\". Veuillez vous renseigner auprès du bureau d\\'information pour en savoir plus.&lt;br&gt;&lt;br&gt; Les parents qui expriment un besoin de garde d\\'enfant dans leur formulaire d\\'inscription à l\\'événement pourront bénéficier d\\'un remboursement de leurs frais à hauteur de 100 $ par jour (pour un maximum de 300 $), selon le principe du \"premier arrivé, premier servi\". Notre offre de remboursement des frais de garde d\\'enfant est proposée par un fournisseur tiers. Si nous acceptons votre demande par e-mail avant le début de la conférence et que votre présence sur le site est confirmée, notre fournisseur vous contactera sous 7 jours ouvrés au terme de Google I/O pour vous faire part des démarches à suivre. Ce fournisseur tiers est chargé d\\'administrer les remboursements de frais de garde d\\'enfant pour nous.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google s\\'engage à offrir à tous les participants une expérience inclusive ne laissant aucune place au harcèlement, indépendamment de leur identité et expression de genre, orientation sexuelle, handicap, neurodiversité, apparence physique, corpulence, ethnicité, nationalité, race, âge, religion, ou de toute autre catégorie protégée. À des fins d\\'inclusion supplémentaires, des toilettes neutres seront disponibles partout sur le site.&lt;br&gt;&lt;br&gt; Nous ne tolérons aucune forme de harcèlement à l\\'encontre des participants à l\\'événement.&lt;br&gt; Google considère toute violation à son règlement comme extrêmement sérieuse et y réagira en conséquence. Pour en savoir plus sur le règlement de la communauté et la politique anti-harcèlement de Google, veuillez consulter &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;cette page&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Les deux présentations ainsi que l\\'ensemble des sessions seront diffusées en direct sur la page d\\'accueil du site Web de l\\'événement pendant les trois jours. Si vous n\\'êtes pas disponible ou si le décalage horaire est trop important, sachez que vous pourrez visionner ultérieurement les enregistrements de sessions sur la &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;chaîne YouTube Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Oui. Chaque année, les développeurs du monde entier organisent leurs propres &lt;a href=\"https://events.google.com/io/extended\"&gt;événements Google I/O Extended&lt;/a&gt;. Durant ces événements, la conférence est diffusée en direct et des sessions spéciales sont organisées, telles que des hackathons, des ateliers de programmation, des démonstrations, et bien plus encore.&lt;br&gt; Si vous souhaitez être l\\'hôte d\\'un événement I/O Extended cette année, voici les démarches que vous devez suivre pour commencer :&lt;br&gt;&lt;br&gt; Consultez le &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guide de l\\'organisateur&lt;/a&gt; pour obtenir des conseils et suggestions vous aidant à créer un événement réussi.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Enregistrez&lt;/a&gt; votre événement public sur le site Web I/O pour une meilleure visibilité.&lt;br&gt;&lt;br&gt; Utilisez le hashtag officiel #io19extended dans toutes vos publications sur les réseaux sociaux en lien avec I/O Extended pour que votre événement soit plus facilement trouvable.&lt;br&gt;&lt;br&gt; Remarque : En tant qu\\'hôte d\\'un événement I/O Extended, vous pouvez demander à ce que vos données à caractère personnel et/ou les informations de votre événement soient effacées au terme de celui-ci en envoyant un e-mail à io19@google.com.&lt;br&gt; Si vous souhaitez simplement assister à un événement I/O Extended, consultez &lt;a href=\"https://events.google.com/io/extended\"&gt;notre plan&lt;/a&gt; pour en trouver un près de chez vous et répondez à l\\'invitation !&lt;br&gt; Pour toute question sur le programme I/O Extended, contactez-nous à l\\'adresse io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Afficher les sessions</string>\n    <string name=\"wifi_install_success\">Réseau Wi-Fi enregistré</string>\n    <string name=\"wifi_install_clipboard_message\">Impossible d\\'enregistrer le réseau Wi-Fi.\\nMot de passe copié dans le presse-papiers.</string>\n    <string name=\"event_sessions_title\">Sessions</string>\n    <string name=\"event_sandbox_title\">Bac à sable</string>\n    <string name=\"event_codelabs_title\">Ateliers de programmation</string>\n    <string name=\"event_officehours_title\">Permanences et avis sur les applications</string>\n    <string name=\"event_afterhours_title\">Après-événement</string>\n    <string name=\"event_meals_title\">Repas</string>\n    <string name=\"event_sessions_description\">Dès le mois d\\'avril, les personnes venant assister à la conférence en personne peuvent réserver à l\\'avance leurs places aux différentes sessions sur le site Web de Google I/O ou via l\\'application I/O (remarque : un certain nombre de places ne pourront pas être réservées et seront disponibles le jour même sur le principe du \"premier arrivé, premier servi\"). Les événements Codelabs, App Reviews et Office Hours ne seront accessibles que sur le principe du \"premier arrivé, premier servi\".</string>\n    <string name=\"event_sandbox_description\">Espaces dédiés permettant de découvrir, de tester et d\\'apprendre à utiliser nos derniers produits et plates-formes grâce à des démonstrations interactives, des installations physiques, etc.</string>\n    <string name=\"event_codelabs_description\">Nos kiosques de programmation vous permettent d\\'acquérir une expérience pratique. Vous y trouverez tout le nécessaire pour découvrir les technologies les plus récentes et performantes de Google grâce à des didacticiels d\\'autoformation. Vous pouvez également apporter votre propre ordinateur et terminer votre travail à la maison. Le personnel de Google sera à votre disposition pour vous donner des conseils utiles et vous guider si vous êtes bloqué.</string>\n    <string name=\"event_officehours_description\">Les permanences vous donnent l\\'occasion de rencontrer individuellement des experts de Google pour poser toutes vos questions techniques. Quant aux avis sur les applications, ils vous permettent de recevoir des conseils et des astuces sur vos projets d\\'applications spécifiques.</string>\n    <string name=\"event_afterhours_description\">Une fois les sessions terminées, restez dans les parages pour profiter de deux soirées avec repas, boissons et bons moments en perspective. Lors de la première, les participants se réuniront au niveau de l\\'espace de bac à sable et, lors de la seconde, un concert sera donné en exclusivité dans l\\'Amphitheatre.</string>\n    <string name=\"event_meals_description\">Le petit-déjeuner, le déjeuner et des en-cas seront servis gratuitement aux participants tous les jours de la conférence Google I/O. Le dîner sera également offert les premier et deuxième jours pendant les événements After Hours.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Applications associées</string>\n    <string name=\"event_types_header\">Types d\\'événement</string>\n    <string name=\"settings_time_zone_label\">Événements dans le fuseau horaire du Pacifique (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Activer les notifications</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Envoyer des statistiques d\\'utilisation anonymes</string>\n    <string name=\"settings_tos\">Conditions d\\'utilisation</string>\n    <string name=\"settings_privacy_policy\">Règles de confidentialité</string>\n    <string name=\"settings_oss_licenses\">Licences Open Source</string>\n    <string name=\"settings_theme_title\">Sélectionner un thème</string>\n    <string name=\"settings_theme_system\">Paramètres par défaut</string>\n    <string name=\"settings_theme_light\">Clair</string>\n    <string name=\"settings_theme_dark\">Foncé</string>\n    <string name=\"settings_theme_battery\">Défini par l\\'économiseur de batterie</string>\n    <string name=\"built_with_material_components\">Créée avec Material Components.</string>\n    <string name=\"wifi_network_and_password\">Réseau : %1$s\\nMot de passe : %2$s</string>\n    <string name=\"join_network\">Rejoindre le réseau</string>\n    <string name=\"assistant_app_description\">Dites \"Ok Google, parle à Google I/O 19\" !</string>\n    <string name=\"assistant_app_description2\">Dites \"Ok Google, parle à Google I/O 19\" !</string>\n    <string name=\"speaker_link_website\">Site Web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Événements</string>\n    <string name=\"no_network_connection\">Aucune connexion Internet.</string>\n    <string name=\"navigate_up\">Remonter</string>\n    <string name=\"no_network_description\">Pour utiliser Explore I/O, procédez comme suit :\\n\\n - Désactivez le mode Avion.\\n\\n - Activez un réseau de données mobiles ou Wi-Fi.\\n\\n - Vérifiez le signal aux alentours.</string>\n    <string name=\"phone_does_not_support_arcore_title\">Votre téléphone n\\'est pas compatible avec ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Essayez avec un autre appareil, ou empruntez celui d\\'un ami</string>\n    <string name=\"codelabs_information\">Découvrez les technologies les plus récentes et performantes de Google grâce à des tutoriels d\\'autoformation accessibles dans nos kiosques de programmation. Vous pouvez également apporter votre propre ordinateur et terminer votre travail à la maison. Les kiosques sont ouverts tous les jours, sauf pendant la première présentation.</string>\n    <string name=\"codelabs_building\">Bâtiment accueillant les ateliers de programmation</string>\n    <string name=\"codelabs_website\">Site Web Codelabs</string>\n    <string name=\"codelab_duration\">Durée : %1$d min</string>\n    <string name=\"start_codelab\">Démarrer l\\'atelier de programmation</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-night/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <color name=\"color_primary\">@color/carolina_blue</color>\n    <color name=\"color_primary_variant\">@color/cornflower_blue</color>\n    <color name=\"color_on_secondary\">@color/black</color>\n\n    <color name=\"color_control_light\">#2EFFFFFF</color> <!-- 18% white -->\n    <color name=\"color_surface_secondary\">#2a2b2e</color>\n\n    <!-- Scrim colors -->\n    <color name=\"system_ui_scrim_light\">#2EFFFFFF</color> <!-- 18% white -->\n    <color name=\"system_ui_scrim_black\">#B3000000</color> <!-- 70% black -->\n\n    <!-- In dark mode without light status bar we can use transparent -->\n    <color name=\"status_bar_scrim\">@color/transparent</color>\n\n    <!-- Other colors with light mode alternatives -->\n    <color name=\"highlighted_card_background\">#263238</color>\n    <color name=\"event_card_header_background\">@color/event_card_header_background_dark</color>\n    <color name=\"list_divider\">#1fffffff</color>\n\n    <item name=\"chip_bg_alpha_checked\" format=\"float\" type=\"dimen\">0.27</item>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-notnight-v23/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <!-- We use a light scrim on API 23+ since we use a light status bar -->\n    <color name=\"status_bar_scrim\">@color/system_ui_scrim_light</color>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-notnight-v23/config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <bool name=\"use_light_status\">true</bool>\n</resources>"
  },
  {
    "path": "mobile/src/main/res/values-notnight-v27/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <!-- We use a light scrim on API 27+ since we use a light nav bar -->\n    <color name=\"nav_bar_scrim\">@color/system_ui_scrim_light</color>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-notnight-v27/config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <bool name=\"use_light_navigation\">true</bool>\n</resources>"
  },
  {
    "path": "mobile/src/main/res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programação</string>\n    <string name=\"title_home\">Casa</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explorar I/O</string>\n    <string name=\"title_info\">Informações</string>\n    <string name=\"filters\">Filtros</string>\n    <string name=\"category_heading_tracks\">Assuntos</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Redefinir</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Seus eventos marcados com estrela e reservados</string>\n    <string name=\"starred_and_reserved_short\">Seus eventos</string>\n    <string name=\"search_schedule_hint\">Pesquisar a programação</string>\n    <string name=\"search_schedule_no_results\">Nenhum resultado encontrado</string>\n    <string name=\"agenda\">Compromissos</string>\n    <string name=\"event_starred\">Evento adicionado aos seus itens com estrela</string>\n    <string name=\"event_unstarred\">Evento removido dos itens marcados com estrela</string>\n    <string name=\"event_star_error\">Erro ao adicionar evento aos itens marcados com estrela</string>\n    <string name=\"reservation_error\">Erro ao fazer alterações na reserva. Aguarde a conclusão das solicitações anteriores ou tente novamente mais tarde.</string>\n    <string name=\"reservation_request_succeeded\">Reserva solicitada.</string>\n    <string name=\"reservation_cancel_succeeded\">Reserva cancelada: &lt;b&gt;%s&lt;/b&gt;.</string>\n    <string name=\"reservation_new\">Seu assento foi reservado para &lt;b&gt;%s&lt;/b&gt;.</string>\n    <string name=\"reservation_replaced\">Evento substituído.</string>\n    <string name=\"waitlist_new\">Você foi colocado na lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Removido da lista de espera.</string>\n    <string name=\"got_it\">Ok</string>\n    <string name=\"dont_show\">Não mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Reserva negada: muito perto do horário de início.</string>\n    <string name=\"reservation_denied_clash\">Reserva negada: conflito com outra reserva.</string>\n    <string name=\"reservation_denied_unknown\">Reserva negada: erro desconhecido.</string>\n    <string name=\"cancellation_denied_cutoff\">Cancelamento negado: muito perto do horário de início.</string>\n    <string name=\"cancellation_denied_unknown\">Cancelamento negado: erro desconhecido.</string>\n    <string name=\"schedule_filters_empty\">Nenhum evento foi encontrado.</string>\n    <string name=\"reservation_reservable\">Reservar assento</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">Na lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Entrar na lista de espera</string>\n    <string name=\"reservation_disabled\">Reservas indisponíveis</string>\n    <string name=\"reservation_pending\">Reserva pendente</string>\n    <string name=\"schedule_hint_title\">Personalizar sua programação</string>\n    <string name=\"schedule_hint_star_event\">Adicionar aos seus eventos marcados com estrela</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar um assento na sessão</string>\n    <string name=\"rate_session\">Avaliar sessão</string>\n    <string name=\"menu_item_session_location\">Local da sessão</string>\n    <string name=\"menu_item_session_star\">Marcar sessão com estrela</string>\n    <string name=\"menu_item_calendar\">Adicionar à agenda</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Alto-falantes</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">Agradecemos o feedback.</string>\n    <string name=\"feedback_q1_text\">Como você avaliaria a qualidade geral da sessão?</string>\n    <string name=\"feedback_q2_text\">Como você descreveria o conteúdo da sessão com base nas suas expectativas/descrição da sessão?</string>\n    <string name=\"feedback_q3_text\">Qual é a relevância da sessão para seus projetos?</string>\n    <string name=\"feedback_q4_text\">Qual é a relevância da sessão para seus projetos?</string>\n    <string name=\"feedback_q1_label_start\">Muito básica</string>\n    <string name=\"feedback_q2_label_start\">Ruim</string>\n    <string name=\"feedback_q3_label_start\">Baixa</string>\n    <string name=\"feedback_q4_label_start\">Não muito</string>\n    <string name=\"feedback_q1_label_end\">Excepcional</string>\n    <string name=\"feedback_q2_label_end\">Excepcional</string>\n    <string name=\"feedback_q3_label_end\">Muito relevante</string>\n    <string name=\"feedback_q4_label_end\">Extremamente</string>\n    <string name=\"a11y_show_navigation\">Mostrar menu de navegação</string>\n    <string name=\"a11y_collapse_filters_sheet\">Recolher a página de filtros</string>\n    <string name=\"a11y_clear_tag_filters\">Limpar filtros</string>\n    <string name=\"a11y_filter_applied\">%1s filtro aplicado.</string>\n    <string name=\"a11y_filter_not_applied\">%1s Filtro não aplicado</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">Reserva indisponível</string>\n    <string name=\"a11y_reservation_wait_list_available\">Entrar na lista de espera do evento</string>\n    <string name=\"a11y_reservation_wait_listed\">Na lista de espera do evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendente</string>\n    <string name=\"a11y_starred\">Evento adicionado aos favoritos</string>\n    <string name=\"a11y_unstarred\">Evento não adicionado aos favoritos</string>\n    <string name=\"a11y_star\">Marcar com estrela</string>\n    <string name=\"a11y_play\">Reproduzir vídeo</string>\n    <string name=\"a11y_select_map_mode\">Selecionar o modo mapa</string>\n    <string name=\"a11y_search_schedule\">Pesquisar programação</string>\n    <string name=\"welcome\">Olá!</string>\n    <string name=\"a11y_signed_in_content_description\">Login feito como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Toque para fazer login.</string>\n    <string name=\"dialog_sign_in_content\">Faça login para salvar eventos, reservar assentos e avaliar as sessões de que você participou. As ações serão sincronizadas na sua conta entre o aplicativo e o site.</string>\n    <string name=\"sign_in\">Fazer login</string>\n    <string name=\"firebase_auth_no_network_connection\">Sem conexão com a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Erro desconhecido</string>\n    <string name=\"dialog_sign_out_content\">Todos os eventos salvos, assentos reservados e avaliações das sessões de que você participou permanecem sincronizados com sua conta.</string>\n    <string name=\"sign_out\">Sair</string>\n    <string name=\"manage_google_account\">Gerencie sua Conta do Google</string>\n    <string name=\"remove_reservation_title\">Remover reserva?</string>\n    <string name=\"remove_reservation_content\">Você está prestes a desistir do seu assento em \"%1$s\". Se decidir não reservar uma vaga, mas ainda quiser participar, uma parte dos assentos de todas as sessões estará disponível por ordem de chegada.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Remover</string>\n    <string name=\"swap_reservation_title\">Trocar reserva?</string>\n    <string name=\"swap_reservation_content\">Você já tem uma reserva ou já está na lista de espera para \"%1$s\". Só é possível fazer uma reserva por horário. Quer trocar por \"%2$s\"?</string>\n    <string name=\"swap\">Trocar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificações do I/O</string>\n    <string name=\"notifications_preference_dialog_content\">Quer receber notificações sobre o I/O? Nós enviaremos informações sobre o horário de início das sessões, os eventos que ocorrerão após as sessões, as gravações de sessões e muito mais. Você pode alterar essas configurações em \"Informações &gt; Configurações\" a qualquer momento.</string>\n    <string name=\"no\">Não</string>\n    <string name=\"yes\">Sim</string>\n    <string name=\"feed_not_available\">Nenhum anúncio encontrado.</string>\n    <string name=\"feed_loading_error\">Não foi possível carregar o feed. Tente novamente mais tarde.</string>\n    <string name=\"feed_announcement_title\">Anúncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos salvos</string>\n    <string name=\"feed_no_saved_events\">Nenhum evento salvo</string>\n    <string name=\"feed_view_all_events\">Visualizar todos os eventos</string>\n    <string name=\"feed_view_your_schedule\">Ver sua programação</string>\n    <string name=\"feed_watch_live_stream\">Assistir transmissão ao vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s dia</item>\n        <item quantity=\"other\">%s dias</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartilhar sessão</string>\n    <string name=\"share_text_session_detail\">Veja a sessão \"%1$s\" em #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartilhar</string>\n    <string name=\"map_variant_after_dark\">Após escurecer</string>\n    <string name=\"map_variant_concert\">Show</string>\n    <string name=\"map_variant_daytime\">Dia</string>\n    <string name=\"enable_my_location\">Ativar minha localização</string>\n    <string name=\"my_location_rationale\">O app precisa de permissão de localização para exibir sua localização no mapa.</string>\n    <string name=\"onboarding_get_started\">Primeiros passos</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Boas-vindas ao Google I/O</string>\n    <string name=\"onboarding_date_location\">De 7 a 9 de maio de 2019\\nem Mountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">MIN</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">O Google I/O está chegando</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Assista a recapitulação do I/O \\'19 e confira a #io19 nas redes sociais</string>\n    <string name=\"onboarding_signin\">Inscreva-se para receber notificações do I/O. Participantes poderão reservar assentos para as sessões.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">A sessão começa em %1$s minuto</item>\n        <item quantity=\"other\">A sessão começa em %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandido</string>\n    <string name=\"collapsed\">Recolhido</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viagem</string>\n    <string name=\"faq_title\">Perguntas frequentes</string>\n    <string name=\"settings_title\">Configurações</string>\n    <string name=\"about_title\">Sobre</string>\n    <string name=\"travel_what_to_bring_title\">O que trazer para o evento</string>\n    <string name=\"travel_hotels_title\">Hotéis</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Como chegar a Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Como chegar a Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Serviço de traslado</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamento externo</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">Bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Compartilhamento de carona</string>\n    <string name=\"travel_airport_transfers_title\">Traslado para o aeroporto</string>\n    <string name=\"travel_what_to_bring_description\">O Google I/O é um evento ao ar livre. Embora isso seja uma parte importante do que faz o I/O ser especial, também significa que algumas coisas precisam ser consideradas. As sessões acontecerão em tendas climatizadas, mas ainda assim recomendamos o uso de protetor solar, óculos de sol e roupas adicionais para o entardecer. O I/O é um evento casual. Tenha isso em mente ao escolher o que vai vestir.</string>\n    <string name=\"travel_hotels_description\">Temos quartos reservados em diversos hotéis. A lista de hotéis e disponibilidade de quartos será atualizada regularmente. Use o mapa abaixo para encontrar o melhor hotel para você. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hotéis&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estes são os três maiores aeroportos internacionais de Bay Area:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Francisco International Airport (SFO)&lt;/a&gt; cerca de 38 km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Oakland International Airport (OAK)&lt;/a&gt; cerca de 51 km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Jose International Airport (SJC)&lt;/a&gt; cerca de 19 km</string>\n    <string name=\"travel_getting_to_shoreline_description\">Em um esforço para reduzir o congestionamento de trânsito e as emissões de carbono, o Google I/O 2019 assumiu o compromisso de ser um \"evento sem estacionamento\"*. Esta decisão foi estudada com cuidado e ofereceremos muitas opções gratuitas para que você possa chegar no evento sem a necessidade de um veículo.&lt;br&gt;&lt;br&gt;Forneceremos mais informações conforme o evento estiver mais próximo.&lt;br&gt;&lt;br&gt;*Estacionamentos acessíveis estarão disponíveis.</string>\n    <string name=\"travel_shuttle_service_description\">Em um esforço para reduzir o congestionamento de trânsito e as emissões de carbono, o Google I/O 2019 assumiu o compromisso de ser um \"evento sem estacionamento\"*. Esta decisão foi estudada com cuidado e ofereceremos muitas opções gratuitas para que você possa chegar no evento sem a necessidade de um veículo.&lt;br&gt;&lt;br&gt;Forneceremos mais informações conforme o evento estiver mais próximo.&lt;br&gt;&lt;br&gt;*Estacionamentos acessíveis estarão disponíveis.</string>\n    <string name=\"travel_off_site_parking_description\">Estacionamento gratuito será fornecido no &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;. Traslado de Avaya será fornecido de/para o Google I/O.&lt;br&gt;&lt;br&gt; Indique no formulário de inscrição se você tem alguma necessidade de acessibilidade ou de assistência especial, e nossa equipe de planejamento entrará em contato diretamente com você.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofereceremos passes pré-pagos para transporte público, disponíveis para retirada durante e pré-inscrição. O transporte público na região é acessível através do:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: sistema regional de trens&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: sistema de trens que atende South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Bay Area Rapid Transit&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: sistema regional de trens&lt;br&gt;&lt;br&gt; O transporte público não vai diretamente para o Google I/O. Fique atento aos locais exatos atendidos pelos serviços de traslado do Google I/O.</string>\n    <string name=\"travel_biking_description\">Estacionamento gratuito para bicicletas estará disponível no estacionamento A do Shoreline Amphitheatre. A Silicon Valley Bicycle Coalition fornecerá estacionamento seguro com manobrista das 7h até o final do evento, todos os dias.&lt;br&gt;&lt;br&gt; Veja no Google Maps os melhores trajetos e rotas para bicicletas. Há duas trilhas, Stevens Creek Trail e Permanente Creek Trail, adequadas para ciclistas que se dirijam ao Shoreline Amphitheatre.</string>\n    <string name=\"travel_ridesharing_description\">Traslados para o SFO e o SJC a partir do Google I/O serão fornecidos no último dia do evento. Traslados para os aeroportos NÃO serão oferecidos em outras datas.</string>\n    <string name=\"travel_airport_transfers_description\">Traslados para o SFO e o SJC a partir do Google I/O serão fornecidos no último dia do evento. Traslados para os aeroportos NÃO serão oferecidos em outras datas.</string>\n    <string name=\"faq_when_and_where_title\">Onde e quando será o Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Como posso me informar das novidades do Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Todas as sessões serão em inglês?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Posso reservar sessões antecipadamente?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Qual a melhor maneira de chegar no Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Onde e quando posso retirar meu crachá?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Quais são as dicas para conseguir um lugar na primeira fila para a palestra principal?</string>\n    <string name=\"faq_what_should_i_wear_title\">Como devo me vestir?</string>\n    <string name=\"faq_onsite_food_options_title\">Eu gostaria de um lanche. Quais são as opções de alimentação no local?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Se eu perder algum objeto no local, onde poderei encontrá-lo?</string>\n    <string name=\"faq_after_dark_program_title\">A programação Pós escurecer parece divertida. Será que devo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">Vocês poderão acomodar minhas necessidades de acessibilidade?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Que apoio vocês oferecem para gestantes e pais que participem do I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Orientações à comunidade de eventos Google e Política de Antiassédio</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">As sessões serão transmitidas ao vivo? E se eu não conseguir acompanhar o evento em tempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quero celebrar o I/O com minha comunidade!  Sugestões?</string>\n    <string name=\"faq_when_and_where_description\">Para não perder nenhuma informação sobre sessões, palestrantes e atividades em geral, acesse frequentemente o &lt;a href=\"https://events.google.com/io/\"&gt;site do Google I/O 2019&lt;/a&gt;, o &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog do Google Developers&lt;/a&gt; e siga-nos no &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; e no &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Também é possível acompanhar e participar da conversa sobre o Google I/O 2019 por meio da hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Além disso, enviaremos informações importantes por e-mail para todos participantes registrados, incluindo instruções para o check-in antes do festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para não perder nenhuma informação sobre sessões, palestrantes e atividades em geral, acesse frequentemente o &lt;a href=\"https://events.google.com/io/\"&gt;site do Google I/O 2019&lt;/a&gt;, o &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog do Google Developers&lt;/a&gt; e siga-nos no &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; e no &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Também é possível acompanhar e participar da conversa sobre o Google I/O 2019 por meio da hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Além disso, enviaremos informações importantes por e-mail para todos participantes registrados, incluindo instruções para o check-in antes do festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sim, para que nosso público global possa acompanhar o evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">A partir de abril, participantes ao vivo poderão reservar assentos antecipados para sessões no site do I/O e através do app para dispositivos móveis do I/O (observação: uma parte dos assentos não será oferecida para reserva e serão disponibilizados por ordem de chegada no local). A participação nos Codelabs, Apps Reviews e Office Hours será baseada em ordem de chegada no local.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Veja na seção Viagem todas as dicas sobre transporte, incluindo informações sobre traslados, rotas para carros e bicicletas, dicas para viagens compartilhadas e mais!</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar o processo de check-in, iniciaremos a retirada de crachás na segunda-feira, 6 de maio, no Shoreline Amphitheatre. Para retirar seu crachá do Google I/O, será necessário apresentar um documento de identidade com foto. Aceitamos carteiras de motorista, passaportes e outras formas de identificação emitidas pelo governo. Se você não tiver uma identificação apropriada, não será possível retirar seu crachá e entrar na conferência. O nome no documento precisa corresponder exatamente ao que consta no seu perfil. Se você for participante acadêmico, lembre-se de trazer uma comprovação de qualificação.&lt;br&gt; - Escaneie o código de registro QR recebido por e-mail. É possível escaneá-lo com seu telefone. Não é necessário imprimir o e-mail! #savetheenvironment &lt;br&gt;&lt;br&gt;Observe que não é permitido emprestar, dar ou compartilhar de qualquer forma seu crachá para outra pessoa. Os crachás do Google I/O são insubstituíveis. Não perca o seu, ou não será mais possível entrar na conferência. Você precisa usar o crachá para ter acesso ao Google I/O, incluindo as sessões, sandboxes e eventos após as sessões. Caso seja solicitado pela segurança, apresente seu crachá e qualquer identificação adicional. O crachá do Google I/O incluirá nome, empresa ou organização (se informada) e foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos os participantes poderão assistir às palestras principais, mas os melhores lugares serão distribuídos por ordem de chegada durante a retirada de crachás, a partir das 7h do dia 6 de maio. Por isso, recomendamos que você se organize para chegar cedo.</string>\n    <string name=\"faq_what_should_i_wear_description\">O Google I/O é um evento para desenvolvedores ao ar livre. Isso quer dizer que você pode usar roupas confortáveis e casuais. Não há nenhuma regra com relação à vestimenta. A região do evento pode ficar muito quente durante o dia e mais fresca durante a noite. Pense nisso para planejar o que vestir.</string>\n    <string name=\"faq_onsite_food_options_description\">A boa notícia é que gostamos de comida também!  São oferecidos aos participantes café da manhã, almoço e lanches em todos os três dias da conferência. Também será servido jantar durante os eventos após as sessões dos dois primeiros dias.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Não se preocupe! O posto de achados e perdidos ficará localizado na central de informações da conferência durante o horário dos eventos. Os itens que não forem recolhidos no mesmo dia serão entregues à equipe de segurança. Um detalhe importante: os crachás do Google I/O não são substituíveis. Se você perder o seu, não terá mais acesso à conferência.</string>\n    <string name=\"faq_after_dark_program_description\">Estas serão duas noites que você não vai querer perder! Os participantes são convidados a curtir músicas, jogos e muito mais ao entardecer de 8 de maio, além de um show exclusivo no anfiteatro no dia 9 de maio. Comida e bebidas serão oferecidas em ambas as noites (bebidas alcoólicas disponíveis para maiores de 21 anos). Os dois eventos após as sessões serão realizados no Shoreline Amphitheatre. Será necessário apresentar o crachá de participante para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Teremos espaços de estacionamento para gestantes na área preferencial.&lt;br&gt; Mães lactantes são bem-vindas a participar da conferência com seus filhos. Haverá quatro salas para mães abertas em 7 e 8 de maio, das 8h às 20h e no dia 9 de maio das 8h às 16h. Fichas de inscrição estarão disponíveis na entrada das salas para mães, e o uso será baseado na ordem de chegada. Entre em contato com nossa central de informações para mais detalhes.&lt;br&gt;&lt;br&gt; Um auxilio creche de US$ 100 por dia (não excedendo o total de US$ 300) será oferecido aos pais que manifestarem interesse em creche pelo nosso formulário de inscrição. A disponibilidade será por ordem de chegada. Nosso auxilio creche é disponibilizado por um fornecedor terceirizado. Caso sua solicitação para creche seja aprovada por nós por e-mail antes do início da conferência e seu comparecimento tenha sido confirmado, nosso fornecedor entrará em contato com você em até sete dias úteis após o Google I/O para os próximos passos. Eles coordenarão o reembolso do nosso auxílio creche.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Teremos espaços de estacionamento para gestantes na área preferencial.&lt;br&gt; Mães lactantes são bem-vindas a participar da conferência com seus filhos. Haverá quatro salas para mães abertas em 7 e 8 de maio, das 8h às 20h e no dia 9 de maio das 8h às 16h. Fichas de inscrição estarão disponíveis na entrada das salas para mães, e o uso será baseado na ordem de chegada. Entre em contato com nossa central de informações para mais detalhes.&lt;br&gt;&lt;br&gt; Um auxilio creche de US$ 100 por dia (não excedendo o total de US$ 300) será oferecido aos pais que manifestarem interesse em creche pelo nosso formulário de inscrição. A disponibilidade será por ordem de chegada. Nosso auxilio creche é disponibilizado por um fornecedor terceirizado. Caso sua solicitação para creche seja aprovada por nós por e-mail antes do início da conferência e seu comparecimento tenha sido confirmado, nosso fornecedor entrará em contato com você em até sete dias úteis após o Google I/O para os próximos passos. Eles coordenarão o reembolso do nosso auxílio creche.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">O Google quer proporcionar um evento inclusivo e sem assédio para todos os participantes, independentemente de aspectos como identidade e expressão de gênero, orientação sexual, deficiências, neurodiversidade, aparência física, tamanho do corpo, etnia, nacionalidade, raça, idade, religião ou outra categoria protegida. Em um esforço para tornar o evento o mais inclusivo possível, banheiros de gênero neutro serão disponibilizados no local.&lt;br&gt;&lt;br&gt; Não toleraremos nenhuma forma de assédio aos participantes do evento.&lt;br&gt; O Google leva violações destas políticas a sério e tomará as medidas apropriadas. Para mais informações sobre as Orientações à comunidade de eventos Google e Política de Antiassédio, acesse &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;este link&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">As duas palestras principais e todas as sessões serão transmitidas ao vivo na página inicial do site do evento durante os três dias de duração dele. Se estiver muito atarefado ou do outro lado do mundo, em que há uma diferença significativa de fuso horário, assista mais tarde às gravações das sessões no &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal Google Developers do YouTube.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sim. A cada ano, desenvolvedores de todo o mundo apresentam eventos no &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended&lt;/a&gt;. Durante esses eventos, os organizadores podem transmitir ao vivo e apresentar suas próprias sessões, incluindo hackathons, codelabs, demos e muito mais.&lt;br&gt; Se você vai se unir a nós como um apresentador do I/O Extended neste ano, veja aqui os passos necessários para começar:&lt;br&gt;&lt;br&gt;  Leia o &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guia do organizador&lt;/a&gt; para dicas e sugestões sobre como apresentar um evento de sucesso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registre&lt;/a&gt; seu evento público no site do I/O para aumentar sua visibilidade.&lt;br&gt;&lt;br&gt; Use a hashtag oficial #io19extended em todas suas postagens sociais relacionadas ao I/O Extended para facilitar sua descoberta.&lt;br&gt;&lt;br&gt; Observação: Apresentadores do I/O Extended podem solicitar a remoção dos seu dados pessoais e/ou do evento após o término do evento enviando um e-mail para io19@google.com.&lt;br&gt; Se você quer apenas participar de um evento I/O Extended, navegue pelo &lt;a href=\"https://events.google.com/io/extended\"&gt;nosso mapa&lt;/a&gt; para encontrar um e confirme sua presença!&lt;br&gt; Para perguntas sobre o programa I/O Extended, entre em contato pelo io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sessões</string>\n    <string name=\"wifi_install_success\">Rede Wi-Fi salva</string>\n    <string name=\"wifi_install_clipboard_message\">Não foi possível salvar a rede Wi-Fi.\\nA senha foi salva na área de transferência.</string>\n    <string name=\"event_sessions_title\">Sessões</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Horários para esclarecimento de dúvidas e avaliações de aplicativos</string>\n    <string name=\"event_afterhours_title\">Eventos após as sessões:</string>\n    <string name=\"event_meals_title\">Refeições</string>\n    <string name=\"event_sessions_description\">A partir de abril, participantes ao vivo poderão reservar assentos antecipados para sessões no site do I/O e através do app para dispositivos móveis do I/O (observação: uma parte dos assentos não será oferecida para reserva e serão disponibilizados por ordem de chegada no local). A participação nos Codelabs, Apps Reviews e Office Hours será baseada em ordem de chegada no local.</string>\n    <string name=\"event_sandbox_description\">Espaços dedicados para explorar, aprender e usar nossos produtos e plataformas mais recentes por meio de demonstrações interativas, instalações físicas e muito mais.</string>\n    <string name=\"event_codelabs_description\">Tenha uma experiência prática nos nossos quiosques de criação de código. Neles, você encontrará tudo de que precisa para aprender sobre as melhores e mais recentes tecnologias do Google por meio de tutoriais individualizados. Se preferir, você também pode trazer sua própria máquina e depois levar seu trabalho para casa. A equipe do Google estará à disposição para dar conselhos úteis e fornecer orientação se você precisar.</string>\n    <string name=\"event_officehours_description\">Os horários para esclarecimento de dúvidas são sua chance de conhecer pessoalmente os especialistas do Google e fazer todas as suas perguntas técnicas. Além disso, as avaliações de aplicativos oferecem a você a oportunidade de receber conselhos e dicas sobre seus projetos específicos relacionados a aplicativos.</string>\n    <string name=\"event_afterhours_description\">Após as sessões, no final do dia, fique em Shoreline para aproveitar duas noites de comida, bebida e diversão. Na primeira noite, a festa será no espaço Sandbox, e na segunda nós teremos um show exclusivo no anfiteatro.</string>\n    <string name=\"event_meals_description\">São oferecidos aos participantes café da manhã, almoço e lanches em todos os três dias da conferência. Também será servido jantar durante os eventos após as sessões dos dois primeiros dias.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Aplicativos relacionados</string>\n    <string name=\"event_types_header\">Tipos de evento</string>\n    <string name=\"settings_time_zone_label\">Eventos no fuso horário do Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Ativar notificações</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estatísticas de uso anônimas</string>\n    <string name=\"settings_tos\">Termos de Serviço</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidade</string>\n    <string name=\"settings_oss_licenses\">Licenças de código aberto</string>\n    <string name=\"settings_theme_title\">Escolher tema</string>\n    <string name=\"settings_theme_system\">Padrão do sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Escuro</string>\n    <string name=\"settings_theme_battery\">Configurar por \"Economia de bateria\"</string>\n    <string name=\"built_with_material_components\">Criado com Material Components.</string>\n    <string name=\"wifi_network_and_password\">Rede: %1$s\\nSenha: %2$s</string>\n    <string name=\"join_network\">Participar da rede</string>\n    <string name=\"assistant_app_description\">Basta dizer \"Ok Google, fale sobre o Google I/O 19\"!</string>\n    <string name=\"assistant_app_description2\">Basta dizer \"Ok Google, fale sobre o Google I/O 19\"!</string>\n    <string name=\"speaker_link_website\">Site</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sem conexão com a Internet.</string>\n    <string name=\"navigate_up\">Navegar para cima</string>\n    <string name=\"no_network_description\">Para usar a função \"Explorar o I/O\",:\\n\\n — Desative o modo avião\\n\\n — Desative os dados móveis ou o Wi-Fi\\n\\n — Verifique o sinal na sua área</string>\n    <string name=\"phone_does_not_support_arcore_title\">Seu smartphone não é compatível com o ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Tente outro dispositivo ou peça um emprestado a um amigo</string>\n    <string name=\"codelabs_information\">Aprenda sobre as maiores e mais recentes tecnologias do Google através de tutoriais individuais em nossos quiosques de criação de código. Se preferir, você também pode trazer sua própria máquina e depois levar seu trabalho para casa. Os quiosques ficarão abertos todos os dias, exceto durante a primeira palestra principal.</string>\n    <string name=\"codelabs_building\">Criação de codelabs</string>\n    <string name=\"codelabs_website\">Site do Codelabs</string>\n    <string name=\"codelab_duration\">Duração: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Programação</string>\n    <string name=\"title_home\">Casa</string>\n    <string name=\"title_map\">Mapa</string>\n    <string name=\"title_explore_io\">Explorar I/O</string>\n    <string name=\"title_info\">Informações</string>\n    <string name=\"filters\">Filtros</string>\n    <string name=\"category_heading_tracks\">Assuntos</string>\n    <string name=\"category_heading_types\">Tipos</string>\n    <string name=\"reset\">Redefinir</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d evento</item>\n        <item quantity=\"other\">%1$d eventos</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Seus eventos marcados com estrela e reservados</string>\n    <string name=\"starred_and_reserved_short\">Seus eventos</string>\n    <string name=\"search_schedule_hint\">Pesquisar a programação</string>\n    <string name=\"search_schedule_no_results\">Nenhum resultado encontrado</string>\n    <string name=\"agenda\">Compromissos</string>\n    <string name=\"event_starred\">Evento adicionado aos seus itens com estrela</string>\n    <string name=\"event_unstarred\">Evento removido dos itens marcados com estrela</string>\n    <string name=\"event_star_error\">Erro ao adicionar evento aos itens marcados com estrela</string>\n    <string name=\"reservation_error\">Erro ao fazer alterações na reserva. Aguarde a conclusão das solicitações anteriores ou tente novamente mais tarde.</string>\n    <string name=\"reservation_request_succeeded\">Reserva solicitada.</string>\n    <string name=\"reservation_cancel_succeeded\">Reserva cancelada: &lt;b&gt;%s&lt;/b&gt;.</string>\n    <string name=\"reservation_new\">Seu assento foi reservado para &lt;b&gt;%s&lt;/b&gt;.</string>\n    <string name=\"reservation_replaced\">Evento substituído.</string>\n    <string name=\"waitlist_new\">Você foi colocado na lista de espera.</string>\n    <string name=\"waitlist_cancel_succeeded\">Removido da lista de espera.</string>\n    <string name=\"got_it\">Ok</string>\n    <string name=\"dont_show\">Não mostrar</string>\n    <string name=\"reservation_denied_cutoff\">Reserva negada: muito perto do horário de início.</string>\n    <string name=\"reservation_denied_clash\">Reserva negada: conflito com outra reserva.</string>\n    <string name=\"reservation_denied_unknown\">Reserva negada: erro desconhecido.</string>\n    <string name=\"cancellation_denied_cutoff\">Cancelamento negado: muito perto do horário de início.</string>\n    <string name=\"cancellation_denied_unknown\">Cancelamento negado: erro desconhecido.</string>\n    <string name=\"schedule_filters_empty\">Nenhum evento foi encontrado.</string>\n    <string name=\"reservation_reservable\">Reservar assento</string>\n    <string name=\"reservation_reserved\">Reservado</string>\n    <string name=\"reservation_waitlisted\">Na lista de espera</string>\n    <string name=\"reservation_waitlist_available\">Entrar na lista de espera</string>\n    <string name=\"reservation_disabled\">Reservas indisponíveis</string>\n    <string name=\"reservation_pending\">Reserva pendente</string>\n    <string name=\"schedule_hint_title\">Personalizar sua programação</string>\n    <string name=\"schedule_hint_star_event\">Adicionar aos seus eventos marcados com estrela</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Reservar um assento na sessão</string>\n    <string name=\"rate_session\">Avaliar sessão</string>\n    <string name=\"menu_item_session_location\">Local da sessão</string>\n    <string name=\"menu_item_session_star\">Marcar sessão com estrela</string>\n    <string name=\"menu_item_calendar\">Adicionar à agenda</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Alto-falantes</string>\n    <string name=\"session_detail_related_header\">Eventos relacionados</string>\n    <string name=\"feedback_submit\">Enviar</string>\n    <string name=\"feedback_thank_you\">Agradecemos o feedback.</string>\n    <string name=\"feedback_q1_text\">Como você avaliaria a qualidade geral da sessão?</string>\n    <string name=\"feedback_q2_text\">Como você descreveria o conteúdo da sessão com base nas suas expectativas/descrição da sessão?</string>\n    <string name=\"feedback_q3_text\">Qual é a relevância da sessão para seus projetos?</string>\n    <string name=\"feedback_q4_text\">Qual é a relevância da sessão para seus projetos?</string>\n    <string name=\"feedback_q1_label_start\">Muito básica</string>\n    <string name=\"feedback_q2_label_start\">Ruim</string>\n    <string name=\"feedback_q3_label_start\">Baixa</string>\n    <string name=\"feedback_q4_label_start\">Não muito</string>\n    <string name=\"feedback_q1_label_end\">Excepcional</string>\n    <string name=\"feedback_q2_label_end\">Excepcional</string>\n    <string name=\"feedback_q3_label_end\">Muito relevante</string>\n    <string name=\"feedback_q4_label_end\">Extremamente</string>\n    <string name=\"a11y_show_navigation\">Mostrar menu de navegação</string>\n    <string name=\"a11y_collapse_filters_sheet\">Recolher a página de filtros</string>\n    <string name=\"a11y_clear_tag_filters\">Limpar filtros</string>\n    <string name=\"a11y_filter_applied\">%1s filtro aplicado.</string>\n    <string name=\"a11y_filter_not_applied\">%1s Filtro não aplicado</string>\n    <string name=\"a11y_reservation_available\">Reservar evento</string>\n    <string name=\"a11y_reservation_reserved\">Evento reservado</string>\n    <string name=\"a11y_reservation_disabled\">Reserva indisponível</string>\n    <string name=\"a11y_reservation_wait_list_available\">Entrar na lista de espera do evento</string>\n    <string name=\"a11y_reservation_wait_listed\">Na lista de espera do evento</string>\n    <string name=\"a11y_reservation_pending\">Reserva pendente</string>\n    <string name=\"a11y_starred\">Evento adicionado aos favoritos</string>\n    <string name=\"a11y_unstarred\">Evento não adicionado aos favoritos</string>\n    <string name=\"a11y_star\">Marcar com estrela</string>\n    <string name=\"a11y_play\">Reproduzir vídeo</string>\n    <string name=\"a11y_select_map_mode\">Selecionar o modo mapa</string>\n    <string name=\"a11y_search_schedule\">Pesquisar programação</string>\n    <string name=\"welcome\">Olá!</string>\n    <string name=\"a11y_signed_in_content_description\">Login feito como %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Toque para fazer login.</string>\n    <string name=\"dialog_sign_in_content\">Faça login para salvar eventos, reservar assentos e avaliar as sessões de que você participou. As ações serão sincronizadas na sua conta entre o aplicativo e o site.</string>\n    <string name=\"sign_in\">Fazer login</string>\n    <string name=\"firebase_auth_no_network_connection\">Sem conexão com a Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Erro desconhecido</string>\n    <string name=\"dialog_sign_out_content\">Todos os eventos salvos, assentos reservados e avaliações das sessões de que você participou permanecem sincronizados com sua conta.</string>\n    <string name=\"sign_out\">Sair</string>\n    <string name=\"manage_google_account\">Gerencie sua Conta do Google</string>\n    <string name=\"remove_reservation_title\">Remover reserva?</string>\n    <string name=\"remove_reservation_content\">Você está prestes a desistir do seu assento em \"%1$s\". Se decidir não reservar uma vaga, mas ainda quiser participar, uma parte dos assentos de todas as sessões estará disponível por ordem de chegada.</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"remove\">Remover</string>\n    <string name=\"swap_reservation_title\">Trocar reserva?</string>\n    <string name=\"swap_reservation_content\">Você já tem uma reserva ou já está na lista de espera para \"%1$s\". Só é possível fazer uma reserva por horário. Quer trocar por \"%2$s\"?</string>\n    <string name=\"swap\">Trocar</string>\n    <string name=\"notifications_preference_dialog_title\">Notificações do I/O</string>\n    <string name=\"notifications_preference_dialog_content\">Quer receber notificações sobre o I/O? Nós enviaremos informações sobre o horário de início das sessões, os eventos que ocorrerão após as sessões, as gravações de sessões e muito mais. Você pode alterar essas configurações em \"Informações &gt; Configurações\" a qualquer momento.</string>\n    <string name=\"no\">Não</string>\n    <string name=\"yes\">Sim</string>\n    <string name=\"feed_not_available\">Nenhum anúncio encontrado.</string>\n    <string name=\"feed_loading_error\">Não foi possível carregar o feed. Tente novamente mais tarde.</string>\n    <string name=\"feed_announcement_title\">Anúncios</string>\n    <string name=\"feed_upcoming_events\">Próximos eventos</string>\n    <string name=\"feed_saved_events\">Eventos salvos</string>\n    <string name=\"feed_no_saved_events\">Nenhum evento salvo</string>\n    <string name=\"feed_view_all_events\">Visualizar todos os eventos</string>\n    <string name=\"feed_view_your_schedule\">Ver sua programação</string>\n    <string name=\"feed_watch_live_stream\">Assistir transmissão ao vivo</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s dia</item>\n        <item quantity=\"other\">%s dias</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s hora</item>\n        <item quantity=\"other\">%s horas</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s minuto</item>\n        <item quantity=\"other\">%s minutos</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s segundo</item>\n        <item quantity=\"other\">%s segundos</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Compartilhar sessão</string>\n    <string name=\"share_text_session_detail\">Veja a sessão \"%1$s\" em #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Compartilhar</string>\n    <string name=\"map_variant_after_dark\">Após escurecer</string>\n    <string name=\"map_variant_concert\">Show</string>\n    <string name=\"map_variant_daytime\">Dia</string>\n    <string name=\"enable_my_location\">Ativar minha localização</string>\n    <string name=\"my_location_rationale\">O app precisa de permissão de localização para exibir sua localização no mapa.</string>\n    <string name=\"onboarding_get_started\">Primeiros passos</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Boas-vindas ao Google I/O</string>\n    <string name=\"onboarding_date_location\">De 7 a 9 de maio de 2019\\nem Mountain View, CA</string>\n    <string name=\"onboarding_label_days\">D</string>\n    <string name=\"onboarding_label_hours\">H</string>\n    <string name=\"onboarding_label_mins\">MIN</string>\n    <string name=\"onboarding_label_seconds\">S</string>\n    <string name=\"onboarding_welcome_google_io_pre\">O Google I/O está chegando</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Assista a recapitulação do I/O \\'19 e confira a #io19 nas redes sociais</string>\n    <string name=\"onboarding_signin\">Inscreva-se para receber notificações do I/O. Participantes poderão reservar assentos para as sessões.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">A sessão começa em %1$s minuto</item>\n        <item quantity=\"other\">A sessão começa em %1$s minutos</item>\n    </plurals>\n    <string name=\"expanded\">Expandido</string>\n    <string name=\"collapsed\">Recolhido</string>\n    <string name=\"event_title\">Evento</string>\n    <string name=\"travel_title\">Viagem</string>\n    <string name=\"faq_title\">Perguntas frequentes</string>\n    <string name=\"settings_title\">Configurações</string>\n    <string name=\"about_title\">Sobre</string>\n    <string name=\"travel_what_to_bring_title\">O que trazer para o evento</string>\n    <string name=\"travel_hotels_title\">Hotéis</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Como chegar a Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Como chegar a Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Serviço de traslado</string>\n    <string name=\"travel_off_site_parking_title\">Estacionamento externo</string>\n    <string name=\"travel_for_public_transportation_title\">Transporte público</string>\n    <string name=\"travel_biking_title\">Bicicleta</string>\n    <string name=\"travel_ridesharing_title\">Compartilhamento de carona</string>\n    <string name=\"travel_airport_transfers_title\">Traslado para o aeroporto</string>\n    <string name=\"travel_what_to_bring_description\">O Google I/O é um evento ao ar livre. Embora isso seja uma parte importante do que faz o I/O ser especial, também significa que algumas coisas precisam ser consideradas. As sessões acontecerão em tendas climatizadas, mas ainda assim recomendamos o uso de protetor solar, óculos de sol e roupas adicionais para o entardecer. O I/O é um evento casual. Tenha isso em mente ao escolher o que vai vestir.</string>\n    <string name=\"travel_hotels_description\">Temos quartos reservados em diversos hotéis. A lista de hotéis e disponibilidade de quartos será atualizada regularmente. Use o mapa abaixo para encontrar o melhor hotel para você. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Mapa de hotéis&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Estes são os três maiores aeroportos internacionais de Bay Area:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Francisco International Airport (SFO)&lt;/a&gt; cerca de 38 km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Oakland International Airport (OAK)&lt;/a&gt; cerca de 51 km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;San Jose International Airport (SJC)&lt;/a&gt; cerca de 19 km</string>\n    <string name=\"travel_getting_to_shoreline_description\">Em um esforço para reduzir o congestionamento de trânsito e as emissões de carbono, o Google I/O 2019 assumiu o compromisso de ser um \"evento sem estacionamento\"*. Esta decisão foi estudada com cuidado e ofereceremos muitas opções gratuitas para que você possa chegar no evento sem a necessidade de um veículo.&lt;br&gt;&lt;br&gt;Forneceremos mais informações conforme o evento estiver mais próximo.&lt;br&gt;&lt;br&gt;*Estacionamentos acessíveis estarão disponíveis.</string>\n    <string name=\"travel_shuttle_service_description\">Em um esforço para reduzir o congestionamento de trânsito e as emissões de carbono, o Google I/O 2019 assumiu o compromisso de ser um \"evento sem estacionamento\"*. Esta decisão foi estudada com cuidado e ofereceremos muitas opções gratuitas para que você possa chegar no evento sem a necessidade de um veículo.&lt;br&gt;&lt;br&gt;Forneceremos mais informações conforme o evento estiver mais próximo.&lt;br&gt;&lt;br&gt;*Estacionamentos acessíveis estarão disponíveis.</string>\n    <string name=\"travel_off_site_parking_description\">Estacionamento gratuito será fornecido no &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;. Traslado de Avaya será fornecido de/para o Google I/O.&lt;br&gt;&lt;br&gt; Indique no formulário de inscrição se você tem alguma necessidade de acessibilidade ou de assistência especial, e nossa equipe de planejamento entrará em contato diretamente com você.</string>\n    <string name=\"travel_for_public_transportation_description\">Ofereceremos passes pré-pagos para transporte público, disponíveis para retirada durante e pré-inscrição. O transporte público na região é acessível através do:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: sistema regional de trens&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: sistema de trens que atende South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Bay Area Rapid Transit&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: sistema regional de trens&lt;br&gt;&lt;br&gt; O transporte público não vai diretamente para o Google I/O. Fique atento aos locais exatos atendidos pelos serviços de traslado do Google I/O.</string>\n    <string name=\"travel_biking_description\">Estacionamento gratuito para bicicletas estará disponível no estacionamento A do Shoreline Amphitheatre. A Silicon Valley Bicycle Coalition fornecerá estacionamento seguro com manobrista das 7h até o final do evento, todos os dias.&lt;br&gt;&lt;br&gt; Veja no Google Maps os melhores trajetos e rotas para bicicletas. Há duas trilhas, Stevens Creek Trail e Permanente Creek Trail, adequadas para ciclistas que se dirijam ao Shoreline Amphitheatre.</string>\n    <string name=\"travel_ridesharing_description\">Traslados para o SFO e o SJC a partir do Google I/O serão fornecidos no último dia do evento. Traslados para os aeroportos NÃO serão oferecidos em outras datas.</string>\n    <string name=\"travel_airport_transfers_description\">Traslados para o SFO e o SJC a partir do Google I/O serão fornecidos no último dia do evento. Traslados para os aeroportos NÃO serão oferecidos em outras datas.</string>\n    <string name=\"faq_when_and_where_title\">Onde e quando será o Google I/O 2019?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Como posso me informar das novidades do Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Todas as sessões serão em inglês?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Posso reservar sessões antecipadamente?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Qual a melhor maneira de chegar no Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Onde e quando posso retirar meu crachá?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Quais são as dicas para conseguir um lugar na primeira fila para a palestra principal?</string>\n    <string name=\"faq_what_should_i_wear_title\">Como devo me vestir?</string>\n    <string name=\"faq_onsite_food_options_title\">Eu gostaria de um lanche. Quais são as opções de alimentação no local?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Se eu perder algum objeto no local, onde poderei encontrá-lo?</string>\n    <string name=\"faq_after_dark_program_title\">A programação Pós escurecer parece divertida. Será que devo ir?</string>\n    <string name=\"faq_accessibility_needs_title\">Vocês poderão acomodar minhas necessidades de acessibilidade?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Que apoio vocês oferecem para gestantes e pais que participem do I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Orientações à comunidade de eventos Google e Política de Antiassédio</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">As sessões serão transmitidas ao vivo? E se eu não conseguir acompanhar o evento em tempo real?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Quero celebrar o I/O com minha comunidade!  Sugestões?</string>\n    <string name=\"faq_when_and_where_description\">Para não perder nenhuma informação sobre sessões, palestrantes e atividades em geral, acesse frequentemente o &lt;a href=\"https://events.google.com/io/\"&gt;site do Google I/O 2019&lt;/a&gt;, o &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog do Google Developers&lt;/a&gt; e siga-nos no &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; e no &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Também é possível acompanhar e participar da conversa sobre o Google I/O 2019 por meio da hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Além disso, enviaremos informações importantes por e-mail para todos participantes registrados, incluindo instruções para o check-in antes do festival.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Para não perder nenhuma informação sobre sessões, palestrantes e atividades em geral, acesse frequentemente o &lt;a href=\"https://events.google.com/io/\"&gt;site do Google I/O 2019&lt;/a&gt;, o &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;blog do Google Developers&lt;/a&gt; e siga-nos no &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; e no &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Também é possível acompanhar e participar da conversa sobre o Google I/O 2019 por meio da hashtag oficial &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Além disso, enviaremos informações importantes por e-mail para todos participantes registrados, incluindo instruções para o check-in antes do festival.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Sim, para que nosso público global possa acompanhar o evento.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">A partir de abril, participantes ao vivo poderão reservar assentos antecipados para sessões no site do I/O e através do app para dispositivos móveis do I/O (observação: uma parte dos assentos não será oferecida para reserva e serão disponibilizados por ordem de chegada no local). A participação nos Codelabs, Apps Reviews e Office Hours será baseada em ordem de chegada no local.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Veja na seção Viagem todas as dicas sobre transporte, incluindo informações sobre traslados, rotas para carros e bicicletas, dicas para viagens compartilhadas e mais!</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Para acelerar o processo de check-in, iniciaremos a retirada de crachás na segunda-feira, 6 de maio, no Shoreline Amphitheatre. Para retirar seu crachá do Google I/O, será necessário apresentar um documento de identidade com foto. Aceitamos carteiras de motorista, passaportes e outras formas de identificação emitidas pelo governo. Se você não tiver uma identificação apropriada, não será possível retirar seu crachá e entrar na conferência. O nome no documento precisa corresponder exatamente ao que consta no seu perfil. Se você for participante acadêmico, lembre-se de trazer uma comprovação de qualificação.&lt;br&gt; - Escaneie o código de registro QR recebido por e-mail. É possível escaneá-lo com seu telefone. Não é necessário imprimir o e-mail! #savetheenvironment &lt;br&gt;&lt;br&gt;Observe que não é permitido emprestar, dar ou compartilhar de qualquer forma seu crachá para outra pessoa. Os crachás do Google I/O são insubstituíveis. Não perca o seu, ou não será mais possível entrar na conferência. Você precisa usar o crachá para ter acesso ao Google I/O, incluindo as sessões, sandboxes e eventos após as sessões. Caso seja solicitado pela segurança, apresente seu crachá e qualquer identificação adicional. O crachá do Google I/O incluirá nome, empresa ou organização (se informada) e foto.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Todos os participantes poderão assistir às palestras principais, mas os melhores lugares serão distribuídos por ordem de chegada durante a retirada de crachás, a partir das 7h do dia 6 de maio. Por isso, recomendamos que você se organize para chegar cedo.</string>\n    <string name=\"faq_what_should_i_wear_description\">O Google I/O é um evento para desenvolvedores ao ar livre. Isso quer dizer que você pode usar roupas confortáveis e casuais. Não há nenhuma regra com relação à vestimenta. A região do evento pode ficar muito quente durante o dia e mais fresca durante a noite. Pense nisso para planejar o que vestir.</string>\n    <string name=\"faq_onsite_food_options_description\">A boa notícia é que gostamos de comida também!  São oferecidos aos participantes café da manhã, almoço e lanches em todos os três dias da conferência. Também será servido jantar durante os eventos após as sessões dos dois primeiros dias.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Não se preocupe! O posto de achados e perdidos ficará localizado na central de informações da conferência durante o horário dos eventos. Os itens que não forem recolhidos no mesmo dia serão entregues à equipe de segurança. Um detalhe importante: os crachás do Google I/O não são substituíveis. Se você perder o seu, não terá mais acesso à conferência.</string>\n    <string name=\"faq_after_dark_program_description\">Estas serão duas noites que você não vai querer perder! Os participantes são convidados a curtir músicas, jogos e muito mais ao entardecer de 8 de maio, além de um show exclusivo no anfiteatro no dia 9 de maio. Comida e bebidas serão oferecidas em ambas as noites (bebidas alcoólicas disponíveis para maiores de 21 anos). Os dois eventos após as sessões serão realizados no Shoreline Amphitheatre. Será necessário apresentar o crachá de participante para entrar.</string>\n    <string name=\"faq_accessibility_needs_description\">Teremos espaços de estacionamento para gestantes na área preferencial.&lt;br&gt; Mães lactantes são bem-vindas a participar da conferência com seus filhos. Haverá quatro salas para mães abertas em 7 e 8 de maio, das 8h às 20h e no dia 9 de maio das 8h às 16h. Fichas de inscrição estarão disponíveis na entrada das salas para mães, e o uso será baseado na ordem de chegada. Entre em contato com nossa central de informações para mais detalhes.&lt;br&gt;&lt;br&gt; Um auxilio creche de US$ 100 por dia (não excedendo o total de US$ 300) será oferecido aos pais que manifestarem interesse em creche pelo nosso formulário de inscrição. A disponibilidade será por ordem de chegada. Nosso auxilio creche é disponibilizado por um fornecedor terceirizado. Caso sua solicitação para creche seja aprovada por nós por e-mail antes do início da conferência e seu comparecimento tenha sido confirmado, nosso fornecedor entrará em contato com você em até sete dias úteis após o Google I/O para os próximos passos. Eles coordenarão o reembolso do nosso auxílio creche.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Teremos espaços de estacionamento para gestantes na área preferencial.&lt;br&gt; Mães lactantes são bem-vindas a participar da conferência com seus filhos. Haverá quatro salas para mães abertas em 7 e 8 de maio, das 8h às 20h e no dia 9 de maio das 8h às 16h. Fichas de inscrição estarão disponíveis na entrada das salas para mães, e o uso será baseado na ordem de chegada. Entre em contato com nossa central de informações para mais detalhes.&lt;br&gt;&lt;br&gt; Um auxilio creche de US$ 100 por dia (não excedendo o total de US$ 300) será oferecido aos pais que manifestarem interesse em creche pelo nosso formulário de inscrição. A disponibilidade será por ordem de chegada. Nosso auxilio creche é disponibilizado por um fornecedor terceirizado. Caso sua solicitação para creche seja aprovada por nós por e-mail antes do início da conferência e seu comparecimento tenha sido confirmado, nosso fornecedor entrará em contato com você em até sete dias úteis após o Google I/O para os próximos passos. Eles coordenarão o reembolso do nosso auxílio creche.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">O Google quer proporcionar um evento inclusivo e sem assédio para todos os participantes, independentemente de aspectos como identidade e expressão de gênero, orientação sexual, deficiências, neurodiversidade, aparência física, tamanho do corpo, etnia, nacionalidade, raça, idade, religião ou outra categoria protegida. Em um esforço para tornar o evento o mais inclusivo possível, banheiros de gênero neutro serão disponibilizados no local.&lt;br&gt;&lt;br&gt; Não toleraremos nenhuma forma de assédio aos participantes do evento.&lt;br&gt; O Google leva violações destas políticas a sério e tomará as medidas apropriadas. Para mais informações sobre as Orientações à comunidade de eventos Google e Política de Antiassédio, acesse &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;este link&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">As duas palestras principais e todas as sessões serão transmitidas ao vivo na página inicial do site do evento durante os três dias de duração dele. Se estiver muito atarefado ou do outro lado do mundo, em que há uma diferença significativa de fuso horário, assista mais tarde às gravações das sessões no &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;canal Google Developers do YouTube.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Sim. A cada ano, desenvolvedores de todo o mundo apresentam eventos no &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended&lt;/a&gt;. Durante esses eventos, os organizadores podem transmitir ao vivo e apresentar suas próprias sessões, incluindo hackathons, codelabs, demos e muito mais.&lt;br&gt; Se você vai se unir a nós como um apresentador do I/O Extended neste ano, veja aqui os passos necessários para começar:&lt;br&gt;&lt;br&gt;  Leia o &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Guia do organizador&lt;/a&gt; para dicas e sugestões sobre como apresentar um evento de sucesso.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Registre&lt;/a&gt; seu evento público no site do I/O para aumentar sua visibilidade.&lt;br&gt;&lt;br&gt; Use a hashtag oficial #io19extended em todas suas postagens sociais relacionadas ao I/O Extended para facilitar sua descoberta.&lt;br&gt;&lt;br&gt; Observação: Apresentadores do I/O Extended podem solicitar a remoção dos seu dados pessoais e/ou do evento após o término do evento enviando um e-mail para io19@google.com.&lt;br&gt; Se você quer apenas participar de um evento I/O Extended, navegue pelo &lt;a href=\"https://events.google.com/io/extended\"&gt;nosso mapa&lt;/a&gt; para encontrar um e confirme sua presença!&lt;br&gt; Para perguntas sobre o programa I/O Extended, entre em contato pelo io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Ver sessões</string>\n    <string name=\"wifi_install_success\">Rede Wi-Fi salva</string>\n    <string name=\"wifi_install_clipboard_message\">Não foi possível salvar a rede Wi-Fi.\\nA senha foi salva na área de transferência.</string>\n    <string name=\"event_sessions_title\">Sessões</string>\n    <string name=\"event_sandbox_title\">Sandbox</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Horários para esclarecimento de dúvidas e avaliações de aplicativos</string>\n    <string name=\"event_afterhours_title\">Eventos após as sessões:</string>\n    <string name=\"event_meals_title\">Refeições</string>\n    <string name=\"event_sessions_description\">A partir de abril, participantes ao vivo poderão reservar assentos antecipados para sessões no site do I/O e através do app para dispositivos móveis do I/O (observação: uma parte dos assentos não será oferecida para reserva e serão disponibilizados por ordem de chegada no local). A participação nos Codelabs, Apps Reviews e Office Hours será baseada em ordem de chegada no local.</string>\n    <string name=\"event_sandbox_description\">Espaços dedicados para explorar, aprender e usar nossos produtos e plataformas mais recentes por meio de demonstrações interativas, instalações físicas e muito mais.</string>\n    <string name=\"event_codelabs_description\">Tenha uma experiência prática nos nossos quiosques de criação de código. Neles, você encontrará tudo de que precisa para aprender sobre as melhores e mais recentes tecnologias do Google por meio de tutoriais individualizados. Se preferir, você também pode trazer sua própria máquina e depois levar seu trabalho para casa. A equipe do Google estará à disposição para dar conselhos úteis e fornecer orientação se você precisar.</string>\n    <string name=\"event_officehours_description\">Os horários para esclarecimento de dúvidas são sua chance de conhecer pessoalmente os especialistas do Google e fazer todas as suas perguntas técnicas. Além disso, as avaliações de aplicativos oferecem a você a oportunidade de receber conselhos e dicas sobre seus projetos específicos relacionados a aplicativos.</string>\n    <string name=\"event_afterhours_description\">Após as sessões, no final do dia, fique em Shoreline para aproveitar duas noites de comida, bebida e diversão. Na primeira noite, a festa será no espaço Sandbox, e na segunda nós teremos um show exclusivo no anfiteatro.</string>\n    <string name=\"event_meals_description\">São oferecidos aos participantes café da manhã, almoço e lanches em todos os três dias da conferência. Também será servido jantar durante os eventos após as sessões dos dois primeiros dias.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Aplicativos relacionados</string>\n    <string name=\"event_types_header\">Tipos de evento</string>\n    <string name=\"settings_time_zone_label\">Eventos no fuso horário do Pacífico (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Ativar notificações</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Enviar estatísticas de uso anônimas</string>\n    <string name=\"settings_tos\">Termos de Serviço</string>\n    <string name=\"settings_privacy_policy\">Política de Privacidade</string>\n    <string name=\"settings_oss_licenses\">Licenças de código aberto</string>\n    <string name=\"settings_theme_title\">Escolher tema</string>\n    <string name=\"settings_theme_system\">Padrão do sistema</string>\n    <string name=\"settings_theme_light\">Leve</string>\n    <string name=\"settings_theme_dark\">Escuro</string>\n    <string name=\"settings_theme_battery\">Configurar por \"Economia de bateria\"</string>\n    <string name=\"built_with_material_components\">Criado com Material Components.</string>\n    <string name=\"wifi_network_and_password\">Rede: %1$s\\nSenha: %2$s</string>\n    <string name=\"join_network\">Participar da rede</string>\n    <string name=\"assistant_app_description\">Basta dizer \"Ok Google, fale sobre o Google I/O 19\"!</string>\n    <string name=\"assistant_app_description2\">Basta dizer \"Ok Google, fale sobre o Google I/O 19\"!</string>\n    <string name=\"speaker_link_website\">Site</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Eventos</string>\n    <string name=\"no_network_connection\">Sem conexão com a Internet.</string>\n    <string name=\"navigate_up\">Navegar para cima</string>\n    <string name=\"no_network_description\">Para usar a função \"Explorar o I/O\",:\\n\\n — Desative o modo avião\\n\\n — Desative os dados móveis ou o Wi-Fi\\n\\n — Verifique o sinal na sua área</string>\n    <string name=\"phone_does_not_support_arcore_title\">Seu smartphone não é compatível com o ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Tente outro dispositivo ou peça um emprestado a um amigo</string>\n    <string name=\"codelabs_information\">Aprenda sobre as maiores e mais recentes tecnologias do Google através de tutoriais individuais em nossos quiosques de criação de código. Se preferir, você também pode trazer sua própria máquina e depois levar seu trabalho para casa. Os quiosques ficarão abertos todos os dias, exceto durante a primeira palestra principal.</string>\n    <string name=\"codelabs_building\">Criação de codelabs</string>\n    <string name=\"codelabs_website\">Site do Codelabs</string>\n    <string name=\"codelab_duration\">Duração: %1$d min</string>\n    <string name=\"start_codelab\">Iniciar codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Расписание</string>\n    <string name=\"title_home\">Главная</string>\n    <string name=\"title_map\">Схема места проведения</string>\n    <string name=\"title_explore_io\">Тур по фестивалю в дополненной реальности</string>\n    <string name=\"title_info\">Информация</string>\n    <string name=\"filters\">Фильтры</string>\n    <string name=\"category_heading_tracks\">Темы</string>\n    <string name=\"category_heading_types\">Типы</string>\n    <string name=\"reset\">Сбросить</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"one\">%1$d мероприятие</item>\n        <item quantity=\"few\">%1$d мероприятия</item>\n        <item quantity=\"many\">%1$d мероприятий</item>\n        <item quantity=\"other\">%1$d мероприятия</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Сохраненные мероприятия</string>\n    <string name=\"starred_and_reserved_short\">Мои мероприятия</string>\n    <string name=\"search_schedule_hint\">Поиск по расписанию</string>\n    <string name=\"search_schedule_no_results\">Ничего не найдено</string>\n    <string name=\"agenda\">Расписание</string>\n    <string name=\"event_starred\">Мероприятие добавлено в ваше расписание</string>\n    <string name=\"event_unstarred\">Мероприятие удалено из вашего расписания.</string>\n    <string name=\"event_star_error\">Не удалось добавить мероприятие в расписание.</string>\n    <string name=\"reservation_error\">Не удалось изменить бронирование. Дождитесь подтверждения предыдущих запросов или повторите попытку позже.</string>\n    <string name=\"reservation_request_succeeded\">Запрос на бронирование места отправлен.</string>\n    <string name=\"reservation_cancel_succeeded\">Бронирование места на сессии \"&lt;b&gt;%s&lt;/b&gt;\" отменено.</string>\n    <string name=\"reservation_new\">Место на сессии \"&lt;b&gt;%s&lt;/b&gt;\" забронировано.</string>\n    <string name=\"reservation_replaced\">Мероприятие заменено.</string>\n    <string name=\"waitlist_new\">Вы добавлены в список ожидания.</string>\n    <string name=\"waitlist_cancel_succeeded\">Вы удалены из списка ожидания.</string>\n    <string name=\"got_it\">ОК</string>\n    <string name=\"dont_show\">Не показывать</string>\n    <string name=\"reservation_denied_cutoff\">Запрос на бронирование отклонен, так как до сессии осталось слишком мало времени.</string>\n    <string name=\"reservation_denied_clash\">Запрос на бронирование отклонен, так как в вашем расписании уже есть мероприятие на указанное время.</string>\n    <string name=\"reservation_denied_unknown\">Запрос на бронирование отклонен из-за неизвестной ошибки.</string>\n    <string name=\"cancellation_denied_cutoff\">Запрос на отмену бронирования отклонен, так как до сессии осталось слишком мало времени.</string>\n    <string name=\"cancellation_denied_unknown\">Запрос на отмену бронирования отклонен из-за неизвестной ошибки.</string>\n    <string name=\"schedule_filters_empty\">Мероприятий нет.</string>\n    <string name=\"reservation_reservable\">Забронировать место</string>\n    <string name=\"reservation_reserved\">Место забронировано</string>\n    <string name=\"reservation_waitlisted\">В списке ожидания</string>\n    <string name=\"reservation_waitlist_available\">Отправить запрос на добавление в список ожидания</string>\n    <string name=\"reservation_disabled\">Бронирование недоступно</string>\n    <string name=\"reservation_pending\">Запрос на бронирование рассматривается</string>\n    <string name=\"schedule_hint_title\">Составьте свое расписание</string>\n    <string name=\"schedule_hint_star_event\">Добавить в расписание</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Забронировать место на сессии</string>\n    <string name=\"rate_session\">Оценить сессию</string>\n    <string name=\"menu_item_session_location\">Место проведения сессии</string>\n    <string name=\"menu_item_session_star\">Добавить сессию в расписание</string>\n    <string name=\"menu_item_calendar\">Добавить в календарь</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Выступающие</string>\n    <string name=\"session_detail_related_header\">Похожие мероприятия</string>\n    <string name=\"feedback_submit\">Отправить</string>\n    <string name=\"feedback_thank_you\">Благодарим за отзыв!</string>\n    <string name=\"feedback_q1_text\">Как бы Вы оценили мероприятие в целом?</string>\n    <string name=\"feedback_q2_text\">Насколько мероприятие, которое Вы посетили, соответствовало Вашим ожиданиям и информации о нем?</string>\n    <string name=\"feedback_q3_text\">Насколько то, что Вы узнали, поможет Вам в реализации проектов?</string>\n    <string name=\"feedback_q4_text\">Насколько то, что Вы узнали, поможет Вам в реализации проектов?</string>\n    <string name=\"feedback_q1_label_start\">Обычное</string>\n    <string name=\"feedback_q2_label_start\">Не оправдало ожиданий</string>\n    <string name=\"feedback_q3_label_start\">Плохо</string>\n    <string name=\"feedback_q4_label_start\">Почти не поможет</string>\n    <string name=\"feedback_q1_label_end\">Потрясающе</string>\n    <string name=\"feedback_q2_label_end\">Превзошло ожидания</string>\n    <string name=\"feedback_q3_label_end\">Значительно поможет</string>\n    <string name=\"feedback_q4_label_end\">Значительно поможет</string>\n    <string name=\"a11y_show_navigation\">Показать меню навигации</string>\n    <string name=\"a11y_collapse_filters_sheet\">Свернуть список фильтров</string>\n    <string name=\"a11y_clear_tag_filters\">Удалить фильтры</string>\n    <string name=\"a11y_filter_applied\">Применен фильтр: %1s</string>\n    <string name=\"a11y_filter_not_applied\">Фильтр \"%1s\" не применен</string>\n    <string name=\"a11y_reservation_available\">Забронировать место на мероприятии</string>\n    <string name=\"a11y_reservation_reserved\">Место забронировано</string>\n    <string name=\"a11y_reservation_disabled\">Бронирование недоступно</string>\n    <string name=\"a11y_reservation_wait_list_available\">Отправить запрос на добавление в список ожидания</string>\n    <string name=\"a11y_reservation_wait_listed\">Запрос на добавление в список ожидания отправлен</string>\n    <string name=\"a11y_reservation_pending\">Запрос на бронирование рассматривается</string>\n    <string name=\"a11y_starred\">Мероприятие добавлено в закладки</string>\n    <string name=\"a11y_unstarred\">Мероприятие не добавлено в закладки</string>\n    <string name=\"a11y_star\">Добавить в расписание или удалить из него</string>\n    <string name=\"a11y_play\">Посмотреть видео</string>\n    <string name=\"a11y_select_map_mode\">Задать параметры карты</string>\n    <string name=\"a11y_search_schedule\">Поиск расписания</string>\n    <string name=\"welcome\">Добро пожаловать!</string>\n    <string name=\"a11y_signed_in_content_description\">Вы вошли в аккаунт %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Нажмите, чтобы войти.</string>\n    <string name=\"dialog_sign_in_content\">Тогда вы сможете добавлять мероприятия в свое расписание, бронировать места и оценивать сессии. Сведения обо всех действиях, которые вы выполните в аккаунте, будут доступны как в приложении, так и на сайте.</string>\n    <string name=\"sign_in\">Войти</string>\n    <string name=\"firebase_auth_no_network_connection\">Нет подключения к Интернету.</string>\n    <string name=\"firebase_auth_unknown_error\">Неизвестная ошибка.</string>\n    <string name=\"dialog_sign_out_content\">Данные о ваших оценках, добавленных в расписание мероприятиях и забронированных местах будут сохранены.</string>\n    <string name=\"sign_out\">Выйти</string>\n    <string name=\"manage_google_account\">Настроить аккаунт Google</string>\n    <string name=\"remove_reservation_title\">Отменить бронирование?</string>\n    <string name=\"remove_reservation_content\">Если вы сделаете это, занять место на сессии \"%1$s\" можно будет только в порядке живой очереди.</string>\n    <string name=\"cancel\">Отменить</string>\n    <string name=\"remove\">Удалить</string>\n    <string name=\"swap_reservation_title\">Заменить бронирование?</string>\n    <string name=\"swap_reservation_content\">Ранее вы уже забронировали место на сессии \"%1$s\", которая будет проходить в то же время, что и сессия \"%2$s\". Если вы подадите заявку на участие в последнем мероприятии, предыдущая броня будет снята.</string>\n    <string name=\"swap\">Заменить</string>\n    <string name=\"notifications_preference_dialog_title\">Уведомления о фестивале</string>\n    <string name=\"notifications_preference_dialog_content\">Если вы включите уведомления, мы будем сообщать вам о начале сессий и появлении записей с них, а также о развлекательных мероприятиях и других важных новостях фестиваля. Изменить параметры уведомлений можно будет в любое время в разделе \"Информация\" в настройках.</string>\n    <string name=\"no\">Нет</string>\n    <string name=\"yes\">Да</string>\n    <string name=\"feed_not_available\">Новостей нет.</string>\n    <string name=\"feed_loading_error\">Не удалось загрузить фид. Повторите попытку позже.</string>\n    <string name=\"feed_announcement_title\">Новости</string>\n    <string name=\"feed_upcoming_events\">Предстоящие мероприятия</string>\n    <string name=\"feed_saved_events\">Сохраненные мероприятия</string>\n    <string name=\"feed_no_saved_events\">У вас нет сохраненных мероприятий</string>\n    <string name=\"feed_view_all_events\">Показать все мероприятия</string>\n    <string name=\"feed_view_your_schedule\">Посмотреть расписание</string>\n    <string name=\"feed_watch_live_stream\">Смотреть трансляцию</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"one\">%s день</item>\n        <item quantity=\"few\">%s дня</item>\n        <item quantity=\"many\">%s дней</item>\n        <item quantity=\"other\">%s дня</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"one\">%s час</item>\n        <item quantity=\"few\">%s часа</item>\n        <item quantity=\"many\">%s часов</item>\n        <item quantity=\"other\">%s часа</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"one\">%s минута</item>\n        <item quantity=\"few\">%s минуты</item>\n        <item quantity=\"many\">%s минут</item>\n        <item quantity=\"other\">%s минуты</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"one\">%s секунда</item>\n        <item quantity=\"few\">%s секунды</item>\n        <item quantity=\"many\">%s секунд</item>\n        <item quantity=\"other\">%s секунды</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Поделиться сессией</string>\n    <string name=\"share_text_session_detail\">Узнайте о сессии \"%1$s\" на фестивале #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Поделиться</string>\n    <string name=\"map_variant_after_dark\">Ночной режим</string>\n    <string name=\"map_variant_concert\">Концерт</string>\n    <string name=\"map_variant_daytime\">Дневной режим</string>\n    <string name=\"enable_my_location\">Открыть доступ к геоданным</string>\n    <string name=\"my_location_rationale\">Разрешите доступ к своему местоположению, чтобы мы могли показывать вам его на карте.</string>\n    <string name=\"onboarding_get_started\">Начать</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Добро пожаловать на фестиваль Google I/O</string>\n    <string name=\"onboarding_date_location\">7–9 мая 2019 г.,\\nМаунтин-Вью, Калифорния</string>\n    <string name=\"onboarding_label_days\">д.</string>\n    <string name=\"onboarding_label_hours\">ч.</string>\n    <string name=\"onboarding_label_mins\">м.</string>\n    <string name=\"onboarding_label_seconds\">с.</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Фестиваль Google I/O начнется совсем скоро</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Посмотрите резюме Google I/O 2019 и узнайте, что говорят о конференции в социальных сетях, с помощью хештега #io19</string>\n    <string name=\"onboarding_signin\">Войдите в аккаунт, чтобы получать уведомления о фестивале и бронировать места на мероприятия.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"one\">Сессия начнется через %1$s минуту</item>\n        <item quantity=\"few\">Сессия начнется через %1$s минуты</item>\n        <item quantity=\"many\">Сессия начнется через %1$s минут</item>\n        <item quantity=\"other\">Сессия начнется через %1$s минуты</item>\n    </plurals>\n    <string name=\"expanded\">Развернуто</string>\n    <string name=\"collapsed\">Свернуто</string>\n    <string name=\"event_title\">Мероприятие</string>\n    <string name=\"travel_title\">Полезные сведения</string>\n    <string name=\"faq_title\">Часто задаваемые вопросы</string>\n    <string name=\"settings_title\">Настройки</string>\n    <string name=\"about_title\">О нас</string>\n    <string name=\"travel_what_to_bring_title\">Что взять на фестиваль</string>\n    <string name=\"travel_hotels_title\">Отели</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Как добраться до Маунтин-Вью</string>\n    <string name=\"travel_getting_to_shoreline_title\">Как добраться до Маунтин-Вью</string>\n    <string name=\"travel_shuttle_service_title\">Трансфер</string>\n    <string name=\"travel_off_site_parking_title\">Парковка за пределами площадки фестиваля</string>\n    <string name=\"travel_for_public_transportation_title\">Общественный транспорт</string>\n    <string name=\"travel_biking_title\">Велосипеды</string>\n    <string name=\"travel_ridesharing_title\">Совместные поездки</string>\n    <string name=\"travel_airport_transfers_title\">Трансфер в аэропорт</string>\n    <string name=\"travel_what_to_bring_description\">Фестиваль Google I/O проходит под открытым небом. Благодаря этому на конференции царит непринужденная атмосфера. Мероприятия будут проходить в шатрах с управляемыми микроклиматом, но в остальное время рекомендуем носить солнцезащитные очки и пользоваться кремами с SPF даже вечером. На фестивале нет дресс-кода, однако при выборе одежды не забывайте учесть погоду Калифорнии.</string>\n    <string name=\"travel_hotels_description\">У вас будет возможность остановиться в одном из отелей поблизости. Список гостиниц и сведения о наличии мест будут постоянно обновляться. Вы можете выбрать удобный для вас отель с помощью карты ниже. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Карта&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Добраться до города Маунтин-Вью можно самолетом. Удобнее всего прилетать в следующие международные аэропорты, расположенные в области Южного залива Сан-Франциско:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Аэропорт Сан-Франциско (SFO)&lt;/a&gt; около 39 км&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Аэропорт Окленда (OAK)&lt;/a&gt; около 52 км&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Аэропорт Сан-Хосе (SJC)&lt;/a&gt; около 19 км</string>\n    <string name=\"travel_getting_to_shoreline_description\">Чтобы избежать скопления транспорта и сократить выбросы углекислого газа в атмосферу, мы объявляем Google I/O 2019 мероприятием, для которого не будет организована парковка*. Это обдуманное решение, и в качестве альтернативы мы предлагаем несколько способов добраться до места проведения фестиваля бесплатно и без автомобиля.&lt;br&gt;&lt;br&gt;Более подробную информацию об этом мы предоставим ближе ко дню начала фестиваля.&lt;br&gt;&lt;br&gt;*Парковочные места будут доступны только для людей с ограниченными возможностями и беременных женщин.</string>\n    <string name=\"travel_shuttle_service_description\">Чтобы избежать скопления транспорта и сократить выбросы углекислого газа в атмосферу, мы объявляем Google I/O 2019 мероприятием, для которого не будет организована парковка*. Это обдуманное решение, и в качестве альтернативы мы предлагаем несколько способов добраться до места проведения фестиваля бесплатно и без автомобиля.&lt;br&gt;&lt;br&gt;Более подробную информацию об этом мы предоставим ближе ко дню начала фестиваля.&lt;br&gt;&lt;br&gt;*Парковочные места будут доступны только для людей с ограниченными возможностями и беременных женщин.</string>\n    <string name=\"travel_off_site_parking_description\">Участники фестиваля смогут бесплатно пользоваться парковкой стадиона &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt;. От стадиона до места проведения фестиваля будет организован трансфер.&lt;br&gt;&lt;br&gt; Если вам необходимы особая помощь или транспортное средство для перевозки людей с ограниченными возможностями, укажите это в форме регистрации. Наши специалисты по планированию мероприятий свяжутся с вами напрямую.</string>\n    <string name=\"travel_for_public_transportation_description\">Во время предварительной регистрации можно получить проездной билет. Добраться до фестиваля на общественном транспорте можно несколькими способами:&lt;br&gt;&lt;br&gt;&lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;. Региональная система пригородных поездов.&lt;br&gt;&lt;br&gt;&lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;. Легкорельсовая транспортная система, обслуживающая область Южного залива Лос-Анджелеса.&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;. Система скоростных электропоездов в области залива Сан-Франциско.&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;. Региональная железнодорожная система.&lt;br&gt;&lt;br&gt;Прямых маршрутов до места проведения фестиваля нет, поэтому будет организован трансфер. Позже мы расскажем о нем подробнее. Следите за новостями!</string>\n    <string name=\"travel_biking_description\">Велосипедисты могут добраться до амфитеатра по одной из двух дорожек: Stevens Creek Trail или Permanente Creek Trail. Посмотреть, где они находятся, можно в Google Картах.&lt;br&gt;&lt;br&gt;Кроме того, ежедневно с 7 часов утра и до окончания мероприятий будет работать пункт парковки от организации Silicon Valley Bicycle Coalition.</string>\n    <string name=\"travel_ridesharing_description\">В последний день фестиваля участникам будет предоставляться трансфер в аэропорты Сан-Франциско (SFO) и Сан-Хосе (SJC). В другие дни он не предусмотрен.</string>\n    <string name=\"travel_airport_transfers_description\">В последний день фестиваля участникам будет предоставляться трансфер в аэропорты Сан-Франциско (SFO) и Сан-Хосе (SJC). В другие дни он не предусмотрен.</string>\n    <string name=\"faq_when_and_where_title\">Где и когда будет проходить фестиваль?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Где можно узнать последние новости о фестивале Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Все ли сессии будут проходить на английском языке?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Можно ли бронировать места на мероприятия до начала конференции?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Как удобнее всего добираться до Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Где и когда можно получить значок участника?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">На презентации я хочу сидеть в первом ряду. Что вы мне посоветуете?</string>\n    <string name=\"faq_what_should_i_wear_title\">Будет ли на фестивале дресс-код?</string>\n    <string name=\"faq_onsite_food_options_title\">Чем можно будет перекусить в ходе мероприятий?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Будет ли работать бюро находок?</string>\n    <string name=\"faq_after_dark_program_title\">Что входит в программу развлекательных мероприятий?</string>\n    <string name=\"faq_accessibility_needs_title\">Как обеспечивается доступность фестиваля для участников с ограниченными возможностями?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Предусмотрены ли на фестивале удобства для беременных женщин и родителей с маленькими детьми?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Правила Google в отношении неподобающего поведения и проведения мероприятий</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">У меня не получится посетить интересную сессию. Можно ли будет посмотреть ее в записи?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Я хочу принять активное участие в фестивале вместе со своей командой.  Можно ли это сделать?</string>\n    <string name=\"faq_when_and_where_description\">Расписание мероприятий и информация о них есть на &lt;a href=\"https://events.google.com/io/\"&gt;сайте фестиваля&lt;/a&gt;, в &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;блоге для разработчиков&lt;/a&gt; и в социальных сетях &lt;a href=\"https://twitter.com/googledevs\"&gt;Твиттер&lt;/a&gt; и &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Найти записи о фестивале можно по хештегу &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Помимо этого, незадолго до конференции участникам придут письма со всей необходимой информацией, в том числе о том, как пройти регистрацию.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Расписание мероприятий и информация о них есть на &lt;a href=\"https://events.google.com/io/\"&gt;сайте фестиваля&lt;/a&gt;, в &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;блоге для разработчиков&lt;/a&gt; и в социальных сетях &lt;a href=\"https://twitter.com/googledevs\"&gt;Твиттер&lt;/a&gt; и &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Найти записи о фестивале можно по хештегу &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Помимо этого, незадолго до конференции участникам придут письма со всей необходимой информацией, в том числе о том, как пройти регистрацию.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Да. Поскольку английский – международный язык, все ведущие будут выступать именно на нем.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Если вы планируете посетить фестиваль лично, забронировать места на сессиях можно уже в апреле на нашем сайте или в приложении. Обратите внимание, что часть мест будет продана непосредственно перед сессиями. Бронирование мест на занятия в формате Codelab и персональные консультации не предусмотрено: регистрация на них проходит в порядке живой очереди.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Ответ на этот вопрос можно найти в разделе \"Полезные сведения\". Там же представлены информация о трансфере, схема проезда на автомобиле и велосипеде, а также сведения о райдшеринге.</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Получить значок участника фестиваля Google I/O вы сможете в здании Shoreline Amphitheatre начиная с 6 мая. Вот как это будет происходить:&lt;br&gt; – Во-первых, потребуется ваше удостоверение личности. В документе должна быть ваша фотография, а указанное в нем имя должно совпадать с именем, предоставленным при регистрации. Это обязательное условие, чтобы попасть на фестиваль. Студентам и сотрудникам учебных заведений также необходимо будет показать удостоверение, подтверждающее этот статус.&lt;br&gt; – Вам также понадобится QR-код, который мы отправили на ваш адрес электронной почты после регистрации. Мы можем считать код с экрана вашего телефона, поэтому распечатывать письмо не нужно. #бережемприроду &lt;br&gt;&lt;br&gt;Значок не подлежит передаче другим лицам, а в случае потери его нельзя восстановить или заменить. Участники фестиваля должны иметь при себе значок при посещении всех мероприятий, в том числе сессий, тестирований и развлекательных программ, и предъявлять его по требованию службы безопасности. На значке Google I/O могут быть напечатаны ваше имя, фотография и название компании, в которой вы работаете.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Мы советуем приходить на регистрацию заранее. Дело в том, что лучшие места на презентации можно забронировать при получении значка участника. Регистрация начнется 6 мая в 07:00 и будет проходить в порядке живой очереди.</string>\n    <string name=\"faq_what_should_i_wear_description\">Дресс-код для участников фестиваля не предусмотрен. Однако, поскольку мероприятия будут проходить на улице, мы советуем учесть, что днем в области залива Сан-Франциско очень жарко, а вечером прохладно.</string>\n    <string name=\"faq_onsite_food_options_description\">Беспокоиться о питании не стоит.  Участникам предлагаются бесплатные завтрак, обед и закуски на протяжении всех трех дней фестиваля. В первые два дня в рамках развлекательной программы также будет организован ужин.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Да, но только во время проведения мероприятий. Оно будет расположено в справочном центре фестиваля. Все потерянные вещи, которые владельцы не заберут в течение дня, будут переданы в службу безопасности. Обратите внимание, что значок участника восстановлению не подлежит. Если вы потеряете его, то не сможете попасть на площадку фестиваля.</string>\n    <string name=\"faq_after_dark_program_description\">8 и 9 мая для участников фестиваля предусмотрена вечерняя развлекательная программа в здании Shoreline Amphitheatre. Посетителям будут предоставлены еда и напитки, в том числе алкогольные (только тем, кому уже исполнился 21 год). При посещении мероприятий необходимо иметь при себе значок.</string>\n    <string name=\"faq_accessibility_needs_description\">Беременные женщины могут оставить автомобили в зоне парковки для людей с ограниченными возможностями.&lt;br&gt;Для посетителей с маленькими детьми выделены четыре отдельных комнаты. Вот часы их работы: 7 и 8 мая с 08:00 до 20:00, 9 мая с 08:00 до 16:00. Посещение осуществляется по предварительной записи в порядке живой очереди. Записаться можно у входа в комнату. Более подробную информацию об этом предоставляют в справочном центре.&lt;br&gt;&lt;br&gt;Заполняя регистрационную форму, родители могут указать, что хотят получить возмещение расходов на уход за детьми. За каждый день мероприятия мы предлагаем сумму в размере 100 долл. США (всего не более 300 долл. США). Возместить расходы могут только те родители, чья заявка будет одобрена по электронной почте до начала конференции, и чье присутствие на ней подтвердится. Всеми выплатами будет заниматься сторонняя компания. В течение семи дней после завершения конференции ее сотрудники свяжутся с вами и передадут дальнейшие инструкции.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Беременные женщины могут оставить автомобили в зоне парковки для людей с ограниченными возможностями.&lt;br&gt;Для посетителей с маленькими детьми выделены четыре отдельных комнаты. Вот часы их работы: 7 и 8 мая с 08:00 до 20:00, 9 мая с 08:00 до 16:00. Посещение осуществляется по предварительной записи в порядке живой очереди. Записаться можно у входа в комнату. Более подробную информацию об этом предоставляют в справочном центре.&lt;br&gt;&lt;br&gt;Заполняя регистрационную форму, родители могут указать, что хотят получить возмещение расходов на уход за детьми. За каждый день мероприятия мы предлагаем сумму в размере 100 долл. США (всего не более 300 долл. США). Возместить расходы могут только те родители, чья заявка будет одобрена по электронной почте до начала конференции, и чье присутствие на ней подтвердится. Всеми выплатами будет заниматься сторонняя компания. В течение семи дней после завершения конференции ее сотрудники свяжутся с вами и передадут дальнейшие инструкции.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">На мероприятиях Google нет места неподобающему поведению. Мы стремимся к тому, чтобы каждый посетитель чувствовал себя комфортно, вне зависимости от его половой идентификации, сексуальной ориентации, уровня трудоспособности, принадлежности к аутическому спектру, внешнего вида, этнической принадлежности, расы, возраста, религиозных убеждений и других особенностей. Как и в прошлом году, на территории фестиваля есть гендерно-нейтральные уборные.&lt;br&gt;&lt;br&gt;Мы категорически не допускаем проявления агрессии в отношении посетителей мероприятия.&lt;br&gt;Если мы выявим любое нарушение, то примем соответствующие меры. Узнать больше о Правилах Google в отношении проведения мероприятий и неподобающего поведения можно на &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;этой странице&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">У вас нет возможности посетить фестиваль лично? Ничего страшного. Присоединяйтесь к нам через Интернет. Две презентации и все сессии можно будет посмотреть в прямом эфире на сайте I/O. Сессии также будут доступны в записи на канале YouTube &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Да! Каждый год разработчики со всего мира организовывают &lt;a href=\"https://events.google.com/io/extended\"&gt;мероприятия Google I/O Extended&lt;/a&gt;, в рамках которых они проводят собственные сессии и смотрят прямые трансляции фестиваля. &lt;br&gt; Хотите стать ведущим такого события? &lt;br&gt;&lt;br&gt;Ознакомьтесь с &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;этими материалами&lt;/a&gt;. Там вы найдете советы о том, что нужно сделать, чтобы провести успешное мероприятие.&lt;br&gt;&lt;br&gt; Далее &lt;a href=\"https://events.google.com/io/extended/form\"&gt;зарегистрируйте&lt;/a&gt; свое событие на сайте конференции.&lt;br&gt;&lt;br&gt; Кроме того, продвигайте мероприятие в социальных сетях, используя официальный хештэг фестиваля #io19extended специально для Google I/O Extended.&lt;br&gt;&lt;br&gt; Примечание. Организаторы I/O Extended могут попросить компанию Google удалить их личные данные или сведения о мероприятии после его завершения. Для этого нужно написать нам на адрес io19@google.com.&lt;br&gt; Хотите просто поучаствовать в таком мероприятии? Откройте &lt;a href=\"https://events.google.com/io/extended\"&gt;эту карту&lt;/a&gt;, найдите событие рядом с вами и зарегистрируйтесь.&lt;br&gt; Остались вопросы о программе I/O Extended? Напишите нам на адрес io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Показать сессии</string>\n    <string name=\"wifi_install_success\">Сеть Wi-Fi сохранена.</string>\n    <string name=\"wifi_install_clipboard_message\">Не удалось сохранить сеть Wi-Fi.\\nПароль от сети Wi-Fi скопирован в буфер обмена.</string>\n    <string name=\"event_sessions_title\">Сеансы</string>\n    <string name=\"event_sandbox_title\">Тестирования</string>\n    <string name=\"event_codelabs_title\">Мероприятия в формате Codelab</string>\n    <string name=\"event_officehours_title\">Персональные консультации</string>\n    <string name=\"event_afterhours_title\">Развлекательные мероприятия</string>\n    <string name=\"event_meals_title\">Питание</string>\n    <string name=\"event_sessions_description\">Бронировать места на сессиях можно уже в апреле через наш сайт или мобильное приложение. Обратите внимание, что часть мест будет продана непосредственно перед сессиями. Бронирование мест на занятия в формате Codelab и персональные консультации не предусмотрено: регистрация на них проходит в порядке живой очереди.</string>\n    <string name=\"event_sandbox_description\">В специально оборудованных для этого помещениях мы покажем, как работают наши новейшие технологические достижения.</string>\n    <string name=\"event_codelabs_description\">Вы сможете самостоятельно протестировать наши новейшие разработки используя готовые коды, а если потребуется, обратиться за помощью к нашим специалистам.</string>\n    <string name=\"event_officehours_description\">Вы сможете обсудить со специалистами Google технические аспекты создания приложений, узнать авторитетное мнение о своих проектах и получить советы о том, как их улучшить.</string>\n    <string name=\"event_afterhours_description\">Для участников фестиваля предусмотрена развлекательная программа. В первый день вы сможете посетить вечеринку в пространстве для тестирования, а во второй – концерт в здании амфитеатра.</string>\n    <string name=\"event_meals_description\">Участникам предлагаются бесплатные завтрак, обед и закуски на протяжении всех трех дней фестиваля. В первые два дня в рамках развлекательной программы также будет организован ужин.</string>\n    <string name=\"wifi_header\">Сведения о Wi-Fi</string>\n    <string name=\"related_apps_header\">Похожие приложения</string>\n    <string name=\"event_types_header\">Типы мероприятий</string>\n    <string name=\"settings_time_zone_label\">Тихоокеанский часовой пояс (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Включить уведомления</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Отправлять анонимную статистику использования</string>\n    <string name=\"settings_tos\">Условия использования</string>\n    <string name=\"settings_privacy_policy\">Политика конфиденциальности</string>\n    <string name=\"settings_oss_licenses\">Посмотреть лицензии ПО с открытым исходным кодом</string>\n    <string name=\"settings_theme_title\">Выберите тему</string>\n    <string name=\"settings_theme_system\">Системное значение по умолчанию</string>\n    <string name=\"settings_theme_light\">Светлый режим</string>\n    <string name=\"settings_theme_dark\">Ночной режим</string>\n    <string name=\"settings_theme_battery\">Учитывать режим энергосбережения</string>\n    <string name=\"built_with_material_components\">В приложении использованы элементы Material Design.</string>\n    <string name=\"wifi_network_and_password\">Название сети Wi-Fi: %1$s\\nПароль: %2$s</string>\n    <string name=\"join_network\">Присоединиться к сети</string>\n    <string name=\"assistant_app_description\">Просто скажите: \"Окей, Google, открой Google I/O 19\".</string>\n    <string name=\"assistant_app_description2\">Просто скажите: \"Окей, Google, открой Google I/O 19\".</string>\n    <string name=\"speaker_link_website\">Сайт</string>\n    <string name=\"speaker_link_twitter\">Твиттер</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Мероприятия</string>\n    <string name=\"no_network_connection\">Нет подключения к Интернету.</string>\n    <string name=\"navigate_up\">Перейти вверх</string>\n    <string name=\"no_network_description\">Чтобы запустить экскурсию по фестивалю в дополненной реальности, попробуйте сделать следующее:\\n\\n - Отключите режим полета.\\n\\n - Включите передачу мобильных данных или настройте соединение с Wi-Fi.\\n\\n - Убедитесь, что уровень сигнала достаточный.</string>\n    <string name=\"phone_does_not_support_arcore_title\">На вашем телефоне приложение ARCore не поддерживается</string>\n    <string name=\"phone_does_not_support_arcore_message\">Попробуйте использовать другое устройство.</string>\n    <string name=\"codelabs_information\">Вы сможете самостоятельно протестировать наши новейшие разработки, используя готовые коды. Работать можно как на нашем оборудовании, так и на своих устройствах. Все материалы можно при желании забрать с собой. Возможность поработать с кодами доступна во все дни фестиваля, кроме времени проведения первой презентации.</string>\n    <string name=\"codelabs_building\">Мероприятия в формате Codelabs</string>\n    <string name=\"codelabs_website\">Сайт занятий в формате Codelab</string>\n    <string name=\"codelab_duration\">Продолжительность: %1$d мин.</string>\n    <string name=\"start_codelab\">Начать практическую работу</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-sw384dp/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <dimen name=\"nav_drawer_width\">320dp</dimen>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-th/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">กำหนดการ</string>\n    <string name=\"title_home\">หน้าแรก</string>\n    <string name=\"title_map\">แผนที่</string>\n    <string name=\"title_explore_io\">สำรวจ I/O</string>\n    <string name=\"title_info\">ข้อมูล</string>\n    <string name=\"filters\">ตัวกรอง</string>\n    <string name=\"category_heading_tracks\">หัวข้อ</string>\n    <string name=\"category_heading_types\">ประเภท</string>\n    <string name=\"reset\">รีเซ็ต</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"other\">%1$d กิจกรรม</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">กิจกรรมที่ติดดาวและจองไว้</string>\n    <string name=\"starred_and_reserved_short\">กิจกรรมของคุณ</string>\n    <string name=\"search_schedule_hint\">ค้นหากำหนดการ</string>\n    <string name=\"search_schedule_no_results\">ไม่พบผลลัพธ์</string>\n    <string name=\"agenda\">กำหนดการ</string>\n    <string name=\"event_starred\">เพิ่มกิจกรรมลงในรายการที่ติดดาวแล้ว</string>\n    <string name=\"event_unstarred\">นำกิจกรรมออกจากรายการที่ติดดาวแล้ว</string>\n    <string name=\"event_star_error\">เกิดข้อผิดพลาดในการเพิ่มกิจกรรมไปยังรายการที่ติดดาว</string>\n    <string name=\"reservation_error\">เกิดข้อผิดพลาดในการแก้ไขการจอง โปรดรอให้คำขอก่อนหน้าเสร็จสิ้นหรือลองอีกครั้งภายหลัง</string>\n    <string name=\"reservation_request_succeeded\">ส่งคำขอการจองแล้ว</string>\n    <string name=\"reservation_cancel_succeeded\">การจองที่ยกเลิก: \"&lt;b&gt;%s&lt;/b&gt;\"</string>\n    <string name=\"reservation_new\">ระบบได้จองที่นั่งสำหรับ \"&lt;b&gt;%s&lt;/b&gt;\" แล้ว</string>\n    <string name=\"reservation_replaced\">แทนที่กิจกรรมแล้ว</string>\n    <string name=\"waitlist_new\">คุณอยู่ในรายชื่อรอเรียกแล้ว</string>\n    <string name=\"waitlist_cancel_succeeded\">นำออกจากรายชื่อรอเรียกแล้ว</string>\n    <string name=\"got_it\">รับทราบ</string>\n    <string name=\"dont_show\">ไม่แสดง</string>\n    <string name=\"reservation_denied_cutoff\">การจองถูกปฏิเสธ: ใกล้กับเวลาเริ่มต้นเกินไป</string>\n    <string name=\"reservation_denied_clash\">การจองถูกปฏิเสธ: ทับซ้อนกับอีกการจองหนึ่ง</string>\n    <string name=\"reservation_denied_unknown\">การจองถูกปฏิเสธ: เกิดข้อผิดพลาดที่ไม่รู้จัก</string>\n    <string name=\"cancellation_denied_cutoff\">การยกเลิกถูกปฏิเสธ: ใกล้กับเวลาเริ่มต้นเกินไป</string>\n    <string name=\"cancellation_denied_unknown\">การยกเลิกถูกปฏิเสธ: เกิดข้อผิดพลาดที่ไม่รู้จัก</string>\n    <string name=\"schedule_filters_empty\">ไม่พบกิจกรรม</string>\n    <string name=\"reservation_reservable\">จองที่นั่ง</string>\n    <string name=\"reservation_reserved\">จองแล้ว</string>\n    <string name=\"reservation_waitlisted\">อยู่ในรายชื่อรอเรียก</string>\n    <string name=\"reservation_waitlist_available\">เข้าร่วมรายชื่อรอเรียก</string>\n    <string name=\"reservation_disabled\">การจองไม่พร้อมใช้งาน</string>\n    <string name=\"reservation_pending\">การจองรอดำเนินการ</string>\n    <string name=\"schedule_hint_title\">ปรับแต่งกำหนดการ</string>\n    <string name=\"schedule_hint_star_event\">เพิ่มไปยังกิจกรรมที่ติดดาว</string>\n    <string name=\"schedule_hint_reserve_session_seat\">จองที่นั่งสำหรับเข้าชม</string>\n    <string name=\"rate_session\">ให้คะแนนเซสชัน</string>\n    <string name=\"menu_item_session_location\">ตำแหน่งที่ตั้งของเซสชัน</string>\n    <string name=\"menu_item_session_star\">ติดดาวเซสชัน</string>\n    <string name=\"menu_item_calendar\">เพิ่มในปฏิทิน</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">ลำโพง</string>\n    <string name=\"session_detail_related_header\">กิจกรรมที่เกี่ยวข้อง</string>\n    <string name=\"feedback_submit\">ส่ง</string>\n    <string name=\"feedback_thank_you\">ขอขอบคุณสำหรับความคิดเห็นของคุณ</string>\n    <string name=\"feedback_q1_text\">คุณจะให้คะแนนคุณภาพโดยรวมของเซสชันเท่าใด</string>\n    <string name=\"feedback_q2_text\">คุณจะอธิบายถึงเนื้อหาของเซสชันโดยอ้างอิงตามความคาดหวัง/คำอธิบายของเซสชันอย่างไร</string>\n    <string name=\"feedback_q3_text\">เซสชันมีความเกี่ยวข้องกับโปรเจ็กต์ของคุณอย่างไร</string>\n    <string name=\"feedback_q4_text\">เซสชันมีความเกี่ยวข้องกับโปรเจ็กต์ของคุณอย่างไร</string>\n    <string name=\"feedback_q1_label_start\">ธรรมดามาก</string>\n    <string name=\"feedback_q2_label_start\">แย่</string>\n    <string name=\"feedback_q3_label_start\">แย่</string>\n    <string name=\"feedback_q4_label_start\">ไม่เกี่ยวข้องมากนัก</string>\n    <string name=\"feedback_q1_label_end\">ยอดเยี่ยมมาก</string>\n    <string name=\"feedback_q2_label_end\">ยอดเยี่ยมมาก</string>\n    <string name=\"feedback_q3_label_end\">เกี่ยวข้องมากที่สุด</string>\n    <string name=\"feedback_q4_label_end\">เกี่ยวข้องมาก</string>\n    <string name=\"a11y_show_navigation\">แสดงเมนูการนำทาง</string>\n    <string name=\"a11y_collapse_filters_sheet\">เลื่อนแถบตัวกรองลง</string>\n    <string name=\"a11y_clear_tag_filters\">ล้างตัวกรอง</string>\n    <string name=\"a11y_filter_applied\">ใช้ตัวกรอง %1s แล้ว</string>\n    <string name=\"a11y_filter_not_applied\">ไม่ได้ใช้ตัวกรอง %1s</string>\n    <string name=\"a11y_reservation_available\">จองกิจกรรม</string>\n    <string name=\"a11y_reservation_reserved\">จองกิจกรรมแล้ว</string>\n    <string name=\"a11y_reservation_disabled\">การจองไม่พร้อมใช้งาน</string>\n    <string name=\"a11y_reservation_wait_list_available\">เข้าร่วมรายชื่อรอเรียกสำหรับกิจกรรม</string>\n    <string name=\"a11y_reservation_wait_listed\">อยู่ในรายชื่อรอเรียกสำหรับกิจกรรม</string>\n    <string name=\"a11y_reservation_pending\">การจองรอดำเนินการ</string>\n    <string name=\"a11y_starred\">บุ๊กมาร์กกิจกรรมแล้ว</string>\n    <string name=\"a11y_unstarred\">ยังไม่บุ๊กมาร์กกิจกรรม</string>\n    <string name=\"a11y_star\">ดาว</string>\n    <string name=\"a11y_play\">เล่นวิดีโอ</string>\n    <string name=\"a11y_select_map_mode\">เลือกโหมดแผนที่</string>\n    <string name=\"a11y_search_schedule\">ค้นหากำหนดการ</string>\n    <string name=\"welcome\">ยินดีต้อนรับ</string>\n    <string name=\"a11y_signed_in_content_description\">ลงชื่อเข้าใช้ด้วย %s</string>\n    <string name=\"a11y_signed_out_content_description\">แตะเพื่อลงชื่อเข้าใช้</string>\n    <string name=\"dialog_sign_in_content\">ลงชื่อเข้าใช้เพื่อบันทึกกิจกรรม จองที่นั่ง และให้คะแนนเซสชัน (หากเป็นผู้เข้าร่วม) การดำเนินการจะได้รับการซิงค์จากบัญชีไปยังแอปและเว็บไซต์</string>\n    <string name=\"sign_in\">ลงชื่อเข้าใช้</string>\n    <string name=\"firebase_auth_no_network_connection\">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</string>\n    <string name=\"firebase_auth_unknown_error\">ข้อผิดพลาดที่ไม่รู้จัก</string>\n    <string name=\"dialog_sign_out_content\">กิจกรรม การจองที่นั่ง และการให้คะแนนเซสชัน (หากเป็นผู้เข้าร่วม) ทั้งหมดจะยังซิงค์กับบัญชี</string>\n    <string name=\"sign_out\">ออกจากระบบ</string>\n    <string name=\"manage_google_account\">จัดการบัญชี Google</string>\n    <string name=\"remove_reservation_title\">นำการจองออกไหม</string>\n    <string name=\"remove_reservation_content\">คุณกำลังจะยกเลิกที่นั่งสำหรับ \"%1$s\" หากคุณตัดสินใจที่จะไม่จองที่นั่งแต่ยังต้องการเข้าร่วม เซสชันทั้งหมดจะยังมีที่นั่งจำนวนหนึ่งที่ให้สิทธิ์ผู้ที่มาก่อนได้ก่อน</string>\n    <string name=\"cancel\">ยกเลิก</string>\n    <string name=\"remove\">ลบ</string>\n    <string name=\"swap_reservation_title\">สลับการจองไหม</string>\n    <string name=\"swap_reservation_content\">คุณมีการจอง/อยู่ในรายชื่อรอเรียกสำหรับ \"%1$s\" แล้วใช่ไหม ระบบอนุญาตให้มีการจองเพียง 1 ครั้งต่อช่วงเวลาเท่านั้น คุณต้องการสลับเป็น \"%2$s\" ไหม</string>\n    <string name=\"swap\">สลับ</string>\n    <string name=\"notifications_preference_dialog_title\">การแจ้งเตือน I/O</string>\n    <string name=\"notifications_preference_dialog_content\">คุณต้องการรับการแจ้งเตือนเกี่ยวกับ I/O ไหม เราจะส่งข้อมูลเกี่ยวกับเวลาเริ่มต้นของเซสชัน กิจกรรมหลังเซสชัน การบันทึกเซสชัน และอื่นๆ ให้ คุณเปลี่ยนการตั้งค่านี้ใน \"ข้อมูล &gt; การตั้งค่า\" ได้ทุกเมื่อ</string>\n    <string name=\"no\">ไม่</string>\n    <string name=\"yes\">ใช่</string>\n    <string name=\"feed_not_available\">ไม่พบประกาศ</string>\n    <string name=\"feed_loading_error\">โหลดฟีดไม่ได้ ลองอีกครั้งในภายหลัง</string>\n    <string name=\"feed_announcement_title\">ประกาศ</string>\n    <string name=\"feed_upcoming_events\">กิจกรรมที่กำลังจะมีขึ้น</string>\n    <string name=\"feed_saved_events\">กิจกรรมที่บันทึกไว้</string>\n    <string name=\"feed_no_saved_events\">ไม่มีกิจกรรมที่บันทึกไว้</string>\n    <string name=\"feed_view_all_events\">ดูกิจกรรมทั้งหมด</string>\n    <string name=\"feed_view_your_schedule\">ดูกำหนดการ</string>\n    <string name=\"feed_watch_live_stream\">ดูสตรีมแบบสด</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"other\">%s วัน</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"other\">%s ชั่วโมง</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"other\">%s นาที</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"other\">%s วินาที</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">แชร์เซสชัน</string>\n    <string name=\"share_text_session_detail\">ลองดู \"%1$s\" ที่ #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">แชร์</string>\n    <string name=\"map_variant_after_dark\">ภาคดึก</string>\n    <string name=\"map_variant_concert\">คอนเสิร์ต</string>\n    <string name=\"map_variant_daytime\">กลางวัน</string>\n    <string name=\"enable_my_location\">เปิดใช้ตำแหน่งของฉัน</string>\n    <string name=\"my_location_rationale\">แอปจำเป็นต้องมีสิทธิ์เข้าถึงตำแหน่งเพื่อแสดงตำแหน่งของคุณบนแผนที่</string>\n    <string name=\"onboarding_get_started\">เริ่มต้นใช้งาน</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">ยินดีต้อนรับสู่ Google I/O</string>\n    <string name=\"onboarding_date_location\">วันที่ 7-9 พฤษภาคม 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">วัน</string>\n    <string name=\"onboarding_label_hours\">ชม.</string>\n    <string name=\"onboarding_label_mins\">นาที</string>\n    <string name=\"onboarding_label_seconds\">วินาที</string>\n    <string name=\"onboarding_welcome_google_io_pre\">เตรียมพบกับ Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">รับชมสรุปงาน I/O \\'19 และดู #io19 ในโซเชียล</string>\n    <string name=\"onboarding_signin\">ลงชื่อเข้าใช้เพื่อรับการแจ้งเตือนเกี่ยวกับ I/O โดยผู้เข้าร่วมจะจองที่นั่งสำหรับเซสชันได้</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"other\">เซสชันจะเริ่มในอีก %1$s นาที</item>\n    </plurals>\n    <string name=\"expanded\">ขยาย</string>\n    <string name=\"collapsed\">ยุบ</string>\n    <string name=\"event_title\">กิจกรรม</string>\n    <string name=\"travel_title\">การท่องเที่ยว</string>\n    <string name=\"faq_title\">คำถามที่พบบ่อย</string>\n    <string name=\"settings_title\">การตั้งค่า</string>\n    <string name=\"about_title\">เกี่ยวกับ</string>\n    <string name=\"travel_what_to_bring_title\">สิ่งที่ต้องนำมาสำหรับกิจกรรม</string>\n    <string name=\"travel_hotels_title\">โรงแรม</string>\n    <string name=\"travel_getting_to_mountain_view_title\">การเดินทางไปยัง Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">การเดินทางไปยัง Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">บริการรถรับส่ง</string>\n    <string name=\"travel_off_site_parking_title\">ที่จอดรถนอกงาน</string>\n    <string name=\"travel_for_public_transportation_title\">ขนส่งมวลชน</string>\n    <string name=\"travel_biking_title\">ขี่จักรยาน</string>\n    <string name=\"travel_ridesharing_title\">บริการร่วมเดินทาง</string>\n    <string name=\"travel_airport_transfers_title\">รถรับส่งสนามบิน</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O เป็นเทศกาลกลางแจ้ง ซึ่งแม้ว่าจะเป็นส่วนสำคัญที่ทำให้ I/O เป็นงานที่พิเศษ แต่ก็หมายความว่าคุณจะต้องพิจารณาปัจจัยบางอย่างด้วย เซสชันจะจัดขึ้นภายในเต็นท์ที่ได้รับการควบคุมอุณหภูมิ แต่เราขอแนะนำให้คุณนำครีมกันแดด แว่นกันแดด และเสื้อคลุมสำหรับสวมทับในยามเย็นติดตัวมาด้วย ทั้งนี้ I/O เป็นกิจกรรมที่มีบรรยากาศเป็นกันเอง อย่าลืมคำนึงถึงเรื่องนี้เมื่อเลือกชุดที่จะใส่มาร่วมงาน</string>\n    <string name=\"travel_hotels_description\">เราได้จองห้องพักของโรงแรมในพื้นที่ไว้หลายแห่ง โดยจะอัปเดตรายการโรงแรมและห้องว่างอยู่เป็นประจำ โปรดใช้แผนที่ด้านล่างเพื่อค้นหาโรงแรมที่คุณต้องการเข้าพัก &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;แผนที่โรงแรม&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">3 สนามบินหลักใน Bay Area ที่มีบริการของสายการบินระหว่างประเทศมีดังนี้&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;สนามบินนานาชาติซานฟรานซิสโก (SFO)&lt;/a&gt; ห่างจากสถานที่จัดงานประมาณ 24 ไมล์&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;สนามบินนานาชาติโอ๊กแลนด์ (OAK)&lt;/a&gt; ห่างจากสถานที่จัดงานประมาณ 32 ไมล์&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;สนามบินนานาชาติแซนโฮเซ (SJC)&lt;/a&gt; ห่างจากสถานที่จัดงานประมาณ 12 ไมล์</string>\n    <string name=\"travel_getting_to_shoreline_description\">Google I/O 2019 มุ่งมั่นที่จะเป็น \"กิจกรรมที่ไม่มีที่จอดรถ*” เพื่อลดปัญหาการจราจรแออัดและการปล่อยคาร์บอน เราได้พิจารณาการตัดสินใจดังกล่าวอย่างถี่ถ้วนและเสนอทางเลือกในการเดินทางมาที่งานให้กับคุณโดยไม่ต้องเสียค่าใช้จ่ายและไม่ต้องนำยานพาหนะมาเอง&lt;br&gt;&lt;br&gt; เราจะให้ข้อมูลเพิ่มเติมเมื่อใกล้ถึงวันงาน&lt;br&gt;&lt;br&gt;*มีที่จอดรถให้บริการแก่ผู้ที่ต้องการความช่วยเหลือพิเศษ</string>\n    <string name=\"travel_shuttle_service_description\">Google I/O 2019 มุ่งมั่นที่จะเป็น \"กิจกรรมที่ไม่มีที่จอดรถ*” เพื่อลดปัญหาการจราจรแออัดและการปล่อยคาร์บอน เราได้พิจารณาการตัดสินใจดังกล่าวอย่างถี่ถ้วนและเสนอทางเลือกในการเดินทางมาที่งานให้กับคุณโดยไม่ต้องเสียค่าใช้จ่ายและไม่ต้องนำยานพาหนะมาเอง&lt;br&gt;&lt;br&gt; เราจะให้ข้อมูลเพิ่มเติมเมื่อใกล้ถึงวันงาน&lt;br&gt;&lt;br&gt;*มีที่จอดรถให้บริการแก่ผู้ที่ต้องการความช่วยเหลือพิเศษ</string>\n    <string name=\"travel_off_site_parking_description\">เรามีที่จอดรถนอกงานให้บริการฟรีที่&lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya Stadium&lt;/a&gt; รวมถึงรถรับส่งจาก Avaya ไป/กลับ Google I/O&lt;br&gt;&lt;br&gt; โปรดระบุในแบบฟอร์มลงทะเบียนหากคุณต้องการความช่วยเหลือด้าน ADA หรือความช่วยเหลือพิเศษ และทีมวางแผนจะติดตามผลกับคุณโดยตรง</string>\n    <string name=\"travel_for_public_transportation_description\">เราจะมอบบัตรขนส่งสาธารณะแบบเติมเงินให้คุณมารับในช่วงลงทะเบียนล่วงหน้า บริการขนส่งมวลชนสำหรับเดินทางไปยังพื้นที่จัดงานมีดังนี้&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: ระบบรถไฟของภูมิภาค&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: ระบบรถรางขนาดเล็กที่ให้บริการในบริเวณ South Bay&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: ระบบขนส่งมวลชนในเขต Bay Area&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: ระบบรถไฟของภูมิภาค&lt;br&gt;&lt;br&gt; ทั้งนี้ คุณเดินทางไปยังงาน Google I/O โดยตรงด้วยขนส่งสาธารณะไม่ได้ โปรดติดตามเพื่อดูข้อมูลเกี่ยวกับจุดให้บริการรถรับส่งไปยังกิจกรรม Google I/O</string>\n    <string name=\"travel_biking_description\">มีที่จอดรถจักรยานฟรีที่ Shoreline Amphitheatre ใน Parking Lot A โดย Silicon Valley Bicycle Coalition จะให้บริการที่จอดรถจักรยานที่ปลอดภัยตั้งแต่เวลา 7.00 น. จนถึงเวลาที่กิจกรรมสิ้นสุดในแต่ละวัน&lt;br&gt;&lt;br&gt; โปรดดู Google Maps สำหรับเส้นทางการเดินทางด้วยจักรยานที่ดีที่สุด มีทางจักรยาน 2 ทางคือ Stevens Creek Trail และ Permanente Creek Trail ที่อำนวยความสะดวกให้กับผู้ที่จะเดินทางด้วยจักรยานมายัง Shoreline Amphitheatre</string>\n    <string name=\"travel_ridesharing_description\">เราจะมีรถรับส่งสนามบินจาก Google I/O ไปยัง SFO และ SJC ให้บริการในวันสุดท้ายของกิจกรรม รถรับส่งสนามบินจะไม่มีให้บริการในวันอื่นๆ นอกเหนือจากนี้</string>\n    <string name=\"travel_airport_transfers_description\">เราจะมีรถรับส่งสนามบินจาก Google I/O ไปยัง SFO และ SJC ให้บริการในวันสุดท้ายของกิจกรรม รถรับส่งสนามบินจะไม่มีให้บริการในวันอื่นๆ นอกเหนือจากนี้</string>\n    <string name=\"faq_when_and_where_title\">Google I/O 2019 จัดขึ้นที่ไหนและเมื่อใด</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">ฉันจะคอยรับข้อมูลอัปเดตล่าสุดจาก Google I/O ได้อย่างไร</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">ทุกเซสชันจะใช้ภาษาอังกฤษใช่ไหม</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">ฉันจองที่นั่งสำหรับเซสชันล่วงหน้าก่อนวันงานได้ไหม</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">วิธีใดเป็นวิธีที่ดีที่สุดในการเดินทางไปยัง Shoreline Amphitheatre</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">ฉันจะรับป้ายได้ที่ไหนและเมื่อใด</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">ฉันอยากได้ที่นั่งแถวหน้าสำหรับช่วงประเด็นสำคัญจังเลย มีเคล็ดลับไหม</string>\n    <string name=\"faq_what_should_i_wear_title\">ฉันควรจะแต่งกายอย่างไรดี</string>\n    <string name=\"faq_onsite_food_options_title\">ฉันชอบทานอาหารว่าง ที่งานมีอาหารอะไรบ้าง</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">ถ้าทำของหายในงาน ฉันจะหาได้จากที่ไหน</string>\n    <string name=\"faq_after_dark_program_title\">กิจกรรมภาคดึกฟังดูน่าสนุกจังเลย ฉันควรเข้าร่วมดีไหม</string>\n    <string name=\"faq_accessibility_needs_title\">คุณรองรับความต้องการการช่วยเหลือพิเศษได้ไหม</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">คุณจะสนับสนุนคุณแม่ที่กำลังตั้งครรภ์และผู้ปกครองที่เข้าร่วมงาน I/O อย่างไร</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">หลักเกณฑ์ของชุมชนสำหรับกิจกรรมของ Google และนโยบายต่อต้านการล่วงละเมิด</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">จะมีการถ่ายทอดสดเซสชันไหม ฉันควรทำอย่างไรหากติดตามกิจกรรมแบบเรียลไทม์ไม่ได้</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">ฉันอยากฉลอง I/O กับชุมชนของฉัน  คุณมีไอเดียอะไรไหม</string>\n    <string name=\"faq_when_and_where_description\">อัปเดตข้อมูลล่าสุดเกี่ยวกับเซสชัน ผู้บรรยาย และกิจกรรมโดยรวมได้โดยไปที่&lt;a href=\"https://events.google.com/io/\"&gt;เว็บไซต์ Google I/O 2019&lt;/a&gt; &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;บล็อก Google Developers&lt;/a&gt; และติดตามเราได้ใน &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; และ &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; คุณยังติดตามและเข้าร่วมการสนทนาบนโลกโซเชียลเกี่ยวกับ Google I/O 2019 ได้ผ่านแฮชแท็กอย่างเป็นทางการ &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; นอกจากนี้ เราจะส่งอีเมลข้อมูลที่สำคัญให้กับผู้เข้าร่วมที่ลงทะเบียนทั้งหมดพร้อมวิธีการเช็คอินก่อนเริ่มงานเทศกาล</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">อัปเดตข้อมูลล่าสุดเกี่ยวกับเซสชัน ผู้บรรยาย และกิจกรรมโดยรวมได้โดยไปที่&lt;a href=\"https://events.google.com/io/\"&gt;เว็บไซต์ Google I/O 2019&lt;/a&gt; &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;บล็อก Google Developers&lt;/a&gt; และติดตามเราได้ใน &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; และ &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; คุณยังติดตามและเข้าร่วมการสนทนาบนโลกโซเชียลเกี่ยวกับ Google I/O 2019 ได้ผ่านแฮชแท็กอย่างเป็นทางการ &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; นอกจากนี้ เราจะส่งอีเมลข้อมูลที่สำคัญให้กับผู้เข้าร่วมที่ลงทะเบียนทั้งหมดพร้อมวิธีการเช็คอินก่อนเริ่มงานเทศกาล</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">ใช่ ผู้ชมจากทั่วทุกมุมโลกจะได้ติดตามงานได้</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">ตั้งแต่เดือนเมษายนเป็นต้นไป ผู้ที่เดินทางมาร่วมงานด้วยตนเองจะจองที่นั่งสำหรับเซสชันได้ก่อนที่กิจกรรมจะเริ่มขึ้นผ่านเว็บไซต์ I/O และแอป I/O บนอุปกรณ์เคลื่อนที่ (หมายเหตุ: ที่นั่งบางส่วนของเซสชันจะไม่มีการเปิดให้จองล่วงหน้า โดยจะให้สิทธิ์กับผู้ที่มาเข้าร่วมในงานก่อนได้ก่อน) ทั้งนี้ การเข้าร่วมที่ Codelabs, App Reviews และ Office Hours จะให้สิทธิ์กับผู้ที่มาเข้าร่วมในงานก่อนได้ก่อน</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">ตรวจสอบหัวข้อการเดินทางเพื่อดูเคล็ดลับทั้งหมดเกี่ยวกับการเดินทางที่คุณต้องรู้ รวมถึงข้อมูลรถรับส่ง เส้นทางการขับขี่และจักรยาน เคล็ดลับสำหรับการร่วมเดินทาง และอีกมากมาย</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">เราจะเริ่มให้รับป้ายในวันจันทร์ที่ 6 พฤษภาคมที่ Shoreline Amphitheatre เพื่อประหยัดเวลาในขั้นตอนเช็คอิน โดยสิ่งที่เราต้องทำก่อนที่จะมอบป้าย Google I/O ให้กับคุณมีดังนี้&lt;br&gt; - ยืนยันบัตรประจำตัวที่มีรูปถ่ายของคุณ โดยจะเป็นใบอนุญาตที่ออกโดยหน่วยงานรัฐ หนังสือเดินทาง และเอกสารยืนยันตนในรูปแบบอื่นก็ได้ หากไม่มีเอกสารยืนยันตนที่เหมาะสม เราจะมอบป้ายให้กับคุณไม่ได้ และคุณก็จะเข้าร่วมงานไม่ได้เช่นกัน ทั้งนี้ ชื่อบนบัตรประจำตัวของคุณต้องตรงกับโปรไฟล์ที่ใช้ลงทะเบียนทุกประการ หากคุณเป็นผู้เข้าร่วมจากสถานศึกษา โปรดนำหลักฐานเพื่อยืนยันสิทธิ์มาด้วย&lt;br&gt; - สแกนคิวอาร์โค้ดสำหรับลงทะเบียนที่ได้รับผ่านอีเมล โดยคุณสแกนได้จากโทรศัพท์ ซึ่งไม่จำเป็นต้องพิมพ์อีเมลออกมา #ลดการใช้กระดาษ &lt;br&gt;&lt;br&gt;โปรดทราบว่า เราไม่อนุญาตให้คุณแชร์ มอบ หรือให้ป้ายแก่ผู้อื่นไม่ว่าจะด้วยวิธีใดก็ตาม คุณจะขอรับป้าย Google I/O ใหม่ไม่ได้ ดังนั้นคุณจึงควรเก็บรักษาเอาไว้ให้ดี มิฉะนั้นจะเข้าร่วมงานอีกครั้งไม่ได้ คุณต้องติดป้าย Google I/O เพื่อให้มีสิทธิ์เข้าร่วมงาน Google I/O รวมไปถึงเซสชัน แซนด์บ็อกซ์ และกิจกรรมหลังจบเซสชัน โปรดแสดงหรือระบุเอกสารยืนยันตัวตนเพิ่มเติมหากเจ้าหน้าที่รักษาความปลอดภัยขอตรวจสอบ ป้าย Google I/O อาจมีชื่อของคุณ บริษัทหรือองค์กร (หากระบุไว้) และรูปถ่ายของคุณอยู่</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">ผู้เข้าร่วมทุกคนจะมีที่นั่งสำหรับเข้าร่วมชมประเด็นสำคัญอย่างแน่นอน แต่ที่นั่งที่ดีที่สุดจะกำหนดโดยผู้ที่มาก่อนจะได้เลือกก่อนในระหว่างการรับป้ายที่จะเริ่มต้นในเวลา 7.00 น. วันที่ 6 พฤษภาคม ดังนั้นก็อย่าลืมมาแต่เช้า</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O เป็นกิจกรรมสำหรับนักพัฒนาซอฟต์แวร์ที่จัดกลางแจ้ง ดังนั้นโปรดแต่งตัวสบายๆ และเป็นกันเอง กิจกรรมนี้ไม่มีระเบียบการแต่งกาย เนื่องจาก Bay Area มีอากาศร้อนในช่วงกลางวัน และอากาศเย็นในช่วงกลางคืน ดังนั้นคุณจึงควรพิจารณาเรื่องสภาพอากาศเมื่อเลือกเครื่องแต่งกายสำหรับงาน</string>\n    <string name=\"faq_onsite_food_options_description\">ข่าวดี เราก็ชอบทานอาหารด้วยเช่นกัน  ผู้เข้าร่วมจะได้รับบริการอาหารเช้า อาหารกลางวัน และอาหารว่างฟรีตลอดทั้ง 3 วันที่เข้าร่วมประชุม ส่วนอาหารเย็นจะมีให้บริการในวันที่ 1 และวันที่ 2 ในช่วงกิจกรรมหลังจบเซสชัน</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">เราจะช่วยเหลือคุณเอง ซุ้ม Lost &amp; Found จะอยู่ที่โต๊ะประชาสัมพันธ์ของงานในระหว่างเวลาจัดงาน สิ่งของใดๆ ที่ทิ้งไว้ข้ามคืนจะส่งไปยังสำนักงานรักษาความปลอดภัยของการประชุม ข้อสำคัญอย่างหนึ่งก็คือ คุณจะขอป้าย Google I/O ใหม่ไม่ได้ ดังนั้นคุณจึงควรเก็บรักษาเอาไว้ให้ดี มิฉะนั้นคุณจะเข้าร่วมงานอีกครั้งไม่ได้</string>\n    <string name=\"faq_after_dark_program_description\">เรามี 2 ค่ำคืนที่ไม่อยากให้คุณพลาด ผู้เข้าร่วมจะได้รับเชิญให้เข้าร่วมงานเพื่อเพลิดเพลินไปกับเสียงเพลง เกม และอื่นๆ ในช่วงค่ำของวันที่ 8 พฤษภาคม รวมถึงคอนเสิร์ตสุดพิเศษที่ Amphitheatre ในวันที่ 9 พฤษภาคม อาหารและเครื่องดื่มจะมีให้บริการทั้ง 2 คืน (มีเครื่องดื่มแอลกอฮอล์สำหรับผู้ที่มีอายุ 21 ปีขึ้นไป) กิจกรรมหลังจบเซสชันทั้ง 2 กิจกรรมจะจัดขึ้นที่ Shoreline Amphitheatre โดยคุณต้องแสดงป้ายผู้เข้าร่วมเพื่อเข้าร่วมงาน</string>\n    <string name=\"faq_accessibility_needs_description\">เราจะมีที่จอดรถสำหรับคุณแม่ที่กำลังตั้งครรภ์ในพื้นที่ ADA&lt;br&gt; เรายินดีต้อนรับคุณแม่ที่กำลังให้นมบุตรให้เข้าร่วมงานประชุมพร้อมกับลูกได้ เรามีห้องสำหรับคุณแม่ 4 ห้องโดยจะเปิดให้บริการในวันที่ 7 และ 8 พฤษภาคม ตั้งแต่ 8.00 น. ถึง 20.00 น. และในวันที่ 9 พฤษภาคม ตั้งแต่ 8.00 น. ถึง 16.00 น. ชีตลงทะเบียนจะอยู่หน้าห้องสำหรับคุณแม่ โดยจะให้สิทธิ์การใช้ห้องกับผู้ที่มาก่อน โปรดติตด่อแผนกช่วยเหลือของงานเพื่อสอบถามข้อมูลเพิ่มเติม&lt;br&gt;&lt;br&gt; เราจะชำระเงินค่ารับเลี้ยงเด็กจำนวน USD $100 ต่อวัน (รวมแล้วไม่เกิน USD $300) คืนให้กับผู้ปกครองที่เข้าร่วมงานและแสดงความสนใจเกี่ยวกับการรับเลี้ยงเด็กผ่านแบบฟอร์มลงทะเบียนของเรา โดยจะให้สิทธิ์ตามลำดับผู้ที่มาก่อน โดยจะชำระเงินดังกล่าวคืนผ่านผู้ให้บริการบุคคลที่สาม หากเราอนุมัติคำขอเกี่ยวกับการรับเลี้ยงเด็กของคุณผ่านอีเมลก่อนที่การประชุมจะเริ่มต้นขึ้น และคุณได้รับการยืนยันการเข้าร่วมงาน ผู้ให้บริการของเราจะติดต่อคุณพร้อมแจ้งขั้นตอนถัดไปภายใน 7 วันทำการหลังจบงาน Google I/O โดยผู้ให้บริการจะจัดการการชำระเงินทั้งหมดที่เกี่ยวกับการชำระเงินค่ารับเลี้ยงเด็กของเรา</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">เราจะมีที่จอดรถสำหรับคุณแม่ที่กำลังตั้งครรภ์ในพื้นที่ ADA&lt;br&gt; เรายินดีต้อนรับคุณแม่ที่กำลังให้นมบุตรให้เข้าร่วมงานประชุมพร้อมกับลูกได้ เรามีห้องสำหรับคุณแม่ 4 ห้องโดยจะเปิดให้บริการในวันที่ 7 และ 8 พฤษภาคม ตั้งแต่ 8.00 น. ถึง 20.00 น. และในวันที่ 9 พฤษภาคม ตั้งแต่ 8.00 น. ถึง 16.00 น. ชีตลงทะเบียนจะอยู่หน้าห้องสำหรับคุณแม่ โดยจะให้สิทธิ์การใช้ห้องกับผู้ที่มาก่อน โปรดติตด่อแผนกช่วยเหลือของงานเพื่อสอบถามข้อมูลเพิ่มเติม&lt;br&gt;&lt;br&gt; เราจะชำระเงินค่ารับเลี้ยงเด็กจำนวน USD $100 ต่อวัน (รวมแล้วไม่เกิน USD $300) คืนให้กับผู้ปกครองที่เข้าร่วมงานและแสดงความสนใจเกี่ยวกับการรับเลี้ยงเด็กผ่านแบบฟอร์มลงทะเบียนของเรา โดยจะให้สิทธิ์ตามลำดับผู้ที่มาก่อน โดยจะชำระเงินดังกล่าวคืนผ่านผู้ให้บริการบุคคลที่สาม หากเราอนุมัติคำขอเกี่ยวกับการรับเลี้ยงเด็กของคุณผ่านอีเมลก่อนที่การประชุมจะเริ่มต้นขึ้น และคุณได้รับการยืนยันการเข้าร่วมงาน ผู้ให้บริการของเราจะติดต่อคุณพร้อมแจ้งขั้นตอนถัดไปภายใน 7 วันทำการหลังจบงาน Google I/O โดยผู้ให้บริการจะจัดการการชำระเงินทั้งหมดที่เกี่ยวกับการชำระเงินค่ารับเลี้ยงเด็กของเรา</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google มุ่งมั่นที่จะมอบประสบการณ์กิจกรรมที่ปราศจากการล่วงละเมิดและให้ความเท่าเทียมกับทุกคนโดยไม่คำนึงถึงอัตลักษณ์ทางเพศและการแสดงออกทางเพศ รสนิยมทางเพศ ความพิการ ความหลากหลายของสภาวะทางระบบสมอง รูปร่างลักษณะภายนอก ขนาดตัว ชาติพันธุ์ สัญชาติ เชื้อชาติ อายุ ศาสนา หรือหมวดหมู่อื่นๆ ที่คุ้มครอง เรามีห้องน้ำเพศกลางให้บริการรอบสถานที่จัดงานเพื่อทำให้กิจกรรมในครั้งนี้เกิดความเท่าเทียมมากที่สุดเท่าที่จะเป็นไปได้&lt;br&gt;&lt;br&gt; เราจะไม่ยอมให้เกิดการล่วงละเมิดทุกรูปแบบกับผู้เข้าร่วมกิจกรรม&lt;br&gt; Google จัดการกับการละเมิดนโยบายอย่างจริงจังและจะตอบสนองตามความเหมาะสม ดูข้อมูลเพิ่มเติมเกี่ยวกับหลักเกณฑ์ของชุมชนสำหรับกิจกรรมของ Google และนโยบายต่อต้านการล่วงละเมิดได้&lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;ที่นี่&lt;/a&gt;</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">ประเด็นสำคัญ 2 ประเด็นและเซสชันทั้งหมดจะมีการสตรีมแบบสดผ่านหน้าแรกของเว็บไซต์กิจกรรมในวันงานทั้ง 3 วัน หากคุณไม่ว่างหรืออยู่อีกซีกโลกหนึ่งซึ่งมีความต่างกันเรื่องเวลา คุณจะรับชมบันทึกของเซสชันภายหลังได้ที่&lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;ช่อง Google Developers ใน YouTube&lt;/a&gt;</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">ได้ ในทุกๆ ปี นักพัฒนาซอฟต์แวร์ทั่วโลกจะจัด&lt;a href=\"https://events.google.com/io/extended\"&gt;กิจกรรม Google I/O Extended&lt;/a&gt; ขึ้น ระหว่างงาน ทางผู้จัดจะแสดงสตรีมแบบสดของกิจกรรมและจัดเซสชันขึ้นเอง ได้แก่ แฮ็กกาธอน, Codelabs, การสาธิต และอื่นๆ อีกมากมาย&lt;br&gt; หากเข้าร่วมเป็นผู้จัดงาน I/O Extended กับเราในปีนี้ คุณควรทำตามขั้นตอนเริ่มต้นดังนี้&lt;br&gt;&lt;br&gt; อ่าน&lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;คู่มือสำหรับผู้จัด&lt;/a&gt;เพื่อดูเคล็ดลับและคำแนะนำต่างๆ เกี่ยวกับวิธีจัดกิจกรรมให้ประสบความสำเร็จ&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;ลงทะเบียน&lt;/a&gt;กิจกรรมสาธารณะในเว็บไซต์ I/O เพื่อให้ผู้คนรู้จักมากขึ้น&lt;br&gt;&lt;br&gt; ติดแฮชแท็กอย่างเป็นทางการ #io19extended ในโพสต์บนโซเชียลเน็ตเวิร์กทั้งหมดที่เกี่ยวข้องกับ I/O Extended เพื่อให้ผู้คนค้นพบกิจกรรมได้ง่ายขึ้น&lt;br&gt;&lt;br&gt; หมายเหตุ: ผู้จัด I/O Extended จะส่งคำขอให้ลบข้อมูลส่วนตัวและ/หรือข้อมูลกิจกรรมหลังจบกิจกรรมได้โดยส่งอีเมลไปที่ io19@google.com&lt;br&gt; หากคุณเพียงต้องการเข้าร่วมกิจกรรม I/O Extended โปรดเรียกดู&lt;a href=\"https://events.google.com/io/extended\"&gt;แผนที่ของเรา&lt;/a&gt;เพื่อค้นหากิจกรรมใกล้คุณและตอบกลับคำเชิญเข้าร่วมกิจกรรม&lt;br&gt; หากมีคำถามเพิ่มเติมเกี่ยวกับโปรแกรม I/O Extended โปรดติดต่อเราที่ io19extended\\-external@google.com</string>\n    <string name=\"view_sessions_text\">ดูเซสชัน</string>\n    <string name=\"wifi_install_success\">บันทึกเครือข่าย WiFi แล้ว</string>\n    <string name=\"wifi_install_clipboard_message\">บันทึกเครือข่าย Wi-Fi ไม่ได้\\nบันทึกรหัสผ่านไปยังคลิปบอร์ดแทน</string>\n    <string name=\"event_sessions_title\">เซสชัน</string>\n    <string name=\"event_sandbox_title\">แซนด์บ็อกซ์</string>\n    <string name=\"event_codelabs_title\">Codelabs</string>\n    <string name=\"event_officehours_title\">Office Hours และ App Reviews</string>\n    <string name=\"event_afterhours_title\">หลังเซสชัน</string>\n    <string name=\"event_meals_title\">อาหาร</string>\n    <string name=\"event_sessions_description\">ตั้งแต่เดือนเมษายนเป็นต้นไป ผู้ที่เดินทางมาร่วมงานด้วยตนเองจะจองที่นั่งสำหรับเซสชันได้ก่อนที่กิจกรรมจะเริ่มขึ้นผ่านเว็บไซต์ I/O และแอป I/O บนอุปกรณ์เคลื่อนที่ (หมายเหตุ: ที่นั่งบางส่วนของเซสชันจะไม่มีการเปิดให้จองล่วงหน้า โดยจะให้สิทธิ์กับผู้ที่มาเข้าร่วมในงานก่อนได้ก่อน) ทั้งนี้ การเข้าร่วมที่ Codelabs, App Reviews และ Office Hours จะให้สิทธิ์กับผู้ที่มาเข้าร่วมในงานก่อนได้ก่อน</string>\n    <string name=\"event_sandbox_description\">พื้นที่ที่สร้างขึ้นเพื่อการสำรวจ เรียนรู้ และเล่นผลิตภัณฑ์และแพลตฟอร์มล่าสุดของเราผ่านการสาธิตเชิงโต้ตอบ การติดตั้ง และอื่นๆ</string>\n    <string name=\"event_codelabs_description\">สัมผัสประสบการณ์ที่ได้ลงมือทำจริงในคีออสก์ที่พร้อมโค้ด ที่นี่เรามีทุกอย่างที่คุณต้องใช้ในการเรียนรู้เกี่ยวกับเทคโนโลยีล่าสุดและยิ่งใหญ่ที่สุดของ Google ผ่านบทแนะนำที่คุณเลือกได้ด้วยตนเอง หรือนำเครื่องของคุณเองมาแล้วนำผลงานกลับบ้าน พนักงานของ Google พร้อมให้คำแนะนำดีๆ และให้คำปรึกษาหากคุณพบปัญหา</string>\n    <string name=\"event_officehours_description\">Office Hours เป็นโอกาสที่คุณจะได้พบกับผู้เชี่ยวชาญ Google ตัวต่อตัวเพื่อสอบถามปัญหาทางเทคนิคทั้งหมด ส่วน App Reviews จะเปิดโอกาสให้คุณได้รับคำแนะนำและเคล็ดลับสำหรับโครงการแอปของคุณแบบเจาะจง</string>\n    <string name=\"event_afterhours_description\">ปิดท้ายวันด้วยกิจกรรมหลังเซสชัน พักผ่อนบริเวณ Shoreline ต่อเพื่อรับประทานอาหาร เครื่องดื่ม และสัมผัสกับความสนุกอีก 2 วัน โดยคืนแรกจะมีการจัดปาร์ตี้ขึ้นบริเวณ Sandbox และคืนที่ 2 จะมีคอนเสิร์ตสุดพิเศษใน Amphitheatre</string>\n    <string name=\"event_meals_description\">ผู้เข้าร่วมจะได้รับบริการอาหารเช้า อาหารกลางวัน และอาหารว่างฟรีตลอดทั้ง 3 วันที่เข้าร่วมประชุม ส่วนอาหารเย็นจะมีให้บริการในวันที่ 1 และวันที่ 2 ในช่วงกิจกรรมหลังจบเซสชัน</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">แอปที่เกี่ยวข้อง</string>\n    <string name=\"event_types_header\">ประเภทกิจกรรม</string>\n    <string name=\"settings_time_zone_label\">กิจกรรมในเขตเวลาแปซิฟิก (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">เปิดใช้การแจ้งเตือน</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">ส่งสถิติการใช้งานแบบไม่ระบุตัวตน</string>\n    <string name=\"settings_tos\">ข้อกำหนดในการให้บริการ</string>\n    <string name=\"settings_privacy_policy\">นโยบายความเป็นส่วนตัว</string>\n    <string name=\"settings_oss_licenses\">ใบอนุญาตโอเพนซอร์ส</string>\n    <string name=\"settings_theme_title\">เลือกธีม</string>\n    <string name=\"settings_theme_system\">ค่าเริ่มต้นของระบบ</string>\n    <string name=\"settings_theme_light\">สว่าง</string>\n    <string name=\"settings_theme_dark\">สีเข้ม</string>\n    <string name=\"settings_theme_battery\">ตั้งตามโหมดประหยัดแบตเตอรี่</string>\n    <string name=\"built_with_material_components\">สร้างด้วย Material Components</string>\n    <string name=\"wifi_network_and_password\">เครือข่าย: %1$s\\nรหัสผ่าน: %2$s</string>\n    <string name=\"join_network\">เข้าร่วมเครือข่าย</string>\n    <string name=\"assistant_app_description\">ลองพูดว่า \"Hey Google พูดกับ Google I/O 19\"</string>\n    <string name=\"assistant_app_description2\">ลองพูดว่า \"Hey Google พูดกับ Google I/O 19\"</string>\n    <string name=\"speaker_link_website\">เว็บไซต์</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">กิจกรรม</string>\n    <string name=\"no_network_connection\">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</string>\n    <string name=\"navigate_up\">นำทางขึ้น</string>\n    <string name=\"no_network_description\">หากต้องการใช้ Explore I/O ลองทำดังนี้\\n\\n - ปิดโหมดเครื่องบิน\\n\\n - เปิดเน็ตมือถือหรือ Wi-Fi\\n\\n - ตรวจสอบสัญญาณในพื้นที่</string>\n    <string name=\"phone_does_not_support_arcore_title\">โทรศัพท์ของคุณไม่รองรับ ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">ลองเปลี่ยนอุปกรณ์หรือยืมอุปกรณ์ของเพื่อน</string>\n    <string name=\"codelabs_information\">ดูข้อมูลเกี่ยวกับเทคโนโลยีล่าสุดและยิ่งใหญ่ที่สุดของ Google ผ่านบทแนะนำที่คุณเลือกได้ด้วยตนเองในคีออสก์พร้อมโค้ดของเรา หรือจะนำเครื่องของคุณมาเองแล้วนำผลงานกลับบ้านก็ได้ คีออสก์พร้อมให้บริการทุกวัน ยกเว้นในระหว่างช่วงประเด็นสำคัญครั้งแรก</string>\n    <string name=\"codelabs_building\">อาคาร Codelabs</string>\n    <string name=\"codelabs_website\">เว็บไซต์ Codelabs</string>\n    <string name=\"codelab_duration\">ระยะเวลา: %1$d นาที</string>\n    <string name=\"start_codelab\">เริ่มใช้ Codelab</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-v29/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Base.AppTheme\">\n        <!-- We use a transparent nav bar on API 29, as the system is responsible for applying\n             context background protection -->\n        <item name=\"android:navigationBarColor\">@color/transparent</item>\n        <item name=\"ioschedNavigationBarDividerColor\">@color/transparent</item>\n    </style>\n</resources>"
  },
  {
    "path": "mobile/src/main/res/values-vi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">Lịch biểu</string>\n    <string name=\"title_home\">Trang chủ</string>\n    <string name=\"title_map\">Bản đồ</string>\n    <string name=\"title_explore_io\">Khám phá địa điểm diễn ra sự kiện I/O</string>\n    <string name=\"title_info\">Thông tin</string>\n    <string name=\"filters\">Bộ lọc</string>\n    <string name=\"category_heading_tracks\">Chủ đề</string>\n    <string name=\"category_heading_types\">Loại</string>\n    <string name=\"reset\">Đặt lại</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"other\">%1$d Sự kiện</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">Các sự kiện được gắn sao và đặt chỗ của bạn</string>\n    <string name=\"starred_and_reserved_short\">Sự kiện của bạn</string>\n    <string name=\"search_schedule_hint\">Tìm kiếm lịch trình</string>\n    <string name=\"search_schedule_no_results\">Không tìm thấy kết quả nào</string>\n    <string name=\"agenda\">Lịch trình sự kiện</string>\n    <string name=\"event_starred\">Đã thêm sự kiện vào các mục có gắn dấu sao của bạn</string>\n    <string name=\"event_unstarred\">Đã xóa sự kiện khỏi các mục được gắn dấu sao</string>\n    <string name=\"event_star_error\">Xảy ra lỗi khi thêm sự kiện vào các mục được gắn dấu sao</string>\n    <string name=\"reservation_error\">Xảy ra lỗi khi thay đổi đặt chỗ. Vui lòng đợi cho đến khi các yêu cầu trước đó kết thúc hoặc thử lại sau.</string>\n    <string name=\"reservation_request_succeeded\">Đã yêu cầu đặt chỗ.</string>\n    <string name=\"reservation_cancel_succeeded\">Đã hủy đặt chỗ: \"&lt;b&gt;%s&lt;/b&gt;.\"</string>\n    <string name=\"reservation_new\">Bạn đã đặt chỗ tại \"&lt;b&gt;%s&lt;/b&gt;\".</string>\n    <string name=\"reservation_replaced\">Đã thay đổi sự kiện.</string>\n    <string name=\"waitlist_new\">Bạn đã được ghi tên trong danh sách chờ đặt chỗ.</string>\n    <string name=\"waitlist_cancel_succeeded\">Đã xóa khỏi danh sách chờ đặt chỗ.</string>\n    <string name=\"got_it\">OK</string>\n    <string name=\"dont_show\">Không hiển thị</string>\n    <string name=\"reservation_denied_cutoff\">Đặt chỗ bị từ chối: quá sát thời gian bắt đầu.</string>\n    <string name=\"reservation_denied_clash\">Đặt chỗ bị từ chối: xung đột với một đặt chỗ khác</string>\n    <string name=\"reservation_denied_unknown\">Đặt chỗ bị từ chối: lỗi không xác định.</string>\n    <string name=\"cancellation_denied_cutoff\">Từ chối hủy: quá sát thời gian bắt đầu.</string>\n    <string name=\"cancellation_denied_unknown\">Từ chối hủy: lỗi không xác định.</string>\n    <string name=\"schedule_filters_empty\">Không tìm thấy sự kiện nào.</string>\n    <string name=\"reservation_reservable\">Đặt chỗ</string>\n    <string name=\"reservation_reserved\">Đã đặt chỗ</string>\n    <string name=\"reservation_waitlisted\">Được đưa vào danh sách chờ đặt chỗ</string>\n    <string name=\"reservation_waitlist_available\">Tham gia danh sách chờ</string>\n    <string name=\"reservation_disabled\">Không thể đặt chỗ</string>\n    <string name=\"reservation_pending\">Đang chờ xử lý đặt chỗ</string>\n    <string name=\"schedule_hint_title\">Tùy chỉnh lịch biểu của bạn</string>\n    <string name=\"schedule_hint_star_event\">Thêm vào mục các sự kiện được gắn dấu sao của bạn</string>\n    <string name=\"schedule_hint_reserve_session_seat\">Đặt trước một chỗ</string>\n    <string name=\"rate_session\">Đánh giá phiên hội thảo</string>\n    <string name=\"menu_item_session_location\">Địa điểm diễn ra phiên hội thảo</string>\n    <string name=\"menu_item_session_star\">Bắt đầu phiên</string>\n    <string name=\"menu_item_calendar\">Thêm vào lịch</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">Diễn giả</string>\n    <string name=\"session_detail_related_header\">Các sự kiện liên quan</string>\n    <string name=\"feedback_submit\">Gửi</string>\n    <string name=\"feedback_thank_you\">Cảm ơn phản hồi của bạn!</string>\n    <string name=\"feedback_q1_text\">Vui lòng cho biết ý kiến đánh giá của bạn về chất lượng chung của Phiên hội thảo này.</string>\n    <string name=\"feedback_q2_text\">Vui lòng cho biết cảm nhận của bạn về nội dung của Phiên hội thảo này dựa trên kỳ vọng của bạn hoặc thông tin mô tả của phiên hội thảo.</string>\n    <string name=\"feedback_q3_text\">Vui lòng cho biết mức độ liên quan của Phiên hội thảo này với các dự án của bạn.</string>\n    <string name=\"feedback_q4_text\">Vui lòng cho biết mức độ liên quan của Phiên hội thảo này với các dự án của bạn.</string>\n    <string name=\"feedback_q1_label_start\">Rất căn bản</string>\n    <string name=\"feedback_q2_label_start\">Kém</string>\n    <string name=\"feedback_q3_label_start\">Kém</string>\n    <string name=\"feedback_q4_label_start\">Không quá</string>\n    <string name=\"feedback_q1_label_end\">Vượt trội</string>\n    <string name=\"feedback_q2_label_end\">Vượt trội</string>\n    <string name=\"feedback_q3_label_end\">Cực kỳ</string>\n    <string name=\"feedback_q4_label_end\">Cực kỳ</string>\n    <string name=\"a11y_show_navigation\">Hiển thị menu di chuyển</string>\n    <string name=\"a11y_collapse_filters_sheet\">Hạ thấp bảng bộ lọc</string>\n    <string name=\"a11y_clear_tag_filters\">Xóa bộ lọc</string>\n    <string name=\"a11y_filter_applied\">Đã áp dụng bộ lọc %1s</string>\n    <string name=\"a11y_filter_not_applied\">Chưa áp dụng bộ lọc %1s</string>\n    <string name=\"a11y_reservation_available\">Đặt chỗ tại sự kiện</string>\n    <string name=\"a11y_reservation_reserved\">Đã đặt chỗ tại sự kiện</string>\n    <string name=\"a11y_reservation_disabled\">Không thể đặt chỗ</string>\n    <string name=\"a11y_reservation_wait_list_available\">Tham gia danh sách chờ đặt chỗ tại sự kiện</string>\n    <string name=\"a11y_reservation_wait_listed\">Trên danh sách chờ đặt chỗ tại sự kiện</string>\n    <string name=\"a11y_reservation_pending\">Đang chờ xử lý đặt chỗ</string>\n    <string name=\"a11y_starred\">Đã đánh dấu sự kiện</string>\n    <string name=\"a11y_unstarred\">Chưa đánh dấu sự kiện</string>\n    <string name=\"a11y_star\">Ngôi sao</string>\n    <string name=\"a11y_play\">Phát video</string>\n    <string name=\"a11y_select_map_mode\">Chọn chế độ bản đồ</string>\n    <string name=\"a11y_search_schedule\">Tìm kiếm lịch biểu</string>\n    <string name=\"welcome\">Xin chào!</string>\n    <string name=\"a11y_signed_in_content_description\">Đã đăng nhập bằng %s.</string>\n    <string name=\"a11y_signed_out_content_description\">Nhấn để đăng nhập.</string>\n    <string name=\"dialog_sign_in_content\">Đăng nhập để lưu các sự kiện, đặt chỗ và xếp hạng các phiên sự kiện (nếu tham dự). Các thao tác sẽ được đồng bộ từ tài khoản của bạn trên cả ứng dụng và trang web.</string>\n    <string name=\"sign_in\">Đăng nhập</string>\n    <string name=\"firebase_auth_no_network_connection\">Không có kết nối Internet</string>\n    <string name=\"firebase_auth_unknown_error\">Lỗi không xác định</string>\n    <string name=\"dialog_sign_out_content\">Tất cả sự kiện đã lưu, đặt chỗ và xếp hạng phiên sự kiện (nếu tham dự) vẫn được đồng bộ hóa với tài khoản của bạn.</string>\n    <string name=\"sign_out\">Đăng xuất</string>\n    <string name=\"manage_google_account\">Quản lý Tài khoản Google của bạn</string>\n    <string name=\"remove_reservation_title\">Xóa yêu cầu đặt chỗ</string>\n    <string name=\"remove_reservation_content\">Bạn sắp từ bỏ đặt chỗ tại \"%1$s\". Nếu bạn quyết định không đặt chỗ nhưng vẫn muốn tham dự, tất cả các phiên sự kiện sẽ có một số chỗ ngồi dành cho những người đến sớm.</string>\n    <string name=\"cancel\">Hủy</string>\n    <string name=\"remove\">Xóa</string>\n    <string name=\"swap_reservation_title\">Thay đổi đặt chỗ?</string>\n    <string name=\"swap_reservation_content\">Bạn đã đặt chỗ/đã có tên trong danh sách chờ đặt chỗ tại \"%1$s\"?. Mỗi lần chỉ được một đặt chỗ. Bạn có muốn thay đổi sang đặt chỗ tại \"%2$s\"?</string>\n    <string name=\"swap\">Hoán đổi</string>\n    <string name=\"notifications_preference_dialog_title\">Thông báo I/O</string>\n    <string name=\"notifications_preference_dialog_content\">Bạn muốn nhận thông báo về I/O? Chúng tôi sẽ gửi thông tin cho bạn về thời gian bắt đầu phiên sự kiện, những sự kiện hậu kỳ, ghi hình sự kiện, v.v. Bạn có thể thay đổi mục cài đặt tại \"Thông tin &gt; Cài đặt\" bất kỳ lúc nào.</string>\n    <string name=\"no\">Không</string>\n    <string name=\"yes\">Có</string>\n    <string name=\"feed_not_available\">Không tim thấy thông báo nào.</string>\n    <string name=\"feed_loading_error\">Không thể tải nguồn cấp dữ liệu. Thử lại sau.</string>\n    <string name=\"feed_announcement_title\">Thông báo</string>\n    <string name=\"feed_upcoming_events\">Sự kiện sắp diễn ra</string>\n    <string name=\"feed_saved_events\">Sự kiện đã lưu</string>\n    <string name=\"feed_no_saved_events\">Chưa lưu sự kiện nào</string>\n    <string name=\"feed_view_all_events\">Xem tất cả sự kiện</string>\n    <string name=\"feed_view_your_schedule\">Xem lịch biểu của bạn</string>\n    <string name=\"feed_watch_live_stream\">Xem sự kiện phát trực tiếp</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"other\">%s ngày</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"other\">%s giờ</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"other\">%s phút</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"other\">%s giây</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">Chia sẻ về phiên hội thảo</string>\n    <string name=\"share_text_session_detail\">Hãy đến tham gia hội thảo \"%1$s\" tại #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">Chia sẻ</string>\n    <string name=\"map_variant_after_dark\">Bản đồ buổi tối</string>\n    <string name=\"map_variant_concert\">Hòa nhạc</string>\n    <string name=\"map_variant_daytime\">Ban ngày</string>\n    <string name=\"enable_my_location\">Bật vị trí của tôi</string>\n    <string name=\"my_location_rationale\">Ứng dụng này cần bạn cấp quyền truy cập vị trí để hiển thị vị trí của bạn trên bản đồ.</string>\n    <string name=\"onboarding_get_started\">Bắt đầu</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">Chào mừng bạn đến với Google I/O</string>\n    <string name=\"onboarding_date_location\">Ngày 7-9 tháng 5 năm 2019\\nMountain View, CA</string>\n    <string name=\"onboarding_label_days\">Ngày</string>\n    <string name=\"onboarding_label_hours\">Giờ</string>\n    <string name=\"onboarding_label_mins\">Phút</string>\n    <string name=\"onboarding_label_seconds\">Giây</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Sự kiện Google I/O sắp diễn ra</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O</string>\n    <string name=\"onboarding_welcome_google_io_post\">Xem nội dung tóm lược của I/O 2019 và xem những bài đăng có hashtag #io19 trên mạng xã hội</string>\n    <string name=\"onboarding_signin\">Đăng nhập để nhận các thông báo từ sự kiện I/O và người tham dự có thể đặt chỗ trước tại các phiên sự kiện.</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"other\">Phiên sự kiện sẽ bắt đầu trong %1$s phút nữa</item>\n    </plurals>\n    <string name=\"expanded\">Đã mở rộng</string>\n    <string name=\"collapsed\">Đã thu gọn</string>\n    <string name=\"event_title\">Sự kiện</string>\n    <string name=\"travel_title\">Thông tin di chuyển</string>\n    <string name=\"faq_title\">CÂU HỎI THƯỜNG GẶP</string>\n    <string name=\"settings_title\">Cài đặt</string>\n    <string name=\"about_title\">Giới thiệu</string>\n    <string name=\"travel_what_to_bring_title\">Những điều cần chuẩn bị để tham gia sự kiện</string>\n    <string name=\"travel_hotels_title\">Khách sạn</string>\n    <string name=\"travel_getting_to_mountain_view_title\">Đến Mountain View</string>\n    <string name=\"travel_getting_to_shoreline_title\">Đến Mountain View</string>\n    <string name=\"travel_shuttle_service_title\">Dịch vụ đưa đón</string>\n    <string name=\"travel_off_site_parking_title\">Đỗ xe bên ngoài sự kiện</string>\n    <string name=\"travel_for_public_transportation_title\">Giao thông công cộng</string>\n    <string name=\"travel_biking_title\">Đi xe đạp</string>\n    <string name=\"travel_ridesharing_title\">Chia sẻ chuyến đi</string>\n    <string name=\"travel_airport_transfers_title\">Xe đưa đón sân bay</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O là một lễ hội ngoài trời. Đây là một yếu tố quan trọng tạo nên nét đặc biệt của sự kiện I/O, đồng thời còn nhắc nhở mọi người cần cân nhắc một số nội dung khác. Các phiên sự kiện sẽ diễn ra bên trong các lều có kiểm soát các yếu tố khí hậu nhưng bạn vẫn nên mang theo kem chống nắng, kính râm và cả áo khoác mỏng nếu định tham gia các sự kiện vào buổi tối. I/O là một sự kiện không quy định trang phục nên hãy lưu ý điều này khi lựa chọn quần áo.</string>\n    <string name=\"travel_hotels_description\">Chúng tôi cũng đặt phòng tại nhiều khách sạn tại địa phương. Danh sách khách sạn và tình trạng còn phòng sẽ được cập nhật thường xuyên. Hãy xem bản đồ dưới đây để tìm khách sạn phù hợp nhất với bạn. &lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;Bản đồ khách sạn&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">Đây là ba sân bay chính tại Vùng Vịnh có các chuyến bay quốc tế:&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Sân bay quốc tế San Francisco (SFO)&lt;/a&gt; ~39km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Sân bay quốc tế Oakland (OAK)&lt;/a&gt; ~51km&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;Sân bay quốc tế San Jose (SJC)&lt;/a&gt; ~19km</string>\n    <string name=\"travel_getting_to_shoreline_description\">Nhằm giảm tắc nghẽn giao thông và phát thải các-bon, Google I/O 2019 cam kết trở thành “Sự kiện không có bãi đỗ xe*.” Quyết định này đã được cân nhắc kỹ lưỡng và chúng tôi sẽ cung cấp những phương án di chuyển đến sự kiện mà không cần phương tiện cá nhân.&lt;br&gt;&lt;br&gt;Chúng tôi sẽ cung cấp thêm thông tin vào thời điểm gần diễn ra sự kiện.&lt;br&gt;&lt;br&gt;*Có khu vực đỗ xe dành cho người khuyết tật.</string>\n    <string name=\"travel_shuttle_service_description\">Nhằm giảm tắc nghẽn giao thông và phát thải các-bon, Google I/O 2019 cam kết trở thành “Sự kiện không có bãi đỗ xe*.” Quyết định này đã được cân nhắc kỹ lưỡng và chúng tôi sẽ cung cấp những phương án di chuyển đến sự kiện mà không cần phương tiện cá nhân.&lt;br&gt;&lt;br&gt;Chúng tôi sẽ cung cấp thêm thông tin vào thời điểm gần diễn ra sự kiện.&lt;br&gt;&lt;br&gt;*Có khu vực đỗ xe dành cho người khuyết tật.</string>\n    <string name=\"travel_off_site_parking_description\">Sẽ có chỗ đỗ xe miễn phí tại &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Sân vận động Avaya&lt;/a&gt;. Sẽ có xe đưa đón giữa Avaya và Google I/O.&lt;br&gt;&lt;br&gt; Vui lòng ghi rõ trên phiếu đăng ký nếu bạn có bất kỳ yêu cầu hỗ trợ đặc biệt nào hoặc có yêu cầu theo Ðạo luật người khuyết tật Hoa Kỳ (ADA) và bộ phận kế hoạch sẽ trực tiếp hỗ trợ bạn.</string>\n    <string name=\"travel_for_public_transportation_description\">Chúng tôi cũng bán thẻ và vé trả trước cho những phương tiện công cộng tham gia đưa đón trong suốt thời gian trước khi đăng ký tham gia sự kiện. Bạn có thể dùng phương tiện công cộng để đến khu vực này:&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;: Hệ thống đường sắt trong khu vực&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;: Hệ thống đường sắt hạng nhẹ phục vụ Vịnh phía nam&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;: Phương tiện công cộng nhanh tại Vùng Vịnh&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;: Hệ thống đường sắt khu vực&lt;br&gt;&lt;br&gt; Không có phương tiện công cộng đi thẳng tới sự kiện Google I/O. Hãy chú ý theo dõi vị trí chính xác các điểm đỗ của xe đưa đón tại sự kiện Google I/O.</string>\n    <string name=\"travel_biking_description\">Có khu vực trông giữ xe đạp miễn phí tại Nhà hát Shoreline Amphitheatre ở Bãi đỗ xe A. Hàng ngày Hiệp hội Xe đạp Thung lũng Silicon (Silicon Valley Bicycle Coalition) sẽ cung cấp khu vực trông giữ xe đạp an toàn từ 7 giờ sáng đến khi sự kiện kết thúc.&lt;br&gt;&lt;br&gt; Hãy kiểm tra Google Maps để tìm tuyến đường và hướng đi tiện lợi nhất cho người đi xe đạp. Có hai tuyến đường tiện lợi để người đi xe đạp tới thẳng Nhà hát Shoreline Amphitheatre là Stevens Creek Trail và Permanente Creek Trail.</string>\n    <string name=\"travel_ridesharing_description\">Sẽ có xe đưa đón tới sân bay SFO và SJC từ Google I/O vào ngày cuối cùng của sự kiện. Sẽ KHÔNG có xe đưa đón sân bay vào bất kỳ ngày nào khác.</string>\n    <string name=\"travel_airport_transfers_description\">Sẽ có xe đưa đón tới sân bay SFO và SJC từ Google I/O vào ngày cuối cùng của sự kiện. Sẽ KHÔNG có xe đưa đón sân bay vào bất kỳ ngày nào khác.</string>\n    <string name=\"faq_when_and_where_title\">Google I/O 2019 diễn ra ở đâu và vào lúc nào?</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">Làm cách nào để tôi nhận những thông tin mới nhất về Google I/O?</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">Có phải tất cả các phiên sự kiện đều sử dụng tiếng Anh?</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">Tôi có thể đặt chỗ trước tại các phiên sự kiện không?</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">Cách tốt nhất để đến Nhà hát Shoreline Amphitheatre?</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">Tôi có thể nhận huy hiệu tham dự sự kiện của mình ở đâu và khi nào?</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">Tôi thực sự muốn được ngồi hàng đầu để lắng nghe bài phát biểu. Tôi phải làm thế nào?</string>\n    <string name=\"faq_what_should_i_wear_title\">Tôi nên mặc gì?</string>\n    <string name=\"faq_onsite_food_options_title\">Tôi thích ăn vặt. Ở sự kiện này, tôi có thể ăn gì?</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">Nếu bị mất đồ tại sự kiện, tôi có thể tìm đồ thất lạc ở đâu?</string>\n    <string name=\"faq_after_dark_program_title\">Các chương trình Buổi tối có vẻ rất thú vị. Tôi có nên tham gia không?</string>\n    <string name=\"faq_accessibility_needs_title\">Bạn có thể hỗ trợ nhu cầu đi lại của tôi không?</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Phụ nữ có thai và những người mang theo con nhỏ được hỗ trợ như thế nào khi tham gia I/O?</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Nguyên tắc cộng đồng về sự kiện và Chính sách chống quấy rối của Google</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Các phiên sự kiện có được phát trực tiếp không? Nếu tôi không thể theo dõi sự kiện theo thời gian thực thì sao?</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">Tôi muốn ăn mừng sự kiện I/O với cộng đồng của mình!  Google có ý tưởng nào không?</string>\n    <string name=\"faq_when_and_where_description\">Để cập nhật những thông tin mới nhất về các phiên sự kiện, diễn giả và các hoạt động chung, đừng quên thường xuyên truy cập &lt;a href=\"https://events.google.com/io/\"&gt;trang web của sự kiện Google I/O 2019&lt;/a&gt;, &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Blog của Google Developers&lt;/a&gt; và theo dõi chúng tôi trên &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; and &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Bạn cũng có thể theo dõi và tham gia cuộc trò chuyện trên mạng xã hội về Google I/O 2019 qua hashtag chính thức &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Ngoài ra, chúng tôi sẽ gửi email thông báo những thông tin quan trọng cho tất cả những người tham dự đã đăng ký, cùng với hướng dẫn làm thủ tục đăng ký ghi tên trước khi tham gia liên hoan này.</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">Để cập nhật những thông tin mới nhất về các phiên sự kiện, diễn giả và các hoạt động chung, đừng quên thường xuyên truy cập &lt;a href=\"https://events.google.com/io/\"&gt;trang web của sự kiện Google I/O 2019&lt;/a&gt;, &lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Blog của Google Developers&lt;/a&gt; và theo dõi chúng tôi trên &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; and &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt;. Bạn cũng có thể theo dõi và tham gia cuộc trò chuyện trên mạng xã hội về Google I/O 2019 qua hashtag chính thức &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt;. Ngoài ra, chúng tôi sẽ gửi email thông báo những thông tin quan trọng cho tất cả những người tham dự đã đăng ký, cùng với hướng dẫn làm thủ tục đăng ký ghi tên trước khi tham gia liên hoan này.</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">Đúng vậy. Việc sử dụng tiếng Anh sẽ cho phép khán giả toàn cầu cùng đồng hành với sự kiện.</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">Các cá nhân tham dự có thể đặt chỗ trước cho các phiên sự kiện ngay từ tháng 4 trên trang web của I/O và trên cả ứng dụng dành cho thiết bị di động của I/O (lưu ý: các phiên sự kiện sẽ dành một phần chỗ ngồi nhất định không cho đặt trước để ưu tiên phục vụ những người đến trước tại địa điểm tổ chức). Việc tham dự Lớp học mã, Đánh giá ứng dụng và Sự kiện chính thức cũng dựa trên tiêu chí ưu tiên người đến trước.</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">Xem mục Di chuyển để biết tất cả những thông tin di chuyển cần thiết, bao gồm thông tin về xe đưa đón của sự kiện, tuyến đường dành cho ô tô và xe đạp, cách đi chung xe và nhiều thông tin khác!</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">Để giải quyết nhanh thủ tục đăng ký ghi tên tham dự sự kiện, chúng tôi sẽ bắt đầu phát huy hiệu tham dự sự kiện vào thứ Hai, ngày 6 tháng 5 tại Nhà hát Shoreline Amphitheatre. Để phát huy hiệu tham dự sự kiện Google I/O cho bạn, chúng tôi sẽ cần:&lt;br&gt; - Xác minh các giấy tờ tùy thân có dán ảnh của bạn. Chúng tôi chấp nhận các giấy phép do chính phủ cấp, hộ chiếu và các hình thức giấy tờ tùy thân khác. Nếu bạn không có giấy tờ tùy thân phù hợp, bạn sẽ không thể nhận được huy hiệu tham dự sự kiện và sẽ không được tham dự hội nghị. Tên trên giấy tờ tùy thân của bạn phải khớp chính xác với hồ sơ đăng ký. Nếu bạn là Đại biểu từ các cơ sở giáo dục, vui lòng mang theo các giấy tờ liên quan.&lt;br&gt; - Quét mã QR đăng ký bạn nhận được qua email. Bạn có thể quét mã QR này trên điện thoại và không cần in email ra! #bảovệmôitrường &lt;br&gt;&lt;br&gt;Vui lòng lưu ý rằng bạn không thể chia sẻ, cung cấp hay đưa huy hiệu tham dự sự kiện của mình cho bất kỳ người nào. Vì huy hiệu tham dự sự kiện Google I/O không thể thay thế bằng giấy tờ nào khác, nên bạn đừng làm mất, nếu không bạn sẽ không được tham dự hội nghị. Bạn phải đeo huy hiệu tham dự sự kiện Google I/O để được phép tham dự Google I/O, bao gồm các Phiên sự kiện, Hộp cát và Sự kiện sau giờ làm việc. Nếu bộ phận an ninh yêu cầu, vui lòng xuất trình thêm giấy tờ tùy thân. Huy hiệu tham dự sự kiện Google I/O có thể ghi tên của bạn, công ty hoặc tổ chức (nếu có) và dán ảnh của bạn.</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">Mọi người đều được đảm bảo có chỗ ngồi để nghe bài phát biểu nhưng những chỗ ngồi đẹp nhất sẽ dành cho những người đến sớm trong thời gian phát huy hiệu diễn ra từ 7 giờ sáng ngày 6 tháng 5. Vì vậy, hãy đảm bảo là bạn sẽ đến thật sớm!</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O là một sự kiện ngoài trời dành cho các nhà phát triển, vì vậy hãy mặc trang phục thật thoải mái. Không có yêu cầu về trang phục. Vùng Vịnh có thể rất nóng vào ban ngày và khá lạnh vào buổi tối nên hãy cân nhắc mang theo trang phục phù hợp.</string>\n    <string name=\"faq_onsite_food_options_description\">Tin tốt là chúng tôi cũng thích ăn uống!  Những người tham dự được phục vụ bữa sáng, bữa trưa và bữa phụ miễn phí trong cả ba ngày diễn ra hội nghị. Cũng sẽ có bữa tối vào ngày thứ nhất và thứ hai trong các sự kiện sau giờ làm việc.</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">Bạn không cần phải lo! Quầy đồ thất lạc sẽ đặt tại Bàn thông tin của hội nghị trong suốt thời gian diễn ra sự kiện. Bất kỳ món đồ nào bị bỏ quên qua đêm sẽ được chuyển đến Bộ phận an ninh của hội nghị. Vui lòng lưu ý rằng: bạn KHÔNG thể thay thế huy hiệu tham dự sự kiện Google I/O bằng bất kỳ giấy tờ nào khác. Do đó, đừng làm mất huy hiệu của mình, nếu không bạn sẽ không được tham dự hội nghị.</string>\n    <string name=\"faq_after_dark_program_description\">Đây là hai đêm mà bạn sẽ không muốn bỏ lỡ! Những người tham dự được mời tới thưởng thức âm nhạc, game và nhiều hoạt động khác vào tối ngày 8 tháng 5 và một buổi hòa nhạc độc đáo tại Nhà hát Amphitheatre vào ngày 9 tháng 5. Cả hai tối đều có thức ăn và đồ uống (đồ uống có cồn chỉ dành cho người từ 21 tuổi trở lên). Cả hai sự kiện sau giờ làm việc đều được tổ chức tại Nhà hát Shoreline Amphitheatre. Bạn cần xuất trình huy hiệu của người tham dự tại lối ra vào.</string>\n    <string name=\"faq_accessibility_needs_description\">Chúng tôi có chỗ đỗ xe dành cho phụ nữ mang thai trong bãi đỗ xe dành cho người khuyết tật.&lt;br&gt; Những bà mẹ đang cho con bú cũng được hoan nghênh tham dự hội nghị cùng với con của mình. Sẽ có bốn phòng dành cho các bà mẹ đang cho con bú mở cửa từ 8 giờ sáng đến 8 giờ tối vào hai ngày 7 và 8 tháng 5 và mở cửa từ 8 giờ sáng đến 4 giờ chiều ngày 9 tháng 5. Sẽ có bảng đăng ký tại trước cửa phòng dành cho các bà mẹ đang cho con bú. Việc sử dụng phòng ưu tiên người đến trước. Vui lòng xem thêm thông tin tại quầy trợ giúp của hội nghị.&lt;br&gt;&lt;br&gt; Chi phí trông trẻ là 100 USD một ngày (nhưng tổng cộng không vượt quá 300 USD). Những người tham dự mang theo con nhỏ quan tâm đến dịch vụ trông trẻ cần điền vào biểu mẫu đăng ký. Dịch vụ này được cung cấp theo tiêu chí ai đến trước được phục vụ trước. Dịch vụ trông trẻ do một bên thứ ba cung cấp. Nếu yêu cầu dịch vụ trông trẻ của bạn được chúng tôi chấp thuận qua email trước khi diễn ra hội nghị và có xác nhận bạn tham dự trực tiếp sự kiện, thì nhà cung cấp dịch vụ của chúng tôi sẽ liên hệ với bạn để thực hiện các bước tiếp theo trong vòng 7 ngày làm việc sau sự kiện Google I/O. Nhà cung cấp dịch vụ sẽ xử lý toàn bộ việc thu phí dịch vụ trông trẻ.</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">Chúng tôi có chỗ đỗ xe dành cho phụ nữ mang thai trong bãi đỗ xe dành cho người khuyết tật.&lt;br&gt; Những bà mẹ đang cho con bú cũng được hoan nghênh tham dự hội nghị cùng với con của mình. Sẽ có bốn phòng dành cho các bà mẹ đang cho con bú mở cửa từ 8 giờ sáng đến 8 giờ tối vào hai ngày 7 và 8 tháng 5 và mở cửa từ 8 giờ sáng đến 4 giờ chiều ngày 9 tháng 5. Sẽ có bảng đăng ký tại trước cửa phòng dành cho các bà mẹ đang cho con bú. Việc sử dụng phòng ưu tiên người đến trước. Vui lòng xem thêm thông tin tại quầy trợ giúp của hội nghị.&lt;br&gt;&lt;br&gt; Chi phí trông trẻ là 100 USD một ngày (nhưng tổng cộng không vượt quá 300 USD). Những người tham dự mang theo con nhỏ quan tâm đến dịch vụ trông trẻ cần điền vào biểu mẫu đăng ký. Dịch vụ này được cung cấp theo tiêu chí ai đến trước được phục vụ trước. Dịch vụ trông trẻ do một bên thứ ba cung cấp. Nếu yêu cầu dịch vụ trông trẻ của bạn được chúng tôi chấp thuận qua email trước khi diễn ra hội nghị và có xác nhận bạn tham dự trực tiếp sự kiện, thì nhà cung cấp dịch vụ của chúng tôi sẽ liên hệ với bạn để thực hiện các bước tiếp theo trong vòng 7 ngày làm việc sau sự kiện Google I/O. Nhà cung cấp dịch vụ sẽ xử lý toàn bộ việc thu phí dịch vụ trông trẻ.</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google nỗ lực hết sức để mang đến trải nghiệm sự kiện dành cho tất cả mọi người và không xảy ra tình trạng quấy rối cho dù họ có nhận thức về giới tính, biểu hiện giới, xu hướng tình dục, khuyết tật, chứng đa dạng thần kinh, ngoại hình, kích thước cơ thể, quốc tịch, dân tộc, tuổi tác, tôn giáo nào hoặc thuộc danh mục được bảo vệ khác. Cố gắng tối đa để tổ chức một sự kiện dành cho tất cả mọi người, chúng tôi cung cấp nhà vệ sinh không phân biệt giới tính ở khắp các vị trí của địa điểm tổ chức sự kiện.&lt;br&gt;&lt;br&gt; Chúng tôi không dung túng cho hành vi quấy rối ở bất kỳ hình thức nào của những người tham dự sự kiện.&lt;br&gt; Google sẽ xem xét nghiêm túc những trường hợp vi phạm chính sách của chúng tôi và có phản ứng phù hợp. Xem thêm thông tin về Nguyên tắc cộng đồng về sự kiện và Chính sách chống quấy rối của Google tại &lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;here&lt;/a&gt;.</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">Hai bài phát biểu và tất các phiên tại sự kiện sẽ được phát trực tiếp trên trang chủ của sự kiện trong suốt ba ngày diễn ra sự kiện. Nếu bạn bận làm việc hoặc sinh sống tại một khu vực lệch múi giờ, bạn có thể xem bản ghi hình các phiên sự kiện sau trên &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;kênh YouTube của Google Developers&lt;/a&gt;.</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">Có! Hàng năm, các nhà phát triển trên toàn thế giới tổ chức &lt;a href=\"https://events.google.com/io/extended\"&gt;các sự kiện Google I/O Mở rộng&lt;/a&gt;. Trong suốt những sự kiện này, các nhà tổ chức có thể phát trực tiếp sự kiện và tổ chức những phiên sự kiện của riêng mình, như sự kiện hackathon, các lớp học mã, các buổi giới thiệu minh họa và nhiều sự kiện khác.&lt;br&gt; Nếu bạn định tham gia với tư cách người đăng cai tổ chức sự kiện I/O Mở rộng năm nay, thì hãy làm theo các bước sau đây để bắt đầu:&lt;br&gt;&lt;br&gt; Vui lòng đọc kỹ &lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;Hướng dẫn tổ chức&lt;/a&gt; để xem các mẹo và gợi ý về cách tổ chức một sự kiện thành công.&lt;br&gt;&lt;br&gt; &lt;a href=\"https://events.google.com/io/extended/form\"&gt;Đăng ký&lt;/a&gt; trên trang web I/O để có thêm nhiều người biết tới sự kiện công khai của bạn.&lt;br&gt;&lt;br&gt; Sử dụng hashtag chính thức #io19extended trong tất cả các bài đăng trên mạng xã hội có liên quan đến sự kiện I/O Mở rộng để mọi người có thể dễ dàng tìm thấy sự kiện hơn.&lt;br&gt;&lt;br&gt; Lưu ý: Những người tổ chức sự kiện I/O Mở rộng có quyền yêu cầu xóa dữ liệu sự kiện và/hoặc dữ liệu cá nhân sau khi sự kiện kết thúc bằng cách gửi email tới địa chỉ io19@google.com.&lt;br&gt; Nếu bạn chỉ muốn tham dự sự kiện I/O Mở rộng, hãy duyệt qua &lt;a href=\"https://events.google.com/io/extended\"&gt;bản đồ của chúng tôi&lt;/a&gt; để tìm sự kiện ở gần khu vực của bạn và trả lời thư mời!&lt;br&gt; Nếu có thắc mắc về chương trình I/O Mở rộng, vui lòng liên hệ với chúng tôi theo địa chỉ io19extended\\-external@google.com.</string>\n    <string name=\"view_sessions_text\">Xem các phiên sự kiện</string>\n    <string name=\"wifi_install_success\">Đã lưu mạng wifi</string>\n    <string name=\"wifi_install_clipboard_message\">Không thể lưu mạng wifi.\\nVì vậy, chúng tôi đã lưu mật khẩu vào khay nhớ tạm.</string>\n    <string name=\"event_sessions_title\">Số phiên</string>\n    <string name=\"event_sandbox_title\">Hộp cát</string>\n    <string name=\"event_codelabs_title\">Phòng thí nghiệm lập trình</string>\n    <string name=\"event_officehours_title\">Giờ làm việc và Đánh giá ứng dụng</string>\n    <string name=\"event_afterhours_title\">Sau giờ làm việc</string>\n    <string name=\"event_meals_title\">Bữa ăn</string>\n    <string name=\"event_sessions_description\">Các cá nhân tham dự có thể đặt chỗ trước cho các phiên sự kiện ngay từ tháng 4 trên trang web của I/O và trên cả ứng dụng dành cho thiết bị di động của I/O (lưu ý: các phiên sự kiện sẽ dành một phần chỗ ngồi nhất định không cho đặt trước để ưu tiên phục vụ những người đến trước tại địa điểm tổ chức). Việc tham dự Lớp học mã, Đánh giá ứng dụng và Sự kiện chính thức cũng dựa trên tiêu chí ưu tiên người đến trước.</string>\n    <string name=\"event_sandbox_description\">Không gian thiết kế dành riêng để khám phá, tìm hiểu và chơi thử các sản phẩm và nền tảng mới nhất của chúng tôi thông qua các bản demo tương tác, cài đặt vật lý và nhiều hơn thế nữa.</string>\n    <string name=\"event_codelabs_description\">Trải nghiệm thực tế tại các quầy sẵn sàng lập mã của chúng tôi. Tại đây, bạn sẽ có mọi thứ cần thiết để tìm hiểu về các công nghệ mới nhất và tuyệt vời nhất của Google thông qua các hướng dẫn tự phát hoặc mang theo máy của riêng bạn và mang công việc về nhà với bạn. Nhân viên của Google sẽ có mặt sẵn sàng cung cấp những lời khuyên hữu ích và chỉ dẫn nếu bạn gặp khó khăn.</string>\n    <string name=\"event_officehours_description\">Giờ làm việc là cơ hội bạn có thể gặp mặt trực tiếp các chuyên gia của Google để đặt những câu hỏi kỹ thuật và Đánh giá ứng dụng sẽ cho bạn có hội nhận được lời khuyên và tư vấn cho các dự án liên quan đến ứng dụng cụ thể của bạn.</string>\n    <string name=\"event_afterhours_description\">Sau khi kết thúc Phiên sự kiện trong ngày, hãy lưu lại Shoreline hai đêm để thưởng thức ẩm thực và vui vẻ. Vào đêm đầu tiên, bữa tiệc sẽ được tổ chức trên không gian Hộp cát và vào đêm thứ hai, chúng tôi sẽ tổ chức một buổi hòa nhạc độc đáo tại Nhà hát vòm.</string>\n    <string name=\"event_meals_description\">Người tham dự được phục vụ bữa sáng, bữa trưa và bữa phụ miễn phí trong cả ba ngày diễn ra hội nghị. Cũng sẽ có bữa tối vào ngày thứ nhất và thứ hai trong các sự kiện sau giờ làm việc.</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">Ứng dụng liên quan</string>\n    <string name=\"event_types_header\">Loại sự kiện</string>\n    <string name=\"settings_time_zone_label\">Sự kiện ở múi giờ chuẩn Thái Bình Dương (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">Bật thông báo</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">Gửi số liệu thống kê sử dụng ẩn danh</string>\n    <string name=\"settings_tos\">Điều khoản dịch vụ</string>\n    <string name=\"settings_privacy_policy\">Chính sách quyền riêng tư</string>\n    <string name=\"settings_oss_licenses\">Giấy phép mã nguồn mở</string>\n    <string name=\"settings_theme_title\">Chọn giao diện</string>\n    <string name=\"settings_theme_system\">Mặc định hệ thống</string>\n    <string name=\"settings_theme_light\">Nhẹ</string>\n    <string name=\"settings_theme_dark\">Tối</string>\n    <string name=\"settings_theme_battery\">Đặt theo Trình tiết kiệm pin</string>\n    <string name=\"built_with_material_components\">Được thiết kế với Material Components.</string>\n    <string name=\"wifi_network_and_password\">Mạng: %1$s\\nMật khẩu: %2$s</string>\n    <string name=\"join_network\">Vào mạng</string>\n    <string name=\"assistant_app_description\">Chỉ cần nói: \"Hey Google, talk to Google I/O 19\"!</string>\n    <string name=\"assistant_app_description2\">Chỉ cần nói: \"Hey Google, talk to Google I/O 19\"!</string>\n    <string name=\"speaker_link_website\">Trang web</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">Sự kiện</string>\n    <string name=\"no_network_connection\">Không có kết nối internet.</string>\n    <string name=\"navigate_up\">Di chuyển lên</string>\n    <string name=\"no_network_description\">Để sử dụng tính năng Khám phá I/O, hãy thử:\\n\\n - Tắt chế độ trên máy bay\\n\\n - Bật dữ liệu di động hoặc Wi-Fi\\n\\n - Kiểm tra tín hiệu trong khu vực của bạn</string>\n    <string name=\"phone_does_not_support_arcore_title\">Điện thoại của bạn không hỗ trợ ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">Thử dùng thiết bị khác hoặc mượn thiết bị của bạn bè</string>\n    <string name=\"codelabs_information\">Hãy tìm hiểu những công nghệ mới nhất và tuyệt vời nhất của Google qua hướng dẫn tùy chỉnh theo tốc độ bạn muốn tại các quầy lập trình có sẵn đầy đủ trang bị hoặc đem theo máy của chính bạn và mang thành quả của bạn về nhà. Những quầy này mở cửa hàng ngày, trừ khoảng thời gian diễn ra bài phát biểu đầu tiên.</string>\n    <string name=\"codelabs_building\">Tòa nhà của Lớp học mã</string>\n    <string name=\"codelabs_website\">Trang web của Lớp học mã</string>\n    <string name=\"codelab_duration\">Thời lượng: %1$d phút</string>\n    <string name=\"start_codelab\">Bắt đầu lớp học mã</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-w1024dp/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <dimen name=\"content_max_width_percent\">0.6</dimen>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-w500dp/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n\n    <dimen name=\"snackbar_width\">@dimen/wrap_content</dimen>\n    <dimen name=\"snackbar_margin_end_fab\">72dp</dimen>\n    <dimen name=\"snackbar_margin_bottom_fab\">0dp</dimen>\n    <dimen name=\"snackbar_margin_bottom_bab\">48dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-w600dp/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <dimen name=\"content_max_width_percent\">0.8</dimen>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-w840dp/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <dimen name=\"content_max_width_percent\">0.7</dimen>\n    <!-- At this size Codelabs screen switches to a 2-column grid. -->\n    <dimen name=\"codelabs_max_width_percent\">1.0</dimen>\n    <dimen name=\"codelabs_list_item_spacing\">@dimen/spacing_normal</dimen>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-w840dp/donottranslate.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <string name=\"codelabs_recyclerview_layoutmanager\">StaggeredGridLayoutManager</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-w840dp/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <style name=\"Widget.IOSched.Codelabs.InfoCard\" parent=\"Widget.MaterialComponents.CardView\">\n        <item name=\"cardBackgroundColor\">@color/highlighted_card_background</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-zh/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">日程安排</string>\n    <string name=\"title_home\">首页</string>\n    <string name=\"title_map\">地图</string>\n    <string name=\"title_explore_io\">探索 I/O 大会</string>\n    <string name=\"title_info\">信息</string>\n    <string name=\"filters\">过滤条件</string>\n    <string name=\"category_heading_tracks\">主题</string>\n    <string name=\"category_heading_types\">类型</string>\n    <string name=\"reset\">重置</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"other\">%1$d 个活动</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">您已加星标的活动和已预约的活动</string>\n    <string name=\"starred_and_reserved_short\">您的活动</string>\n    <string name=\"search_schedule_hint\">搜索日程安排</string>\n    <string name=\"search_schedule_no_results\">未找到任何结果</string>\n    <string name=\"agenda\">日程</string>\n    <string name=\"event_starred\">已将活动添加到您的加星标项</string>\n    <string name=\"event_unstarred\">活动已从已加星标的项中移除</string>\n    <string name=\"event_star_error\">向已加星标的项添加活动时出错</string>\n    <string name=\"reservation_error\">更改预约时出错。请等待之前的请求完成，或稍后再试。</string>\n    <string name=\"reservation_request_succeeded\">已提交预约请求。</string>\n    <string name=\"reservation_cancel_succeeded\">已取消预约：&lt;b&gt;%s&lt;/b&gt;。</string>\n    <string name=\"reservation_new\">已为您预约&lt;b&gt;%s&lt;/b&gt;的席位。</string>\n    <string name=\"reservation_replaced\">活动已更换。</string>\n    <string name=\"waitlist_new\">您已进入候补名单。</string>\n    <string name=\"waitlist_cancel_succeeded\">已从候补名单中移除。</string>\n    <string name=\"got_it\">知道了</string>\n    <string name=\"dont_show\">不显示</string>\n    <string name=\"reservation_denied_cutoff\">预约被拒：与开始时间相隔太近。</string>\n    <string name=\"reservation_denied_clash\">预约被拒：与另一项预约冲突</string>\n    <string name=\"reservation_denied_unknown\">预约被拒：未知错误。</string>\n    <string name=\"cancellation_denied_cutoff\">取消请求被拒：与开始时间相隔太近。</string>\n    <string name=\"cancellation_denied_unknown\">取消请求被拒：未知错误。</string>\n    <string name=\"schedule_filters_empty\">未找到任何活动。</string>\n    <string name=\"reservation_reservable\">预约席位</string>\n    <string name=\"reservation_reserved\">已预约</string>\n    <string name=\"reservation_waitlisted\">已进入候补名单</string>\n    <string name=\"reservation_waitlist_available\">进入候补名单</string>\n    <string name=\"reservation_disabled\">无法预约</string>\n    <string name=\"reservation_pending\">预约待处理</string>\n    <string name=\"schedule_hint_title\">自定义日程安排</string>\n    <string name=\"schedule_hint_star_event\">添加到您已加星标的活动中</string>\n    <string name=\"schedule_hint_reserve_session_seat\">预约会议席位</string>\n    <string name=\"rate_session\">为会议评分</string>\n    <string name=\"menu_item_session_location\">会议位置</string>\n    <string name=\"menu_item_session_star\">为会议加注星标</string>\n    <string name=\"menu_item_calendar\">添加至日历</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">演讲者</string>\n    <string name=\"session_detail_related_header\">相关活动</string>\n    <string name=\"feedback_submit\">提交</string>\n    <string name=\"feedback_thank_you\">非常感谢您的反馈！</string>\n    <string name=\"feedback_q1_text\">您觉得这次大会的整体质量怎么样？</string>\n    <string name=\"feedback_q2_text\">您觉得大会的内容是否符合您的期望/大会介绍？</string>\n    <string name=\"feedback_q3_text\">大会与您的项目密切相关吗？</string>\n    <string name=\"feedback_q4_text\">研讨会与您的项目密切相关吗？</string>\n    <string name=\"feedback_q1_label_start\">非常基础</string>\n    <string name=\"feedback_q2_label_start\">很差</string>\n    <string name=\"feedback_q3_label_start\">很差</string>\n    <string name=\"feedback_q4_label_start\">不太相关</string>\n    <string name=\"feedback_q1_label_end\">很好</string>\n    <string name=\"feedback_q2_label_end\">非常棒</string>\n    <string name=\"feedback_q3_label_end\">非常相关</string>\n    <string name=\"feedback_q4_label_end\">非常相关</string>\n    <string name=\"a11y_show_navigation\">显示导航菜单</string>\n    <string name=\"a11y_collapse_filters_sheet\">收起过滤条件表格</string>\n    <string name=\"a11y_clear_tag_filters\">清除过滤条件</string>\n    <string name=\"a11y_filter_applied\">已应用过滤条件“%1s”</string>\n    <string name=\"a11y_filter_not_applied\">未应用过滤条件“%1s”</string>\n    <string name=\"a11y_reservation_available\">预约活动</string>\n    <string name=\"a11y_reservation_reserved\">已成功预约活动</string>\n    <string name=\"a11y_reservation_disabled\">无法预约</string>\n    <string name=\"a11y_reservation_wait_list_available\">进入活动候补名单</string>\n    <string name=\"a11y_reservation_wait_listed\">在活动的候补名单中</string>\n    <string name=\"a11y_reservation_pending\">预约待处理</string>\n    <string name=\"a11y_starred\">活动已添加书签</string>\n    <string name=\"a11y_unstarred\">活动未添加书签</string>\n    <string name=\"a11y_star\">加注星标</string>\n    <string name=\"a11y_play\">播放视频</string>\n    <string name=\"a11y_select_map_mode\">选择地图模式</string>\n    <string name=\"a11y_search_schedule\">搜索日程安排</string>\n    <string name=\"welcome\">欢迎！</string>\n    <string name=\"a11y_signed_in_content_description\">目前登录的帐号是 %s。</string>\n    <string name=\"a11y_signed_out_content_description\">点按即可登录。</string>\n    <string name=\"dialog_sign_in_content\">登录即可保存活动、预约席位并为会议评分（如果是会议参加者）。系统将通过您的帐号同步在应用和网站中执行的操作。</string>\n    <string name=\"sign_in\">登录</string>\n    <string name=\"firebase_auth_no_network_connection\">未连接到互联网</string>\n    <string name=\"firebase_auth_unknown_error\">未知错误</string>\n    <string name=\"dialog_sign_out_content\">所有已保存的活动、席位预约和会议评分（如果是会议参加者）都会持续同步到您的帐号中。</string>\n    <string name=\"sign_out\">退出帐号</string>\n    <string name=\"manage_google_account\">管理您的 Google 帐号</string>\n    <string name=\"remove_reservation_title\">要移除预约项目吗？</string>\n    <string name=\"remove_reservation_content\">您即将放弃“%1$s”的预约席位。如果您决定不预约席位，但仍想参加会议，我们的所有会议都会保留部分无需预约的座位：座位有限，先到现场者先得。</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"remove\">移除</string>\n    <string name=\"swap_reservation_title\">要更换预约项目吗？</string>\n    <string name=\"swap_reservation_content\">您已经有“%1$s”的预约席位/候补资格？每个时间段只能有一项预约。要改为预约“%2$s”吗？</string>\n    <string name=\"swap\">更换</string>\n    <string name=\"notifications_preference_dialog_title\">I/O 大会通知</string>\n    <string name=\"notifications_preference_dialog_content\">想要接收有关 I/O 大会的通知吗？我们会向您发送会议开始时间、会后活动、会议录像等相关信息。您可以随时在“信息”&gt;“设置”下更改此设置。</string>\n    <string name=\"no\">否</string>\n    <string name=\"yes\">是</string>\n    <string name=\"feed_not_available\">未找到任何公告。</string>\n    <string name=\"feed_loading_error\">无法加载 Feed。请稍后再试。</string>\n    <string name=\"feed_announcement_title\">公告</string>\n    <string name=\"feed_upcoming_events\">即将举行的活动</string>\n    <string name=\"feed_saved_events\">已保存的活动</string>\n    <string name=\"feed_no_saved_events\">没有已保存的活动</string>\n    <string name=\"feed_view_all_events\">查看所有活动</string>\n    <string name=\"feed_view_your_schedule\">查看您的日程安排</string>\n    <string name=\"feed_watch_live_stream\">观看直播</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"other\">%s 天</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"other\">%s 小时</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"other\">%s 分钟</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"other\">%s 秒</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">分享会议</string>\n    <string name=\"share_text_session_detail\">访问 #io19 %2$s，了解“%1$s”</string>\n    <string name=\"intent_chooser_session_detail\">分享</string>\n    <string name=\"map_variant_after_dark\">夜间</string>\n    <string name=\"map_variant_concert\">音乐会</string>\n    <string name=\"map_variant_daytime\">白天</string>\n    <string name=\"enable_my_location\">启用“我的位置”</string>\n    <string name=\"my_location_rationale\">此应用需要位置权限才能在地图上显示您所在的位置。</string>\n    <string name=\"onboarding_get_started\">开始使用</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">欢迎来到 Google I/O 大会</string>\n    <string name=\"onboarding_date_location\">2019 年 5 月 7 日至 9 日\\n加利福尼亚州山景城</string>\n    <string name=\"onboarding_label_days\">天</string>\n    <string name=\"onboarding_label_hours\">小时</string>\n    <string name=\"onboarding_label_mins\">分</string>\n    <string name=\"onboarding_label_seconds\">秒</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O 大会即将到来</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O 大会</string>\n    <string name=\"onboarding_welcome_google_io_post\">观看 2019 年 I/O 大会回顾并在社交网络上关注 #io19</string>\n    <string name=\"onboarding_signin\">登录即可接收 I/O 大会通知，并且参加者可以预约各场研讨会的座位。</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"other\">会议将在 %1$s 分钟后开始</item>\n    </plurals>\n    <string name=\"expanded\">已展开</string>\n    <string name=\"collapsed\">已收起</string>\n    <string name=\"event_title\">活动</string>\n    <string name=\"travel_title\">出行信息</string>\n    <string name=\"faq_title\">常见问题解答</string>\n    <string name=\"settings_title\">设置</string>\n    <string name=\"about_title\">简介</string>\n    <string name=\"travel_what_to_bring_title\">参会需携带的物品/资料</string>\n    <string name=\"travel_hotels_title\">酒店</string>\n    <string name=\"travel_getting_to_mountain_view_title\">前往山景城</string>\n    <string name=\"travel_getting_to_shoreline_title\">前往山景城</string>\n    <string name=\"travel_shuttle_service_title\">班车服务</string>\n    <string name=\"travel_off_site_parking_title\">异地停车</string>\n    <string name=\"travel_for_public_transportation_title\">公共交通</string>\n    <string name=\"travel_biking_title\">骑车</string>\n    <string name=\"travel_ridesharing_title\">拼车</string>\n    <string name=\"travel_airport_transfers_title\">机场接送</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O 大会是一项户外活动。虽然 I/O 大会的特别之处很大程度上来源于此，但这也意味着需要注意一些事项。研讨会将在空调帐篷内举行，但建议您在参加活动时准备好防晒霜、太阳镜和额外的衣服（以防晚上温度较低）。在决定穿什么衣服时，请记住 I/O 大会是一次休闲型着装的活动。</string>\n    <string name=\"travel_hotels_description\">我们在当地多家酒店预留了团体客房。酒店列表和客房提供情况会定期更新。请使用以下地图查找最适合您的酒店。&lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;酒店地图&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">湾区有三个大型机场提供国际航空服务：&lt;br&gt;&lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;旧金山国际机场 (SFO)&lt;/a&gt; 大约 24 英里&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;奥克兰国际机场 (OAK)&lt;/a&gt; 大约 32 英里&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;圣何塞国际机场 (SJC)&lt;/a&gt; 大约 12 英里</string>\n    <string name=\"travel_getting_to_shoreline_description\">为了减少交通拥堵并降低碳排放，2019 年 Google I/O 大会致力于成为一个“无停车活动”。此决定经过慎重考虑，我们将为您提供多种免费方案，让您无需开车即可到达会场。&lt;br&gt;&lt;br&gt;在活动即将开始时，我们将为您提供更多信息。&lt;br&gt;&lt;br&gt;*我们将提供无障碍停车服务。</string>\n    <string name=\"travel_shuttle_service_description\">为了减少交通拥堵并降低碳排放，2019 年 Google I/O 大会致力于成为一个“无停车活动”。此决定经过慎重考虑，我们将为您提供多种免费方案，让您无需开车即可到达会场。&lt;br&gt;&lt;br&gt;在活动即将开始时，我们将为您提供更多信息。&lt;br&gt;&lt;br&gt;*我们将提供无障碍停车服务。</string>\n    <string name=\"travel_off_site_parking_description\">我们将在 &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya 体育场&lt;/a&gt;提供免费异地停车服务。Avaya 体育场和 Google I/O 大会会场之间有班车供往返。&lt;br&gt;&lt;br&gt;如有无障碍停车位方面的需求或需要特别协助，请在您的注册表单中指明，规划团队会直接与您联系。</string>\n    <string name=\"travel_for_public_transportation_description\">我们将提供预付费公交卡，参加者可在预签到时领取。您可以搭乘以下公共交通工具到达会场所在区域：&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;：区域性轻轨交通系统&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;：在南湾区运营的轻轨系统&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;：湾区快速公交&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;：区域性轨道系统&lt;br&gt;&lt;br&gt;没有直达 Google I/O 大会会场的公交线路。敬请关注 Google I/O 大会活动班车的确切停靠站点。</string>\n    <string name=\"travel_biking_description\">Shoreline Amphitheatre 的 A 停车场将免费提供自行车存放服务。Silicon Valley Bicycle Coalition 将于每天早上 7 点到当天活动结束期间，为您提供安全的自行车代客停车服务。&lt;br&gt;&lt;br&gt;请查看 Google 地图，获取最佳骑行路线和导航信息。骑车前往 Shoreline Amphitheatre 有两条便捷的路线可选：一条是 Stevens Creek Trail，另一条是 Permanente Creek Trail。</string>\n    <string name=\"travel_ridesharing_description\">我们将在大会最后一天提供从 Google I/O 大会会场到 SFO 和 SJC 的送机服务。我们不会在任何其他日期提供机场接送服务。</string>\n    <string name=\"travel_airport_transfers_description\">我们将在大会最后一天提供从 Google I/O 大会会场到 SFO 和 SJC 的送机服务。我们不会在任何其他日期提供机场接送服务。</string>\n    <string name=\"faq_when_and_where_title\">2019 年 Google I/O 大会将在何时何地举行？</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">如何随时掌握 Google I/O 大会的最新动态？</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">所有研讨会都用英文吗？</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">我可以在活动开始之前预约研讨会吗？</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">前往 Shoreline Amphitheatre 的最佳路线是什么？</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">何时何地可以领取徽章？</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">听主题演讲时，我真的很想有一个前排座位。有什么办法吗？</string>\n    <string name=\"faq_what_should_i_wear_title\">我应该如何着装？</string>\n    <string name=\"faq_onsite_food_options_title\">我喜欢吃些点心。现场一般会提供哪些食品？</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">如果我在现场丢了东西，可以到哪里去找？</string>\n    <string name=\"faq_after_dark_program_title\">晚间计划听上去很有意思。我应该参加吗？</string>\n    <string name=\"faq_accessibility_needs_title\">你们能解决我的无障碍需求吗？</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">你们会为出席 I/O 大会的准妈妈和带孩子的父母提供哪些支持？</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google 活动社区准则和反骚扰政策</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">研讨会是采用现场直播形式吗？如果我无法实时关注活动该怎么办？</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">我想和我的社区一起庆祝 I/O 大会！能给我提供一些建议吗？</string>\n    <string name=\"faq_when_and_where_description\">要想即时获得有关研讨会、演讲者和整体活动的最新信息，请务必经常访问&lt;a href=\"https://events.google.com/io/\"&gt;2019 年 Google I/O 大会网站&lt;/a&gt;、&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google 开发者博客&lt;/a&gt;，并在 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; 和 &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; 上关注我们。您还可以通过官方 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; # 标签关注并参与有关 2019 年 Google I/O 大会的社交媒体讨论。此外，我们还会在大会开始前通过电子邮件向所有注册过的参加者发送重要信息以及签到说明。</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">要想即时获得有关研讨会、演讲者和整体活动的最新信息，请务必经常访问&lt;a href=\"https://events.google.com/io/\"&gt;2019 年 Google I/O 大会网站&lt;/a&gt;、&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google 开发者博客&lt;/a&gt;，并在 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; 和 &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; 上关注我们。您还可以通过官方 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; # 标签关注并参与有关 2019 年 Google I/O 大会的社交媒体讨论。此外，我们还会在大会开始前通过电子邮件向所有注册过的参加者发送重要信息以及签到说明。</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">是的。这样我们全球的观众都能持续关注。</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">从 4 月份开始，现场参加者可以在大会开始前通过 I/O 大会网站和 I/O 大会移动应用预约研讨会座位（注意：每次研讨会将保留部分不提供预约的座位，在现场先到先得）。Codelabs、应用评测和交流时间的座位将在现场按先到先得的原则分配给参加者。</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">请查看“旅行”部分，了解您所需的所有交通提示，包括班车信息、驾车和骑车路线、拼车提示等等！</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">为了加快签到流程，从 5 月 6 日星期一开始，参加者便可在 Shoreline Amphitheatre 领取徽章。在向您发放 Google I/O 大会徽章之前，我们需要：&lt;br&gt; - 核实您的带照片的身份证件。我们接受政府签发的驾照、护照和其他形式的身份证明。如果没有适当的身份证明，您将无法获得徽章，因而不能参加大会。您证件中的姓名必须与注册的个人资料中的姓名完全一致。如果您参加的是学术研讨会，请务必携带相关资格证明。&lt;br&gt; - 扫描您通过电子邮件收到的注册 QR 码。您可以用手机进行扫描，无需打印电子邮件！#savetheenvironment &lt;br&gt;&lt;br&gt;请注意，您不得将自己的徽章分享、赠送或以其他方式提供给任何人。Google I/O 大会徽章是不可补办的；因此，请务必保管好。如果丢失，您将无法继续参加大会。您必须佩戴 Google I/O 大会徽章才能获准参加 Google I/O 大会，包括研讨会、沙盒会议和晚间活动等。若安保人员要求出示或提供额外的身份证明，请予以配合。Google I/O 大会徽章上可能会显示您的姓名、公司或组织（若已提供）和照片。</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">我们会保证所有参加主题演讲的人员都有座位，但最佳座位将于领取徽章之时，按照先到先得的原则进行分配。徽章将于 5 月 6 日上午 7 点开始领取，届时请务必尽早赶到！</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O 大会是在室外举办的开发者活动，因此请以自己感觉舒适放松为度，没有严格的着装要求。湾区早晚温差很大，请在选择服装时考虑这一点。</string>\n    <string name=\"faq_onsite_food_options_description\">好消息，我们也喜欢美食！在为期三天的大会期间，我们每天都会为参加者提供免费早餐、午餐和点心。在第一天和第二天的晚间活动期间，我们还将提供晚餐。</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">请放心！大会期间，我们将在大会服务台设立失物招领处。无人认领的所有物品会在第二天移交至大会安保部门。有一点要特别注意：Google I/O 大会徽章是不可补办的；因此，请务必保管好。如果丢失，您将无法继续参加大会。</string>\n    <string name=\"faq_after_dark_program_description\">不容错过的两个晚上！我们将邀请参加者在 5 月 8 日晚上畅享音乐、游戏等娱乐节目，并在 5 月 9 日在 Shoreline Amphitheatre 为参加者举办专场音乐会。我们会在这两个晚上提供美酒佳肴（酒精饮料仅限年满 21 周岁的人士）。这两个晚间活动都在 Shoreline Amphitheatre 举行，您需要佩戴参会徽章才能入场。</string>\n    <string name=\"faq_accessibility_needs_description\">我们将在无障碍停车区留出停车位供准妈妈使用。&lt;br&gt;欢迎哺乳期的妈妈们带孩子一起参加大会。5 月 7 日和 8 日的上午 8 点至晚上 8 点以及 5 月 9 日上午 8 点至下午 4 点，将有 4 个哺乳室供妈妈们使用。哺乳室门前提供了登记表；哺乳室按照先到先得的方式供妈妈们使用。请前往大会服务中心了解详情。&lt;br&gt;&lt;br&gt;参加大会的父母如果在我们的注册表单中表达了对儿童看护的需求，则可以获得每天 100 美元（总共不超过 300 美元）的补贴费用（先到先得）。我们的儿童看护补贴费用是通过第三方供应商提供的。如果在大会开始前我们通过电子邮件批准了您的儿童看护请求，并且已确认您是现场参加大会，我们的供应商将在 Google I/O 大会结束后的 7 个工作日内与您联系，以商讨后续事宜。他们将负责管理儿童看护补贴费用的所有补贴事宜。</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">我们将在无障碍停车区留出停车位供准妈妈使用。&lt;br&gt;欢迎哺乳期的妈妈们带孩子一起参加大会。5 月 7 日和 8 日的上午 8 点至晚上 8 点以及 5 月 9 日上午 8 点至下午 4 点，将有 4 个哺乳室供妈妈们使用。哺乳室门前提供了登记表；哺乳室按照先到先得的方式供妈妈们使用。请前往大会服务中心了解详情。&lt;br&gt;&lt;br&gt;参加大会的父母如果在我们的注册表单中表达了对儿童看护的需求，则可以获得每天 100 美元（总共不超过 300 美元）的补贴费用（先到先得）。我们的儿童看护补贴费用是通过第三方供应商提供的。如果在大会开始前我们通过电子邮件批准了您的儿童看护请求，并且已确认您是现场参加大会，我们的供应商将在 Google I/O 大会结束后的 7 个工作日内与您联系，以商讨后续事宜。他们将负责管理儿童看护补贴费用的所有补贴事宜。</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google 致力于为所有人提供无骚扰、包容性的活动体验，不会因为性别认同、性别表现、性取向、残疾、神经多样性、外貌、体型、民族、国籍、种族、年龄、宗教信仰或属于其他受保护的类别而对参加者区别对待。为了尽可能在活动中提供包容性氛围，我们将在整个会场中提供中性洗手间。&lt;br&gt;&lt;br&gt;我们不能容忍以任何形式骚扰活动参与者的行为。&lt;br&gt;Google 会严肃对待违反我们政策的行为并将做出适当处理。要详细了解《Google 活动社区准则和反骚扰政策》，请点击&lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;此处&lt;/a&gt;。</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">本届大会为期三天，期间我们会在大会网站的首页上提供两场主题演讲和所有研讨会的现场直播。如果您工作繁忙，或因身处地球的另一端而面临时差造成的不便，则可以在晚些时候通过 &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;YouTube 上的“Google Developers”频道&lt;/a&gt;观看活动录像。</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">会！每年，世界各地的开发者都会举办 &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended 活动&lt;/a&gt;。在这些活动期间，主办者可以直播 Google I/O 大会并举办自己的研讨会（包括黑客马拉松、代码实验室、演示等）。&lt;br&gt;如果您今年要作为 I/O Extended 主办者加入参与大会，您应该按照以下步骤着手：&lt;br&gt;&lt;br&gt;仔细阅读&lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;主办者指南&lt;/a&gt;以获得如何成功举办活动的提示和建议。&lt;br&gt;&lt;br&gt;请在 I/O 网站上&lt;a href=\"https://events.google.com/io/extended/form\"&gt;注册&lt;/a&gt;您的公开活动，以提高曝光度。&lt;br&gt;&lt;br&gt;在所有与 I/O Extended 相关的社交信息中使用官方 #io19extended # 标签，方便用户发现您。&lt;br&gt;&lt;br&gt;注意：活动结束后，I/O Extended 主办者可以向 io19@google.com 发送电子邮件来请求删除其个人和/或活动数据。&lt;br&gt;如果您只想参加 I/O Extended 活动，请浏览&lt;a href=\"https://events.google.com/io/extended\"&gt;我们的地图&lt;/a&gt;寻找您附近的活动并确认您要参加该活动！&lt;br&gt;如有 I/O Extended 计划方面的问题，请发送电子邮件至 io19extended\\-external@google.com 与我们联系。</string>\n    <string name=\"view_sessions_text\">查看会议</string>\n    <string name=\"wifi_install_success\">Wi-Fi 网络已保存</string>\n    <string name=\"wifi_install_clipboard_message\">无法保存 Wi-Fi 网络。\\n已将密码保存到剪贴板。</string>\n    <string name=\"event_sessions_title\">会议</string>\n    <string name=\"event_sandbox_title\">沙盒</string>\n    <string name=\"event_codelabs_title\">代码实验室</string>\n    <string name=\"event_officehours_title\">交流时间和应用评价</string>\n    <string name=\"event_afterhours_title\">会后活动</string>\n    <string name=\"event_meals_title\">用餐</string>\n    <string name=\"event_sessions_description\">从 4 月份开始，现场参加者可以在大会开始前通过 I/O 大会网站和 I/O 大会移动应用预约研讨会座位（注意：每次研讨会将保留部分不提供预约的座位，在现场先到先得）。Codelabs、应用评测和交流时间的座位将在现场按先到先得的原则分配给参加者。</string>\n    <string name=\"event_sandbox_description\">这些专用空间用于通过互动式演示、物理装置等方式探索、学习及试用我们的最新产品和平台。</string>\n    <string name=\"event_codelabs_description\">利用可直接编程的自助服务终端获取实践经验。在这里，您可以借助自定进度的教程和全面的资源来学习最新、最优秀的 Google 技术，也可以携带自己的机器并将成果带回家。如果您遇到困难，Google 员工将随时为您提供有用的建议并提供指导。</string>\n    <string name=\"event_officehours_description\">在“交流时间”，您将有机会与 Google 专家面对面交谈，询问所有技术问题；在“应用评价”时段，您将有机会为自己的特定应用相关项目获取建议和提示。</string>\n    <string name=\"event_afterhours_description\">我们会在前两天会议结束后提供美食佳饮，欢迎留在海岸线与我们同乐。在第一个晚上，我们将在沙盒空间举办派对活动；在第二个晚上，我们将在 Shoreline Amphitheatre 举办一场独家音乐会。</string>\n    <string name=\"event_meals_description\">在为期三天的大会期间，我们每天都会为参加者提供免费早餐、午餐和点心。在第一天和第二天的晚间活动期间，我们还将提供晚餐。</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">相关应用</string>\n    <string name=\"event_types_header\">活动类型</string>\n    <string name=\"settings_time_zone_label\">活动时间为太平洋时区 (UTC-8) 的时间</string>\n    <string name=\"settings_enable_notifications\">启用通知</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">发送匿名使用情况统计信息</string>\n    <string name=\"settings_tos\">服务条款</string>\n    <string name=\"settings_privacy_policy\">隐私权政策</string>\n    <string name=\"settings_oss_licenses\">开放源代码许可</string>\n    <string name=\"settings_theme_title\">选择主题背景</string>\n    <string name=\"settings_theme_system\">系统默认</string>\n    <string name=\"settings_theme_light\">浅色</string>\n    <string name=\"settings_theme_dark\">深色</string>\n    <string name=\"settings_theme_battery\">根据省电模式设置</string>\n    <string name=\"built_with_material_components\">使用 Material Components 开发。</string>\n    <string name=\"wifi_network_and_password\">网络：%1$s\\n密码：%2$s</string>\n    <string name=\"join_network\">加入网络</string>\n    <string name=\"assistant_app_description\">只需说“Hey Google, talk to Google I/O 19”（Hey Google，我要跟 Google I/O 19 聊一聊）！</string>\n    <string name=\"assistant_app_description2\">只需说“Hey Google, talk to Google I/O 19”（Hey Google，我要跟 Google I/O 19 聊一聊）！</string>\n    <string name=\"speaker_link_website\">网站</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">活动</string>\n    <string name=\"no_network_connection\">未连接到互联网。</string>\n    <string name=\"navigate_up\">转到上一层级</string>\n    <string name=\"no_network_description\">要使用“探索 I/O 大会”，请尝试：\\n\\n - 关闭飞行模式\\n\\n - 开启移动数据网络或 WLAN\\n\\n - 检查您所在区域的信号强度</string>\n    <string name=\"phone_does_not_support_arcore_title\">您手机不支持 ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">请尝试换一部设备，或者借用下朋友的设备</string>\n    <string name=\"codelabs_information\">您可以在我们提供的可直接编程的自助服务终端中通过自定进度的教程来学习最新、最精彩的 Google 技术，也可以携带自己的计算机并将成果带回家。自助服务终端每天都开放，首次主题演讲期间除外。</string>\n    <string name=\"codelabs_building\">Codelabs 大楼</string>\n    <string name=\"codelabs_website\">Codelabs 网站</string>\n    <string name=\"codelab_duration\">时长：%1$d 分钟</string>\n    <string name=\"start_codelab\">启动代码实验室</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">日程安排</string>\n    <string name=\"title_home\">首页</string>\n    <string name=\"title_map\">地图</string>\n    <string name=\"title_explore_io\">探索 I/O 大会</string>\n    <string name=\"title_info\">信息</string>\n    <string name=\"filters\">过滤条件</string>\n    <string name=\"category_heading_tracks\">主题</string>\n    <string name=\"category_heading_types\">类型</string>\n    <string name=\"reset\">重置</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"other\">%1$d 个活动</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">您已加星标的活动和已预约的活动</string>\n    <string name=\"starred_and_reserved_short\">您的活动</string>\n    <string name=\"search_schedule_hint\">搜索日程安排</string>\n    <string name=\"search_schedule_no_results\">未找到任何结果</string>\n    <string name=\"agenda\">日程</string>\n    <string name=\"event_starred\">已将活动添加到您的加星标项</string>\n    <string name=\"event_unstarred\">活动已从已加星标的项中移除</string>\n    <string name=\"event_star_error\">向已加星标的项添加活动时出错</string>\n    <string name=\"reservation_error\">更改预约时出错。请等待之前的请求完成，或稍后再试。</string>\n    <string name=\"reservation_request_succeeded\">已提交预约请求。</string>\n    <string name=\"reservation_cancel_succeeded\">已取消预约：&lt;b&gt;%s&lt;/b&gt;。</string>\n    <string name=\"reservation_new\">已为您预约&lt;b&gt;%s&lt;/b&gt;的席位。</string>\n    <string name=\"reservation_replaced\">活动已更换。</string>\n    <string name=\"waitlist_new\">您已进入候补名单。</string>\n    <string name=\"waitlist_cancel_succeeded\">已从候补名单中移除。</string>\n    <string name=\"got_it\">知道了</string>\n    <string name=\"dont_show\">不显示</string>\n    <string name=\"reservation_denied_cutoff\">预约被拒：与开始时间相隔太近。</string>\n    <string name=\"reservation_denied_clash\">预约被拒：与另一项预约冲突</string>\n    <string name=\"reservation_denied_unknown\">预约被拒：未知错误。</string>\n    <string name=\"cancellation_denied_cutoff\">取消请求被拒：与开始时间相隔太近。</string>\n    <string name=\"cancellation_denied_unknown\">取消请求被拒：未知错误。</string>\n    <string name=\"schedule_filters_empty\">未找到任何活动。</string>\n    <string name=\"reservation_reservable\">预约席位</string>\n    <string name=\"reservation_reserved\">已预约</string>\n    <string name=\"reservation_waitlisted\">已进入候补名单</string>\n    <string name=\"reservation_waitlist_available\">进入候补名单</string>\n    <string name=\"reservation_disabled\">无法预约</string>\n    <string name=\"reservation_pending\">预约待处理</string>\n    <string name=\"schedule_hint_title\">自定义日程安排</string>\n    <string name=\"schedule_hint_star_event\">添加到您已加星标的活动中</string>\n    <string name=\"schedule_hint_reserve_session_seat\">预约会议席位</string>\n    <string name=\"rate_session\">为会议评分</string>\n    <string name=\"menu_item_session_location\">会议位置</string>\n    <string name=\"menu_item_session_star\">为会议加注星标</string>\n    <string name=\"menu_item_calendar\">添加至日历</string>\n    <string name=\"speaker_delimiter\">,</string>\n    <string name=\"session_detail_speakers_header\">演讲者</string>\n    <string name=\"session_detail_related_header\">相关活动</string>\n    <string name=\"feedback_submit\">提交</string>\n    <string name=\"feedback_thank_you\">非常感谢您的反馈！</string>\n    <string name=\"feedback_q1_text\">您觉得这次大会的整体质量怎么样？</string>\n    <string name=\"feedback_q2_text\">您觉得大会的内容是否符合您的期望/大会介绍？</string>\n    <string name=\"feedback_q3_text\">大会与您的项目密切相关吗？</string>\n    <string name=\"feedback_q4_text\">研讨会与您的项目密切相关吗？</string>\n    <string name=\"feedback_q1_label_start\">非常基础</string>\n    <string name=\"feedback_q2_label_start\">很差</string>\n    <string name=\"feedback_q3_label_start\">很差</string>\n    <string name=\"feedback_q4_label_start\">不太相关</string>\n    <string name=\"feedback_q1_label_end\">很好</string>\n    <string name=\"feedback_q2_label_end\">非常棒</string>\n    <string name=\"feedback_q3_label_end\">非常相关</string>\n    <string name=\"feedback_q4_label_end\">非常相关</string>\n    <string name=\"a11y_show_navigation\">显示导航菜单</string>\n    <string name=\"a11y_collapse_filters_sheet\">收起过滤条件表格</string>\n    <string name=\"a11y_clear_tag_filters\">清除过滤条件</string>\n    <string name=\"a11y_filter_applied\">已应用过滤条件“%1s”</string>\n    <string name=\"a11y_filter_not_applied\">未应用过滤条件“%1s”</string>\n    <string name=\"a11y_reservation_available\">预约活动</string>\n    <string name=\"a11y_reservation_reserved\">已成功预约活动</string>\n    <string name=\"a11y_reservation_disabled\">无法预约</string>\n    <string name=\"a11y_reservation_wait_list_available\">进入活动候补名单</string>\n    <string name=\"a11y_reservation_wait_listed\">在活动的候补名单中</string>\n    <string name=\"a11y_reservation_pending\">预约待处理</string>\n    <string name=\"a11y_starred\">活动已添加书签</string>\n    <string name=\"a11y_unstarred\">活动未添加书签</string>\n    <string name=\"a11y_star\">加注星标</string>\n    <string name=\"a11y_play\">播放视频</string>\n    <string name=\"a11y_select_map_mode\">选择地图模式</string>\n    <string name=\"a11y_search_schedule\">搜索日程安排</string>\n    <string name=\"welcome\">欢迎！</string>\n    <string name=\"a11y_signed_in_content_description\">目前登录的帐号是 %s。</string>\n    <string name=\"a11y_signed_out_content_description\">点按即可登录。</string>\n    <string name=\"dialog_sign_in_content\">登录即可保存活动、预约席位并为会议评分（如果是会议参加者）。系统将通过您的帐号同步在应用和网站中执行的操作。</string>\n    <string name=\"sign_in\">登录</string>\n    <string name=\"firebase_auth_no_network_connection\">未连接到互联网</string>\n    <string name=\"firebase_auth_unknown_error\">未知错误</string>\n    <string name=\"dialog_sign_out_content\">所有已保存的活动、席位预约和会议评分（如果是会议参加者）都会持续同步到您的帐号中。</string>\n    <string name=\"sign_out\">退出帐号</string>\n    <string name=\"manage_google_account\">管理您的 Google 帐号</string>\n    <string name=\"remove_reservation_title\">要移除预约项目吗？</string>\n    <string name=\"remove_reservation_content\">您即将放弃“%1$s”的预约席位。如果您决定不预约席位，但仍想参加会议，我们的所有会议都会保留部分无需预约的座位：座位有限，先到现场者先得。</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"remove\">移除</string>\n    <string name=\"swap_reservation_title\">要更换预约项目吗？</string>\n    <string name=\"swap_reservation_content\">您已经有“%1$s”的预约席位/候补资格？每个时间段只能有一项预约。要改为预约“%2$s”吗？</string>\n    <string name=\"swap\">更换</string>\n    <string name=\"notifications_preference_dialog_title\">I/O 大会通知</string>\n    <string name=\"notifications_preference_dialog_content\">想要接收有关 I/O 大会的通知吗？我们会向您发送会议开始时间、会后活动、会议录像等相关信息。您可以随时在“信息”&gt;“设置”下更改此设置。</string>\n    <string name=\"no\">否</string>\n    <string name=\"yes\">是</string>\n    <string name=\"feed_not_available\">未找到任何公告。</string>\n    <string name=\"feed_loading_error\">无法加载 Feed。请稍后再试。</string>\n    <string name=\"feed_announcement_title\">公告</string>\n    <string name=\"feed_upcoming_events\">即将举行的活动</string>\n    <string name=\"feed_saved_events\">已保存的活动</string>\n    <string name=\"feed_no_saved_events\">没有已保存的活动</string>\n    <string name=\"feed_view_all_events\">查看所有活动</string>\n    <string name=\"feed_view_your_schedule\">查看您的日程安排</string>\n    <string name=\"feed_watch_live_stream\">观看直播</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"other\">%s 天</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"other\">%s 小时</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"other\">%s 分钟</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"other\">%s 秒</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">分享会议</string>\n    <string name=\"share_text_session_detail\">访问 #io19 %2$s，了解“%1$s”</string>\n    <string name=\"intent_chooser_session_detail\">分享</string>\n    <string name=\"map_variant_after_dark\">夜间</string>\n    <string name=\"map_variant_concert\">音乐会</string>\n    <string name=\"map_variant_daytime\">白天</string>\n    <string name=\"enable_my_location\">启用“我的位置”</string>\n    <string name=\"my_location_rationale\">此应用需要位置权限才能在地图上显示您所在的位置。</string>\n    <string name=\"onboarding_get_started\">开始使用</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">欢迎来到 Google I/O 大会</string>\n    <string name=\"onboarding_date_location\">2019 年 5 月 7 日至 9 日\\n加利福尼亚州山景城</string>\n    <string name=\"onboarding_label_days\">天</string>\n    <string name=\"onboarding_label_hours\">小时</string>\n    <string name=\"onboarding_label_mins\">分</string>\n    <string name=\"onboarding_label_seconds\">秒</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O 大会即将到来</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O 大会</string>\n    <string name=\"onboarding_welcome_google_io_post\">观看 2019 年 I/O 大会回顾并在社交网络上关注 #io19</string>\n    <string name=\"onboarding_signin\">登录即可接收 I/O 大会通知，并且参加者可以预约各场研讨会的座位。</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"other\">会议将在 %1$s 分钟后开始</item>\n    </plurals>\n    <string name=\"expanded\">已展开</string>\n    <string name=\"collapsed\">已收起</string>\n    <string name=\"event_title\">活动</string>\n    <string name=\"travel_title\">出行信息</string>\n    <string name=\"faq_title\">常见问题解答</string>\n    <string name=\"settings_title\">设置</string>\n    <string name=\"about_title\">简介</string>\n    <string name=\"travel_what_to_bring_title\">参会需携带的物品/资料</string>\n    <string name=\"travel_hotels_title\">酒店</string>\n    <string name=\"travel_getting_to_mountain_view_title\">前往山景城</string>\n    <string name=\"travel_getting_to_shoreline_title\">前往山景城</string>\n    <string name=\"travel_shuttle_service_title\">班车服务</string>\n    <string name=\"travel_off_site_parking_title\">异地停车</string>\n    <string name=\"travel_for_public_transportation_title\">公共交通</string>\n    <string name=\"travel_biking_title\">骑车</string>\n    <string name=\"travel_ridesharing_title\">拼车</string>\n    <string name=\"travel_airport_transfers_title\">机场接送</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O 大会是一项户外活动。虽然 I/O 大会的特别之处很大程度上来源于此，但这也意味着需要注意一些事项。研讨会将在空调帐篷内举行，但建议您在参加活动时准备好防晒霜、太阳镜和额外的衣服（以防晚上温度较低）。在决定穿什么衣服时，请记住 I/O 大会是一次休闲型着装的活动。</string>\n    <string name=\"travel_hotels_description\">我们在当地多家酒店预留了团体客房。酒店列表和客房提供情况会定期更新。请使用以下地图查找最适合您的酒店。&lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;酒店地图&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">湾区有三个大型机场提供国际航空服务：&lt;br&gt;&lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;旧金山国际机场 (SFO)&lt;/a&gt; 大约 24 英里&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;奥克兰国际机场 (OAK)&lt;/a&gt; 大约 32 英里&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=en\"&gt;圣何塞国际机场 (SJC)&lt;/a&gt; 大约 12 英里</string>\n    <string name=\"travel_getting_to_shoreline_description\">为了减少交通拥堵并降低碳排放，2019 年 Google I/O 大会致力于成为一个“无停车活动”。此决定经过慎重考虑，我们将为您提供多种免费方案，让您无需开车即可到达会场。&lt;br&gt;&lt;br&gt;在活动即将开始时，我们将为您提供更多信息。&lt;br&gt;&lt;br&gt;*我们将提供无障碍停车服务。</string>\n    <string name=\"travel_shuttle_service_description\">为了减少交通拥堵并降低碳排放，2019 年 Google I/O 大会致力于成为一个“无停车活动”。此决定经过慎重考虑，我们将为您提供多种免费方案，让您无需开车即可到达会场。&lt;br&gt;&lt;br&gt;在活动即将开始时，我们将为您提供更多信息。&lt;br&gt;&lt;br&gt;*我们将提供无障碍停车服务。</string>\n    <string name=\"travel_off_site_parking_description\">我们将在 &lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;Avaya 体育场&lt;/a&gt;提供免费异地停车服务。Avaya 体育场和 Google I/O 大会会场之间有班车供往返。&lt;br&gt;&lt;br&gt;如有无障碍停车位方面的需求或需要特别协助，请在您的注册表单中指明，规划团队会直接与您联系。</string>\n    <string name=\"travel_for_public_transportation_description\">我们将提供预付费公交卡，参加者可在预签到时领取。您可以搭乘以下公共交通工具到达会场所在区域：&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.caltrain.com/\"&gt;Caltrain&lt;/a&gt;：区域性轻轨交通系统&lt;br&gt;&lt;br&gt; &lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;：在南湾区运营的轻轨系统&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;：湾区快速公交&lt;br&gt;&lt;br&gt; &lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;：区域性轨道系统&lt;br&gt;&lt;br&gt;没有直达 Google I/O 大会会场的公交线路。敬请关注 Google I/O 大会活动班车的确切停靠站点。</string>\n    <string name=\"travel_biking_description\">Shoreline Amphitheatre 的 A 停车场将免费提供自行车存放服务。Silicon Valley Bicycle Coalition 将于每天早上 7 点到当天活动结束期间，为您提供安全的自行车代客停车服务。&lt;br&gt;&lt;br&gt;请查看 Google 地图，获取最佳骑行路线和导航信息。骑车前往 Shoreline Amphitheatre 有两条便捷的路线可选：一条是 Stevens Creek Trail，另一条是 Permanente Creek Trail。</string>\n    <string name=\"travel_ridesharing_description\">我们将在大会最后一天提供从 Google I/O 大会会场到 SFO 和 SJC 的送机服务。我们不会在任何其他日期提供机场接送服务。</string>\n    <string name=\"travel_airport_transfers_description\">我们将在大会最后一天提供从 Google I/O 大会会场到 SFO 和 SJC 的送机服务。我们不会在任何其他日期提供机场接送服务。</string>\n    <string name=\"faq_when_and_where_title\">2019 年 Google I/O 大会将在何时何地举行？</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">如何随时掌握 Google I/O 大会的最新动态？</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">所有研讨会都用英文吗？</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">我可以在活动开始之前预约研讨会吗？</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">前往 Shoreline Amphitheatre 的最佳路线是什么？</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">何时何地可以领取徽章？</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">听主题演讲时，我真的很想有一个前排座位。有什么办法吗？</string>\n    <string name=\"faq_what_should_i_wear_title\">我应该如何着装？</string>\n    <string name=\"faq_onsite_food_options_title\">我喜欢吃些点心。现场一般会提供哪些食品？</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">如果我在现场丢了东西，可以到哪里去找？</string>\n    <string name=\"faq_after_dark_program_title\">晚间计划听上去很有意思。我应该参加吗？</string>\n    <string name=\"faq_accessibility_needs_title\">你们能解决我的无障碍需求吗？</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">你们会为出席 I/O 大会的准妈妈和带孩子的父母提供哪些支持？</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google 活动社区准则和反骚扰政策</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">研讨会是采用现场直播形式吗？如果我无法实时关注活动该怎么办？</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">我想和我的社区一起庆祝 I/O 大会！能给我提供一些建议吗？</string>\n    <string name=\"faq_when_and_where_description\">要想即时获得有关研讨会、演讲者和整体活动的最新信息，请务必经常访问&lt;a href=\"https://events.google.com/io/\"&gt;2019 年 Google I/O 大会网站&lt;/a&gt;、&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google 开发者博客&lt;/a&gt;，并在 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; 和 &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; 上关注我们。您还可以通过官方 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; # 标签关注并参与有关 2019 年 Google I/O 大会的社交媒体讨论。此外，我们还会在大会开始前通过电子邮件向所有注册过的参加者发送重要信息以及签到说明。</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">要想即时获得有关研讨会、演讲者和整体活动的最新信息，请务必经常访问&lt;a href=\"https://events.google.com/io/\"&gt;2019 年 Google I/O 大会网站&lt;/a&gt;、&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google 开发者博客&lt;/a&gt;，并在 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; 和 &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; 上关注我们。您还可以通过官方 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; # 标签关注并参与有关 2019 年 Google I/O 大会的社交媒体讨论。此外，我们还会在大会开始前通过电子邮件向所有注册过的参加者发送重要信息以及签到说明。</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">是的。这样我们全球的观众都能持续关注。</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">从 4 月份开始，现场参加者可以在大会开始前通过 I/O 大会网站和 I/O 大会移动应用预约研讨会座位（注意：每次研讨会将保留部分不提供预约的座位，在现场先到先得）。Codelabs、应用评测和交流时间的座位将在现场按先到先得的原则分配给参加者。</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">请查看“旅行”部分，了解您所需的所有交通提示，包括班车信息、驾车和骑车路线、拼车提示等等！</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">为了加快签到流程，从 5 月 6 日星期一开始，参加者便可在 Shoreline Amphitheatre 领取徽章。在向您发放 Google I/O 大会徽章之前，我们需要：&lt;br&gt; - 核实您的带照片的身份证件。我们接受政府签发的驾照、护照和其他形式的身份证明。如果没有适当的身份证明，您将无法获得徽章，因而不能参加大会。您证件中的姓名必须与注册的个人资料中的姓名完全一致。如果您参加的是学术研讨会，请务必携带相关资格证明。&lt;br&gt; - 扫描您通过电子邮件收到的注册 QR 码。您可以用手机进行扫描，无需打印电子邮件！#savetheenvironment &lt;br&gt;&lt;br&gt;请注意，您不得将自己的徽章分享、赠送或以其他方式提供给任何人。Google I/O 大会徽章是不可补办的；因此，请务必保管好。如果丢失，您将无法继续参加大会。您必须佩戴 Google I/O 大会徽章才能获准参加 Google I/O 大会，包括研讨会、沙盒会议和晚间活动等。若安保人员要求出示或提供额外的身份证明，请予以配合。Google I/O 大会徽章上可能会显示您的姓名、公司或组织（若已提供）和照片。</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">我们会保证所有参加主题演讲的人员都有座位，但最佳座位将于领取徽章之时，按照先到先得的原则进行分配。徽章将于 5 月 6 日上午 7 点开始领取，届时请务必尽早赶到！</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O 大会是在室外举办的开发者活动，因此请以自己感觉舒适放松为度，没有严格的着装要求。湾区早晚温差很大，请在选择服装时考虑这一点。</string>\n    <string name=\"faq_onsite_food_options_description\">好消息，我们也喜欢美食！在为期三天的大会期间，我们每天都会为参加者提供免费早餐、午餐和点心。在第一天和第二天的晚间活动期间，我们还将提供晚餐。</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">请放心！大会期间，我们将在大会服务台设立失物招领处。无人认领的所有物品会在第二天移交至大会安保部门。有一点要特别注意：Google I/O 大会徽章是不可补办的；因此，请务必保管好。如果丢失，您将无法继续参加大会。</string>\n    <string name=\"faq_after_dark_program_description\">不容错过的两个晚上！我们将邀请参加者在 5 月 8 日晚上畅享音乐、游戏等娱乐节目，并在 5 月 9 日在 Shoreline Amphitheatre 为参加者举办专场音乐会。我们会在这两个晚上提供美酒佳肴（酒精饮料仅限年满 21 周岁的人士）。这两个晚间活动都在 Shoreline Amphitheatre 举行，您需要佩戴参会徽章才能入场。</string>\n    <string name=\"faq_accessibility_needs_description\">我们将在无障碍停车区留出停车位供准妈妈使用。&lt;br&gt;欢迎哺乳期的妈妈们带孩子一起参加大会。5 月 7 日和 8 日的上午 8 点至晚上 8 点以及 5 月 9 日上午 8 点至下午 4 点，将有 4 个哺乳室供妈妈们使用。哺乳室门前提供了登记表；哺乳室按照先到先得的方式供妈妈们使用。请前往大会服务中心了解详情。&lt;br&gt;&lt;br&gt;参加大会的父母如果在我们的注册表单中表达了对儿童看护的需求，则可以获得每天 100 美元（总共不超过 300 美元）的补贴费用（先到先得）。我们的儿童看护补贴费用是通过第三方供应商提供的。如果在大会开始前我们通过电子邮件批准了您的儿童看护请求，并且已确认您是现场参加大会，我们的供应商将在 Google I/O 大会结束后的 7 个工作日内与您联系，以商讨后续事宜。他们将负责管理儿童看护补贴费用的所有补贴事宜。</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">我们将在无障碍停车区留出停车位供准妈妈使用。&lt;br&gt;欢迎哺乳期的妈妈们带孩子一起参加大会。5 月 7 日和 8 日的上午 8 点至晚上 8 点以及 5 月 9 日上午 8 点至下午 4 点，将有 4 个哺乳室供妈妈们使用。哺乳室门前提供了登记表；哺乳室按照先到先得的方式供妈妈们使用。请前往大会服务中心了解详情。&lt;br&gt;&lt;br&gt;参加大会的父母如果在我们的注册表单中表达了对儿童看护的需求，则可以获得每天 100 美元（总共不超过 300 美元）的补贴费用（先到先得）。我们的儿童看护补贴费用是通过第三方供应商提供的。如果在大会开始前我们通过电子邮件批准了您的儿童看护请求，并且已确认您是现场参加大会，我们的供应商将在 Google I/O 大会结束后的 7 个工作日内与您联系，以商讨后续事宜。他们将负责管理儿童看护补贴费用的所有补贴事宜。</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google 致力于为所有人提供无骚扰、包容性的活动体验，不会因为性别认同、性别表现、性取向、残疾、神经多样性、外貌、体型、民族、国籍、种族、年龄、宗教信仰或属于其他受保护的类别而对参加者区别对待。为了尽可能在活动中提供包容性氛围，我们将在整个会场中提供中性洗手间。&lt;br&gt;&lt;br&gt;我们不能容忍以任何形式骚扰活动参与者的行为。&lt;br&gt;Google 会严肃对待违反我们政策的行为并将做出适当处理。要详细了解《Google 活动社区准则和反骚扰政策》，请点击&lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;此处&lt;/a&gt;。</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">本届大会为期三天，期间我们会在大会网站的首页上提供两场主题演讲和所有研讨会的现场直播。如果您工作繁忙，或因身处地球的另一端而面临时差造成的不便，则可以在晚些时候通过 &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;YouTube 上的“Google Developers”频道&lt;/a&gt;观看活动录像。</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">会！每年，世界各地的开发者都会举办 &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended 活动&lt;/a&gt;。在这些活动期间，主办者可以直播 Google I/O 大会并举办自己的研讨会（包括黑客马拉松、代码实验室、演示等）。&lt;br&gt;如果您今年要作为 I/O Extended 主办者加入参与大会，您应该按照以下步骤着手：&lt;br&gt;&lt;br&gt;仔细阅读&lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;主办者指南&lt;/a&gt;以获得如何成功举办活动的提示和建议。&lt;br&gt;&lt;br&gt;请在 I/O 网站上&lt;a href=\"https://events.google.com/io/extended/form\"&gt;注册&lt;/a&gt;您的公开活动，以提高曝光度。&lt;br&gt;&lt;br&gt;在所有与 I/O Extended 相关的社交信息中使用官方 #io19extended # 标签，方便用户发现您。&lt;br&gt;&lt;br&gt;注意：活动结束后，I/O Extended 主办者可以向 io19@google.com 发送电子邮件来请求删除其个人和/或活动数据。&lt;br&gt;如果您只想参加 I/O Extended 活动，请浏览&lt;a href=\"https://events.google.com/io/extended\"&gt;我们的地图&lt;/a&gt;寻找您附近的活动并确认您要参加该活动！&lt;br&gt;如有 I/O Extended 计划方面的问题，请发送电子邮件至 io19extended\\-external@google.com 与我们联系。</string>\n    <string name=\"view_sessions_text\">查看会议</string>\n    <string name=\"wifi_install_success\">Wi-Fi 网络已保存</string>\n    <string name=\"wifi_install_clipboard_message\">无法保存 Wi-Fi 网络。\\n已将密码保存到剪贴板。</string>\n    <string name=\"event_sessions_title\">会议</string>\n    <string name=\"event_sandbox_title\">沙盒</string>\n    <string name=\"event_codelabs_title\">代码实验室</string>\n    <string name=\"event_officehours_title\">交流时间和应用评价</string>\n    <string name=\"event_afterhours_title\">会后活动</string>\n    <string name=\"event_meals_title\">用餐</string>\n    <string name=\"event_sessions_description\">从 4 月份开始，现场参加者可以在大会开始前通过 I/O 大会网站和 I/O 大会移动应用预约研讨会座位（注意：每次研讨会将保留部分不提供预约的座位，在现场先到先得）。Codelabs、应用评测和交流时间的座位将在现场按先到先得的原则分配给参加者。</string>\n    <string name=\"event_sandbox_description\">这些专用空间用于通过互动式演示、物理装置等方式探索、学习及试用我们的最新产品和平台。</string>\n    <string name=\"event_codelabs_description\">利用可直接编程的自助服务终端获取实践经验。在这里，您可以借助自定进度的教程和全面的资源来学习最新、最优秀的 Google 技术，也可以携带自己的机器并将成果带回家。如果您遇到困难，Google 员工将随时为您提供有用的建议并提供指导。</string>\n    <string name=\"event_officehours_description\">在“交流时间”，您将有机会与 Google 专家面对面交谈，询问所有技术问题；在“应用评价”时段，您将有机会为自己的特定应用相关项目获取建议和提示。</string>\n    <string name=\"event_afterhours_description\">我们会在前两天会议结束后提供美食佳饮，欢迎留在海岸线与我们同乐。在第一个晚上，我们将在沙盒空间举办派对活动；在第二个晚上，我们将在 Shoreline Amphitheatre 举办一场独家音乐会。</string>\n    <string name=\"event_meals_description\">在为期三天的大会期间，我们每天都会为参加者提供免费早餐、午餐和点心。在第一天和第二天的晚间活动期间，我们还将提供晚餐。</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">相关应用</string>\n    <string name=\"event_types_header\">活动类型</string>\n    <string name=\"settings_time_zone_label\">活动时间为太平洋时区 (UTC-8) 的时间</string>\n    <string name=\"settings_enable_notifications\">启用通知</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">发送匿名使用情况统计信息</string>\n    <string name=\"settings_tos\">服务条款</string>\n    <string name=\"settings_privacy_policy\">隐私权政策</string>\n    <string name=\"settings_oss_licenses\">开放源代码许可</string>\n    <string name=\"settings_theme_title\">选择主题背景</string>\n    <string name=\"settings_theme_system\">系统默认</string>\n    <string name=\"settings_theme_light\">浅色</string>\n    <string name=\"settings_theme_dark\">深色</string>\n    <string name=\"settings_theme_battery\">根据省电模式设置</string>\n    <string name=\"built_with_material_components\">使用 Material Components 开发。</string>\n    <string name=\"wifi_network_and_password\">网络：%1$s\\n密码：%2$s</string>\n    <string name=\"join_network\">加入网络</string>\n    <string name=\"assistant_app_description\">只需说“Hey Google, talk to Google I/O 19”（Hey Google，我要跟 Google I/O 19 聊一聊）！</string>\n    <string name=\"assistant_app_description2\">只需说“Hey Google, talk to Google I/O 19”（Hey Google，我要跟 Google I/O 19 聊一聊）！</string>\n    <string name=\"speaker_link_website\">网站</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">活动</string>\n    <string name=\"no_network_connection\">未连接到互联网。</string>\n    <string name=\"navigate_up\">转到上一层级</string>\n    <string name=\"no_network_description\">要使用“探索 I/O 大会”，请尝试：\\n\\n - 关闭飞行模式\\n\\n - 开启移动数据网络或 WLAN\\n\\n - 检查您所在区域的信号强度</string>\n    <string name=\"phone_does_not_support_arcore_title\">您手机不支持 ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">请尝试换一部设备，或者借用下朋友的设备</string>\n    <string name=\"codelabs_information\">您可以在我们提供的可直接编程的自助服务终端中通过自定进度的教程来学习最新、最精彩的 Google 技术，也可以携带自己的计算机并将成果带回家。自助服务终端每天都开放，首次主题演讲期间除外。</string>\n    <string name=\"codelabs_building\">Codelabs 大楼</string>\n    <string name=\"codelabs_website\">Codelabs 网站</string>\n    <string name=\"codelab_duration\">时长：%1$d 分钟</string>\n    <string name=\"start_codelab\">启动代码实验室</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-zh-rHK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">時間表</string>\n    <string name=\"title_home\">首頁</string>\n    <string name=\"title_map\">地圖</string>\n    <string name=\"title_explore_io\">探索 I/O 大會</string>\n    <string name=\"title_info\">相關資訊</string>\n    <string name=\"filters\">篩選器</string>\n    <string name=\"category_heading_tracks\">主題</string>\n    <string name=\"category_heading_types\">類型</string>\n    <string name=\"reset\">重設</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"other\">%1$d 個活動</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">你已加星號和預約的活動</string>\n    <string name=\"starred_and_reserved_short\">你的活動</string>\n    <string name=\"search_schedule_hint\">搜尋時間表</string>\n    <string name=\"search_schedule_no_results\">找不到任何結果</string>\n    <string name=\"agenda\">議程</string>\n    <string name=\"event_starred\">已為活動加上星號</string>\n    <string name=\"event_unstarred\">已從加上星號的項目中移除活動</string>\n    <string name=\"event_star_error\">將活動新增至已加星號的項目時發生錯誤</string>\n    <string name=\"reservation_error\">變更預約項目時發生錯誤。請等待先前的要求處理完畢或稍後再試。</string>\n    <string name=\"reservation_request_succeeded\">已提出預約申請。</string>\n    <string name=\"reservation_cancel_succeeded\">已取消預約：「&lt;b&gt;%s&lt;/b&gt;」。</string>\n    <string name=\"reservation_new\">已為你預留「&lt;b&gt;%s&lt;/b&gt;」的席位。</string>\n    <string name=\"reservation_replaced\">已更換活動。</string>\n    <string name=\"waitlist_new\">你已排入候補名單。</string>\n    <string name=\"waitlist_cancel_succeeded\">已從候補名單中移除。</string>\n    <string name=\"got_it\">我知道了</string>\n    <string name=\"dont_show\">不顯示</string>\n    <string name=\"reservation_denied_cutoff\">預約遭拒：申請時間過於接近活動開始時間。</string>\n    <string name=\"reservation_denied_clash\">預約遭拒：與另一個預約項目的時間發生衝突</string>\n    <string name=\"reservation_denied_unknown\">預約遭拒：發生不明錯誤。</string>\n    <string name=\"cancellation_denied_cutoff\">取消遭拒：申請時間過於接近活動開始時間。</string>\n    <string name=\"cancellation_denied_unknown\">取消遭拒：發生不明錯誤。</string>\n    <string name=\"schedule_filters_empty\">找不到任何活動。</string>\n    <string name=\"reservation_reservable\">預約席位</string>\n    <string name=\"reservation_reserved\">已預約</string>\n    <string name=\"reservation_waitlisted\">已排入候補名單</string>\n    <string name=\"reservation_waitlist_available\">加入候補名單</string>\n    <string name=\"reservation_disabled\">不提供預約</string>\n    <string name=\"reservation_pending\">預約待處理</string>\n    <string name=\"schedule_hint_title\">自訂你的時間表</string>\n    <string name=\"schedule_hint_star_event\">新增至你已加星號的活動</string>\n    <string name=\"schedule_hint_reserve_session_seat\">預約活動席位</string>\n    <string name=\"rate_session\">為講座評分</string>\n    <string name=\"menu_item_session_location\">講座舉行地點</string>\n    <string name=\"menu_item_session_star\">將活動加上星號</string>\n    <string name=\"menu_item_calendar\">新增至日曆</string>\n    <string name=\"speaker_delimiter\">、</string>\n    <string name=\"session_detail_speakers_header\">講者</string>\n    <string name=\"session_detail_related_header\">相關活動</string>\n    <string name=\"feedback_submit\">提交</string>\n    <string name=\"feedback_thank_you\">感謝你提供的寶貴意見！</string>\n    <string name=\"feedback_q1_text\">您對於這場活動的整體品質評價如何？</string>\n    <string name=\"feedback_q2_text\">就您自身的期待/活動說明來看，您對於實際活動內容有什麼看法？</string>\n    <string name=\"feedback_q3_text\">這場活動與您的專案相關度有多高？</string>\n    <string name=\"feedback_q4_text\">這場活動與你的專案相關度有多高？</string>\n    <string name=\"feedback_q1_label_start\">很基礎</string>\n    <string name=\"feedback_q2_label_start\">差</string>\n    <string name=\"feedback_q3_label_start\">不佳</string>\n    <string name=\"feedback_q4_label_start\">不太高</string>\n    <string name=\"feedback_q1_label_end\">好極了</string>\n    <string name=\"feedback_q2_label_end\">好極了</string>\n    <string name=\"feedback_q3_label_end\">非常高</string>\n    <string name=\"feedback_q4_label_end\">非常高</string>\n    <string name=\"a11y_show_navigation\">顯示導覽選單</string>\n    <string name=\"a11y_collapse_filters_sheet\">將篩選器工作表移至底部</string>\n    <string name=\"a11y_clear_tag_filters\">清除篩選條件</string>\n    <string name=\"a11y_filter_applied\">已套用「%1s」篩選器</string>\n    <string name=\"a11y_filter_not_applied\">未套用「%1s」篩選器</string>\n    <string name=\"a11y_reservation_available\">預約活動</string>\n    <string name=\"a11y_reservation_reserved\">已預約活動</string>\n    <string name=\"a11y_reservation_disabled\">無法預約</string>\n    <string name=\"a11y_reservation_wait_list_available\">加入活動候補名單</string>\n    <string name=\"a11y_reservation_wait_listed\">已排入活動候補名單</string>\n    <string name=\"a11y_reservation_pending\">預約待處理</string>\n    <string name=\"a11y_starred\">已將活動加入書籤</string>\n    <string name=\"a11y_unstarred\">尚未將活動加入書籤</string>\n    <string name=\"a11y_star\">加上星號</string>\n    <string name=\"a11y_play\">播放影片</string>\n    <string name=\"a11y_select_map_mode\">選取地圖模式</string>\n    <string name=\"a11y_search_schedule\">搜尋時間表</string>\n    <string name=\"welcome\">歡迎！</string>\n    <string name=\"a11y_signed_in_content_description\">目前登入的帳戶是：%s。</string>\n    <string name=\"a11y_signed_out_content_description\">輕按即可登入。</string>\n    <string name=\"dialog_sign_in_content\">登入後即可儲存活動、預約席位及為活動評分 (參與者才能使用這項功能)。系統會在應用程式和網站上同步處理你透過帳戶執行的動作。</string>\n    <string name=\"sign_in\">登入</string>\n    <string name=\"firebase_auth_no_network_connection\">沒有網際網路連線</string>\n    <string name=\"firebase_auth_unknown_error\">發生不明錯誤</string>\n    <string name=\"dialog_sign_out_content\">所有已儲存的活動、席位預約和活動評分 (只有參與者能為活動評分) 都會持續同步至你的帳戶。</string>\n    <string name=\"sign_out\">登出</string>\n    <string name=\"manage_google_account\">管理你的 Google 帳戶</string>\n    <string name=\"remove_reservation_title\">要移除預約項目嗎？</string>\n    <string name=\"remove_reservation_content\">你即將放棄「%1$s」的預約席位。如果你決定不預約席位，但仍想參加，我們在所有活動場次都會保留部分座位給未預約的參與者；座位有限，先到先入座。</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"remove\">移除</string>\n    <string name=\"swap_reservation_title\">要更換預約項目嗎？</string>\n    <string name=\"swap_reservation_content\">你是否已預約「%1$s」/已排入這場活動的候補名單？每個時段只允許預約一場活動。是否要換成「%2$s」？</string>\n    <string name=\"swap\">更換</string>\n    <string name=\"notifications_preference_dialog_title\">I/O 大會通知</string>\n    <string name=\"notifications_preference_dialog_content\">願意接收有關 I/O 大會的通知嗎？我們會將活動開始時間、會後活動、講座錄影存檔等相關資訊傳送給你。如果想調整通知接收設定，隨時可以前往「[資訊] &gt; [設定]」進行變更。</string>\n    <string name=\"no\">否</string>\n    <string name=\"yes\">是</string>\n    <string name=\"feed_not_available\">找不到任何公告事項。</string>\n    <string name=\"feed_loading_error\">無法載入動態饋給，請稍後再試。</string>\n    <string name=\"feed_announcement_title\">公告事項</string>\n    <string name=\"feed_upcoming_events\">即將舉辦的活動</string>\n    <string name=\"feed_saved_events\">已儲存的活動</string>\n    <string name=\"feed_no_saved_events\">沒有任何已儲存的活動</string>\n    <string name=\"feed_view_all_events\">查看所有活動</string>\n    <string name=\"feed_view_your_schedule\">查看你的時間表</string>\n    <string name=\"feed_watch_live_stream\">觀看直播影片</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"other\">%s 天</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"other\">%s 小時</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"other\">%s 分鐘</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"other\">%s 秒</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">分享講座資訊</string>\n    <string name=\"share_text_session_detail\">快來參加「%1$s」，詳情請見 #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">分享</string>\n    <string name=\"map_variant_after_dark\">會後活動</string>\n    <string name=\"map_variant_concert\">音樂會</string>\n    <string name=\"map_variant_daytime\">白天</string>\n    <string name=\"enable_my_location\">啟用我的位置</string>\n    <string name=\"my_location_rationale\">授予應用程式位置存取權後，即可在地圖上顯示您的位置。</string>\n    <string name=\"onboarding_get_started\">開始使用</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">歡迎使用 Google I/O</string>\n    <string name=\"onboarding_date_location\">2019 年 5 月 7 日至 9 日於\\n美國加州山景城</string>\n    <string name=\"onboarding_label_days\">天</string>\n    <string name=\"onboarding_label_hours\">小時</string>\n    <string name=\"onboarding_label_mins\">分鐘</string>\n    <string name=\"onboarding_label_seconds\">秒</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O 大會即將登場</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O 大會</string>\n    <string name=\"onboarding_welcome_google_io_post\">觀看 2019 年 I/O 大會重點整理，並在社交媒體中查看 #io19 主題標記</string>\n    <string name=\"onboarding_signin\">參加人員只要登入帳戶，就能接收 I/O 大會通知及預約講座席位。</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"other\">活動將於 %1$s 分鐘後開始</item>\n    </plurals>\n    <string name=\"expanded\">已展開</string>\n    <string name=\"collapsed\">已收合</string>\n    <string name=\"event_title\">活動</string>\n    <string name=\"travel_title\">交通資訊</string>\n    <string name=\"faq_title\">常見問題</string>\n    <string name=\"settings_title\">設定</string>\n    <string name=\"about_title\">簡介</string>\n    <string name=\"travel_what_to_bring_title\">我應該攜帶哪些物品前往會場？</string>\n    <string name=\"travel_hotels_title\">飯店</string>\n    <string name=\"travel_getting_to_mountain_view_title\">前往山景城</string>\n    <string name=\"travel_getting_to_shoreline_title\">前往山景城</string>\n    <string name=\"travel_shuttle_service_title\">接駁服務</string>\n    <string name=\"travel_off_site_parking_title\">會場外停車場</string>\n    <string name=\"travel_for_public_transportation_title\">大眾運輸</string>\n    <string name=\"travel_biking_title\">騎乘自行車</string>\n    <string name=\"travel_ridesharing_title\">共乘服務</string>\n    <string name=\"travel_airport_transfers_title\">機場接駁服務</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O 大會是在室外舉行的盛大活動。這是 I/O 大會的一大特色，在選擇攜帶物品時也請考量這一點。講座將會在不受天氣影響的營帳中舉辦，但我們會建議你攜帶防曬霜和太陽眼鏡。另外，你也可以準備額外的保暖衣物，以防夜間溫度下降。I/O 大會的氣氛悠閒，因此請挑選適合這場活動的服裝。</string>\n    <string name=\"travel_hotels_description\">我們與多間當地飯店合作提供住宿服務，並會定期更新合作飯店清單和目前的空房數量。請透過下方的地圖尋找最適合你的住宿選項。&lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;飯店地圖&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">灣區共有三座提供國際航線服務的大型機場：&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=zh-Hant\"&gt;舊金山國際機場 (SFO)&lt;/a&gt; 約 24 英里&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=zh-Hant\"&gt;奧克蘭國際機場 (OAK)&lt;/a&gt; 約 32 英里&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=zh-Hant\"&gt;聖荷西國際機場 (SJC)&lt;/a&gt; 約 12 英里</string>\n    <string name=\"travel_getting_to_shoreline_description\">為減少交通壅塞情況並降低碳排放量，我們承諾 2019 年 Google I/O 大會會是一場「無車位活動*」。這是一項經過深思熟慮的決定，我們也會提供多種無須自行駕車來到會場的免費交通方式。&lt;br&gt;&lt;br&gt;我們會在活動正式開始前提供更多相關資訊。&lt;br&gt;&lt;br&gt;* 無障礙車位照常提供。</string>\n    <string name=\"travel_shuttle_service_description\">為減少交通壅塞情況並降低碳排放量，我們承諾 2019 年 Google I/O 大會會是一場「無車位活動*」。這是一項經過深思熟慮的決定，我們也會提供多種無須自行駕車來到會場的免費交通方式。&lt;br&gt;&lt;br&gt;我們會在活動正式開始前提供更多相關資訊。&lt;br&gt;&lt;br&gt;* 無障礙車位照常提供。</string>\n    <string name=\"travel_off_site_parking_description\">&lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;亞美亞球場&lt;/a&gt;設有免費的場外停車場，並提供往返 Google I/O 會場的接駁服務。&lt;br&gt;&lt;br&gt;如有任何 ADA 需求或需要特別協助，請在報名表上註明，我們的活動規劃小組將會直接與你商議後續事宜。</string>\n    <string name=\"travel_for_public_transportation_description\">我們將會在預先註冊期間提供預付型大眾運輸票證，方便你搭車前往會場。你可以搭乘下列大眾運輸工具前往會場所在地&lt;br&gt;&lt;br&gt;&lt;a href=\"http://www.caltrain.com/\"&gt;加州列車&lt;/a&gt;：地區性火車系統&lt;br&gt;&lt;br&gt;&lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;：行經南灣地區的輕軌系統&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;：灣區捷運系統&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;：地區性火車系統&lt;br&gt;&lt;br&gt;大眾運輸工具並非直接抵達 Google I/O 會場。請密切留意 Google I/O 大會提供的確切接駁車停靠站資訊。</string>\n    <string name=\"travel_biking_description\">如果你是騎乘單車前來，可以將單車免費停放在海岸露天劇場的 A 區停車場。活動期間，矽谷單車聯盟 (Silicon Valley Bicycle Coalition) 每天上午 7 點至當天活動結束為止，都會為單車騎士提供安全可靠的代客停車服務。&lt;br&gt;&lt;br&gt;如要取得最適合單車通行的路線和方向指引，請查看 Google 地圖。建議單車騎士選擇史蒂文斯溪小道 (Stevens Creek Trail) 和佩曼南緹溪小道 (Permanente Creek Trail) 這兩條路線前往海岸露天劇場。</string>\n    <string name=\"travel_ridesharing_description\">我們會在活動最後一天提供從 Google I/O 會場前往舊金山國際機場和聖荷西國際機場的接駁服務。其他日期「恕不提供」機場接駁服務。</string>\n    <string name=\"travel_airport_transfers_description\">我們會在活動最後一天提供從 Google I/O 會場前往舊金山國際機場和聖荷西國際機場的接駁服務。其他日期「恕不提供」機場接駁服務。</string>\n    <string name=\"faq_when_and_where_title\">2019 年 Google I/O 大會的舉辦時間和地點為何？</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">如何隨時掌握 Google I/O 大會的最新動態？</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">所有講座都會以英文進行嗎？</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">我可以在活動開始前先預約講座席位嗎？</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">前往海岸露天劇場的最佳方式為何？</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">我何時可以領取識別證？在哪裡領取？</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">我真的很想坐在前排聆聽主題演講，有什麼好辦法嗎？</string>\n    <string name=\"faq_what_should_i_wear_title\">我應該如何選擇服裝？</string>\n    <string name=\"faq_onsite_food_options_title\">有點心真是太棒了！現場會供應哪些餐點？</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">如果我在會場遺失物品，該怎麼找回來？</string>\n    <string name=\"faq_after_dark_program_title\">會後活動聽起來很有趣，我該參加嗎？</string>\n    <string name=\"faq_accessibility_needs_title\">現場是否提供任何無障礙工具？</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Google 會為參加 I/O 大會的孕婦和家長提供哪些協助？</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google 的《活動社群規範》和《反騷擾政策》</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Google 會直播講座內容嗎？如果我無法即時觀看活動直播該怎麼辦？</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">我想與社群好友一同慶祝 I/O 大會，有什麼好辦法嗎？</string>\n    <string name=\"faq_when_and_where_description\">如要隨時掌握講座、主講人和所有活動的最新資訊，你可以多加運用 &lt;a href=\"https://events.google.com/io/\"&gt;2019 年 Google I/O 大會網站&lt;/a&gt;、&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers 網誌&lt;/a&gt;，並在 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; 和 &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; 上關注我們。你也可以透過官方主題標記 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; 追蹤及加入 2019 年 Google I/O 大會的相關社交媒體討論串。另外，在活動正式開始之前，我們會透過電子郵件與所有報名參加活動的開發人員分享相關重要資訊和報到須知。</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">如要隨時掌握講座、主講人和所有活動的最新資訊，你可以多加運用 &lt;a href=\"https://events.google.com/io/\"&gt;2019 年 Google I/O 大會網站&lt;/a&gt;、&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers 網誌&lt;/a&gt;，並在 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; 和 &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; 上關注我們。你也可以透過官方主題標記 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; 追蹤及加入 2019 年 Google I/O 大會的相關社交媒體討論串。另外，在活動正式開始之前，我們會透過電子郵件與所有報名參加活動的開發人員分享相關重要資訊和報到須知。</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">是的，為了讓全球的觀眾都能一同參與，所有講座都會以英文進行。</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">4 月起，會實際出席活動的參加人員可以透過 I/O 大會網站和 I/O 大會行動應用程式預約講座席位。不過請注意，部分現場講座席位是以先到先入座的方式分配，恕不接受預約。另外，針對程式碼研究室、應用程式實務討論和諮詢服務等活動，我們會在現場採用先到先入場的方式分配座位。</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">請參閱「旅遊資訊」部分來瞭解各種實用的交通運輸訣竅，包括接駁車資訊、汽機車與單車路線、共乘注意事項等。</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">為加快報到程序的速度，我們會在 5 月 6 日 (週一) 於海岸露天劇場開始提供識別證領取服務。在核發 Google I/O 大會識別證給你之前，我們必須先完成下列工作：&lt;br&gt; - 驗證你的附相片身分證件。我們接受政府核發的證件、護照和其他形式的身分證明文件。如未提供合適的身分證件，你就無法領取識別證，也不得入場。請注意，身分證件上的姓名必須與你的註冊個人資料所載資訊完全相符。如果你是基於學術目的參加大會，請務必提供相關的身分證明。&lt;br&gt; - 掃描你在電子郵件中收到的註冊 QR 圖碼。你不需要印出電子郵件內容，只要透過手機掃描即可！#savetheenvironment&lt;br&gt;&lt;br&gt;請注意，識別證不得共用、轉讓，或是透過其他方式供他人使用。Google I/O 大會的識別證無法補發，因此請務必妥善保管，以免無法重新入場。你必須配戴 Google I/O 大會識別證，才能參加 Google I/O 大會活動 (包括講座、沙箱實驗和會後活動)。如有安檢人員提出要求，請出示或提供額外的身分證件。另外請注意，Google I/O 大會識別證上可能會顯示你的姓名、所屬公司或機構 (如有提供) 和相片。</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">我們在主題演講中都會為全體參加人員準備足夠的座位。5 月 6 日上午 7 點開始提供識別證領取服務，並採先到先入場的方式分配座位。如需視野較佳的位置，建議你提前報到！</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O 大會是在室外舉行的開發人員活動，因此衣著方面並無強制規定，穿著舒適休閒的服裝即可。不過請注意，灣區的日夜溫差相當大，選擇衣著時請一併考量到這一點。</string>\n    <string name=\"faq_onsite_food_options_description\">太好了，希望你會喜歡我們供應的點心！在為期 3 天的大會中，參加人員可以享用免費供應的早餐、午餐和點心。另外，我們也會在第 1 天和第 2 天的「會後活動」時段提供晚餐。</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">請放心，大會服務台在活動期間提供失物招領服務，無人認領的所有遺失物會在隔日轉送至大會安檢處。另外請注意，Google I/O 大會的識別證「無法」補發，因此請務必妥善保管，以免無法重新入場。</string>\n    <string name=\"faq_after_dark_program_description\">其中兩天的活動結束後還有更多精彩節目，千萬別錯過！誠摯邀請所有參加人員於 5 月 8 日傍晚與我們一同體驗動感音樂、參與遊戲和其他活動，並於 5 月 9 日前往露天劇場參加獨家音樂會。在這兩天晚上，參加人員可以盡情享用各種餐點與飲品 (酒精飲品僅限年滿 21 歲的成年人飲用)。兩場會後活動都會在海岸露天劇場舉辦，歡迎前來共襄盛舉。不過請注意，你必須出示參加人員識別證才能入場。</string>\n    <string name=\"faq_accessibility_needs_description\">我們在 ADA 停車區設有孕婦專用停車位。&lt;br&gt;歡迎需要哺乳的母親偕同子女前來參加活動。會場共設有四間哺乳室，開放時間為 5 月 7 至 8 日的上午 8 點至下午 8 點，以及 5 月 9 日的上午 8 點至下午 4 點。申請表位於哺乳室入口處，並採先到先使用的方式提供服務。如要瞭解詳細資訊，請洽詢大會服務台。&lt;br&gt;&lt;br&gt;如果是有托育需求的家長，只要在報名表中註明這項需求，我們就會提供每日 $100 美元的托育津貼 (總金額不超過 $300 美元)。托育津貼採先到先得的方式提供，我們會委託第三方廠商提供托育津貼。如果我們在大會開始前便已透過電子郵件核准你的托育申請，並確認你會親自來到會場，我們的合作廠商就會在 Google I/O 大會結束後的 7 個工作天內與你聯絡，並向你說明後續步驟。合作廠商將會支付所有托育費用。</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">我們在 ADA 停車區設有孕婦專用停車位。&lt;br&gt;歡迎需要哺乳的母親偕同子女前來參加活動。會場共設有四間哺乳室，開放時間為 5 月 7 至 8 日的上午 8 點至下午 8 點，以及 5 月 9 日的上午 8 點至下午 4 點。申請表位於哺乳室入口處，並採先到先使用的方式提供服務。如要瞭解詳細資訊，請洽詢大會服務台。&lt;br&gt;&lt;br&gt;如果是有托育需求的家長，只要在報名表中註明這項需求，我們就會提供每日 $100 美元的托育津貼 (總金額不超過 $300 美元)。托育津貼採先到先得的方式提供，我們會委託第三方廠商提供托育津貼。如果我們在大會開始前便已透過電子郵件核准你的托育申請，並確認你會親自來到會場，我們的合作廠商就會在 Google I/O 大會結束後的 7 個工作天內與你聯絡，並向你說明後續步驟。合作廠商將會支付所有托育費用。</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google 致力於打造不受騷擾且友善包容的活動環境，讓各種性別認同、性別表達、性傾向、身心障礙、神經多樣性、外貌、體態、族裔、國籍、種族、年齡、宗教或屬於其他弱勢群體的任何人都能自在參與其中。為確保本活動的多元包容性，我們將在會場提供性別友善廁所。&lt;br&gt;&lt;br&gt;請注意，我們嚴禁以任何形式騷擾活動參加人員。&lt;br&gt;Google 會審慎處理每項政策違反行為，並視情況採取合適的因應措施。如要進一步瞭解 Google 的《活動社群規範》和《反騷擾政策》，請按&lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;這裡&lt;/a&gt;。</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">在大會舉行的三天期間，我們將在活動網站的首頁上同步直播兩場主題演講和所有講座。如果你無法來到現場或位在不同時區，可以在活動結束後前往 &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers YouTube 頻道&lt;/a&gt;觀賞講座的錄影內容。</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">有！世界各地的開發人員每年都會舉辦 &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended 活動&lt;/a&gt;。在這些活動中，籌辦人可以直播活動內容並舉辦獨有的講座，包括黑客松、程式碼研究室、示範教學等。&lt;br&gt;如果你今年想要擔任 I/O Extended 活動的主講人，請先採取下列步驟：&lt;br&gt;&lt;br&gt;詳閱&lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;籌辦人指南&lt;/a&gt;，查看成功主持活動的訣竅和建議。&lt;br&gt;&lt;br&gt;在 I/O 大會的網站中&lt;a href=\"https://events.google.com/io/extended/form\"&gt;登記&lt;/a&gt;你的公開活動，藉此增加曝光度。&lt;br&gt;&lt;br&gt;將官方的 #io19extended 主題標記新增至 I/O Extended 活動的所有相關社交訊息中，方便使用者找到所需內容。&lt;br&gt;&lt;br&gt;注意事項：活動結束後，如果 I/O Extended 活動主講人想要提出個人和/或活動資料的刪除要求，請傳送電子郵件至 io19@google.com。&lt;br&gt;如果你只是希望參加 I/O Extended 活動，請利用我們的&lt;a href=\"https://events.google.com/io/extended\"&gt;地圖&lt;/a&gt;尋找鄰近所在地點的活動並報名參加！&lt;br&gt;如有任何 I/O Extended 計畫的相關疑問，請傳送電子郵件至 io19extended\\-external@google.com 與我們聯絡。</string>\n    <string name=\"view_sessions_text\">查看活動時間表</string>\n    <string name=\"wifi_install_success\">已儲存 Wi-Fi 網路</string>\n    <string name=\"wifi_install_clipboard_message\">無法儲存 Wi-Fi 網路。\\n請改成將密碼儲存至剪貼簿。</string>\n    <string name=\"event_sessions_title\">活動</string>\n    <string name=\"event_sandbox_title\">沙箱</string>\n    <string name=\"event_codelabs_title\">Codelab</string>\n    <string name=\"event_officehours_title\">諮詢時段和應用程式實務討論</string>\n    <string name=\"event_afterhours_title\">會後活動</string>\n    <string name=\"event_meals_title\">餐點</string>\n    <string name=\"event_sessions_description\">4 月起，會實際出席活動的參加人員可以透過 I/O 大會網站和 I/O 大會行動應用程式預約講座席位。不過請注意，部分現場講座席位是以先到先入座的方式分配，恕不接受預約。另外，針對程式碼研究室、應用程式實務討論和諮詢服務等活動，我們會在現場採用先到先入場的方式分配座位。</string>\n    <string name=\"event_sandbox_description\">這個專用空間提供互動示範、實體裝置操作等體驗，供你探索、學習及試用我們的最新產品和平台。</string>\n    <string name=\"event_codelabs_description\">利用我們可直接編程的資訊站獲取實作經驗。在這裡，你可以參閱自修課程和完整資訊掌握所有最新和最強大的 Google 技術，也可以自行攜帶機器前來並另行抽空實作。如果遇到瓶頸，Google 員工將隨時提供實用的建議和指引，助你解開疑惑。</string>\n    <string name=\"event_officehours_description\">你可以在「諮詢時段」與 Google 專家面對面交流，為各種技術問題尋求解答。在「應用程式實務討論」中，你將有機會為自己特定的應用程式相關專案取得實用建議和提示。</string>\n    <string name=\"event_afterhours_description\">我們會在前兩天的活動結束後提供美食佳飲，歡迎繼續留在海岸地區與我們同樂。第一天晚間沙箱區將舉行熱鬧派對，第二天晚上我們將在露天劇場為與會者舉辦一場獨家音樂會。</string>\n    <string name=\"event_meals_description\">在為期 3 天的大會中，參加人員可以享用免費供應的早餐、午餐和點心。另外，我們也會在第 1 天和第 2 天的「會後活動」時段提供晚餐。</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">相關應用程式</string>\n    <string name=\"event_types_header\">活動類型</string>\n    <string name=\"settings_time_zone_label\">太平洋時區的活動資訊 (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">啟用通知</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">傳送匿名使用統計資料</string>\n    <string name=\"settings_tos\">服務條款</string>\n    <string name=\"settings_privacy_policy\">隱私權政策</string>\n    <string name=\"settings_oss_licenses\">開放原始碼授權</string>\n    <string name=\"settings_theme_title\">選擇主題</string>\n    <string name=\"settings_theme_system\">系統預設</string>\n    <string name=\"settings_theme_light\">淺色</string>\n    <string name=\"settings_theme_dark\">深色</string>\n    <string name=\"settings_theme_battery\">根據節約耗電量模式進行設定</string>\n    <string name=\"built_with_material_components\">使用 Material Components 打造。</string>\n    <string name=\"wifi_network_and_password\">網路：%1$s\\n密碼：%2$s</string>\n    <string name=\"join_network\">連上網路</string>\n    <string name=\"assistant_app_description\">只要說「Hey Google，連線到 2019 年 Google I/O 大會！」即可</string>\n    <string name=\"assistant_app_description2\">只要說「Hey Google，連線到 2019 年 Google I/O 大會！」即可</string>\n    <string name=\"speaker_link_website\">網站</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">活動</string>\n    <string name=\"no_network_connection\">沒有網際網路連線。</string>\n    <string name=\"navigate_up\">向上瀏覽</string>\n    <string name=\"no_network_description\">如要使用「探索 I/O 大會」功能，請試著：\\n\\n - 關閉飛航模式\\n\\n - 開啟行動數據或 Wi-Fi\\n\\n - 檢查所在區域的訊號強度</string>\n    <string name=\"phone_does_not_support_arcore_title\">你的手機不支援 ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">請改用其他裝置，或是借用朋友的裝置</string>\n    <string name=\"codelabs_information\">我們提供可直接開始編寫程式碼的資訊站，方便你按照自己的步調參加教學課程，藉此體驗最新、最頂尖的 Google 技術。另外，你也能使用自己的機器進行實作並將成果帶回家。資訊站每日開放使用，但首場主題演講期間恕不提供服務。</string>\n    <string name=\"codelabs_building\">程式碼研究室所在地點</string>\n    <string name=\"codelabs_website\">程式碼研究室網站</string>\n    <string name=\"codelab_duration\">時間長度：%1$d 分鐘</string>\n    <string name=\"start_codelab\">開始使用程式碼研究室</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"title_schedule\">時間表</string>\n    <string name=\"title_home\">首頁</string>\n    <string name=\"title_map\">地圖</string>\n    <string name=\"title_explore_io\">探索 I/O 大會</string>\n    <string name=\"title_info\">相關資訊</string>\n    <string name=\"filters\">篩選器</string>\n    <string name=\"category_heading_tracks\">主題</string>\n    <string name=\"category_heading_types\">類型</string>\n    <string name=\"reset\">重設</string>\n    <plurals name=\"filter_event_count\">\n        <item quantity=\"other\">%1$d 個活動</item>\n    </plurals>\n    <string name=\"starred_and_reserved\">你已加星號和預約的活動</string>\n    <string name=\"starred_and_reserved_short\">你的活動</string>\n    <string name=\"search_schedule_hint\">搜尋時間表</string>\n    <string name=\"search_schedule_no_results\">找不到任何結果</string>\n    <string name=\"agenda\">議程</string>\n    <string name=\"event_starred\">已為活動加上星號</string>\n    <string name=\"event_unstarred\">已從加上星號的項目中移除活動</string>\n    <string name=\"event_star_error\">將活動新增至已加星號的項目時發生錯誤</string>\n    <string name=\"reservation_error\">變更預約項目時發生錯誤。請等待先前的要求處理完畢或稍後再試。</string>\n    <string name=\"reservation_request_succeeded\">已提出預約申請。</string>\n    <string name=\"reservation_cancel_succeeded\">已取消預約：「&lt;b&gt;%s&lt;/b&gt;」。</string>\n    <string name=\"reservation_new\">已為你預留「&lt;b&gt;%s&lt;/b&gt;」的席位。</string>\n    <string name=\"reservation_replaced\">已更換活動。</string>\n    <string name=\"waitlist_new\">你已排入候補名單。</string>\n    <string name=\"waitlist_cancel_succeeded\">已從候補名單中移除。</string>\n    <string name=\"got_it\">我知道了</string>\n    <string name=\"dont_show\">不顯示</string>\n    <string name=\"reservation_denied_cutoff\">預約遭拒：申請時間過於接近活動開始時間。</string>\n    <string name=\"reservation_denied_clash\">預約遭拒：與另一個預約項目的時間發生衝突</string>\n    <string name=\"reservation_denied_unknown\">預約遭拒：發生不明錯誤。</string>\n    <string name=\"cancellation_denied_cutoff\">取消遭拒：申請時間過於接近活動開始時間。</string>\n    <string name=\"cancellation_denied_unknown\">取消遭拒：發生不明錯誤。</string>\n    <string name=\"schedule_filters_empty\">找不到任何活動。</string>\n    <string name=\"reservation_reservable\">預約席位</string>\n    <string name=\"reservation_reserved\">已預約</string>\n    <string name=\"reservation_waitlisted\">已排入候補名單</string>\n    <string name=\"reservation_waitlist_available\">加入候補名單</string>\n    <string name=\"reservation_disabled\">不提供預約</string>\n    <string name=\"reservation_pending\">預約待處理</string>\n    <string name=\"schedule_hint_title\">自訂你的時間表</string>\n    <string name=\"schedule_hint_star_event\">新增至你已加星號的活動</string>\n    <string name=\"schedule_hint_reserve_session_seat\">預約活動席位</string>\n    <string name=\"rate_session\">為講座評分</string>\n    <string name=\"menu_item_session_location\">講座舉行地點</string>\n    <string name=\"menu_item_session_star\">將活動加上星號</string>\n    <string name=\"menu_item_calendar\">新增至日曆</string>\n    <string name=\"speaker_delimiter\">、</string>\n    <string name=\"session_detail_speakers_header\">講者</string>\n    <string name=\"session_detail_related_header\">相關活動</string>\n    <string name=\"feedback_submit\">提交</string>\n    <string name=\"feedback_thank_you\">感謝你提供的寶貴意見！</string>\n    <string name=\"feedback_q1_text\">您對於這場活動的整體品質評價如何？</string>\n    <string name=\"feedback_q2_text\">就您自身的期待/活動說明來看，您對於實際活動內容有什麼看法？</string>\n    <string name=\"feedback_q3_text\">這場活動與您的專案相關度有多高？</string>\n    <string name=\"feedback_q4_text\">這場活動與你的專案相關度有多高？</string>\n    <string name=\"feedback_q1_label_start\">很基礎</string>\n    <string name=\"feedback_q2_label_start\">差</string>\n    <string name=\"feedback_q3_label_start\">不佳</string>\n    <string name=\"feedback_q4_label_start\">不太高</string>\n    <string name=\"feedback_q1_label_end\">好極了</string>\n    <string name=\"feedback_q2_label_end\">好極了</string>\n    <string name=\"feedback_q3_label_end\">非常高</string>\n    <string name=\"feedback_q4_label_end\">非常高</string>\n    <string name=\"a11y_show_navigation\">顯示導覽選單</string>\n    <string name=\"a11y_collapse_filters_sheet\">將篩選器工作表移至底部</string>\n    <string name=\"a11y_clear_tag_filters\">清除篩選條件</string>\n    <string name=\"a11y_filter_applied\">已套用「%1s」篩選器</string>\n    <string name=\"a11y_filter_not_applied\">未套用「%1s」篩選器</string>\n    <string name=\"a11y_reservation_available\">預約活動</string>\n    <string name=\"a11y_reservation_reserved\">已預約活動</string>\n    <string name=\"a11y_reservation_disabled\">無法預約</string>\n    <string name=\"a11y_reservation_wait_list_available\">加入活動候補名單</string>\n    <string name=\"a11y_reservation_wait_listed\">已排入活動候補名單</string>\n    <string name=\"a11y_reservation_pending\">預約待處理</string>\n    <string name=\"a11y_starred\">已將活動加入書籤</string>\n    <string name=\"a11y_unstarred\">尚未將活動加入書籤</string>\n    <string name=\"a11y_star\">加上星號</string>\n    <string name=\"a11y_play\">播放影片</string>\n    <string name=\"a11y_select_map_mode\">選取地圖模式</string>\n    <string name=\"a11y_search_schedule\">搜尋時間表</string>\n    <string name=\"welcome\">歡迎！</string>\n    <string name=\"a11y_signed_in_content_description\">目前登入的帳戶是：%s。</string>\n    <string name=\"a11y_signed_out_content_description\">輕按即可登入。</string>\n    <string name=\"dialog_sign_in_content\">登入後即可儲存活動、預約席位及為活動評分 (參與者才能使用這項功能)。系統會在應用程式和網站上同步處理你透過帳戶執行的動作。</string>\n    <string name=\"sign_in\">登入</string>\n    <string name=\"firebase_auth_no_network_connection\">沒有網際網路連線</string>\n    <string name=\"firebase_auth_unknown_error\">發生不明錯誤</string>\n    <string name=\"dialog_sign_out_content\">所有已儲存的活動、席位預約和活動評分 (只有參與者能為活動評分) 都會持續同步至你的帳戶。</string>\n    <string name=\"sign_out\">登出</string>\n    <string name=\"manage_google_account\">管理你的 Google 帳戶</string>\n    <string name=\"remove_reservation_title\">要移除預約項目嗎？</string>\n    <string name=\"remove_reservation_content\">你即將放棄「%1$s」的預約席位。如果你決定不預約席位，但仍想參加，我們在所有活動場次都會保留部分座位給未預約的參與者；座位有限，先到先入座。</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"remove\">移除</string>\n    <string name=\"swap_reservation_title\">要更換預約項目嗎？</string>\n    <string name=\"swap_reservation_content\">你是否已預約「%1$s」/已排入這場活動的候補名單？每個時段只允許預約一場活動。是否要換成「%2$s」？</string>\n    <string name=\"swap\">更換</string>\n    <string name=\"notifications_preference_dialog_title\">I/O 大會通知</string>\n    <string name=\"notifications_preference_dialog_content\">願意接收有關 I/O 大會的通知嗎？我們會將活動開始時間、會後活動、講座錄影存檔等相關資訊傳送給你。如果想調整通知接收設定，隨時可以前往「[資訊] &gt; [設定]」進行變更。</string>\n    <string name=\"no\">否</string>\n    <string name=\"yes\">是</string>\n    <string name=\"feed_not_available\">找不到任何公告事項。</string>\n    <string name=\"feed_loading_error\">無法載入動態饋給，請稍後再試。</string>\n    <string name=\"feed_announcement_title\">公告事項</string>\n    <string name=\"feed_upcoming_events\">即將舉辦的活動</string>\n    <string name=\"feed_saved_events\">已儲存的活動</string>\n    <string name=\"feed_no_saved_events\">沒有任何已儲存的活動</string>\n    <string name=\"feed_view_all_events\">查看所有活動</string>\n    <string name=\"feed_view_your_schedule\">查看你的時間表</string>\n    <string name=\"feed_watch_live_stream\">觀看直播影片</string>\n    <plurals name=\"duration_days\">\n        <item quantity=\"other\">%s 天</item>\n    </plurals>\n    <plurals name=\"duration_hours\">\n        <item quantity=\"other\">%s 小時</item>\n    </plurals>\n    <plurals name=\"duration_minutes\">\n        <item quantity=\"other\">%s 分鐘</item>\n    </plurals>\n    <plurals name=\"duration_seconds\">\n        <item quantity=\"other\">%s 秒</item>\n    </plurals>\n    <string name=\"menu_item_share_session\">分享講座資訊</string>\n    <string name=\"share_text_session_detail\">快來參加「%1$s」，詳情請見 #io19 %2$s</string>\n    <string name=\"intent_chooser_session_detail\">分享</string>\n    <string name=\"map_variant_after_dark\">會後活動</string>\n    <string name=\"map_variant_concert\">音樂會</string>\n    <string name=\"map_variant_daytime\">白天</string>\n    <string name=\"enable_my_location\">啟用我的位置</string>\n    <string name=\"my_location_rationale\">授予應用程式位置存取權後，即可在地圖上顯示您的位置。</string>\n    <string name=\"onboarding_get_started\">開始使用</string>\n    <string name=\"onboarding_welcome_to_google_i_o\">歡迎使用 Google I/O</string>\n    <string name=\"onboarding_date_location\">2019 年 5 月 7 日至 9 日於\\n美國加州山景城</string>\n    <string name=\"onboarding_label_days\">天</string>\n    <string name=\"onboarding_label_hours\">小時</string>\n    <string name=\"onboarding_label_mins\">分鐘</string>\n    <string name=\"onboarding_label_seconds\">秒</string>\n    <string name=\"onboarding_welcome_google_io_pre\">Google I/O 大會即將登場</string>\n    <string name=\"onboarding_welcome_google_io_during\">Google I/O 大會</string>\n    <string name=\"onboarding_welcome_google_io_post\">觀看 2019 年 I/O 大會重點整理，並在社交媒體中查看 #io19 主題標記</string>\n    <string name=\"onboarding_signin\">參加人員只要登入帳戶，就能接收 I/O 大會通知及預約講座席位。</string>\n    <plurals name=\"session_starting_in\">\n        <item quantity=\"other\">活動將於 %1$s 分鐘後開始</item>\n    </plurals>\n    <string name=\"expanded\">已展開</string>\n    <string name=\"collapsed\">已收合</string>\n    <string name=\"event_title\">活動</string>\n    <string name=\"travel_title\">交通資訊</string>\n    <string name=\"faq_title\">常見問題</string>\n    <string name=\"settings_title\">設定</string>\n    <string name=\"about_title\">簡介</string>\n    <string name=\"travel_what_to_bring_title\">我應該攜帶哪些物品前往會場？</string>\n    <string name=\"travel_hotels_title\">飯店</string>\n    <string name=\"travel_getting_to_mountain_view_title\">前往山景城</string>\n    <string name=\"travel_getting_to_shoreline_title\">前往山景城</string>\n    <string name=\"travel_shuttle_service_title\">接駁服務</string>\n    <string name=\"travel_off_site_parking_title\">會場外停車場</string>\n    <string name=\"travel_for_public_transportation_title\">大眾運輸</string>\n    <string name=\"travel_biking_title\">騎乘自行車</string>\n    <string name=\"travel_ridesharing_title\">共乘服務</string>\n    <string name=\"travel_airport_transfers_title\">機場接駁服務</string>\n    <string name=\"travel_what_to_bring_description\">Google I/O 大會是在室外舉行的盛大活動。這是 I/O 大會的一大特色，在選擇攜帶物品時也請考量這一點。講座將會在不受天氣影響的營帳中舉辦，但我們會建議你攜帶防曬霜和太陽眼鏡。另外，你也可以準備額外的保暖衣物，以防夜間溫度下降。I/O 大會的氣氛悠閒，因此請挑選適合這場活動的服裝。</string>\n    <string name=\"travel_hotels_description\">我們與多間當地飯店合作提供住宿服務，並會定期更新合作飯店清單和目前的空房數量。請透過下方的地圖尋找最適合你的住宿選項。&lt;a href=\"https://www.google.com/maps/d/u/1/viewer?mid=11u43dDY9LID1uf46p4y7ba2_TbE_Y8-W&amp;ll=37.383600316075075%2C-122.07007405000002&amp;z=12\"&gt;飯店地圖&lt;/a&gt;</string>\n    <string name=\"travel_getting_to_mountain_view_description\">灣區共有三座提供國際航線服務的大型機場：&lt;br&gt; &lt;a href=\"https://www.google.com/maps/dir/San+Francisco+International+Airport,+San+Francisco,+CA+94128/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5206703,-122.3803144,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f778c55555555:0xa4f25c571acded3f!2m2!1d-122.3789554!2d37.6213129!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=zh-Hant\"&gt;舊金山國際機場 (SFO)&lt;/a&gt; 約 24 英里&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.google.com/maps/dir/Oakland+International+Airport,+Oakland,+CA/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.5755915,-122.270249,11z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808f845402c0a641:0xb0630c0f03017460!2m2!1d-122.2197428!2d37.7125689!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=zh-Hant\"&gt;奧克蘭國際機場 (OAK)&lt;/a&gt; 約 32 英里&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.google.com/maps/dir/San+Jose+International+Airport-Sjc,+Airport+Boulevard,+San+Jose,+CA,+United+States/Shoreline+Amphitheatre,+Amphitheatre+Parkway,+Mountain+View,+CA/@37.3954744,-122.0741791,12z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x808fcbc3fab3c59b:0xbcfa443f6df67e3e!2m2!1d-121.9289375!2d37.3639472!1m5!1m1!1s0x808fb9f776f5e165:0x1ddf014a1b553f3d!2m2!1d-122.0807647!2d37.4267703!2m3!6e0!7e2!8j1463556000!3e0?hl=zh-Hant\"&gt;聖荷西國際機場 (SJC)&lt;/a&gt; 約 12 英里</string>\n    <string name=\"travel_getting_to_shoreline_description\">為減少交通壅塞情況並降低碳排放量，我們承諾 2019 年 Google I/O 大會會是一場「無車位活動*」。這是一項經過深思熟慮的決定，我們也會提供多種無須自行駕車來到會場的免費交通方式。&lt;br&gt;&lt;br&gt;我們會在活動正式開始前提供更多相關資訊。&lt;br&gt;&lt;br&gt;* 無障礙車位照常提供。</string>\n    <string name=\"travel_shuttle_service_description\">為減少交通壅塞情況並降低碳排放量，我們承諾 2019 年 Google I/O 大會會是一場「無車位活動*」。這是一項經過深思熟慮的決定，我們也會提供多種無須自行駕車來到會場的免費交通方式。&lt;br&gt;&lt;br&gt;我們會在活動正式開始前提供更多相關資訊。&lt;br&gt;&lt;br&gt;* 無障礙車位照常提供。</string>\n    <string name=\"travel_off_site_parking_description\">&lt;a href=\"https://www.sjearthquakes.com/avayastadium/parking-directions\"&gt;亞美亞球場&lt;/a&gt;設有免費的場外停車場，並提供往返 Google I/O 會場的接駁服務。&lt;br&gt;&lt;br&gt;如有任何 ADA 需求或需要特別協助，請在報名表上註明，我們的活動規劃小組將會直接與你商議後續事宜。</string>\n    <string name=\"travel_for_public_transportation_description\">我們將會在預先註冊期間提供預付型大眾運輸票證，方便你搭車前往會場。你可以搭乘下列大眾運輸工具前往會場所在地&lt;br&gt;&lt;br&gt;&lt;a href=\"http://www.caltrain.com/\"&gt;加州列車&lt;/a&gt;：地區性火車系統&lt;br&gt;&lt;br&gt;&lt;a href=\"http://www.vta.org/getting-around/interactive-light-rail-map\"&gt;VTA&lt;/a&gt;：行經南灣地區的輕軌系統&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.bart.gov/\"&gt;BART&lt;/a&gt;：灣區捷運系統&lt;br&gt;&lt;br&gt;&lt;a href=\"https://www.amtrak.com/home.html\"&gt;AMTRAK&lt;/a&gt;：地區性火車系統&lt;br&gt;&lt;br&gt;大眾運輸工具並非直接抵達 Google I/O 會場。請密切留意 Google I/O 大會提供的確切接駁車停靠站資訊。</string>\n    <string name=\"travel_biking_description\">如果你是騎乘單車前來，可以將單車免費停放在海岸露天劇場的 A 區停車場。活動期間，矽谷單車聯盟 (Silicon Valley Bicycle Coalition) 每天上午 7 點至當天活動結束為止，都會為單車騎士提供安全可靠的代客停車服務。&lt;br&gt;&lt;br&gt;如要取得最適合單車通行的路線和方向指引，請查看 Google 地圖。建議單車騎士選擇史蒂文斯溪小道 (Stevens Creek Trail) 和佩曼南緹溪小道 (Permanente Creek Trail) 這兩條路線前往海岸露天劇場。</string>\n    <string name=\"travel_ridesharing_description\">我們會在活動最後一天提供從 Google I/O 會場前往舊金山國際機場和聖荷西國際機場的接駁服務。其他日期「恕不提供」機場接駁服務。</string>\n    <string name=\"travel_airport_transfers_description\">我們會在活動最後一天提供從 Google I/O 會場前往舊金山國際機場和聖荷西國際機場的接駁服務。其他日期「恕不提供」機場接駁服務。</string>\n    <string name=\"faq_when_and_where_title\">2019 年 Google I/O 大會的舉辦時間和地點為何？</string>\n    <string name=\"faq_how_can_i_stay_informed_title\">如何隨時掌握 Google I/O 大會的最新動態？</string>\n    <string name=\"faq_will_the_sessions_be_english_title\">所有講座都會以英文進行嗎？</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_title\">我可以在活動開始前先預約講座席位嗎？</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_title\">前往海岸露天劇場的最佳方式為何？</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_title\">我何時可以領取識別證？在哪裡領取？</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_title\">我真的很想坐在前排聆聽主題演講，有什麼好辦法嗎？</string>\n    <string name=\"faq_what_should_i_wear_title\">我應該如何選擇服裝？</string>\n    <string name=\"faq_onsite_food_options_title\">有點心真是太棒了！現場會供應哪些餐點？</string>\n    <string name=\"faq_if_i_lose_something_onsite_title\">如果我在會場遺失物品，該怎麼找回來？</string>\n    <string name=\"faq_after_dark_program_title\">會後活動聽起來很有趣，我該參加嗎？</string>\n    <string name=\"faq_accessibility_needs_title\">現場是否提供任何無障礙工具？</string>\n    <string name=\"faq_support_for_expectant_mothers_parents_title\">Google 會為參加 I/O 大會的孕婦和家長提供哪些協助？</string>\n    <string name=\"faq_community_guidelines_and_policy_title\">Google 的《活動社群規範》和《反騷擾政策》</string>\n    <string name=\"faq_sessions_be_live_streamed_question_title\">Google 會直播講座內容嗎？如果我無法即時觀看活動直播該怎麼辦？</string>\n    <string name=\"faq_want_to_celebrate_i_o_title\">我想與社群好友一同慶祝 I/O 大會，有什麼好辦法嗎？</string>\n    <string name=\"faq_when_and_where_description\">如要隨時掌握講座、主講人和所有活動的最新資訊，你可以多加運用 &lt;a href=\"https://events.google.com/io/\"&gt;2019 年 Google I/O 大會網站&lt;/a&gt;、&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers 網誌&lt;/a&gt;，並在 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; 和 &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; 上關注我們。你也可以透過官方主題標記 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; 追蹤及加入 2019 年 Google I/O 大會的相關社交媒體討論串。另外，在活動正式開始之前，我們會透過電子郵件與所有報名參加活動的開發人員分享相關重要資訊和報到須知。</string>\n    <string name=\"faq_how_can_i_stay_informed_description\">如要隨時掌握講座、主講人和所有活動的最新資訊，你可以多加運用 &lt;a href=\"https://events.google.com/io/\"&gt;2019 年 Google I/O 大會網站&lt;/a&gt;、&lt;a href=\"http://googledevelopers.blogspot.com/\"&gt;Google Developers 網誌&lt;/a&gt;，並在 &lt;a href=\"https://twitter.com/googledevs\"&gt;Twitter&lt;/a&gt; 和 &lt;a href=\"https://www.facebook.com/Google-Developers-967415219957038/\"&gt;Facebook&lt;/a&gt; 上關注我們。你也可以透過官方主題標記 &lt;a href=\"https://twitter.com/search?q=%23io19&amp;src=typd\"&gt;#io19&lt;/a&gt; 追蹤及加入 2019 年 Google I/O 大會的相關社交媒體討論串。另外，在活動正式開始之前，我們會透過電子郵件與所有報名參加活動的開發人員分享相關重要資訊和報到須知。</string>\n    <string name=\"faq_will_the_sessions_be_english_description\">是的，為了讓全球的觀眾都能一同參與，所有講座都會以英文進行。</string>\n    <string name=\"faq_can_i_reserve_sessions_ahead_of_time_description\">4 月起，會實際出席活動的參加人員可以透過 I/O 大會網站和 I/O 大會行動應用程式預約講座席位。不過請注意，部分現場講座席位是以先到先入座的方式分配，恕不接受預約。另外，針對程式碼研究室、應用程式實務討論和諮詢服務等活動，我們會在現場採用先到先入場的方式分配座位。</string>\n    <string name=\"faq_best_way_to_get_to_shoreline_description\">請參閱「旅遊資訊」部分來瞭解各種實用的交通運輸訣竅，包括接駁車資訊、汽機車與單車路線、共乘注意事項等。</string>\n    <string name=\"faq_where_and_when_can_i_pick_up_badge_description\">為加快報到程序的速度，我們會在 5 月 6 日 (週一) 於海岸露天劇場開始提供識別證領取服務。在核發 Google I/O 大會識別證給你之前，我們必須先完成下列工作：&lt;br&gt; - 驗證你的附相片身分證件。我們接受政府核發的證件、護照和其他形式的身分證明文件。如未提供合適的身分證件，你就無法領取識別證，也不得入場。請注意，身分證件上的姓名必須與你的註冊個人資料所載資訊完全相符。如果你是基於學術目的參加大會，請務必提供相關的身分證明。&lt;br&gt; - 掃描你在電子郵件中收到的註冊 QR 圖碼。你不需要印出電子郵件內容，只要透過手機掃描即可！#savetheenvironment&lt;br&gt;&lt;br&gt;請注意，識別證不得共用、轉讓，或是透過其他方式供他人使用。Google I/O 大會的識別證無法補發，因此請務必妥善保管，以免無法重新入場。你必須配戴 Google I/O 大會識別證，才能參加 Google I/O 大會活動 (包括講座、沙箱實驗和會後活動)。如有安檢人員提出要求，請出示或提供額外的身分證件。另外請注意，Google I/O 大會識別證上可能會顯示你的姓名、所屬公司或機構 (如有提供) 和相片。</string>\n    <string name=\"faq_want_a_front_row_seat_at_keynote_description\">我們在主題演講中都會為全體參加人員準備足夠的座位。5 月 6 日上午 7 點開始提供識別證領取服務，並採先到先入場的方式分配座位。如需視野較佳的位置，建議你提前報到！</string>\n    <string name=\"faq_what_should_i_wear_description\">Google I/O 大會是在室外舉行的開發人員活動，因此衣著方面並無強制規定，穿著舒適休閒的服裝即可。不過請注意，灣區的日夜溫差相當大，選擇衣著時請一併考量到這一點。</string>\n    <string name=\"faq_onsite_food_options_description\">太好了，希望你會喜歡我們供應的點心！在為期 3 天的大會中，參加人員可以享用免費供應的早餐、午餐和點心。另外，我們也會在第 1 天和第 2 天的「會後活動」時段提供晚餐。</string>\n    <string name=\"faq_if_i_lose_something_onsite_description\">請放心，大會服務台在活動期間提供失物招領服務，無人認領的所有遺失物會在隔日轉送至大會安檢處。另外請注意，Google I/O 大會的識別證「無法」補發，因此請務必妥善保管，以免無法重新入場。</string>\n    <string name=\"faq_after_dark_program_description\">其中兩天的活動結束後還有更多精彩節目，千萬別錯過！誠摯邀請所有參加人員於 5 月 8 日傍晚與我們一同體驗動感音樂、參與遊戲和其他活動，並於 5 月 9 日前往露天劇場參加獨家音樂會。在這兩天晚上，參加人員可以盡情享用各種餐點與飲品 (酒精飲品僅限年滿 21 歲的成年人飲用)。兩場會後活動都會在海岸露天劇場舉辦，歡迎前來共襄盛舉。不過請注意，你必須出示參加人員識別證才能入場。</string>\n    <string name=\"faq_accessibility_needs_description\">我們在 ADA 停車區設有孕婦專用停車位。&lt;br&gt;歡迎需要哺乳的母親偕同子女前來參加活動。會場共設有四間哺乳室，開放時間為 5 月 7 至 8 日的上午 8 點至下午 8 點，以及 5 月 9 日的上午 8 點至下午 4 點。申請表位於哺乳室入口處，並採先到先使用的方式提供服務。如要瞭解詳細資訊，請洽詢大會服務台。&lt;br&gt;&lt;br&gt;如果是有托育需求的家長，只要在報名表中註明這項需求，我們就會提供每日 $100 美元的托育津貼 (總金額不超過 $300 美元)。托育津貼採先到先得的方式提供，我們會委託第三方廠商提供托育津貼。如果我們在大會開始前便已透過電子郵件核准你的托育申請，並確認你會親自來到會場，我們的合作廠商就會在 Google I/O 大會結束後的 7 個工作天內與你聯絡，並向你說明後續步驟。合作廠商將會支付所有托育費用。</string>\n    <string name=\"faq_support_for_expectant_mothers_parent_description\">我們在 ADA 停車區設有孕婦專用停車位。&lt;br&gt;歡迎需要哺乳的母親偕同子女前來參加活動。會場共設有四間哺乳室，開放時間為 5 月 7 至 8 日的上午 8 點至下午 8 點，以及 5 月 9 日的上午 8 點至下午 4 點。申請表位於哺乳室入口處，並採先到先使用的方式提供服務。如要瞭解詳細資訊，請洽詢大會服務台。&lt;br&gt;&lt;br&gt;如果是有托育需求的家長，只要在報名表中註明這項需求，我們就會提供每日 $100 美元的托育津貼 (總金額不超過 $300 美元)。托育津貼採先到先得的方式提供，我們會委託第三方廠商提供托育津貼。如果我們在大會開始前便已透過電子郵件核准你的托育申請，並確認你會親自來到會場，我們的合作廠商就會在 Google I/O 大會結束後的 7 個工作天內與你聯絡，並向你說明後續步驟。合作廠商將會支付所有托育費用。</string>\n    <string name=\"faq_community_guidelines_and_policy_description\">Google 致力於打造不受騷擾且友善包容的活動環境，讓各種性別認同、性別表達、性傾向、身心障礙、神經多樣性、外貌、體態、族裔、國籍、種族、年齡、宗教或屬於其他弱勢群體的任何人都能自在參與其中。為確保本活動的多元包容性，我們將在會場提供性別友善廁所。&lt;br&gt;&lt;br&gt;請注意，我們嚴禁以任何形式騷擾活動參加人員。&lt;br&gt;Google 會審慎處理每項政策違反行為，並視情況採取合適的因應措施。如要進一步瞭解 Google 的《活動社群規範》和《反騷擾政策》，請按&lt;a href=\"https://www.google.com/events/policy/anti-harassmentpolicy.html\"&gt;這裡&lt;/a&gt;。</string>\n    <string name=\"faq_sessions_be_live_streamed_question_description\">在大會舉行的三天期間，我們將在活動網站的首頁上同步直播兩場主題演講和所有講座。如果你無法來到現場或位在不同時區，可以在活動結束後前往 &lt;a href=\"https://www.youtube.com/user/GoogleDevelopers\"&gt;Google Developers YouTube 頻道&lt;/a&gt;觀賞講座的錄影內容。</string>\n    <string name=\"faq_want_to_celebrate_i_o_description\">有！世界各地的開發人員每年都會舉辦 &lt;a href=\"https://events.google.com/io/extended\"&gt;Google I/O Extended 活動&lt;/a&gt;。在這些活動中，籌辦人可以直播活動內容並舉辦獨有的講座，包括黑客松、程式碼研究室、示範教學等。&lt;br&gt;如果你今年想要擔任 I/O Extended 活動的主講人，請先採取下列步驟：&lt;br&gt;&lt;br&gt;詳閱&lt;a href=\"https://docs.google.com/presentation/d/e/2PACX–1vReWDtj-yASOho5q7XC6lYY8af9wRa13-81mPaoSRodiRoCw4MKJnQExQ8GxyNyCQiPZpBprznPG4ex/pub?slide=id.g62811f3b0_18\"&gt;籌辦人指南&lt;/a&gt;，查看成功主持活動的訣竅和建議。&lt;br&gt;&lt;br&gt;在 I/O 大會的網站中&lt;a href=\"https://events.google.com/io/extended/form\"&gt;登記&lt;/a&gt;你的公開活動，藉此增加曝光度。&lt;br&gt;&lt;br&gt;將官方的 #io19extended 主題標記新增至 I/O Extended 活動的所有相關社交訊息中，方便使用者找到所需內容。&lt;br&gt;&lt;br&gt;注意事項：活動結束後，如果 I/O Extended 活動主講人想要提出個人和/或活動資料的刪除要求，請傳送電子郵件至 io19@google.com。&lt;br&gt;如果你只是希望參加 I/O Extended 活動，請利用我們的&lt;a href=\"https://events.google.com/io/extended\"&gt;地圖&lt;/a&gt;尋找鄰近所在地點的活動並報名參加！&lt;br&gt;如有任何 I/O Extended 計畫的相關疑問，請傳送電子郵件至 io19extended\\-external@google.com 與我們聯絡。</string>\n    <string name=\"view_sessions_text\">查看活動時間表</string>\n    <string name=\"wifi_install_success\">已儲存 Wi-Fi 網路</string>\n    <string name=\"wifi_install_clipboard_message\">無法儲存 Wi-Fi 網路。\\n請改成將密碼儲存至剪貼簿。</string>\n    <string name=\"event_sessions_title\">活動</string>\n    <string name=\"event_sandbox_title\">沙箱</string>\n    <string name=\"event_codelabs_title\">Codelab</string>\n    <string name=\"event_officehours_title\">諮詢時段和應用程式實務討論</string>\n    <string name=\"event_afterhours_title\">會後活動</string>\n    <string name=\"event_meals_title\">餐點</string>\n    <string name=\"event_sessions_description\">4 月起，會實際出席活動的參加人員可以透過 I/O 大會網站和 I/O 大會行動應用程式預約講座席位。不過請注意，部分現場講座席位是以先到先入座的方式分配，恕不接受預約。另外，針對程式碼研究室、應用程式實務討論和諮詢服務等活動，我們會在現場採用先到先入場的方式分配座位。</string>\n    <string name=\"event_sandbox_description\">這個專用空間提供互動示範、實體裝置操作等體驗，供你探索、學習及試用我們的最新產品和平台。</string>\n    <string name=\"event_codelabs_description\">利用我們可直接編程的資訊站獲取實作經驗。在這裡，你可以參閱自修課程和完整資訊掌握所有最新和最強大的 Google 技術，也可以自行攜帶機器前來並另行抽空實作。如果遇到瓶頸，Google 員工將隨時提供實用的建議和指引，助你解開疑惑。</string>\n    <string name=\"event_officehours_description\">你可以在「諮詢時段」與 Google 專家面對面交流，為各種技術問題尋求解答。在「應用程式實務討論」中，你將有機會為自己特定的應用程式相關專案取得實用建議和提示。</string>\n    <string name=\"event_afterhours_description\">我們會在前兩天的活動結束後提供美食佳飲，歡迎繼續留在海岸地區與我們同樂。第一天晚間沙箱區將舉行熱鬧派對，第二天晚上我們將在露天劇場為與會者舉辦一場獨家音樂會。</string>\n    <string name=\"event_meals_description\">在為期 3 天的大會中，參加人員可以享用免費供應的早餐、午餐和點心。另外，我們也會在第 1 天和第 2 天的「會後活動」時段提供晚餐。</string>\n    <string name=\"wifi_header\">Wi-Fi</string>\n    <string name=\"related_apps_header\">相關應用程式</string>\n    <string name=\"event_types_header\">活動類型</string>\n    <string name=\"settings_time_zone_label\">太平洋時區的活動資訊 (UTC-8)</string>\n    <string name=\"settings_enable_notifications\">啟用通知</string>\n    <string name=\"settings_send_anonymous_usage_statistics\">傳送匿名使用統計資料</string>\n    <string name=\"settings_tos\">服務條款</string>\n    <string name=\"settings_privacy_policy\">隱私權政策</string>\n    <string name=\"settings_oss_licenses\">開放原始碼授權</string>\n    <string name=\"settings_theme_title\">選擇主題</string>\n    <string name=\"settings_theme_system\">系統預設</string>\n    <string name=\"settings_theme_light\">淺色</string>\n    <string name=\"settings_theme_dark\">深色</string>\n    <string name=\"settings_theme_battery\">根據節約耗電量模式進行設定</string>\n    <string name=\"built_with_material_components\">使用 Material Components 打造。</string>\n    <string name=\"wifi_network_and_password\">網路：%1$s\\n密碼：%2$s</string>\n    <string name=\"join_network\">連上網路</string>\n    <string name=\"assistant_app_description\">只要說「Hey Google，連線到 2019 年 Google I/O 大會！」即可</string>\n    <string name=\"assistant_app_description2\">只要說「Hey Google，連線到 2019 年 Google I/O 大會！」即可</string>\n    <string name=\"speaker_link_website\">網站</string>\n    <string name=\"speaker_link_twitter\">Twitter</string>\n    <string name=\"speaker_link_github\">GitHub</string>\n    <string name=\"speaker_link_linkedin\">LinkedIn</string>\n    <string name=\"speaker_events_subhead\">活動</string>\n    <string name=\"no_network_connection\">沒有網際網路連線。</string>\n    <string name=\"navigate_up\">向上瀏覽</string>\n    <string name=\"no_network_description\">如要使用「探索 I/O 大會」功能，請試著：\\n\\n - 關閉飛航模式\\n\\n - 開啟行動數據或 Wi-Fi\\n\\n - 檢查所在區域的訊號強度</string>\n    <string name=\"phone_does_not_support_arcore_title\">你的手機不支援 ARCore</string>\n    <string name=\"phone_does_not_support_arcore_message\">請改用其他裝置，或是借用朋友的裝置</string>\n    <string name=\"codelabs_information\">我們提供可直接開始編寫程式碼的資訊站，方便你按照自己的步調參加教學課程，藉此體驗最新、最頂尖的 Google 技術。另外，你也能使用自己的機器進行實作並將成果帶回家。資訊站每日開放使用，但首場主題演講期間恕不提供服務。</string>\n    <string name=\"codelabs_building\">程式碼研究室所在地點</string>\n    <string name=\"codelabs_website\">程式碼研究室網站</string>\n    <string name=\"codelab_duration\">時間長度：%1$d 分鐘</string>\n    <string name=\"start_codelab\">開始使用程式碼研究室</string>\n</resources>\n"
  },
  {
    "path": "mobile/src/release/google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_number\": \"627211894852\",\n    \"firebase_url\": \"https://events-d07ac.firebaseio.com\",\n    \"project_id\": \"events-d07ac\",\n    \"storage_bucket\": \"events-d07ac.appspot.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:627211894852:android:66c485c6a5187053\",\n        \"android_client_info\": {\n          \"package_name\": \"com.google.samples.apps.iosched\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"627211894852-8i0ds2p18k5nnth69ef49htnp7k4b8eu.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.google.samples.apps.iosched\",\n            \"certificate_hash\": \"d9b2069d4bc7ecf3e10c8b64f13fd5f1314c6e67\"\n          }\n        },\n        {\n          \"client_id\": \"627211894852-eglljbslsqdegn1ct9eiu6svvt3r84sh.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyD8FgzBb2Kbh7Wi71t-jDZlGXmokJJM9o0\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"appinvite_service\": {\n          \"status\": 2,\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"627211894852-eglljbslsqdegn1ct9eiu6svvt3r84sh.apps.googleusercontent.com\",\n              \"client_type\": 3\n            }\n          ]\n        },\n        \"ads_service\": {\n          \"status\": 2\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}"
  },
  {
    "path": "mobile/src/staging/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2021 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.google.samples.apps.iosched\">\n\n    <application>\n        <activity\n            android:name=\".test.HiltTestActivity\"\n            android:exported=\"false\"  />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "mobile/src/staging/java/com/google/samples/apps/iosched/di/SignInModule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.di\n\nimport android.content.Context\nimport com.google.samples.apps.iosched.shared.data.login.StagingAuthenticatedUser\nimport com.google.samples.apps.iosched.shared.data.login.StagingSignInHandler\nimport com.google.samples.apps.iosched.shared.data.login.datasources.StagingAuthStateUserDataSource\nimport com.google.samples.apps.iosched.shared.data.login.datasources.StagingRegisteredUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthIdDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthStateUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.RegisteredUserDataSource\nimport com.google.samples.apps.iosched.shared.domain.sessions.NotificationAlarmUpdater\nimport com.google.samples.apps.iosched.util.signin.SignInHandler\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\ninternal class SignInModule {\n    @Provides\n    fun provideSignInHandler(@ApplicationContext context: Context): SignInHandler {\n        return StagingSignInHandler(StagingAuthenticatedUser(context))\n    }\n\n    @Singleton\n    @Provides\n    fun provideRegisteredUserDataSource(\n        @ApplicationContext context: Context\n    ): RegisteredUserDataSource {\n        return StagingRegisteredUserDataSource(true)\n    }\n\n    @Singleton\n    @Provides\n    fun provideAuthStateUserDataSource(\n        @ApplicationContext context: Context,\n        notificationAlarmUpdater: NotificationAlarmUpdater\n    ): AuthStateUserDataSource {\n        return StagingAuthStateUserDataSource(\n            isRegistered = true,\n            isSignedIn = true,\n            context = context,\n            userId = \"StagingTest\",\n            notificationAlarmUpdater = notificationAlarmUpdater\n        )\n    }\n\n    @Singleton\n    @Provides\n    fun providesAuthIdDataSource(): AuthIdDataSource {\n        return object : AuthIdDataSource {\n            override fun getUserId() = \"StagingTest\"\n        }\n    }\n}\n"
  },
  {
    "path": "mobile/src/staging/java/com/google/samples/apps/iosched/shared/data/login/StagingSignInHandler.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.login\n\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport com.google.samples.apps.iosched.shared.data.login.datasources.StagingAuthenticatedUserInfo\nimport com.google.samples.apps.iosched.util.signin.SignInHandler\nimport com.google.samples.apps.iosched.util.signin.SignInResult\nimport com.google.samples.apps.iosched.util.signin.SignInSuccess\nimport timber.log.Timber\n\n/**\n * A [SignInHandler] that signs a [StagingAuthenticatedUser] in and out, used to simulate an\n * authentication backend for hermetic development and testing.\n */\nclass StagingSignInHandler(val user: StagingAuthenticatedUser) : SignInHandler {\n\n    override suspend fun makeSignInIntent(): Intent {\n        Timber.d(\"staging makeSignInIntent called\")\n        user.signIn()\n        return Intent()\n    }\n\n    override fun signIn(resultCode: Int, data: Intent?, onComplete: (SignInResult) -> Unit) {\n        Timber.d(\"staging signIn called\")\n        onComplete(SignInSuccess)\n    }\n\n    override fun signOut(context: Context, onComplete: () -> Unit) {\n        Timber.d(\"staging signIn called\")\n        onComplete()\n        user.signOut()\n    }\n}\n\n/**\n * A data source for used for [StagingSignInHandler]\n */\nclass StagingAuthenticatedUser(val context: Context) {\n\n    // TODO: Unused\n    private var signedIn: Boolean = false\n\n    fun signIn() {\n        signedIn = true\n    }\n\n    fun signOut() {\n        signedIn = false\n    }\n}\n\nclass StagingLoggedOutFirebaseUserInfo(\n    _context: Context\n) : StagingAuthenticatedUserInfo(_context) {\n\n    override fun isSignedIn(): Boolean = false\n\n    override fun isRegistered(): Boolean = false\n\n    override fun getPhotoUrl(): Uri? = null\n\n    override fun isRegistrationDataReady(): Boolean = true\n}\n"
  },
  {
    "path": "mobile/src/staging/java/com/google/samples/apps/iosched/shared/data/login/datasources/StagingUserDataSources.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.login.datasources\n\nimport android.content.ContentResolver\nimport android.content.Context\nimport android.net.Uri\nimport com.google.firebase.auth.UserInfo\nimport com.google.samples.apps.iosched.shared.R\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfoBasic\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthStateUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.RegisteredUserDataSource\nimport com.google.samples.apps.iosched.shared.domain.sessions.NotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\n\n/**\n * A configurable [RegisteredUserDataSource] used for staging.\n *\n * @see LoginModule\n */\nclass StagingRegisteredUserDataSource(val isRegistered: Boolean) : RegisteredUserDataSource {\n    private val userChanges = MutableStateFlow(Success(isRegistered))\n\n    override fun observeUserChanges(userId: String): Flow<Result<Boolean?>> = userChanges\n}\n\n/**\n * A configurable [AuthenticatedUserInfo] used for staging.\n *\n * @see [LoginModule]\n */\nopen class StagingAuthenticatedUserInfo(\n    val context: Context,\n    val registered: Boolean = true,\n    val signedIn: Boolean = true,\n    val userId: String? = \"StagingUser\"\n\n) : AuthenticatedUserInfo {\n\n    override fun isSignedIn(): Boolean = signedIn\n\n    override fun isRegistered(): Boolean = registered\n\n    override fun isRegistrationDataReady(): Boolean = true\n\n    override fun getEmail(): String? = \"staginguser@example.com\"\n\n    override fun getProviderData(): MutableList<out UserInfo> = TODO(\"Not implemented\")\n\n    override fun isAnonymous(): Boolean = !signedIn\n\n    override fun getPhoneNumber(): String? = TODO(\"Not implemented\")\n\n    override fun getUid(): String? = userId\n\n    override fun isEmailVerified(): Boolean = TODO(\"Not implemented\")\n\n    override fun getDisplayName(): String? = \"Staging User\"\n\n    override fun getPhotoUrl(): Uri? {\n        val resources = context.resources\n        return Uri.Builder()\n            .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)\n            .authority(resources.getResourcePackageName(R.drawable.staging_user_profile))\n            .appendPath(resources.getResourceTypeName(R.drawable.staging_user_profile))\n            .appendPath(resources.getResourceEntryName(R.drawable.staging_user_profile))\n            .build()\n    }\n\n    override fun getProviderId(): String = TODO(\"Not implemented\")\n\n    override fun getLastSignInTimestamp(): Long? = TODO(\"not implemented\")\n\n    override fun getCreationTimestamp(): Long? = TODO(\"not implemented\")\n}\n\n/**\n * A configurable [AuthStateUserDataSource] used for staging.\n *\n * @see LoginModule\n */\nclass StagingAuthStateUserDataSource(\n    val isSignedIn: Boolean,\n    val isRegistered: Boolean,\n    val userId: String?,\n    val context: Context,\n    val notificationAlarmUpdater: NotificationAlarmUpdater\n) : AuthStateUserDataSource {\n\n    private val userInfo = MutableStateFlow(\n        Success(\n            StagingAuthenticatedUserInfo(\n                registered = isRegistered,\n                signedIn = isSignedIn,\n                context = context\n            )\n        )\n    )\n    override fun getBasicUserInfo(): Flow<Result<AuthenticatedUserInfoBasic?>> {\n        userId?.let {\n            notificationAlarmUpdater.updateAll(userId)\n        }\n\n        return userInfo\n    }\n}\n"
  },
  {
    "path": "mobile/src/staging/java/com/google/samples/apps/iosched/test/HiltTestActivity.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test\n\nimport androidx.appcompat.app.AppCompatActivity\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass HiltTestActivity : AppCompatActivity()\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/model/MobileTestData.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataSource\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakeAppDatabase\n\n/**\n * Test data for unit tests.\n */\nobject TestDataSource : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        return TestData.conferenceData\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return TestData.conferenceData\n    }\n}\n\n/** ConferenceDataRepository for tests */\nobject TestDataRepository : ConferenceDataRepository(\n    TestDataSource,\n    TestDataSource,\n    FakeAppDatabase()\n) {\n    override fun getConferenceDays(): List<ConferenceDay> {\n        return TestData.TestConferenceDays\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeAnalyticsHelper.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.fakes\n\nimport android.app.Activity\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\n\nclass FakeAnalyticsHelper : AnalyticsHelper {\n    override fun sendScreenView(screenName: String, activity: Activity) {}\n\n    override fun logUiEvent(itemId: String, action: String) {}\n\n    override fun setUserSignedIn(isSignedIn: Boolean) {}\n\n    override fun setUserRegistered(isRegistered: Boolean) {}\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeAppDatabase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.fakes\n\nimport androidx.room.DatabaseConfiguration\nimport androidx.room.InvalidationTracker\nimport androidx.sqlite.db.SupportSQLiteOpenHelper\nimport com.google.samples.apps.iosched.shared.data.db.AppDatabase\nimport com.google.samples.apps.iosched.shared.data.db.CodelabFtsDao\nimport com.google.samples.apps.iosched.shared.data.db.SessionFtsDao\nimport com.google.samples.apps.iosched.shared.data.db.SpeakerFtsDao\nimport org.mockito.Mockito\n\nclass FakeAppDatabase : AppDatabase() {\n    override fun sessionFtsDao(): SessionFtsDao {\n        return Mockito.mock(SessionFtsDao::class.java)\n    }\n\n    override fun speakerFtsDao(): SpeakerFtsDao {\n        return Mockito.mock(SpeakerFtsDao::class.java)\n    }\n\n    override fun codelabFtsDao(): CodelabFtsDao {\n        return Mockito.mock(CodelabFtsDao::class.java)\n    }\n\n    override fun createOpenHelper(config: DatabaseConfiguration?): SupportSQLiteOpenHelper {\n        return Mockito.mock(SupportSQLiteOpenHelper::class.java)\n    }\n\n    override fun createInvalidationTracker(): InvalidationTracker {\n        return Mockito.mock(InvalidationTracker::class.java)\n    }\n\n    override fun clearAllTables() {}\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeConferenceDataSource.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.fakes\n\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.shared.data.BootstrapConferenceDataSource\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataSource\n\n/**\n * ConferenceDataSource data source that never touches the network.\n *\n * This class is only available with the staging variant. It's used for unit tests.\n */\nobject FakeConferenceDataSource : ConferenceDataSource {\n\n    override fun getRemoteConferenceData() = getOfflineConferenceData()\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        val bootstrapContent = BootstrapConferenceDataSource.getOfflineConferenceData()\n\n        return bootstrapContent ?: throw Exception(\"Couldn't load data\")\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeOnSessionStarClickDelegate.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.fakes\n\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate\nimport kotlinx.coroutines.flow.Flow\n\nclass FakeOnSessionStarClickDelegate : OnSessionStarClickDelegate {\n\n    override val navigateToSignInDialogEvents: Flow<Unit>\n        get() = TODO(\"Not implemented\")\n\n    override fun onStarClicked(userSession: UserSession) = TODO(\"Not implemented\")\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakePreferenceStorage.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.fakes\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\n\nclass FakePreferenceStorage(\n    onboardingCompleted: Boolean = false,\n    notificationsPreferenceShown: Boolean = false,\n    preferToReceiveNotifications: Boolean = false,\n    myLocationOptedIn: Boolean = false,\n    preferConferenceTimeZone: Boolean = true,\n    sendUsageStatistics: Boolean = false,\n    selectedFilters: String = \"\",\n    selectedTheme: String = \"\",\n    codelabsInfoShown: Boolean = true,\n    var snackbarIsStopped: Boolean = false,\n    var scheduleUiHintsShown: Boolean = false,\n) : PreferenceStorage {\n    private val _onboardingCompleted = MutableStateFlow(onboardingCompleted)\n    override val onboardingCompleted: Flow<Boolean> = _onboardingCompleted\n\n    private val _notificationsPreferenceShown =\n        MutableStateFlow(notificationsPreferenceShown)\n    override val notificationsPreferenceShown = _notificationsPreferenceShown\n\n    private val _preferToReceiveNotifications =\n        MutableStateFlow(preferToReceiveNotifications)\n    override val preferToReceiveNotifications = _preferToReceiveNotifications\n\n    private val _myLocationOptedIn = MutableStateFlow(myLocationOptedIn)\n    override val myLocationOptedIn = _myLocationOptedIn\n\n    private val _sendUsageStatistics = MutableStateFlow(sendUsageStatistics)\n    override val sendUsageStatistics = _sendUsageStatistics\n\n    private val _preferConferenceTimeZone = MutableStateFlow(preferConferenceTimeZone)\n    override val preferConferenceTimeZone = _preferConferenceTimeZone\n\n    private val _selectedFilters = MutableStateFlow(selectedFilters)\n    override val selectedFilters = _selectedFilters\n\n    private val _selectedTheme = MutableStateFlow(selectedTheme)\n    override val selectedTheme = _selectedTheme\n\n    private val _codelabsInfoShown = MutableStateFlow(codelabsInfoShown)\n    override val codelabsInfoShown = _codelabsInfoShown\n\n    override suspend fun completeOnboarding(complete: Boolean) {\n        _onboardingCompleted.value = complete\n    }\n\n    override suspend fun areScheduleUiHintsShown() = scheduleUiHintsShown\n\n    override suspend fun showScheduleUiHints(show: Boolean) {\n        scheduleUiHintsShown = show\n    }\n\n    override suspend fun showNotificationsPreference(show: Boolean) {\n        _notificationsPreferenceShown.value = show\n    }\n\n    override suspend fun preferToReceiveNotifications(prefer: Boolean) {\n        _preferToReceiveNotifications.value = prefer\n    }\n\n    override suspend fun optInMyLocation(optIn: Boolean) {\n        _myLocationOptedIn.value = optIn\n    }\n\n    override suspend fun stopSnackbar(stop: Boolean) {\n        snackbarIsStopped = stop\n    }\n\n    override suspend fun isSnackbarStopped(): Boolean {\n        return snackbarIsStopped\n    }\n\n    override suspend fun sendUsageStatistics(send: Boolean) {\n        _sendUsageStatistics.value = send\n    }\n\n    override suspend fun preferConferenceTimeZone(preferConferenceTimeZone: Boolean) {\n        _preferConferenceTimeZone.value = preferConferenceTimeZone\n    }\n\n    override suspend fun selectFilters(filters: String) {\n        _selectedFilters.value = filters\n    }\n\n    override suspend fun selectTheme(theme: String) {\n        _selectedTheme.value = theme\n    }\n\n    override suspend fun showCodelabsInfo(show: Boolean) {\n        _codelabsInfoShown.value = show\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeSignInViewModelDelegate.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.fakes\n\nimport android.net.Uri\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo\nimport com.google.samples.apps.iosched.ui.signin.SignInNavigationAction\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.nhaarman.mockito_kotlin.doReturn\nimport com.nhaarman.mockito_kotlin.mock\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.emitAll\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.map\n\nclass FakeSignInViewModelDelegate : SignInViewModelDelegate {\n\n    override val userInfo = MutableStateFlow<AuthenticatedUserInfo?>(null)\n    override val currentUserImageUri = MutableStateFlow<Uri?>(null)\n    override val signInNavigationActions = flow<SignInNavigationAction> { }\n    override val showReservations = MutableStateFlow<Boolean>(false)\n\n    var injectIsSignedIn = true\n    var injectIsRegistered = false\n    var signInRequestsEmitted = 0\n    var signOutRequestsEmitted = 0\n\n    override val isUserSignedInValue: Boolean\n        get() = injectIsSignedIn\n\n    override val isUserSignedIn get() = TODO(\"Not implemented\")\n\n    override val isUserRegistered get() = MutableStateFlow(injectIsSignedIn)\n\n    override val isUserRegisteredValue: Boolean\n        get() = injectIsRegistered\n\n    override suspend fun emitSignInRequest() {\n        signInRequestsEmitted++\n    }\n\n    override suspend fun emitSignOutRequest() {\n        signOutRequestsEmitted++\n    }\n\n    override val userIdValue: String?\n        get() {\n            return userInfo.value?.getUid()\n        }\n\n    fun loadUser(id: String) {\n        val mockUser = mock<AuthenticatedUserInfo> {\n            on { getUid() }.doReturn(id)\n            on { getPhotoUrl() }.doReturn(mock<Uri> {})\n            on { isSignedIn() }.doReturn(true)\n            on { this@on.isRegistered() }.doReturn(injectIsRegistered)\n            on { isRegistrationDataReady() }.doReturn(true)\n        }\n        userInfo.value = mockUser\n    }\n\n    override val userId: Flow<String?>\n        get() = flow { emitAll(userInfo.map { it?.getUid() }) }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeStarEventUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.fakes\n\nimport com.google.samples.apps.iosched.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.users.StarEventAndNotifyUseCase\nimport com.google.samples.apps.iosched.ui.schedule.TestUserEventDataSource\nimport com.nhaarman.mockito_kotlin.mock\nimport kotlinx.coroutines.CoroutineDispatcher\n\nclass FakeStarEventUseCase(dispatcher: CoroutineDispatcher) : StarEventAndNotifyUseCase(\n    DefaultSessionAndUserEventRepository(\n        TestUserEventDataSource(),\n        DefaultSessionRepository(TestDataRepository)\n    ),\n    mock {},\n    dispatcher\n)\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/fakes/FakeThemedActivityDelegate.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.fakes\n\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.ui.theme.ThemedActivityDelegate\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\n\nclass FakeThemedActivityDelegate(\n    override val theme: StateFlow<Theme> = MutableStateFlow(Theme.SYSTEM),\n    override val currentTheme: Theme = Theme.SYSTEM\n) : ThemedActivityDelegate\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/test/util/time/FixedTimeProvider.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util.time\n\nimport com.google.samples.apps.iosched.shared.time.DefaultTimeProvider\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport org.junit.rules.TestWatcher\nimport org.junit.runner.Description\nimport org.threeten.bp.Instant\n\n/**\n * Fix the TimeProvider to a fixed time\n */\nclass FixedTimeProvider(var instant: Instant) : TimeProvider {\n    constructor(timeInMilis: Long) : this(Instant.ofEpochMilli(timeInMilis))\n\n    override fun now(): Instant {\n        return instant\n    }\n}\n\n/**\n * Rule to be used in tests that sets the clocked used by DefaultTimeProvider.\n */\nclass FixedTimeExecutorRule(\n    private val fixedTime: FixedTimeProvider = FixedTimeProvider(1_000_000)\n) : TestWatcher() {\n\n    var time: Instant\n        get() = fixedTime.instant\n        set(value) {\n            fixedTime.instant = value\n        }\n\n    override fun starting(description: Description?) {\n        super.starting(description)\n        DefaultTimeProvider.setDelegate(fixedTime)\n    }\n\n    override fun finished(description: Description?) {\n        super.finished(description)\n        DefaultTimeProvider.setDelegate(null)\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/LaunchViewModelTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@file:Suppress(\"FunctionName\")\n\npackage com.google.samples.apps.iosched.ui\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.shared.domain.prefs.OnboardingCompletedUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToMainActivityAction\nimport com.google.samples.apps.iosched.ui.LaunchNavigatonAction.NavigateToOnboardingAction\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for the [LaunchViewModel].\n */\nclass LaunchViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun notCompletedOnboarding_navigatesToOnboarding() = runTest {\n        // Given that user has *not* completed onboarding\n        val prefs = FakePreferenceStorage(onboardingCompleted = false)\n        val onboardingCompletedUseCase =\n            OnboardingCompletedUseCase(prefs, coroutineRule.testDispatcher)\n        val viewModel = LaunchViewModel(onboardingCompletedUseCase)\n\n        // When launchDestination is observed\n        // Then verify user is navigated to the onboarding activity\n        val navigateEvent = viewModel.launchDestination.first()\n        assertEquals(NavigateToOnboardingAction, navigateEvent)\n    }\n\n    @Test\n    fun hasCompletedOnboarding_navigatesToMainActivity() = runTest {\n        // Given that user *has* completed onboarding\n        val prefs = FakePreferenceStorage(onboardingCompleted = true)\n        val onboardingCompletedUseCase =\n            OnboardingCompletedUseCase(prefs, coroutineRule.testDispatcher)\n        val viewModel = LaunchViewModel(onboardingCompletedUseCase)\n\n        // When launchDestination is observed\n        // Then verify user is navigated to the main activity\n        val navigateEvent = viewModel.launchDestination.first()\n        assertEquals(NavigateToMainActivityAction, navigateEvent)\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/MainActivityViewModelTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui\n\nimport android.content.Context\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.firebase.functions.FirebaseFunctions\nimport com.google.gson.GsonBuilder\nimport com.google.samples.apps.iosched.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.data.ar.DefaultArDebugFlagEndpoint\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.ar.LoadArDebugFlagUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadPinnedSessionsJsonUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport com.google.samples.apps.iosched.test.util.fakes.FakeThemedActivityDelegate\nimport com.google.samples.apps.iosched.ui.schedule.TestUserEventDataSource\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.ui.theme.ThemedActivityDelegate\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Rule\nimport org.junit.Test\nimport org.mockito.Mockito.mock\n\nclass MainActivityViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private fun createMainActivityViewModel(\n        signInViewModelDelegate: SignInViewModelDelegate = FakeSignInViewModelDelegate(),\n        themedActivityDelegate: ThemedActivityDelegate = FakeThemedActivityDelegate()\n    ): MainActivityViewModel {\n        return MainActivityViewModel(\n            signInViewModelDelegate = signInViewModelDelegate,\n            themedActivityDelegate = themedActivityDelegate,\n            loadPinnedSessionsUseCase = LoadPinnedSessionsJsonUseCase(\n                DefaultSessionAndUserEventRepository(\n                    TestUserEventDataSource(), DefaultSessionRepository(TestDataRepository)\n                ),\n                GsonBuilder().create(),\n                coroutineRule.testDispatcher\n            ),\n            loadArDebugFlagUseCase = LoadArDebugFlagUseCase(\n                DefaultArDebugFlagEndpoint(\n                    mock(FirebaseFunctions::class.java)\n                ),\n                coroutineRule.testDispatcher\n            ),\n            context = mock(Context::class.java)\n        )\n    }\n\n    @Test\n    fun notLoggedIn_profileClicked_showsSignInDialog() = runTest {\n        // Given a ViewModel with a signed out user\n        val signInViewModelDelegate = FakeSignInViewModelDelegate().apply {\n            injectIsSignedIn = false\n        }\n        val viewModel =\n            createMainActivityViewModel(signInViewModelDelegate = signInViewModelDelegate)\n\n        // When profile is clicked\n        viewModel.onProfileClicked()\n\n        // Then the sign in dialog should be shown\n        val signInEvent = viewModel.navigationActions.first()\n        assertEquals(signInEvent, MainNavigationAction.OpenSignIn)\n    }\n\n    @Test\n    fun loggedIn_profileClicked_showsSignOutDialog() = runTest {\n        // Given a ViewModel with a signed in user\n        val signInViewModelDelegate = FakeSignInViewModelDelegate().apply {\n            injectIsSignedIn = true\n        }\n        val viewModel =\n            createMainActivityViewModel(signInViewModelDelegate = signInViewModelDelegate)\n\n        // When profile is clicked\n        viewModel.onProfileClicked()\n\n        // Then the sign out dialog should be shown\n        val signOutEvent = viewModel.navigationActions.first()\n        assertEquals(signOutEvent, MainNavigationAction.OpenSignOut)\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/agenda/AgendaHeaderIndexerTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.agenda\n\nimport com.google.samples.apps.iosched.test.data.TestData\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.threeten.bp.ZonedDateTime\n\nclass AgendaHeaderIndexerTest {\n\n    @Test\n    fun indexAgenda_groupsCorrectly() {\n        // Given a list of test blocks starting over 3 days\n        val block = TestData.block1\n        val start = ZonedDateTime.parse(\"2018-05-08T07:00:00-07:00\")\n        val sessions = listOf(\n            block.copy(startTime = start),\n            block.copy(startTime = start),\n            block.copy(startTime = start.plusDays(1)),\n            block.copy(startTime = start.plusDays(1)),\n            block.copy(startTime = start.plusDays(2)),\n            block.copy(startTime = start.plusDays(2))\n        )\n\n        // Process this list to group by start day, keyed on index\n        val grouped = indexAgendaHeaders(sessions).toMap()\n\n        // Then verify that the correct groupings are made and indexes used\n        assertEquals(3, grouped.size)\n        assertEquals(setOf(0, 2, 4), grouped.keys)\n        assertEquals(start, grouped[0])\n        assertEquals(start.plusDays(1), grouped[2])\n        assertEquals(start.plusDays(2), grouped[4])\n    }\n\n    @Test\n    fun indexAgenda_roundsDayDown() {\n        // Given a list of test blocks where a block straddles two days\n        val block = TestData.block1\n        val dayOneSevenAM = ZonedDateTime.parse(\"2018-05-08T07:00:00-07:00\")\n        val dayOneEightAM = ZonedDateTime.parse(\"2018-05-08T08:00:00-07:00\")\n        val dayOneElevenPM = ZonedDateTime.parse(\"2018-05-08T23:00:00-07:00\")\n        val dayTwoOneAM = ZonedDateTime.parse(\"2018-05-09T01:00:00-07:00\")\n        val dayTwoSevenAM = ZonedDateTime.parse(\"2018-05-09T07:00:00-07:00\")\n        val dayTwoEightAM = ZonedDateTime.parse(\"2018-05-09T08:00:00-07:00\")\n\n        val sessions = listOf(\n            block.copy(startTime = dayOneSevenAM, endTime = dayOneEightAM),\n            block.copy(startTime = dayOneElevenPM, endTime = dayTwoOneAM), // straddling day\n            block.copy(startTime = dayTwoSevenAM, endTime = dayTwoEightAM)\n        )\n\n        // Process this list to group by start time, keyed on index\n        val grouped = indexAgendaHeaders(sessions).toMap()\n\n        // Then verify that the correct groupings are made; the straddling block should be grouped\n        // with the day it starts in.\n        assertEquals(2, grouped.size)\n        assertEquals(setOf(0, 2), grouped.keys)\n        assertEquals(dayOneSevenAM, grouped[0])\n        assertEquals(dayTwoSevenAM, grouped[2])\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/agenda/AgendaViewModelTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.agenda\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.shared.data.agenda.AgendaRepository\nimport com.google.samples.apps.iosched.shared.domain.agenda.LoadAgendaUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\nimport org.hamcrest.Matchers.equalTo as isEqualTo\n\n/**\n * Unit tests for the [AgendaViewModel].\n */\nclass AgendaViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun agendaDataIsLoaded() = runTest {\n        val viewModel = AgendaViewModel(\n            LoadAgendaUseCase(FakeAgendaRepository(), coroutineRule.testDispatcher),\n            GetTimeZoneUseCase(FakePreferenceStorage(), coroutineRule.testDispatcher)\n        )\n\n        val blocks = viewModel.agenda.first()\n        assertThat(blocks, isEqualTo(TestData.agenda))\n    }\n\n    internal class FakeAgendaRepository : AgendaRepository {\n\n        override suspend fun getAgenda(forceRefresh: Boolean): List<Block> = TestData.agenda\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsViewModelTest.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.codelabs\n\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.data.codelabs.CodelabsRepository\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.domain.codelabs.GetCodelabsInfoCardShownUseCase\nimport com.google.samples.apps.iosched.shared.domain.codelabs.LoadCodelabsUseCase\nimport com.google.samples.apps.iosched.shared.domain.codelabs.SetCodelabsInfoCardShownUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakeAppDatabase\nimport com.google.samples.apps.iosched.test.util.fakes.FakeConferenceDataSource\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [CodelabsViewModel]\n */\nclass CodelabsViewModelTest {\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun testData_codelabInfoShown() = runTest {\n        val prefs = FakePreferenceStorage(codelabsInfoShown = true)\n        val viewModel = createCodelabsViewModel(\n            getCodelabsInfoCardShownUseCase = createTestGetCodelabsInfoCardShownUseCase(prefs)\n        )\n        val codelabs = viewModel.screenContent.first()\n        // codelabs does not contain the info card\n        assertFalse(codelabs.contains(CodelabsInformationCard))\n        // We have other codelabs apart from the header item\n        assertTrue(codelabs.size > 1)\n    }\n\n    @Test\n    fun testData_codelabInfoNotShown() = runTest {\n        val prefs = FakePreferenceStorage(codelabsInfoShown = false)\n        val viewModel = createCodelabsViewModel(\n            getCodelabsInfoCardShownUseCase = createTestGetCodelabsInfoCardShownUseCase(prefs)\n        )\n        val codelabs = viewModel.screenContent.first()\n        // codelabs contain the info card\n        assertTrue(codelabs.contains(CodelabsInformationCard))\n        // We have other codelabs apart from the header item and info card\n        assertTrue(codelabs.size > 2)\n    }\n\n    @Test\n    fun testData_dismissCodelabInfoCard() = runTest {\n        val prefs = FakePreferenceStorage(codelabsInfoShown = false)\n        val viewModel = createCodelabsViewModel(\n            getCodelabsInfoCardShownUseCase = createTestGetCodelabsInfoCardShownUseCase(prefs),\n            setCodelabsInfoCardShownUseCase = createTestSetCodelabsInfoCardShownUseCase(prefs)\n        )\n        val initialCodelabs = viewModel.screenContent.first()\n        // codelabs contain the info card\n        assertTrue(initialCodelabs.contains(CodelabsInformationCard))\n\n        viewModel.dismissCodelabsInfoCard()\n\n        val newCodelabs = viewModel.screenContent.first()\n        assertFalse(newCodelabs.contains(CodelabsInformationCard))\n    }\n\n    private fun createCodelabsViewModel(\n        loadCodelabsUseCase: LoadCodelabsUseCase = createTestLoadCodelabsUseCase(),\n        getCodelabsInfoCardShownUseCase: GetCodelabsInfoCardShownUseCase =\n            createTestGetCodelabsInfoCardShownUseCase(),\n        setCodelabsInfoCardShownUseCase: SetCodelabsInfoCardShownUseCase =\n            createTestSetCodelabsInfoCardShownUseCase()\n    ): CodelabsViewModel {\n        return CodelabsViewModel(\n            loadCodelabsUseCase,\n            getCodelabsInfoCardShownUseCase,\n            setCodelabsInfoCardShownUseCase\n        )\n    }\n\n    private fun createTestLoadCodelabsUseCase(): LoadCodelabsUseCase {\n        val conferenceDataRepository = createTestConferenceDataRepository()\n        val codelabsRepository: CodelabsRepository =\n            createTestCodelabsRepository(conferenceDataRepository)\n        return LoadCodelabsUseCase(\n            codelabsRepository,\n            coroutineRule.testDispatcher\n        )\n    }\n\n    private fun createTestConferenceDataRepository(): ConferenceDataRepository {\n        return ConferenceDataRepository(\n            remoteDataSource = FakeConferenceDataSource,\n            boostrapDataSource = FakeConferenceDataSource,\n            appDatabase = FakeAppDatabase()\n        )\n    }\n\n    private fun createTestCodelabsRepository(\n        conferenceDataRepository: ConferenceDataRepository\n    ): CodelabsRepository {\n        return CodelabsRepository(conferenceDataRepository)\n    }\n\n    private fun createTestGetCodelabsInfoCardShownUseCase(\n        preferenceStorage: PreferenceStorage = FakePreferenceStorage()\n    ): GetCodelabsInfoCardShownUseCase {\n        return GetCodelabsInfoCardShownUseCase(\n            preferenceStorage,\n            coroutineRule.testDispatcher\n        )\n    }\n\n    private fun createTestSetCodelabsInfoCardShownUseCase(\n        preferenceStorage: PreferenceStorage = FakePreferenceStorage()\n    ): SetCodelabsInfoCardShownUseCase {\n        return SetCodelabsInfoCardShownUseCase(\n            preferenceStorage,\n            coroutineRule.testDispatcher\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/feed/FeedViewModelTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.lifecycle.viewModelScope\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.data.feed.DefaultFeedRepository\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.feed.GetConferenceStateUseCase\nimport com.google.samples.apps.iosched.shared.domain.feed.LoadAnnouncementsUseCase\nimport com.google.samples.apps.iosched.shared.domain.feed.LoadCurrentMomentUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.StopSnackbarActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadStarredAndReservedSessionsUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport com.google.samples.apps.iosched.test.data.CoroutineScope\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakeAnalyticsHelper\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport com.google.samples.apps.iosched.test.util.fakes.FakeThemedActivityDelegate\nimport com.google.samples.apps.iosched.test.util.time.FixedTimeProvider\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.schedule.TestUserEventDataSource\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.google.samples.apps.iosched.ui.theme.ThemedActivityDelegate\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.hamcrest.Matchers.`is`\nimport org.hamcrest.Matchers.equalTo\nimport org.hamcrest.Matchers.instanceOf\nimport org.junit.Assert.assertEquals\nimport org.junit.Rule\nimport org.junit.Test\nimport org.threeten.bp.Instant\n\n/**\n * Unit tests for the [FeedViewModel]\n */\nclass FeedViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private val testDispatcher = coroutineRule.testDispatcher\n\n    private val defaultFeedRepository =\n        DefaultFeedRepository(TestAnnouncementDataSource, TestMomentDataSource)\n\n    // Loads feed roughly during the Keynote time\n    private val defaultTimeProvider =\n        FixedTimeProvider(TestData.TestConferenceDays[0].start.plusHours(4).toInstant())\n\n    @Test\n    fun testDataIsLoaded_ObservablesUpdated() = runTest {\n        // Create ViewModel with the use case and load the feed.\n        val viewModel = createFeedViewModel()\n        val feedObservable = viewModel.feed.first()\n\n        // Check that data was loaded correctly.\n        // At the specified time, the Moment is relevant and there is one Announcement.\n        // Add two more for the Sessions carousel and the \"Announcements' heading.\n        assertThat(feedObservable.size, `is`(equalTo(5)))\n        assertThat(feedObservable[0] as? Moment, `is`(equalTo(TestData.moment1)))\n        assertThat(\n            feedObservable[1] as? AnnouncementsHeader,\n            `is`(equalTo(AnnouncementsHeader(false)))\n        )\n        assertThat(feedObservable[2] as? Announcement, `is`(equalTo(TestData.feedItem1)))\n        assertThat(feedObservable[3], `is`(instanceOf(FeedSustainabilitySection::class.java)))\n        assertThat(feedObservable[4], `is`(instanceOf(FeedSocialChannelsSection::class.java)))\n\n        // Must cancel because there's a flow in [GetConferenceStateUseCase] that never finishes.\n        viewModel.viewModelScope.cancel()\n    }\n\n    @Test\n    fun testDataIsLoaded_Fails() = runTest {\n        // Create ViewModel with a use case that returns an error\n        val snackbarMessageManager = createSnackbarMessageManager()\n        val viewModel = createFeedViewModel(\n            loadAnnouncementUseCase = FailingUseCase(testDispatcher),\n            snackbarMessageManager = snackbarMessageManager\n        )\n\n        // Observe feed to generate an error\n        val feed = viewModel.feed.first()\n\n        // Verify that an error was caught\n        val msg = snackbarMessageManager.currentSnackbar.value\n        assertEquals(R.string.feed_loading_error, msg?.messageId)\n\n        // Must cancel because there's a flow in [GetConferenceStateUseCase] that never finishes.\n        viewModel.viewModelScope.cancel()\n    }\n\n    /**\n     * Use case that always returns an error when executed.\n     */\n    class FailingUseCase(coroutineDispatcher: CoroutineDispatcher) : LoadAnnouncementsUseCase(\n        DefaultFeedRepository(TestAnnouncementDataSource, TestMomentDataSource),\n        coroutineDispatcher\n    ) {\n        override suspend fun execute(parameters: Instant): List<Announcement> {\n            throw Exception(\"Error!\")\n        }\n    }\n\n    private fun createFeedViewModel(\n        loadCurrentMomentUseCase: LoadCurrentMomentUseCase =\n            LoadCurrentMomentUseCase(defaultFeedRepository, testDispatcher),\n        loadAnnouncementUseCase: LoadAnnouncementsUseCase =\n            LoadAnnouncementsUseCase(defaultFeedRepository, testDispatcher),\n        loadStarredAndReservedSessionsUseCase: LoadStarredAndReservedSessionsUseCase =\n            LoadStarredAndReservedSessionsUseCase(\n                DefaultSessionAndUserEventRepository(\n                    TestUserEventDataSource(), DefaultSessionRepository(TestDataRepository)\n                ),\n                testDispatcher\n            ),\n        getTimeZoneUseCase: GetTimeZoneUseCase =\n            GetTimeZoneUseCase(FakePreferenceStorage(), testDispatcher),\n        getConferenceStateUseCase: GetConferenceStateUseCase =\n            GetConferenceStateUseCase(testDispatcher, defaultTimeProvider),\n        timeProvider: TimeProvider = defaultTimeProvider,\n        signInViewModelDelegate: SignInViewModelDelegate = FakeSignInViewModelDelegate().apply {\n            loadUser(\"123\")\n        },\n        themedActivityDelegate: ThemedActivityDelegate = FakeThemedActivityDelegate(),\n        snackbarMessageManager: SnackbarMessageManager = createSnackbarMessageManager()\n    ): FeedViewModel {\n        return FeedViewModel(\n            loadCurrentMomentUseCase = loadCurrentMomentUseCase,\n            loadAnnouncementsUseCase = loadAnnouncementUseCase,\n            loadStarredAndReservedSessionsUseCase = loadStarredAndReservedSessionsUseCase,\n            getTimeZoneUseCase = getTimeZoneUseCase,\n            getConferenceStateUseCase = getConferenceStateUseCase,\n            timeProvider = timeProvider,\n            analyticsHelper = FakeAnalyticsHelper(),\n            signInViewModelDelegate = signInViewModelDelegate,\n            themedActivityDelegate = themedActivityDelegate,\n            snackbarMessageManager = snackbarMessageManager\n        )\n    }\n\n    private fun createSnackbarMessageManager(\n        preferenceStorage: PreferenceStorage = FakePreferenceStorage()\n    ): SnackbarMessageManager {\n        return SnackbarMessageManager(\n            preferenceStorage,\n            coroutineRule.CoroutineScope(),\n            StopSnackbarActionUseCase(preferenceStorage, testDispatcher)\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/feed/TestAnnouncementDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.shared.data.feed.AnnouncementDataSource\nimport com.google.samples.apps.iosched.test.data.TestData\n\n/**\n * Generates dummy session data to be used in tests.\n */\nobject TestAnnouncementDataSource : AnnouncementDataSource {\n\n    override fun getAnnouncements(): List<Announcement> = TestData.announcements\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/feed/TestMomentDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.feed\n\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.shared.data.feed.MomentDataSource\nimport com.google.samples.apps.iosched.test.data.TestData\n\n/**\n * Generates dummy moments data to be used in tests.\n */\nobject TestMomentDataSource : MomentDataSource {\n\n    override fun getMoments(): List<Moment> = TestData.moments\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/filters/FiltersViewModelTest.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.filters\n\nimport com.google.samples.apps.iosched.model.Tag\nimport com.google.samples.apps.iosched.model.filters.Filter\nimport com.google.samples.apps.iosched.model.filters.Filter.MyScheduleFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.TagFilter\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.test.UnconfinedTestDispatcher\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\n\nclass FiltersViewModelTest {\n\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private val tagFilters = TestData.tagsList.map { TagFilter(it) }\n    private val androidFilter = TagFilter(TestData.androidTag)\n    private val sessionsFilter = TagFilter(TestData.sessionsTag)\n\n    private lateinit var viewModel: FiltersViewModelDelegate\n\n    @Before\n    fun setup() {\n        viewModel = FiltersViewModelDelegateImpl(CoroutineScope(coroutineRule.testDispatcher))\n        viewModel.setSupportedFilters(tagFilters)\n    }\n\n    @Test(expected = IllegalArgumentException::class)\n    fun `toggle unsupported filter throws exception`() {\n        // Not one of the tag filters.\n        viewModel.toggleFilter(MyScheduleFilter, true)\n    }\n\n    // Helper method for subsequent tests.\n    private suspend fun verifyFlowEmissions(\n        viewModel: FiltersViewModelDelegate,\n        selectedFilters: List<Filter>,\n        allFilters: List<Filter> = tagFilters\n    ) {\n        // Verify selected filters.\n        val selectedFiltersResult = viewModel.selectedFilters.first()\n        assertEquals(selectedFiltersResult.size, selectedFilters.size)\n        selectedFiltersResult.forEach {\n            assertTrue(it in selectedFilters)\n        }\n\n        // Verify selected filter chips.\n        val selectedFilterChipsResult = viewModel.selectedFilterChips.first()\n        assertEquals(selectedFilterChipsResult.size, selectedFilters.size)\n        selectedFilterChipsResult.forEach {\n            assertTrue(it.filter in selectedFilters)\n        }\n\n        // Verify all filter chips.\n        val filterChipsResult = viewModel.filterChips.first()\n        assertEquals(filterChipsResult.size, allFilters.size)\n        filterChipsResult.forEachIndexed { index, filterChip ->\n            assertEquals(filterChip.filter, allFilters[index])\n            assertEquals(filterChip.isSelected, filterChip.filter in selectedFilters)\n        }\n    }\n\n    @Test\n    fun `setSupportedFilters() emits default values`() = runTest {\n        verifyFlowEmissions(viewModel, emptyList())\n    }\n\n    @Test\n    fun `activate and deactivate filters updates flows`() = runTest {\n        // Activate filters.\n        viewModel.toggleFilter(androidFilter, true)\n        viewModel.toggleFilter(sessionsFilter, true)\n        verifyFlowEmissions(viewModel, listOf(androidFilter, sessionsFilter))\n\n        // Deactivate a filter.\n        viewModel.toggleFilter(androidFilter, false)\n        verifyFlowEmissions(viewModel, listOf(sessionsFilter))\n    }\n\n    @Test\n    fun `activate same filter does not emit a change`() = runTest {\n        // Activate filter.\n        viewModel.toggleFilter(androidFilter, true)\n\n        var calls = 0\n        val collectionJob = launch(UnconfinedTestDispatcher()) {\n            viewModel.selectedFilters.collect {\n                calls++\n            }\n        }\n        assertEquals(calls, 1)\n\n        // Activate same filter.\n        viewModel.toggleFilter(androidFilter, true)\n\n        // Verify collector not called again.\n        assertEquals(calls, 1)\n\n        collectionJob.cancel()\n    }\n\n    @Test\n    fun `deactivate filter that isn't selected does not emit a change`() = runTest {\n        // Activate filter.\n        viewModel.toggleFilter(androidFilter, true)\n\n        var calls = 0\n        val collectionJob = launch(UnconfinedTestDispatcher()) {\n            viewModel.selectedFilters.collect {\n                calls++\n            }\n        }\n        // Verify collector called for current value.\n        assertEquals(calls, 1)\n\n        // Deactivate some other filter.\n        viewModel.toggleFilter(sessionsFilter, false)\n\n        // Verify collector not called again.\n        assertEquals(calls, 1)\n\n        collectionJob.cancel()\n    }\n\n    @Test\n    fun `setSupportedFilters() removes orphaned selected filters`() =\n        runTest {\n            // Activate a topic filter and a type filter.\n            viewModel.toggleFilter(androidFilter, true)\n            viewModel.toggleFilter(sessionsFilter, true)\n            verifyFlowEmissions(viewModel, listOf(androidFilter, sessionsFilter))\n\n            // Set supported filters to only topic tags.\n            val topicTagFilters = tagFilters.filter { it.tag.category == Tag.CATEGORY_TOPIC }\n            viewModel.setSupportedFilters(topicTagFilters)\n            verifyFlowEmissions(viewModel, listOf(androidFilter), allFilters = topicTagFilters)\n        }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/map/MapVariantTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport com.google.samples.apps.iosched.shared.BuildConfig\nimport com.google.samples.apps.iosched.ui.map.MapVariant.AFTER_DARK\nimport com.google.samples.apps.iosched.ui.map.MapVariant.CONCERT\nimport com.google.samples.apps.iosched.ui.map.MapVariant.DAY\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.hamcrest.Matchers.`is`\nimport org.hamcrest.Matchers.equalTo\nimport org.junit.Test\nimport org.threeten.bp.ZonedDateTime\n\nclass MapVariantTest {\n\n    @Test\n    fun forTime_beforeConference_returnsDay() {\n        val time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_START).minusMinutes(1)\n            .toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(DAY)))\n    }\n\n    @Test\n    fun forTime_afterConference_returnsDay() {\n        val time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY3_END).plusMinutes(1).toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(DAY)))\n    }\n\n    @Test\n    fun forTime_duringAnyDay_returnsDay() {\n        var time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_START).plusMinutes(1).toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(DAY)))\n\n        time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_START).plusMinutes(1).toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(DAY)))\n\n        time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY3_START).plusMinutes(1).toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(DAY)))\n    }\n\n    @Test\n    fun forTime_duringAfterHours_returnsAfterHours() {\n        val time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_AFTERHOURS_START).plusMinutes(1)\n            .toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(AFTER_DARK)))\n    }\n\n    @Test\n    fun forTime_afterAfterHours_returnsDay() {\n        val time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_END).plusMinutes(1).toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(DAY)))\n    }\n\n    @Test\n    fun forTime_duringConcert_returnsConcert() {\n        val time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_CONCERT_START).plusMinutes(1)\n            .toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(CONCERT)))\n    }\n\n    @Test\n    fun forTime_afterConcert_returnsDay() {\n        val time = ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_END).plusMinutes(1).toInstant()\n        assertThat(MapVariant.forTime(time), `is`(equalTo(DAY)))\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/map/MapViewModelTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.map\n\nimport android.content.Context\nimport com.google.android.gms.maps.model.LatLng\nimport com.google.samples.apps.iosched.shared.domain.prefs.MyLocationOptedInUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.OptIntoMyLocationUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakeAnalyticsHelper\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.mockito.Mockito.mock\n\n/**\n * Unit tests for the [MapViewModel].\n */\nclass MapViewModelTest {\n\n    @get:Rule var coroutineRule = MainCoroutineRule()\n\n    private val storage = FakePreferenceStorage()\n    private val signInViewModelDelegate = FakeSignInViewModelDelegate()\n    private lateinit var viewModel: MapViewModel\n\n    private val testDispatcher = coroutineRule.testDispatcher\n\n    @Before\n    fun createViewModel() {\n        // Create ViewModel with the test data\n        viewModel = MapViewModel(\n            LoadGeoJsonFeaturesUseCase(mock(Context::class.java), testDispatcher),\n            FakeAnalyticsHelper(),\n            signInViewModelDelegate,\n            OptIntoMyLocationUseCase(storage, testDispatcher),\n            MyLocationOptedInUseCase(storage, testDispatcher)\n        )\n    }\n\n    @Test\n    fun testDataIsLoaded() = runTest {\n        assertTrue(\n            viewModel.conferenceLocationBounds.contains(\n                // conference center\n                LatLng(37.425842, -122.079933)\n            )\n        )\n    }\n\n    @Test\n    fun myLocation() = runTest {\n        signInViewModelDelegate.injectIsRegistered = true // On-site attendee\n        signInViewModelDelegate.loadUser(\"1\")\n        assertNotNull(viewModel.userInfo)\n        assertFalse(storage.myLocationOptedIn.first())\n        assertTrue(viewModel.showMyLocationOption.first())\n        viewModel.optIntoMyLocation()\n        // The button is gone after opt-in\n        assertFalse(viewModel.showMyLocationOption.first())\n        // This happens when user revokes the permission on system settings.\n        viewModel.optIntoMyLocation(false)\n        assertTrue(viewModel.showMyLocationOption.first())\n    }\n\n    @Test\n    fun myLocation_notSignedIn() = runTest {\n        signInViewModelDelegate.injectIsSignedIn = false\n        signInViewModelDelegate.loadUser(\"1\")\n        assertFalse(viewModel.showMyLocationOption.first())\n    }\n\n    @Test\n    fun myLocation_notRegistered() = runTest {\n        signInViewModelDelegate.injectIsRegistered = false\n        signInViewModelDelegate.loadUser(\"1\")\n        assertFalse(viewModel.showMyLocationOption.first())\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/messages/SnackbarMessageManagerTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.messages\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.domain.prefs.StopSnackbarActionUseCase\nimport com.google.samples.apps.iosched.test.data.CoroutineScope\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [SnackbarMessageManager].\n */\nclass SnackbarMessageManagerTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private fun createSnackbarMessageManager(\n        preferenceStorage: PreferenceStorage = FakePreferenceStorage()\n    ): SnackbarMessageManager {\n        return SnackbarMessageManager(\n            preferenceStorage,\n            coroutineRule.CoroutineScope(),\n            StopSnackbarActionUseCase(preferenceStorage, coroutineRule.testDispatcher)\n        )\n    }\n\n    @Test\n    fun addOneMessage() {\n        val snackbarMessageManager = createSnackbarMessageManager()\n        snackbarMessageManager.addMessage(msg1)\n\n        val result = snackbarMessageManager.currentSnackbar.value\n\n        assertEquals(result, msg1)\n    }\n\n    @Test\n    fun addTwoMessages_OrderMaintained_NullWhenNoMore() {\n        val snackbarMessageManager = createSnackbarMessageManager()\n\n        snackbarMessageManager.addMessage(msg1)\n        snackbarMessageManager.addMessage(msg2)\n\n        // First message is consumed\n        var result = snackbarMessageManager.currentSnackbar.value\n        assertEquals(result, msg1)\n        snackbarMessageManager.removeMessageAndLoadNext(msg1) // Snackbar dismissed\n\n        // Second message is consumed\n        result = snackbarMessageManager.currentSnackbar.value\n        assertEquals(result, msg2)\n        snackbarMessageManager.removeMessageAndLoadNext(msg2) // Snackbar dismissed\n\n        // All messages have been consumed\n        result = snackbarMessageManager.currentSnackbar.value\n        assertNull(result)\n    }\n\n    @Test\n    fun addTwoMessagesSameRequestId_OnlyOneShows() {\n        val snackbarMessageManager = createSnackbarMessageManager()\n\n        snackbarMessageManager.addMessage(msg1)\n        snackbarMessageManager.addMessage(msg1)\n\n        // First message is consumed\n        var result = snackbarMessageManager.currentSnackbar.value\n        assertEquals(result, msg1)\n        snackbarMessageManager.removeMessageAndLoadNext(msg1) // Snackbar dismissed\n\n        // All messages have been consumed\n        result = snackbarMessageManager.currentSnackbar.value\n        assertNull(result)\n    }\n\n    @Test\n    fun addMessagesToQueue_NewOnesRemoved() {\n        val snackbarMessageManager = createSnackbarMessageManager()\n\n        val addedMsgs = 15\n        (0..addedMsgs).forEach {\n            val newMsg = createMessage(it.toString())\n            snackbarMessageManager.addMessage(newMsg)\n        }\n\n        val result = snackbarMessageManager.currentSnackbar.value\n        assertEquals(result?.requestChangeId, 0.toString())\n\n        (0 until SnackbarMessageManager.MAX_ITEMS).forEach {\n            val newMsg = createMessage(it.toString())\n            snackbarMessageManager.removeMessageAndLoadNext(newMsg)\n        }\n\n        // The last message request ID should be 10, because we added 15 and the maximum is 10.\n        val lastMsg = snackbarMessageManager.currentSnackbar.value\n        val lastId = SnackbarMessageManager.MAX_ITEMS.toString()\n        assertEquals(lastMsg?.requestChangeId, lastId)\n    }\n\n    @Test\n    fun addOneMessage_snackbarIsStopped_actionDontShow() {\n        val snackbarMessageManager = createSnackbarMessageManager(\n            FakePreferenceStorage(snackbarIsStopped = true)\n        )\n        snackbarMessageManager.addMessage(msg1.copy(actionId = R.string.dont_show))\n\n        val result = snackbarMessageManager.currentSnackbar.value\n        assertNull(result)\n    }\n\n    @Test\n    fun addOneMessage_snackbarAppears_actionNotDontShow() {\n        val snackbarMessageManager = createSnackbarMessageManager(\n            FakePreferenceStorage(snackbarIsStopped = true)\n        )\n        snackbarMessageManager.addMessage(msg1)\n\n        val result = snackbarMessageManager.currentSnackbar.value\n        assertEquals(result, msg1)\n    }\n\n    private fun createMessage(requestId: String): SnackbarMessage {\n        return SnackbarMessage(\n            messageId = 100,\n            actionId = 500,\n            requestChangeId = requestId,\n            session = TestData.session0\n        )\n    }\n}\n\nval msg1 = SnackbarMessage(\n    messageId = 123,\n    actionId = 321,\n    requestChangeId = \"42\",\n    session = TestData.session0\n)\n\nval msg2 = SnackbarMessage(\n    messageId = 123,\n    actionId = 321,\n    requestChangeId = \"43\",\n    session = TestData.session1\n)\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/onboarding/OnboardingViewModelTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@file:Suppress(\"FunctionName\")\n\npackage com.google.samples.apps.iosched.ui.onboarding\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.shared.domain.prefs.OnboardingCompleteActionUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for the [OnboardingViewModel].\n */\nclass OnboardingViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun onGetStartedClicked_updatesPrefs() = runTest {\n        // Given an onboarding view model\n        val prefs = FakePreferenceStorage()\n        val onboardingCompleteActionUseCase =\n            OnboardingCompleteActionUseCase(prefs, coroutineRule.testDispatcher)\n        val signInDelegate = FakeSignInViewModelDelegate()\n        val viewModel = OnboardingViewModel(onboardingCompleteActionUseCase, signInDelegate)\n\n        // When getStarted is called\n        viewModel.getStartedClick()\n\n        // Then verify that local storage was updated\n        val onboardingCompleted = prefs.onboardingCompleted.first()\n        assertTrue(onboardingCompleted)\n\n        // And that the navigation event was fired\n        val navigateEvent = viewModel.navigationActions.first()\n        assertEquals(navigateEvent, OnboardingNavigationAction.NavigateToMainScreen)\n    }\n\n    @Test\n    fun onSigninClicked() = runTest {\n        // Given an onboarding view model\n        val prefs = FakePreferenceStorage()\n        val onboardingCompleteActionUseCase =\n            OnboardingCompleteActionUseCase(prefs, coroutineRule.testDispatcher)\n        val signInDelegate = FakeSignInViewModelDelegate()\n        val viewModel = OnboardingViewModel(onboardingCompleteActionUseCase, signInDelegate)\n\n        // When getStarted is called\n        viewModel.onSigninClicked()\n\n        // And that the navigation event was fired\n        val navigateEvent = viewModel.navigationActions.first()\n        assertEquals(navigateEvent, OnboardingNavigationAction.NavigateToSignInDialog)\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/reservation/RemoveReservationViewModelTest.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.reservation\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.lifecycle.SavedStateHandle\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventDataSource\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.StarReserveNotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationActionUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport com.google.samples.apps.iosched.ui.schedule.TestUserEventDataSource\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.nhaarman.mockito_kotlin.any\nimport com.nhaarman.mockito_kotlin.mock\nimport com.nhaarman.mockito_kotlin.verify\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for the [RemoveReservationViewModel].\n */\nclass RemoveReservationViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private val signInViewModelDelegate = FakeSignInViewModelDelegate()\n    private val alarmUpdater: StarReserveNotificationAlarmUpdater = mock()\n\n    @Before\n    fun setUp() {\n        signInViewModelDelegate.loadUser(\"123\")\n    }\n\n    @Test\n    fun dataIsLoaded() = runTest {\n        val removeReservationViewModel = createRemoveReservationViewModel(TestData.session0.id)\n\n        val userSession = removeReservationViewModel.userSession.first()\n        assertEquals(\"0\", userSession?.session?.id)\n    }\n\n    @Test\n    fun reservationIsPlaced() = runTest {\n        val removeReservationViewModel = createRemoveReservationViewModel(TestData.session0.id)\n\n        val userSession = removeReservationViewModel.userSession.first()\n        assertEquals(\"0\", userSession?.session?.id)\n\n        removeReservationViewModel.removeReservation()\n\n        verify(alarmUpdater).updateSession(any(), any())\n    }\n\n    private fun createRemoveReservationViewModel(\n        sessionId: SessionId = TestData.session0.id,\n        signInViewModelDelegate: SignInViewModelDelegate = this.signInViewModelDelegate,\n        loadUserSessionUseCase: LoadUserSessionUseCase = createTestLoadUserSessionUseCase(),\n        reservationActionUseCase: ReservationActionUseCase = createReservationActionUseCase()\n    ) = RemoveReservationViewModel(\n        savedStateHandle = SavedStateHandle(mapOf(\"session_id\" to sessionId)),\n        signInViewModelDelegate = signInViewModelDelegate,\n        loadUserSessionUseCase = loadUserSessionUseCase,\n        reservationActionUseCase = reservationActionUseCase\n    )\n\n    private fun createTestLoadUserSessionUseCase(\n        userEventDataSource: UserEventDataSource = TestUserEventDataSource()\n    ): LoadUserSessionUseCase {\n        val sessionRepository = DefaultSessionRepository(TestDataRepository)\n        val userEventRepository = DefaultSessionAndUserEventRepository(\n            userEventDataSource,\n            sessionRepository\n        )\n        return LoadUserSessionUseCase(userEventRepository, coroutineRule.testDispatcher)\n    }\n\n    private fun createReservationActionUseCase() = object : ReservationActionUseCase(\n        DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(), DefaultSessionRepository(TestDataRepository)\n        ),\n        alarmUpdater,\n        coroutineRule.testDispatcher\n    ) {}\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/schedule/MarkScheduleUiHintsShownUseCaseTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.shared.domain.prefs.MarkScheduleUiHintsShownUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [MarkScheduleUiHintsShownUseCase].\n */\nclass MarkScheduleUiHintsShownUseCaseTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun dismissed_navigateUiHintsShowAction() = runTest {\n        val prefs = FakePreferenceStorage()\n        val useCase = MarkScheduleUiHintsShownUseCase(prefs, coroutineRule.testDispatcher)\n\n        useCase.invoke(Unit)\n        val hintsShown = prefs.scheduleUiHintsShown\n        assertTrue(hintsShown)\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/schedule/ScheduleViewModelTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@file:Suppress(\"FunctionName\")\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.model.TestDataRepository\nimport com.google.samples.apps.iosched.model.TestDataSource\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataSource\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfoBasic\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthStateUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.RegisteredUserDataSource\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventDataSource\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessage\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventsResult\nimport com.google.samples.apps.iosched.shared.domain.RefreshConferenceDataUseCase\nimport com.google.samples.apps.iosched.shared.domain.auth.ObserveUserAuthStateUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.ScheduleUiHintsShownUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.StopSnackbarActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsParameters\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsResult\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadScheduleUserSessionsUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.ObserveConferenceDataUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.fcm.TopicSubscriber\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.CoroutineScope\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakeAppDatabase\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.signin.FirebaseSignInViewModelDelegate\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.nhaarman.mockito_kotlin.doReturn\nimport com.nhaarman.mockito_kotlin.mock\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.toList\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.test.UnconfinedTestDispatcher\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.hamcrest.core.Is.`is`\nimport org.hamcrest.core.IsEqual\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\nimport org.mockito.Mockito.verify\n\n/**\n * Unit tests for the [ScheduleViewModel].\n */\nclass ScheduleViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private val testDispatcher = coroutineRule.testDispatcher\n\n    private val coroutineScope = coroutineRule.CoroutineScope()\n\n    @Test\n    fun testDataIsLoaded_ObservablesUpdated() = runTest {\n        // Create a delegate so we can load a user\n        val signInDelegate = FakeSignInViewModelDelegate()\n\n        // Create ViewModel with the use cases\n        val viewModel = createScheduleViewModel(signInViewModelDelegate = signInDelegate)\n\n        // Kick off the viewmodel by loading a user.\n        signInDelegate.loadUser(\"test\")\n\n        // Observe viewmodel to load sessions\n        val scheduleUiData = viewModel.scheduleUiData.first()\n\n        // Check that data were loaded correctly\n        assertEquals(\n            TestData.userSessionList,\n            scheduleUiData.list\n        )\n        assertFalse(viewModel.isLoading.first())\n    }\n\n    @Test\n    fun testDataIsLoaded_Fails() = runTest {\n        // Create ViewModel\n        val viewModel = createScheduleViewModel(\n            loadScheduleSessionsUseCase = createExceptionUseCase()\n        )\n        // Trigger data load\n        viewModel.scheduleUiData.first()\n\n        assertNotNull(viewModel.errorMessage.first())\n    }\n\n    /** New reservation / waitlist **/\n\n    @Test\n    fun reservationReceived() = runTest {\n        // Create test use cases with test data\n        val testUserId = \"test\"\n        val source = TestUserEventDataSource()\n        val loadSessionsUseCase = createTestLoadUserSessionsByDayUseCase(source)\n        val signInDelegate = FakeSignInViewModelDelegate()\n        val snackbarMessageManager = createSnackbarMessageManager()\n        val viewModel = createScheduleViewModel(\n            loadScheduleSessionsUseCase = loadSessionsUseCase,\n            signInViewModelDelegate = signInDelegate,\n            snackbarMessageManager = snackbarMessageManager\n        )\n\n        // Kick off the viewmodel by loading a user.\n        signInDelegate.loadUser(testUserId)\n\n        // Observe viewmodel to load sessions\n        viewModel.scheduleUiData.first()\n\n        // A session goes from not-reserved to reserved\n        val oldValue = UserEventsResult(TestData.userEvents)\n        val newValue = oldValue.copy(\n            userEventsMessage = UserEventMessage(\n                UserEventMessageChangeType.CHANGES_IN_RESERVATIONS\n            )\n        )\n        source.newObservableUserEvents.value = newValue\n\n        val message = snackbarMessageManager.currentSnackbar.value\n        assertEquals(\n            message?.messageId,\n            R.string.reservation_new\n        )\n    }\n\n    @Test\n    fun waitlistReceived() = runTest {\n        // Create test use cases with test data\n        val source = TestUserEventDataSource()\n        val loadSessionsUseCase = createTestLoadUserSessionsByDayUseCase(source)\n        val signInDelegate = FakeSignInViewModelDelegate()\n        val snackbarMessageManager = createSnackbarMessageManager()\n        val viewModel = createScheduleViewModel(\n            loadScheduleSessionsUseCase = loadSessionsUseCase,\n            signInViewModelDelegate = signInDelegate,\n            snackbarMessageManager = snackbarMessageManager\n        )\n\n        // Kick off the viewmodel by loading a user.\n        signInDelegate.loadUser(\"test\")\n\n        // Observe viewmodel to load sessions\n        viewModel.scheduleUiData.first()\n\n        // A session goes from not-reserved to reserved\n        val oldValue = UserEventsResult(TestData.userEvents)\n        val newValue = oldValue.copy(\n            userEventsMessage = UserEventMessage(UserEventMessageChangeType.CHANGES_IN_WAITLIST)\n        )\n\n        source.newObservableUserEvents.value = newValue\n\n        val message = snackbarMessageManager.currentSnackbar.value\n        assertEquals(\n            message?.messageId,\n            R.string.waitlist_new\n        )\n    }\n\n    @Test\n    fun noLoggedInUser_showsReservationButton() = runTest {\n        // Given no logged in user\n        val noFirebaseUser = null\n\n        // Create ViewModel\n        val observableFirebaseUserUseCase = FakeObserveUserAuthStateUseCase(\n            user = Result.Success(noFirebaseUser),\n            isRegistered = Result.Success(false),\n            coroutineScope = coroutineRule.CoroutineScope(),\n            coroutineDispatcher = testDispatcher\n        )\n        val signInViewModelComponent = FirebaseSignInViewModelDelegate(\n            observableFirebaseUserUseCase,\n            mock {},\n            testDispatcher,\n            testDispatcher,\n            true,\n            coroutineScope\n        )\n        val viewModel = createScheduleViewModel(signInViewModelDelegate = signInViewModelComponent)\n\n        // Check that reservation buttons are shown\n        assertTrue(viewModel.showReservations.first())\n    }\n\n    @Test\n    fun loggedInUser_registered_showsReservationButton() = runTest {\n        // Given a logged in user\n        val mockUser = mock<AuthenticatedUserInfoBasic> {\n            on { getUid() }.doReturn(\"uuid\")\n            on { isSignedIn() }.doReturn(true)\n        }\n\n        // Who is registered\n        val observableFirebaseUserUseCase = FakeObserveUserAuthStateUseCase(\n            user = Result.Success(mockUser),\n            isRegistered = Result.Success(true),\n            coroutineScope = coroutineRule.CoroutineScope(),\n            coroutineDispatcher = testDispatcher\n        )\n        val signInViewModelComponent = FirebaseSignInViewModelDelegate(\n            observableFirebaseUserUseCase,\n            mock {},\n            testDispatcher,\n            testDispatcher,\n            true,\n            coroutineScope\n        )\n        // Create ViewModel\n        val viewModel = createScheduleViewModel(signInViewModelDelegate = signInViewModelComponent)\n\n        // Trigger data load\n        viewModel.userInfo.first()\n        viewModel.isUserSignedIn.first()\n        viewModel.isUserRegistered.first()\n\n        // Check that reservation buttons are shown\n        assertTrue(viewModel.showReservations.first())\n    }\n\n    @Test\n    fun loggedInUser_notRegistered_hidesReservationButton() = runTest {\n        // Given a logged in user\n        val mockUser = mock<AuthenticatedUserInfoBasic> {\n            on { getUid() }.doReturn(\"uuid\")\n            on { isSignedIn() }.doReturn(true)\n        }\n\n        // Who isn't registered\n        val observableFirebaseUserUseCase = FakeObserveUserAuthStateUseCase(\n            user = Result.Success(mockUser),\n            isRegistered = Result.Success(false),\n            coroutineScope = coroutineRule.CoroutineScope(),\n            coroutineDispatcher = testDispatcher\n        )\n        val signInViewModelComponent = FirebaseSignInViewModelDelegate(\n            observableFirebaseUserUseCase,\n            mock {},\n            testDispatcher,\n            testDispatcher,\n            true,\n            coroutineRule.CoroutineScope()\n        )\n\n        // Create ViewModel\n        val viewModel = createScheduleViewModel(signInViewModelDelegate = signInViewModelComponent)\n\n        // Trigger data load\n        viewModel.userInfo.first()\n        viewModel.isUserSignedIn.first()\n        viewModel.isUserRegistered.first()\n\n        // Check that *no* reservation buttons are shown\n        assertFalse(viewModel.showReservations.first())\n    }\n\n    @Test\n    fun scheduleHints_shownOnLaunch() = runTest {\n        val viewModel = createScheduleViewModel()\n        val firstNavAction = viewModel.navigationActions.firstOrNull()\n        assertEquals(firstNavAction, ScheduleNavigationAction.ShowScheduleUiHints)\n    }\n\n    @Test\n    fun swipeRefresh_refreshesRemoteConfData() = runTest {\n        // Given a view model with a mocked remote data source\n        val remoteDataSource = mock<ConferenceDataSource> {}\n        val viewModel = createScheduleViewModel(\n            refreshConferenceDataUseCase = RefreshConferenceDataUseCase(\n                ConferenceDataRepository(\n                    remoteDataSource = remoteDataSource,\n                    boostrapDataSource = TestDataSource,\n                    appDatabase = FakeAppDatabase()\n                ),\n                testDispatcher\n            )\n        )\n\n        // When swipe refresh is called\n        viewModel.onSwipeRefresh()\n\n        // Then the remote data source attempts to fetch new data\n        verify(remoteDataSource).getRemoteConferenceData()\n\n        // And the swipe refreshing status is set to false\n        assertEquals(false, viewModel.swipeRefreshing.first())\n    }\n\n    @Test\n    fun newDataFromConfRepo_scheduleUpdated() = runTest {\n        val repo = ConferenceDataRepository(\n            remoteDataSource = TestConfDataSourceSession0(),\n            boostrapDataSource = BootstrapDataSourceSession3(),\n            appDatabase = FakeAppDatabase()\n        )\n\n        val loadUserSessionsByDayUseCase = createTestLoadUserSessionsByDayUseCase(\n            conferenceDataRepo = repo\n        )\n        val viewModel = createScheduleViewModel(\n            loadScheduleSessionsUseCase = loadUserSessionsByDayUseCase,\n            observeConferenceDataUseCase = ObserveConferenceDataUseCase(repo, testDispatcher)\n        )\n\n        // Observe viewmodel to load sessions\n        viewModel.scheduleUiData.first()\n\n        // Trigger a refresh on the repo\n        repo.refreshCacheWithRemoteConferenceData()\n\n        // The new value should be present\n        val newValue = viewModel.scheduleUiData.first()\n\n        assertThat(\n            newValue.list?.first()?.session,\n            `is`(IsEqual.equalTo(TestData.session0))\n        )\n    }\n\n    @Test\n    fun scrollToEvent_beforeconference() {\n        scrollToEvent_beforeConference(dayIndex = 0, targetPosition = 0)\n    }\n\n    @Test\n    fun scrollToEvent_beforeConference_clickOnSecondDay() {\n        scrollToEvent_beforeConference(dayIndex = 1, targetPosition = 2)\n    }\n\n    private fun scrollToEvent_beforeConference(dayIndex: Int, targetPosition: Int) =\n        runTest {\n            val viewModel = createScheduleViewModel()\n\n            // Start observing\n            viewModel.scheduleUiData.first()\n\n            // Trigger to generate indexer\n            viewModel.scrollToStartOfDay(TestData.TestConferenceDays[0])\n\n            val result = mutableListOf<ScheduleScrollEvent>()\n            val job = launch(UnconfinedTestDispatcher()) {\n                viewModel.scrollToEvent.toList(result)\n            }\n\n            // Trigger to generate a result in scrollToEvent\n            viewModel.scrollToStartOfDay(TestData.TestConferenceDays[dayIndex])\n\n            assertTrue(result.size == 1)\n            assertEquals(\n                result[0],\n                ScheduleScrollEvent(targetPosition = targetPosition, smoothScroll = false)\n            )\n\n            job.cancel()\n        }\n\n    @Test\n    fun scrollToEvent_beforeConference_userHasInteracted() = runTest {\n        val viewModel = createScheduleViewModel()\n\n        viewModel.userHasInteracted = true\n\n        // Start observing\n        viewModel.scheduleUiData.first()\n\n        // Trigger to generate indexer\n        viewModel.scrollToStartOfDay(TestData.TestConferenceDays[0])\n\n        val result = mutableListOf<ScheduleScrollEvent>()\n        val job = launch(UnconfinedTestDispatcher()) {\n            viewModel.scrollToEvent.toList(result)\n        }\n\n        // Trigger to generate a result in scrollToEvent\n        viewModel.scrollToStartOfDay(TestData.TestConferenceDays[1])\n        assertEquals(1, result.size)\n        assertEquals(result[0], ScheduleScrollEvent(targetPosition = 2, smoothScroll = false))\n\n        job.cancel()\n    }\n\n    private fun createScheduleViewModel(\n        loadScheduleSessionsUseCase: LoadScheduleUserSessionsUseCase =\n            createTestLoadUserSessionsByDayUseCase(),\n        signInViewModelDelegate: SignInViewModelDelegate = FakeSignInViewModelDelegate(),\n        snackbarMessageManager: SnackbarMessageManager = createSnackbarMessageManager(),\n        scheduleUiHintsShownUseCase: ScheduleUiHintsShownUseCase =\n            FakeScheduleUiHintsShownUseCase(testDispatcher),\n        getTimeZoneUseCase: GetTimeZoneUseCase = createGetTimeZoneUseCase(),\n        topicSubscriber: TopicSubscriber = mock {},\n        refreshConferenceDataUseCase: RefreshConferenceDataUseCase =\n            RefreshConferenceDataUseCase(TestDataRepository, testDispatcher),\n        observeConferenceDataUseCase: ObserveConferenceDataUseCase =\n            ObserveConferenceDataUseCase(TestDataRepository, testDispatcher)\n    ): ScheduleViewModel {\n        return ScheduleViewModel(\n            loadScheduleUserSessionsUseCase = loadScheduleSessionsUseCase,\n            signInViewModelDelegate = signInViewModelDelegate,\n            scheduleUiHintsShownUseCase = scheduleUiHintsShownUseCase,\n            topicSubscriber = topicSubscriber,\n            snackbarMessageManager = snackbarMessageManager,\n            getTimeZoneUseCase = getTimeZoneUseCase,\n            refreshConferenceDataUseCase = refreshConferenceDataUseCase,\n            observeConferenceDataUseCase = observeConferenceDataUseCase\n        )\n    }\n\n    /**\n     * Creates a test [LoadScheduleUserSessionsUseCase].\n     */\n    private fun createTestLoadUserSessionsByDayUseCase(\n        userEventDataSource: UserEventDataSource = TestUserEventDataSource(),\n        conferenceDataRepo: ConferenceDataRepository = TestDataRepository\n    ): LoadScheduleUserSessionsUseCase {\n        val sessionRepository = DefaultSessionRepository(conferenceDataRepo)\n        val userEventRepository = DefaultSessionAndUserEventRepository(\n            userEventDataSource, sessionRepository\n        )\n\n        return LoadScheduleUserSessionsUseCase(userEventRepository, testDispatcher)\n    }\n\n    /**\n     * Creates a use case that throws an exception.\n     */\n    private fun createExceptionUseCase(): LoadScheduleUserSessionsUseCase {\n        return object : LoadScheduleUserSessionsUseCase(mock {}, testDispatcher) {\n            override fun execute(parameters: LoadScheduleUserSessionsParameters):\n                Flow<Result<LoadScheduleUserSessionsResult>> = flow {\n                    throw Exception(\"Loading failed\")\n                }\n        }\n    }\n\n    private fun createGetTimeZoneUseCase() =\n        GetTimeZoneUseCase(FakePreferenceStorage(), testDispatcher)\n\n    private fun createSnackbarMessageManager(\n        preferenceStorage: PreferenceStorage = FakePreferenceStorage()\n    ): SnackbarMessageManager {\n        return SnackbarMessageManager(\n            preferenceStorage,\n            coroutineRule.CoroutineScope(),\n            StopSnackbarActionUseCase(preferenceStorage, testDispatcher)\n        )\n    }\n}\n\nclass TestRegisteredUserDataSource(private val isRegistered: Result<Boolean?>) :\n    RegisteredUserDataSource {\n    override fun observeUserChanges(userId: String): Flow<Result<Boolean?>> = flow {\n        emit(isRegistered)\n    }\n}\n\nclass TestAuthStateUserDataSource(\n    private val user: Result<AuthenticatedUserInfoBasic?>\n) : AuthStateUserDataSource {\n    override fun getBasicUserInfo(): Flow<Result<AuthenticatedUserInfoBasic?>> = flow {\n        emit(user)\n    }\n}\n\nclass FakeObserveUserAuthStateUseCase(\n    user: Result<AuthenticatedUserInfoBasic?>,\n    isRegistered: Result<Boolean?>,\n    coroutineScope: CoroutineScope,\n    coroutineDispatcher: CoroutineDispatcher\n) : ObserveUserAuthStateUseCase(\n    TestRegisteredUserDataSource(isRegistered),\n    TestAuthStateUserDataSource(user),\n    mock {},\n    coroutineScope,\n    coroutineDispatcher\n)\n\nclass FakeScheduleUiHintsShownUseCase(\n    dispatcher: CoroutineDispatcher\n) : ScheduleUiHintsShownUseCase(\n    preferenceStorage = FakePreferenceStorage(),\n    dispatcher = dispatcher,\n)\n\nclass TestConfDataSourceSession0 : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        return conferenceData\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return conferenceData\n    }\n\n    private val conferenceData = ConferenceData(\n        sessions = listOf(TestData.session0),\n        speakers = listOf(TestData.speaker1),\n        rooms = emptyList(),\n        codelabs = emptyList(),\n        tags = listOf(TestData.androidTag, TestData.webTag),\n        version = 42\n    )\n}\n\nclass BootstrapDataSourceSession3 : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        throw NotImplementedError() // Not used\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return ConferenceData(\n            sessions = listOf(TestData.session3),\n            speakers = listOf(TestData.speaker1),\n            rooms = emptyList(),\n            codelabs = emptyList(),\n            tags = listOf(TestData.androidTag, TestData.webTag),\n            version = 42\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/schedule/SessionHeaderIndexerTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport com.google.samples.apps.iosched.test.data.TestData\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\n\nclass SessionHeaderIndexerTest {\n    companion object {\n        val timeZone = \"America/Los_Angeles\"\n        val startTimeString = \"2018-05-08T07:00:00-07:00[$timeZone]\"\n    }\n\n    @Test\n    fun indexSessions_groupsCorrectly() {\n        // Given a list of test sessions with a range of start times (on the hour)\n        val session = TestData.session1\n        val start = ZonedDateTime.parse(startTimeString)\n\n        val sessions = listOf(\n            session.copy(startTime = start),\n            session.copy(startTime = start),\n            session.copy(startTime = start.plusHours(1)),\n            session.copy(startTime = start.plusHours(1)),\n            session.copy(startTime = start.plusHours(2)),\n            session.copy(startTime = start.plusHours(2))\n        )\n\n        // Process this list to group by start time, keyed on index\n        val grouped = indexSessionHeaders(sessions, ZoneId.of(timeZone)).toMap()\n\n        // Then verify that the correct groupings are made and indexes used\n        assertEquals(3, grouped.size)\n        assertEquals(setOf(0, 2, 4), grouped.keys)\n        assertEquals(start, grouped[0])\n        assertEquals(start.plusHours(1), grouped[2])\n        assertEquals(start.plusHours(2), grouped[4])\n    }\n\n    @Test\n    fun indexSessions_doesNotRoundTimeDown() {\n        // Given a list of test sessions with start times not on the hour\n        val session = TestData.session1\n        val start = ZonedDateTime.parse(startTimeString)\n        val sessions = listOf(\n            session.copy(startTime = start.minusMinutes(30)),\n            session.copy(startTime = start.minusMinutes(30)),\n            session.copy(startTime = start.minusMinutes(15)),\n            session.copy(startTime = start),\n            session.copy(startTime = start.plusMinutes(15)),\n            session.copy(startTime = start.plusMinutes(30)),\n            session.copy(startTime = start.plusMinutes(30))\n        )\n\n        // Process this list to group by start time, keyed on index\n        val grouped = indexSessionHeaders(sessions, ZoneId.of(timeZone)).toMap()\n\n        // Then verify that the correct groupings are made and no rounding occurs\n        assertEquals(5, grouped.size)\n        assertEquals(setOf(0, 2, 3, 4, 5), grouped.keys)\n    }\n\n    @Test\n    fun indexSessions_acrossDays() {\n        // Given a list of test sessions which cross into a new day\n        val session = TestData.session1\n        val start = ZonedDateTime.parse(startTimeString)\n        val sessions = listOf(\n            session.copy(startTime = start), // 10PM\n            session.copy(startTime = start.plusHours(1)), // 11PM\n            session.copy(startTime = start.plusHours(2)), // Midnight\n            session.copy(startTime = start.plusHours(3)), // 1AM\n            session.copy(startTime = start.plusHours(4)) // 2AM\n        )\n\n        // Process this list to group by start time, keyed on index\n        val grouped = indexSessionHeaders(sessions, ZoneId.of(timeZone)).toMap()\n\n        // Then verify that the correct groupings are made and in the correct order\n        assertEquals(5, grouped.size)\n        assertEquals(setOf(0, 1, 2, 3, 4), grouped.keys)\n        assertEquals(start, grouped[0])\n        assertEquals(start.plusHours(1), grouped[1])\n        assertEquals(start.plusHours(2), grouped[2])\n        assertEquals(start.plusHours(3), grouped[3])\n        assertEquals(start.plusHours(4), grouped[4])\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/schedule/TestUserEventDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.schedule\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventDataSource\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventResult\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventsResult\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.CancelAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus.STARRED\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus.UNSTARRED\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestAction\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.flow\n\nclass TestUserEventDataSource : UserEventDataSource {\n\n    val newObservableUserEvents = MutableStateFlow(UserEventsResult(TestData.userEvents))\n\n    override fun getObservableUserEvents(userId: String) = newObservableUserEvents\n\n    override fun getObservableUserEvent(userId: String, eventId: SessionId) = flow {\n        emit(UserEventResult(TestData.userEvents.find { it.id == eventId }))\n    }\n\n    override suspend fun starEvent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<StarUpdatedStatus> = Result.Success(if (userEvent.isStarred) STARRED else UNSTARRED)\n\n    override suspend fun recordFeedbackSent(userId: String, userEvent: UserEvent): Result<Unit> {\n        return Result.Success(Unit)\n    }\n\n    override suspend fun requestReservation(\n        userId: String,\n        session: Session,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction> =\n        Result.Success(\n            if (action is RequestAction) RequestAction() else CancelAction()\n        )\n\n    override fun getUserEvents(userId: String): List<UserEvent> = TestData.userEvents\n\n    override suspend fun swapReservation(\n        userId: String,\n        fromSession: Session,\n        toSession: Session\n    ): Result<SwapRequestAction> = Result.Success(SwapRequestAction())\n\n    override fun clearSingleEventSubscriptions() {}\n\n    override fun getUserEvent(userId: String, eventId: SessionId): UserEvent? {\n        throw NotImplementedError()\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/sessioncommon/OnSessionStarClickDelegateTest.kt",
    "content": "/*\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessioncommon\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.domain.prefs.StopSnackbarActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.StarEventAndNotifyUseCase\nimport com.google.samples.apps.iosched.test.data.CoroutineScope\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakeAnalyticsHelper\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport com.google.samples.apps.iosched.test.util.fakes.FakeStarEventUseCase\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Rule\nimport org.junit.Test\n\nclass OnSessionStarClickDelegateTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private val testDispatcher = coroutineRule.testDispatcher\n\n    private fun createOnSessionStarClickDelegate(\n        signInViewModelDelegate: SignInViewModelDelegate = FakeSignInViewModelDelegate(),\n        starEventUseCase: StarEventAndNotifyUseCase = FakeStarEventUseCase(testDispatcher),\n        snackbarMessageManager: SnackbarMessageManager = createSnackbarMessageManager(),\n        analyticsHelper: AnalyticsHelper = FakeAnalyticsHelper()\n    ): OnSessionStarClickDelegate {\n        return DefaultOnSessionStarClickDelegate(\n            signInViewModelDelegate,\n            starEventUseCase,\n            snackbarMessageManager,\n            analyticsHelper,\n            coroutineRule.CoroutineScope(),\n            coroutineRule.testDispatcher\n        )\n    }\n\n    private fun createSnackbarMessageManager(\n        preferenceStorage: PreferenceStorage = FakePreferenceStorage()\n    ): SnackbarMessageManager {\n        return SnackbarMessageManager(\n            preferenceStorage,\n            coroutineRule.CoroutineScope(),\n            StopSnackbarActionUseCase(preferenceStorage, testDispatcher)\n        )\n    }\n\n    @Test\n    fun testStarEvent() {\n        val snackbarMessageManager = createSnackbarMessageManager()\n        val delegate = createOnSessionStarClickDelegate(\n            snackbarMessageManager = snackbarMessageManager\n        )\n\n        delegate.onStarClicked(TestData.userSession0)\n\n        val message = snackbarMessageManager.currentSnackbar.value\n        assertEquals(R.string.event_starred, message?.messageId)\n        assertEquals(R.string.dont_show, message?.actionId)\n    }\n\n    @Test\n    fun testUnstarEvent() {\n        val snackbarMessageManager = createSnackbarMessageManager()\n        val delegate = createOnSessionStarClickDelegate(\n            snackbarMessageManager = snackbarMessageManager\n        )\n\n        delegate.onStarClicked(TestData.userSession1)\n\n        val message = snackbarMessageManager.currentSnackbar.value\n        assertEquals(R.string.event_unstarred, message?.messageId)\n        assertEquals(R.string.dont_show, message?.actionId)\n    }\n\n    @Test\n    fun testStar_notLoggedInUser() = runTest {\n        // Create test use cases with test data\n        val signInDelegate = FakeSignInViewModelDelegate()\n        signInDelegate.injectIsSignedIn = false\n\n        val snackbarMessageManager = createSnackbarMessageManager()\n\n        val delegate = createOnSessionStarClickDelegate(\n            signInViewModelDelegate = signInDelegate,\n            snackbarMessageManager = snackbarMessageManager\n        )\n\n        delegate.onStarClicked(TestData.userSession1)\n\n        val message = snackbarMessageManager.currentSnackbar.value\n        Assert.assertNull(message)\n\n        // Verify that the sign in dialog was triggered\n        val signInEvent = delegate.navigateToSignInDialogEvents.first()\n        assertNotNull(signInEvent)\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailViewModelTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@file:Suppress(\"FunctionName\")\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.lifecycle.SavedStateHandle\nimport com.google.samples.apps.iosched.R\nimport com.google.samples.apps.iosched.androidtest.util.LiveDataTestUtil\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventDataSource\nimport com.google.samples.apps.iosched.shared.domain.prefs.StopSnackbarActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionsUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.StarReserveNotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.StarEventAndNotifyUseCase\nimport com.google.samples.apps.iosched.shared.notifications.SessionAlarmManager\nimport com.google.samples.apps.iosched.shared.time.DefaultTimeProvider\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport com.google.samples.apps.iosched.shared.util.NetworkUtils\nimport com.google.samples.apps.iosched.shared.util.TimeUtils.ConferenceDays\nimport com.google.samples.apps.iosched.test.data.CoroutineScope\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.data.TestData.sessionWithYoutubeUrl\nimport com.google.samples.apps.iosched.test.util.fakes.FakeAnalyticsHelper\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport com.google.samples.apps.iosched.test.util.fakes.FakeStarEventUseCase\nimport com.google.samples.apps.iosched.test.util.time.FixedTimeExecutorRule\nimport com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager\nimport com.google.samples.apps.iosched.ui.reservation.RemoveReservationDialogParameters\nimport com.google.samples.apps.iosched.ui.schedule.TestUserEventDataSource\nimport com.google.samples.apps.iosched.ui.sessioncommon.DefaultOnSessionStarClickDelegate\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToSignInDialogAction\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.NavigateToYoutube\nimport com.google.samples.apps.iosched.ui.sessiondetail.SessionDetailNavigationAction.RemoveReservationDialogAction\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.nhaarman.mockito_kotlin.any\nimport com.nhaarman.mockito_kotlin.doNothing\nimport com.nhaarman.mockito_kotlin.doReturn\nimport com.nhaarman.mockito_kotlin.eq\nimport com.nhaarman.mockito_kotlin.mock\nimport com.nhaarman.mockito_kotlin.validateMockitoUsage\nimport com.nhaarman.mockito_kotlin.verify\nimport com.nhaarman.mockito_kotlin.whenever\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.advanceTimeBy\nimport kotlinx.coroutines.test.runTest\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.threeten.bp.Duration\n\nprivate const val TEN_SECONDS = 10_000L\n\n/**\n * Unit tests for the [SessionDetailViewModel].\n */\nclass SessionDetailViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Allows explicit setting of \"now\"\n    @get:Rule var fixedTimeExecutorRule = FixedTimeExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private lateinit var viewModel: SessionDetailViewModel\n    private val testSession = TestData.session0\n\n    private lateinit var mockNetworkUtils: NetworkUtils\n\n    @Before\n    fun setup() {\n        mockNetworkUtils = mock {\n            on { hasNetworkConnection() }.doReturn(true)\n        }\n\n        viewModel = createSessionDetailViewModel()\n    }\n\n    @After\n    fun tearDown() {\n        validateMockitoUsage()\n    }\n\n    @Test\n    fun testAnonymous_dataReady() = runTest {\n        // Session should be loaded without a user\n        assertNotNull(viewModel.session.first { it != null })\n    }\n\n    @Test\n    fun testDataIsLoaded_authReady() = runTest {\n        val vm = createSessionDetailViewModelWithAuthEnabled()\n\n        assertEquals(testSession, vm.session.first())\n    }\n\n    @Test\n    fun testOnPlayVideo_createsEventForVideo() = runTest {\n        val vm = createSessionDetailViewModelWithAuthEnabled(sessionId = sessionWithYoutubeUrl.id)\n\n        // Observe to load a session\n        vm.session.first()\n\n        // User opens video\n        vm.onPlayVideo()\n\n        assertEquals(\n            TestData.sessionWithYoutubeUrl.youTubeUrl,\n            (vm.navigationActions.first() as NavigateToYoutube).videoId\n        )\n    }\n\n    @Test\n    fun testReserveEvent() = runTest {\n        val mockRepository = mock<SessionAndUserEventRepository>()\n        val mockAlarmUpdater = mock<StarReserveNotificationAlarmUpdater>()\n        val reservationActionUseCase = ReservationActionUseCase(\n            mockRepository, mockAlarmUpdater, coroutineRule.testDispatcher\n        )\n        val signInDelegate = FakeSignInViewModelDelegate()\n        // The session isn't reservable from one hour before the session.\n        // So making now as two hours before\n        val now = TestData.session0.startTime.minusHours(2).toInstant()\n        val mockTime = mock<TimeProvider> {\n            on { now() }.doReturn(now)\n        }\n        val viewModel = createSessionDetailViewModel(\n            sessionId = TestData.session3.id,\n            reservationActionUseCase = reservationActionUseCase,\n            signInViewModelPlugin = signInDelegate,\n            timeProvider = mockTime\n        )\n        val testUid = \"testUid\"\n        // Kick off the viewmodel by loading a user.\n        signInDelegate.loadUser(testUid)\n\n        // Trigger data load\n        viewModel.userEvent.first()\n        viewModel.session.first()\n\n        viewModel.onReservationClicked()\n\n        verify(mockRepository).changeReservation(\n            eq(testUid), eq(TestData.session3.id), any<RequestAction>()\n        )\n    }\n\n    @Test\n    fun testReserveEvent_notLoggedIn() = runTest {\n        // Create test use cases with test data\n        val signInDelegate = FakeSignInViewModelDelegate()\n        signInDelegate.injectIsSignedIn = false\n\n        val viewModel = createSessionDetailViewModel(signInViewModelPlugin = signInDelegate)\n\n        viewModel.onReservationClicked()\n\n        // TODO: Fix \"This job has not completed yet\"\n        // assertNull(viewModel.snackBarMessage.firstOrNull())\n\n        // Then the sign in dialog should be shown\n        assertTrue(viewModel.navigationActions.first() is NavigateToSignInDialogAction)\n    }\n\n    @Test\n    fun testReserveEvent_noInternet() = runTest {\n        // Create test use cases with test data\n        val signInDelegate = FakeSignInViewModelDelegate()\n        signInDelegate.injectIsSignedIn = false\n\n        val networkUtils: NetworkUtils = mock {\n            on { hasNetworkConnection() }.doReturn(false)\n        }\n\n        val snackbarMessageManager = createSnackbarMessageManager()\n        val viewModel = createSessionDetailViewModel(\n            networkUtils = networkUtils,\n            snackbarMessageManager = snackbarMessageManager\n        )\n\n        viewModel.onReservationClicked()\n\n        val message = snackbarMessageManager.currentSnackbar.value\n        assertEquals(message?.messageId, R.string.no_network_connection)\n    }\n\n    @Test\n    fun testCancelEvent() = runTest {\n        val signInDelegate = FakeSignInViewModelDelegate()\n        // The session isn't reservable from one hour before the session.\n        // So making now as two hours before\n        val now = TestData.session0.startTime.minusHours(2).toInstant()\n        val mockTime = mock<TimeProvider> {\n            on { now() }.doReturn(now)\n        }\n        val viewModel = createSessionDetailViewModel(\n            sessionId = TestData.session1.id,\n            signInViewModelPlugin = signInDelegate,\n            timeProvider = mockTime\n        )\n        val testUid = \"testUid\"\n        // Kick off the viewmodel by loading a user.\n        signInDelegate.loadUser(testUid)\n\n        // Trigger data load\n        viewModel.userEvent.first()\n        viewModel.session.first()\n\n        viewModel.onReservationClicked()\n\n        val navigationAction = viewModel.navigationActions.first()\n        assertEquals(\n            RemoveReservationDialogParameters(\n                testUid,\n                TestData.session1.id,\n                TestData.session1.title\n            ),\n            (navigationAction as RemoveReservationDialogAction).params\n        )\n    }\n\n    @Test\n    fun testStartsInTenMinutes_thenHasNullTimeUntilStart() = runTest {\n        val vm = createSessionDetailViewModelWithAuthEnabled()\n        fixedTimeExecutorRule.time = testSession.startTime.minusMinutes(10).toInstant()\n        advanceTimeBy(TEN_SECONDS)\n        assertNull(LiveDataTestUtil.getValue(vm.timeUntilStart))\n    }\n\n    @Test\n    fun testStartsIn5Minutes_thenHasDurationTimeUntilStart() = runTest {\n        val viewmodel = createSessionDetailViewModelWithAuthEnabled()\n        fixedTimeExecutorRule.time = testSession.startTime.minusMinutes(5).toInstant()\n        assertEquals(Duration.ofMinutes(5), LiveDataTestUtil.getValue(viewmodel.timeUntilStart))\n    }\n\n    /** Enable when timeUntilStart is a StateFlow again https://issuetracker.google.com/184935697\n     @InternalCoroutinesApi\n     @Test\n     fun testStartsIn5Minutes_timeUntilStartUpdatesAfter10s() {\n     // Set the initial time to T-5m\n     fixedTimeExecutorRule.time = testSession.startTime.minusMinutes(5).toInstant()\n\n     val updates = mutableListOf<Duration?>()\n\n     coroutineRule.testDispatcher.runBlockingTest {\n     val viewmodel = createSessionDetailViewModelWithAuthEnabled()\n\n     // Start collecting updates\n     val job = launch {\n     viewmodel.timeUntilStart.toList(updates)\n     }\n     // Set the time to T-4\n     fixedTimeExecutorRule.time = testSession.startTime.minusMinutes(4).toInstant()\n\n     // Advance the time so the loop generates a new update\n     advanceTimeBy(TEN_SECONDS)\n\n     // Set the time to T+1\n     fixedTimeExecutorRule.time = testSession.startTime.plusMinutes(1).toInstant()\n\n     // Advance the time so the loop generates a new update\n     advanceTimeBy(TEN_SECONDS)\n\n     // Stop collecting\n     job.cancel()\n     }\n     assertEquals(Duration.ofMinutes(5), updates[0])\n     assertEquals(Duration.ofMinutes(4), updates[1])\n     assertEquals(null, updates[2])\n     }\n     */\n\n    /** TODO: Use .first() instead of LiveDataTestUtil when isReservationDeniedByCutoff is a\n     * StateFlow https://issuetracker.google.com/184935697 */\n    @Test\n    fun testSessionStartsIn61Minutes_thenReservationIsEnabled() =\n        runTest {\n            fixedTimeExecutorRule.time = testSession.startTime.minusMinutes(61).toInstant()\n            val reservationDisabled =\n                LiveDataTestUtil.getValue(viewModel.isReservationDeniedByCutoff)\n            assertEquals(false, reservationDisabled)\n        }\n\n    @Test\n    fun testSessionStartsIn60Minutes_thenReservationIsDisabled() =\n        runTest {\n            fixedTimeExecutorRule.time = testSession.startTime.minusMinutes(59).toInstant()\n            val reservationDisabled =\n                LiveDataTestUtil.getValue(viewModel.isReservationDeniedByCutoff)\n            assertTrue(reservationDisabled == true)\n        }\n\n    @Test\n    fun testSessionStartsNow_thenReservationIsDisabled() =\n        runTest {\n            fixedTimeExecutorRule.time = testSession.startTime.toInstant()\n            val reservationDisabled =\n                LiveDataTestUtil.getValue(viewModel.isReservationDeniedByCutoff)\n            assertTrue(reservationDisabled == true)\n        }\n\n    @Test\n    fun testSessionStarted1MinuteAgo_thenReservationIsDisabled() =\n        runTest {\n            fixedTimeExecutorRule.time = testSession.startTime.plusMinutes(1).toInstant()\n            val reservationDisabled =\n                LiveDataTestUtil.getValue(viewModel.isReservationDeniedByCutoff)\n            assertTrue(reservationDisabled == true)\n        }\n\n    // TODO: Add a test for onReservationClicked\n\n    private fun createSessionDetailViewModelWithAuthEnabled(\n        sessionId: String? = testSession.id\n    ): SessionDetailViewModel {\n        // If session ID and user are available, session data can be loaded\n        val signInViewModelPlugin = FakeSignInViewModelDelegate()\n        signInViewModelPlugin.loadUser(\"123\")\n        return createSessionDetailViewModel(\n            sessionId = sessionId,\n            signInViewModelPlugin = signInViewModelPlugin\n        )\n    }\n\n    private fun createSessionDetailViewModel(\n        sessionId: String? = testSession.id,\n        signInViewModelPlugin: SignInViewModelDelegate = FakeSignInViewModelDelegate(),\n        loadUserSessionUseCase: LoadUserSessionUseCase = createTestLoadUserSessionUseCase(),\n        loadRelatedSessionsUseCase: LoadUserSessionsUseCase =\n            createTestLoadUserSessionsUseCase(),\n        reservationActionUseCase: ReservationActionUseCase = createReservationActionUseCase(),\n        starEventUseCase: StarEventAndNotifyUseCase =\n            FakeStarEventUseCase(coroutineRule.testDispatcher),\n        getTimeZoneUseCase: GetTimeZoneUseCase = createGetTimeZoneUseCase(),\n        networkUtils: NetworkUtils = mockNetworkUtils,\n        timeProvider: TimeProvider = DefaultTimeProvider,\n        analyticsHelper: AnalyticsHelper = FakeAnalyticsHelper(),\n        snackbarMessageManager: SnackbarMessageManager = createSnackbarMessageManager(),\n        isReservationEnabledByRemoteConfig: Boolean = true,\n        onSessionStarClickDelegate: OnSessionStarClickDelegate = createOnSessionStarClickDelegate()\n    ): SessionDetailViewModel {\n        return SessionDetailViewModel(\n            savedStateHandle = SavedStateHandle(mapOf(\"session_id\" to sessionId)),\n            signInViewModelDelegate = signInViewModelPlugin,\n            loadUserSessionUseCase = loadUserSessionUseCase,\n            loadRelatedSessionUseCase = loadRelatedSessionsUseCase,\n            reservationActionUseCase = reservationActionUseCase,\n            getTimeZoneUseCase = getTimeZoneUseCase,\n            timeProvider = timeProvider,\n            networkUtils = networkUtils,\n            analyticsHelper = analyticsHelper,\n            snackbarMessageManager = snackbarMessageManager,\n            onSessionStarClickDelegate = onSessionStarClickDelegate,\n            isReservationEnabledByRemoteConfig = isReservationEnabledByRemoteConfig\n        )\n    }\n\n    private fun createSessionWithUrl(youtubeUrl: String) =\n        Session(\n            id = \"0\", title = \"Session 0\", description = \"\",\n            startTime = ConferenceDays.first().start,\n            endTime = ConferenceDays.first().end, room = TestData.room, isLivestream = false,\n            sessionUrl = \"\", youTubeUrl = youtubeUrl, photoUrl = \"\", doryLink = \"\",\n            tags = listOf(TestData.androidTag, TestData.webTag),\n            displayTags = listOf(TestData.androidTag, TestData.webTag),\n            speakers = setOf(TestData.speaker1), relatedSessions = emptySet()\n        )\n\n    private fun createTestLoadUserSessionUseCase(\n        userEventDataSource: UserEventDataSource = TestUserEventDataSource()\n    ): LoadUserSessionUseCase {\n        val sessionRepository = DefaultSessionRepository(TestDataRepository)\n        val userEventRepository = DefaultSessionAndUserEventRepository(\n            userEventDataSource,\n            sessionRepository\n        )\n        return LoadUserSessionUseCase(userEventRepository, coroutineRule.testDispatcher)\n    }\n\n    private fun createTestLoadUserSessionsUseCase(\n        userEventDataSource: UserEventDataSource = TestUserEventDataSource()\n    ): LoadUserSessionsUseCase {\n        val sessionRepository = DefaultSessionRepository(TestDataRepository)\n        val userEventRepository = DefaultSessionAndUserEventRepository(\n            userEventDataSource,\n            sessionRepository\n        )\n        return LoadUserSessionsUseCase(userEventRepository, coroutineRule.testDispatcher)\n    }\n\n    private fun createFakeUpdater(): StarReserveNotificationAlarmUpdater {\n        val alarmManager: SessionAlarmManager = mock()\n        doNothing().whenever(alarmManager).cancelAlarmForSession(any())\n        return StarReserveNotificationAlarmUpdater(alarmManager)\n    }\n\n    private fun createReservationActionUseCase() = object : ReservationActionUseCase(\n        DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(), DefaultSessionRepository(TestDataRepository)\n        ),\n        createFakeUpdater(),\n        coroutineRule.testDispatcher\n    ) {}\n\n    private fun createGetTimeZoneUseCase() =\n        GetTimeZoneUseCase(FakePreferenceStorage(), coroutineRule.testDispatcher)\n\n    private fun createSnackbarMessageManager(\n        preferenceStorage: PreferenceStorage = FakePreferenceStorage()\n    ): SnackbarMessageManager {\n        return SnackbarMessageManager(\n            preferenceStorage,\n            coroutineRule.CoroutineScope(),\n            StopSnackbarActionUseCase(preferenceStorage, coroutineRule.testDispatcher)\n        )\n    }\n\n    private fun createOnSessionStarClickDelegate(\n        signInViewModelDelegate: SignInViewModelDelegate = FakeSignInViewModelDelegate(),\n        starEventUseCase: StarEventAndNotifyUseCase = createStarEventUseCase(),\n        snackbarMessageManager: SnackbarMessageManager = createSnackbarMessageManager(),\n        analyticsHelper: AnalyticsHelper = FakeAnalyticsHelper()\n    ): OnSessionStarClickDelegate {\n        return DefaultOnSessionStarClickDelegate(\n            signInViewModelDelegate,\n            starEventUseCase,\n            snackbarMessageManager,\n            analyticsHelper,\n            coroutineRule.CoroutineScope(),\n            coroutineRule.testDispatcher\n        )\n    }\n\n    private fun createStarEventUseCase() = FakeStarEventUseCase(coroutineRule.testDispatcher)\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionFeedbackViewModelTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.sessiondetail\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.data.feedback.FeedbackEndpoint\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventDataSource\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCase\nimport com.google.samples.apps.iosched.shared.domain.users.FeedbackUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.util.NetworkUtils\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport com.google.samples.apps.iosched.test.util.time.FixedTimeExecutorRule\nimport com.google.samples.apps.iosched.ui.schedule.TestUserEventDataSource\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport com.nhaarman.mockito_kotlin.doReturn\nimport com.nhaarman.mockito_kotlin.mock\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for the [SessionFeedbackViewModel].\n */\nclass SessionFeedbackViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Allows explicit setting of \"now\"\n    @get:Rule\n    var fixedTimeExecutorRule = FixedTimeExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private lateinit var viewModel: SessionFeedbackViewModel\n    private val testSession = TestData.session0\n\n    private lateinit var mockNetworkUtils: NetworkUtils\n\n    @Before\n    fun setup() {\n        mockNetworkUtils = mock {\n            on { hasNetworkConnection() }.doReturn(true)\n        }\n\n        viewModel = createSessionFeedbackViewModel()\n        viewModel.setSessionId(testSession.id)\n    }\n\n    @Test\n    fun title() = runTest {\n        assertEquals(\n            testSession.title,\n            viewModel.userSession.first().data?.session?.title\n        )\n    }\n\n    @Test\n    fun questions() {\n        // TODO: pointless test, left here for when these are dynamic.\n        val questions = viewModel.questions\n        assertEquals(4, questions.size)\n        assertEquals(0, questions[0].currentRating)\n        assertEquals(0, questions[1].currentRating)\n        assertEquals(0, questions[2].currentRating)\n        assertEquals(0, questions[3].currentRating)\n    }\n\n    private fun createSessionFeedbackViewModel(\n        signInViewModelPlugin: SignInViewModelDelegate = FakeSignInViewModelDelegate(),\n        loadUserSessionUseCase: LoadUserSessionUseCase = createTestLoadUserSessionUseCase(),\n        feedbackUseCase: FeedbackUseCase = createTestFeedbackUseCase()\n    ): SessionFeedbackViewModel {\n        return SessionFeedbackViewModel(\n            signInViewModelDelegate = signInViewModelPlugin,\n            loadUserSessionUseCase = loadUserSessionUseCase,\n            feedbackUseCase = feedbackUseCase\n        )\n    }\n\n    private fun createTestLoadUserSessionUseCase(\n        userEventDataSource: UserEventDataSource = TestUserEventDataSource()\n    ): LoadUserSessionUseCase {\n        return LoadUserSessionUseCase(\n            DefaultSessionAndUserEventRepository(\n                userEventDataSource,\n                DefaultSessionRepository(TestDataRepository)\n            ),\n            coroutineRule.testDispatcher\n        )\n    }\n\n    private fun createTestFeedbackUseCase(\n        userEventDataSource: UserEventDataSource = TestUserEventDataSource()\n    ): FeedbackUseCase {\n        return FeedbackUseCase(\n            object : FeedbackEndpoint {\n                override suspend fun sendFeedback(\n                    sessionId: SessionId,\n                    responses: Map<String, Int>\n                ): Result<Unit> {\n                    return Result.Success(Unit)\n                }\n            },\n            DefaultSessionAndUserEventRepository(\n                userEventDataSource,\n                DefaultSessionRepository(TestDataRepository)\n            ),\n            coroutineRule.testDispatcher\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/settings/SettingsViewModelTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.settings\n\nimport com.google.samples.apps.iosched.model.Theme.BATTERY_SAVER\nimport com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefSaveActionUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetAnalyticsSettingUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetAvailableThemesUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetNotificationsSettingUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetThemeUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.SetAnalyticsSettingUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.SetThemeUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.SetTimeZoneUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for the [SettingsViewModel]\n */\nclass SettingsViewModelTest {\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private val testDispatcher = coroutineRule.testDispatcher\n\n    @Test\n    fun initialValues_matchStorage() = runTest {\n        val viewModel = createSettingsViewModel()\n\n        val prefs = FakePreferenceStorage()\n\n        assertEquals(\n            prefs.preferConferenceTimeZone.first(),\n            viewModel.preferConferenceTimeZone.first()\n        )\n        assertEquals(\n            prefs.preferToReceiveNotifications.first(),\n            viewModel.enableNotifications.first()\n        )\n        assertEquals(prefs.sendUsageStatistics.first(), viewModel.sendUsageStatistics.first())\n        assertEquals(BATTERY_SAVER, viewModel.theme.first())\n    }\n\n    @Test\n    fun toggleBooleanSettings() = runTest {\n        val viewModel = createSettingsViewModel()\n\n        val initialTimeZone = viewModel.preferConferenceTimeZone.first()\n        val initialNotifications = viewModel.enableNotifications.first()\n        val initialSendUsageStatistics = viewModel.sendUsageStatistics.first()\n\n        viewModel.toggleTimeZone()\n        viewModel.toggleEnableNotifications()\n        viewModel.toggleSendUsageStatistics()\n\n        assertEquals(!initialTimeZone, viewModel.preferConferenceTimeZone.first())\n        assertEquals(!initialNotifications, viewModel.enableNotifications.first())\n        assertEquals(!initialSendUsageStatistics, viewModel.sendUsageStatistics.first())\n    }\n\n    @Test\n    fun clickOnChooseTheme_navigationActionTriggered() = runTest {\n        val viewModel = createSettingsViewModel()\n        viewModel.onThemeSettingClicked()\n\n        assertTrue(\n            viewModel.navigationActions.first() is SettingsNavigationAction.NavigateToThemeSelector\n        )\n    }\n\n    private fun createSettingsViewModel(): SettingsViewModel {\n        val preferenceStorage = FakePreferenceStorage()\n\n        val getTimeZoneUseCase =\n            GetTimeZoneUseCase(preferenceStorage, testDispatcher)\n        val setTimeZoneUseCase =\n            SetTimeZoneUseCase(preferenceStorage, testDispatcher)\n\n        val notificationsPrefSaveActionUseCase =\n            NotificationsPrefSaveActionUseCase(preferenceStorage, testDispatcher)\n        val getNotificationsSettingUseCase =\n            GetNotificationsSettingUseCase(preferenceStorage, testDispatcher)\n\n        val setAnalyticsSettingUseCase =\n            SetAnalyticsSettingUseCase(preferenceStorage, testDispatcher)\n        val getAnalyticsSettingUseCase =\n            GetAnalyticsSettingUseCase(preferenceStorage, testDispatcher)\n\n        val setThemeUseCase = SetThemeUseCase(preferenceStorage, testDispatcher)\n        val getThemeUseCase = GetThemeUseCase(preferenceStorage, testDispatcher)\n\n        val getAvailableThemesUseCase =\n            GetAvailableThemesUseCase(testDispatcher)\n\n        return SettingsViewModel(\n            getTimeZoneUseCase = getTimeZoneUseCase,\n            setTimeZoneUseCase = setTimeZoneUseCase,\n            notificationsPrefSaveActionUseCase = notificationsPrefSaveActionUseCase,\n            getNotificationsSettingUseCase = getNotificationsSettingUseCase,\n            setAnalyticsSettingUseCase = setAnalyticsSettingUseCase,\n            getAnalyticsSettingUseCase = getAnalyticsSettingUseCase,\n            setThemeUseCase = setThemeUseCase,\n            getThemeUseCase = getThemeUseCase,\n            getAvailableThemesUseCase = getAvailableThemesUseCase\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/signin/FirebaseSignInViewModelDelegateTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport android.net.Uri\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfoBasic\nimport com.google.samples.apps.iosched.shared.domain.auth.ObserveUserAuthStateUseCase\nimport com.google.samples.apps.iosched.shared.domain.prefs.NotificationsPrefIsShownUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.CoroutineScope\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.ui.schedule.FakeObserveUserAuthStateUseCase\nimport com.nhaarman.mockito_kotlin.doReturn\nimport com.nhaarman.mockito_kotlin.mock\nimport junit.framework.TestCase.assertEquals\nimport junit.framework.TestCase.assertFalse\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Tests for [FirebaseSignInViewModelDelegate]\n */\nclass FirebaseSignInViewModelDelegateTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun testSignedOut() = runTest {\n        val subject = createFirebaseSignInViewModelDelegate(\n            observeUserAuthStateUseCase = FakeObserveUserAuthStateUseCase(\n                user = Result.Success(null),\n                isRegistered = Result.Success(false),\n                coroutineScope = coroutineRule.CoroutineScope(),\n                coroutineDispatcher = coroutineRule.testDispatcher\n            )\n        )\n\n        assertEquals(\n            null,\n            subject.userInfo.first()?.getUid()\n        )\n        assertEquals(\n            null,\n            subject.currentUserImageUri.first()\n        )\n        assertFalse(subject.isUserSignedInValue)\n    }\n\n    @Test\n    fun testSignedInRegistered() = runTest {\n\n        val user = mock<AuthenticatedUserInfoBasic> {\n            on { getUid() }.doReturn(\"123\")\n            on { getPhotoUrl() }.doReturn(mock<Uri> {})\n            on { isSignedIn() }.doReturn(true)\n        }\n\n        val fakeObserveUserAuthStateUseCase = FakeObserveUserAuthStateUseCase(\n            user = Result.Success(user),\n            isRegistered = Result.Success(true),\n            coroutineScope = coroutineRule.CoroutineScope(),\n            coroutineDispatcher = coroutineRule.testDispatcher\n        )\n\n        val subject = createFirebaseSignInViewModelDelegate(\n            observeUserAuthStateUseCase = fakeObserveUserAuthStateUseCase\n        )\n\n        assertEquals(\n            user.getUid(),\n            subject.userInfo.first()?.getUid()\n        )\n        assertEquals(\n            user.getPhotoUrl(),\n            subject.currentUserImageUri.first()\n        )\n        assertTrue(subject.isUserSignedIn.first())\n        assertTrue(subject.isUserSignedInValue)\n        assertTrue(subject.isUserRegistered.first())\n        assertTrue(subject.isUserRegisteredValue)\n    }\n\n    @Test\n    fun testSignedInNotRegistered() = runTest {\n\n        val user = mock<AuthenticatedUserInfoBasic> {\n            on { getUid() }.doReturn(\"123\")\n            on { getPhotoUrl() }.doReturn(mock<Uri> {})\n            on { isSignedIn() }.doReturn(true)\n        }\n        val fakeObserveUserAuthStateUseCase = FakeObserveUserAuthStateUseCase(\n            user = Result.Success(user),\n            isRegistered = Result.Success(false),\n            coroutineScope = coroutineRule.CoroutineScope(),\n            coroutineDispatcher = coroutineRule.testDispatcher\n        )\n\n        val subject = createFirebaseSignInViewModelDelegate(\n            observeUserAuthStateUseCase = fakeObserveUserAuthStateUseCase\n        )\n        assertEquals(\n            user.getUid(),\n            subject.userInfo.first()?.getUid()\n        )\n        assertEquals(\n            user.getPhotoUrl(),\n            subject.currentUserImageUri.first()\n        )\n\n        assertTrue(subject.isUserSignedIn.first())\n        assertTrue(subject.isUserSignedInValue)\n        assertFalse(subject.isUserRegistered.first())\n        assertFalse(subject.isUserRegisteredValue)\n    }\n\n    @Test\n    fun testPostSignIn() = runTest {\n        val subject = createFirebaseSignInViewModelDelegate(\n            observeUserAuthStateUseCase = FakeObserveUserAuthStateUseCase(\n                user = Result.Success(null),\n                isRegistered = Result.Success(false),\n                coroutineScope = coroutineRule.CoroutineScope(),\n                coroutineDispatcher = coroutineRule.testDispatcher\n            )\n        )\n\n        subject.emitSignInRequest()\n\n        // Check that the emitted event is a sign in request\n        assertEquals(\n            subject.signInNavigationActions.first(),\n            SignInNavigationAction.RequestSignIn\n        )\n    }\n\n    @Test\n    fun testPostSignOut() = runTest {\n        val subject = createFirebaseSignInViewModelDelegate(\n            observeUserAuthStateUseCase = FakeObserveUserAuthStateUseCase(\n                user = Result.Success(null),\n                isRegistered = Result.Success(false),\n                coroutineScope = coroutineRule.CoroutineScope(),\n                coroutineDispatcher = coroutineRule.testDispatcher\n            )\n        )\n\n        subject.emitSignOutRequest()\n\n        assertEquals(\n            subject.signInNavigationActions.first(),\n            SignInNavigationAction.RequestSignOut\n        )\n    }\n\n    private fun createNotificationsPrefIsShownUseCase(): NotificationsPrefIsShownUseCase {\n        return NotificationsPrefIsShownUseCase(\n            FakePreferenceStorage(),\n            coroutineRule.testDispatcher\n        )\n    }\n\n    private fun createFirebaseSignInViewModelDelegate(\n        observeUserAuthStateUseCase: ObserveUserAuthStateUseCase =\n            FakeObserveUserAuthStateUseCase(\n                user = Result.Success(null),\n                isRegistered = Result.Success(true),\n                coroutineScope = coroutineRule.CoroutineScope(),\n                coroutineDispatcher = coroutineRule.testDispatcher\n            ),\n        notificationsPrefIsShownUseCase: NotificationsPrefIsShownUseCase =\n            createNotificationsPrefIsShownUseCase(),\n        ioDispatcher: CoroutineDispatcher = coroutineRule.testDispatcher,\n        mainDispatcher: CoroutineDispatcher = coroutineRule.testDispatcher,\n        isReservationEnabledByRemoteConfig: Boolean = true\n    ): FirebaseSignInViewModelDelegate {\n        return FirebaseSignInViewModelDelegate(\n            observeUserAuthStateUseCase,\n            notificationsPrefIsShownUseCase,\n            ioDispatcher,\n            mainDispatcher,\n            isReservationEnabledByRemoteConfig,\n            applicationScope = coroutineRule.CoroutineScope()\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/signin/SignInViewModelTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.ui.signin\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport junit.framework.Assert.assertEquals\nimport org.junit.Rule\nimport org.junit.Test\n\nclass SignInViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun signedInUser_signsOut() {\n        // Given a view model with a signed in user\n        val signInViewModelDelegate = FakeSignInViewModelDelegate().apply {\n            injectIsSignedIn = true\n        }\n        val viewModel = SignInViewModel(signInViewModelDelegate)\n\n        // When sign out is requested\n        viewModel.onSignOut()\n\n        // Then a sign out request is emitted\n        assertEquals(1, signInViewModelDelegate.signOutRequestsEmitted)\n    }\n\n    @Test\n    fun noSignedInUser_signsIn() {\n        // Given a view model with a signed out user\n        val signInViewModelDelegate = FakeSignInViewModelDelegate().apply {\n            injectIsSignedIn = false\n        }\n        val viewModel = SignInViewModel(signInViewModelDelegate)\n\n        // When sign out is requested\n        viewModel.onSignIn()\n\n        // Then a sign out request is emitted\n        assertEquals(1, signInViewModelDelegate.signInRequestsEmitted)\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/ui/speaker/SpeakerViewModelTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n@file:Suppress(\"FunctionName\")\n\npackage com.google.samples.apps.iosched.ui.speaker\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.lifecycle.SavedStateHandle\nimport com.google.samples.apps.iosched.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionsUseCase\nimport com.google.samples.apps.iosched.shared.domain.settings.GetTimeZoneUseCase\nimport com.google.samples.apps.iosched.shared.domain.speakers.LoadSpeakerUseCase\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.fakes.FakeOnSessionStarClickDelegate\nimport com.google.samples.apps.iosched.test.util.fakes.FakePreferenceStorage\nimport com.google.samples.apps.iosched.test.util.fakes.FakeSignInViewModelDelegate\nimport com.google.samples.apps.iosched.ui.schedule.TestUserEventDataSource\nimport com.google.samples.apps.iosched.ui.sessioncommon.OnSessionStarClickDelegate\nimport com.google.samples.apps.iosched.ui.signin.SignInViewModelDelegate\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for the [SpeakerViewModel].\n */\n\nclass SpeakerViewModelTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun setSpeakerId_loadsSpeaker() = runTest {\n        // Given a speaker view model\n        val viewModel = createViewModel()\n\n        // Then the speaker is loaded\n        assertEquals(TestData.speaker1, viewModel.speaker.first())\n    }\n\n    @Test\n    fun setSpeakerId_loadsSpeakersEvents_singleEvent() = runTest {\n        // Given a speaker view model\n        val viewModel = createViewModel(speakerId = TestData.speaker3.id)\n\n        // Then the speakers event is loaded\n        assertEquals(\n            listOf(TestData.userSession2),\n            viewModel.speakerUserSessions.first()\n        )\n    }\n\n    @Test\n    fun setSpeakerId_loadsSpeakersEvents_multipleEvents() = runTest {\n        // Given a speaker view model\n        val viewModel = createViewModel()\n\n        // Then the speakers events are loaded\n        assertEquals(\n            listOf(TestData.userSession0, TestData.userSession3, TestData.userSession4),\n            viewModel.speakerUserSessions.first()\n        )\n    }\n\n    private fun createViewModel(\n        speakerId: String? = TestData.speaker1.id,\n        loadSpeakerUseCase: LoadSpeakerUseCase =\n            LoadSpeakerUseCase(TestDataRepository, coroutineRule.testDispatcher),\n        loadSpeakerSessionsUseCase: LoadUserSessionsUseCase = LoadUserSessionsUseCase(\n            DefaultSessionAndUserEventRepository(\n                TestUserEventDataSource(),\n                DefaultSessionRepository(TestDataRepository)\n            ),\n            coroutineRule.testDispatcher\n        ),\n        getTimeZoneUseCase: GetTimeZoneUseCase =\n            GetTimeZoneUseCase(FakePreferenceStorage(), coroutineRule.testDispatcher),\n        signInViewModelDelegate: SignInViewModelDelegate = FakeSignInViewModelDelegate().apply {\n            loadUser(\"123\")\n        },\n        onSessionStarClickDelegate: OnSessionStarClickDelegate = FakeOnSessionStarClickDelegate()\n    ): SpeakerViewModel {\n        return SpeakerViewModel(\n            savedStateHandle = SavedStateHandle(mapOf(\"speaker_id\" to speakerId)),\n            loadSpeakerUseCase = loadSpeakerUseCase,\n            loadSpeakerSessionsUseCase = loadSpeakerSessionsUseCase,\n            getTimeZoneUseCase = getTimeZoneUseCase,\n            signInViewModelDelegate = signInViewModelDelegate,\n            onSessionStarClickDelegate = onSessionStarClickDelegate\n        )\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/util/WifiConfigurationStringsTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util\n\nimport junit.framework.Assert.assertEquals\nimport org.junit.Test\n\nclass WifiConfigurationStringsTest {\n    @Test\n    fun testWrapQuotes_emptyString() {\n        val original = \"\"\n        val expected = \"\\\"\\\"\"\n        val quoted = original.wrapInQuotes()\n        assertEquals(expected, quoted)\n    }\n\n    @Test\n    fun testWrapQuotes_alreadyQuotes() {\n        val original = \"\\\"io2018\\\"\"\n        val expected = \"\\\"io2018\\\"\"\n        val quoted = original.wrapInQuotes()\n        assertEquals(expected, quoted)\n    }\n\n    @Test\n    fun testWrapQuotes_noQuotes() {\n        val original = \"io2018\"\n        val expected = \"\\\"io2018\\\"\"\n        val quoted = original.wrapInQuotes()\n        assertEquals(expected, quoted)\n    }\n\n    @Test\n    fun testWrapQuotes_oneStartingQuote() {\n        val original = \"\\\"io2018\"\n        val expected = \"\\\"io2018\\\"\"\n        val quoted = original.wrapInQuotes()\n        assertEquals(expected, quoted)\n    }\n\n    @Test\n    fun testWrapQuotes_oneEndingQuote() {\n        val original = \"io2018\\\"\"\n        val expected = \"\\\"io2018\\\"\"\n        val quoted = original.wrapInQuotes()\n        assertEquals(expected, quoted)\n    }\n\n    @Test\n    fun testUnwrapQuotes_emptyString() {\n        val original = \"\"\n        val expected = \"\"\n        val unquoted = original.unwrapQuotes()\n        assertEquals(expected, unquoted)\n    }\n\n    @Test\n    fun testUnwrapQuotes_alreadyQuotes() {\n        val original = \"\\\"io2018\\\"\"\n        val expected = \"io2018\"\n        val unquoted = original.unwrapQuotes()\n        assertEquals(expected, unquoted)\n    }\n\n    @Test\n    fun testUnwrapQuotes_noQuotes() {\n        val original = \"io2018\"\n        val expected = \"io2018\"\n        val unquoted = original.unwrapQuotes()\n        assertEquals(expected, unquoted)\n    }\n\n    @Test\n    fun testUnwrapQuotes_oneStartingQuote() {\n        val original = \"\\\"io2018\"\n        val expected = \"io2018\"\n        val quoted = original.unwrapQuotes()\n        assertEquals(expected, quoted)\n    }\n\n    @Test\n    fun testUnwrapQuotes_oneEndingQuote() {\n        val original = \"io2018\\\"\"\n        val expected = \"io2018\"\n        val quoted = original.unwrapQuotes()\n        assertEquals(expected, quoted)\n    }\n}\n"
  },
  {
    "path": "mobile/src/test/java/com/google/samples/apps/iosched/util/signin/FirebaseAuthErrorCodeConverterTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.util.signin\n\nimport com.firebase.ui.auth.ErrorCodes\nimport com.google.samples.apps.iosched.R\nimport org.hamcrest.core.Is.`is`\nimport org.hamcrest.core.IsEqual.equalTo\nimport org.junit.Assert.assertThat\nimport org.junit.Test\n\nclass FirebaseAuthErrorCodeConverterTest {\n\n    @Test\n    fun convert_noInternet() {\n        val resource = FirebaseAuthErrorCodeConverter.convert(ErrorCodes.NO_NETWORK)\n\n        assertThat(resource, `is`(equalTo(R.string.firebase_auth_no_network_connection)))\n    }\n\n    @Test\n    fun convert_unknown() {\n        // All error codes except for NO_NETWORK should convert to\n        // R.string.firebase_auth_unknown_error\n        val errorCodes = listOf(\n            ErrorCodes.DEVELOPER_ERROR,\n            ErrorCodes.PLAY_SERVICES_UPDATE_CANCELLED,\n            ErrorCodes.PROVIDER_ERROR,\n            ErrorCodes.UNKNOWN_ERROR\n        )\n\n        errorCodes.map { FirebaseAuthErrorCodeConverter.convert(it) }\n            .forEach { assertThat(it, `is`(equalTo(R.string.firebase_auth_unknown_error))) }\n    }\n}\n"
  },
  {
    "path": "model/build.gradle.kts",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id(\"java-library\")\n    kotlin(\"jvm\")\n}\n\ndependencies {\n    api(platform(project(\":depconstraints\")))\n\n    implementation(fileTree(mapOf(\"dir\" to \"libs\", \"include\" to listOf(\"*.jar\"))))\n    // ThreeTenBP for the shared module only. Date and time API for Java.\n    api(\"org.threeten:threetenbp:${Versions.THREETENBP}:no-tzdb\")\n    implementation(Libs.CORE_KTX)\n\n    implementation(Libs.KOTLIN_STDLIB)\n}\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_1_7\n    targetCompatibility = JavaVersion.VERSION_1_7\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Announcement.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport androidx.annotation.ColorInt\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Describes an item in the feed, displaying social-media like updates.\n * Each item includes a message, id, a title and a timestamp.\n * Optionally, it can also include an image and a category with a color.\n * An item can also be marked as priority.\n */\ndata class Announcement(\n    val id: String,\n    val title: String,\n    val message: String,\n    val priority: Boolean,\n    /**\n     * Marks this feed item as an emergency.\n     */\n    val emergency: Boolean,\n    val timestamp: ZonedDateTime,\n    val imageUrl: String?,\n    /**\n     * Item category. Free form string.\n     */\n    val category: String,\n    @ColorInt val color: Int\n) {\n    val hasImage = !imageUrl.isNullOrEmpty()\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Block.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Defines a block of time associated with the conference. For example, a span of time denotes the\n * time when codelabs are offered, or when lunch is provided, etc.\n */\ndata class Block(\n    /**\n     * The title of the block. Example, \"Sandbox\".\n     */\n    val title: String,\n\n    /**\n     * The type of agenda item. Example, \"concert\", or \"meal\".\n     */\n    val type: String,\n\n    /**\n     * The color of the block.\n     */\n    val color: Int,\n\n    /**\n     * The stroke color of the block (defaults to [color])\n     */\n    val strokeColor: Int = color,\n\n    /**\n     * If [color] is dark i.e. overlaid text should be light (defaults to false)\n     */\n    val isDark: Boolean = false,\n\n    /**\n     * Start time\n     */\n    val startTime: ZonedDateTime,\n\n    /**\n     * End time\n     */\n    val endTime: ZonedDateTime\n)\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Codelab.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\ndata class Codelab(\n    /** Unique ID identifying this Codelab */\n    val id: String,\n    /** Codelab title */\n    val title: String,\n    /** A short description of the codelab content */\n    val description: String,\n    /** Approximate time in minutes a user would spend doing this codelab */\n    val durationMinutes: Int,\n    /** URL for an icon to display */\n    val iconUrl: String?,\n    /** URL to access this codelab on the web */\n    val codelabUrl: String,\n    /** Sort priorty. Higher sort priority should come before lower ones. */\n    val sortPriority: Int,\n    /** [Tag]s applicable to this codelab */\n    val tags: List<Tag>\n) {\n    fun hasUrl() = codelabUrl.isNotBlank()\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/ConferenceData.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\n/**\n * Contains schedule data with the UI models.\n */\ndata class ConferenceData(\n    val sessions: List<Session>,\n    val speakers: List<Speaker>,\n    val rooms: List<Room>,\n    val codelabs: List<Codelab>,\n    val tags: List<Tag>,\n    val version: Int\n)\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/ConferenceDay.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport org.threeten.bp.ZonedDateTime\n\ndata class ConferenceDay(\n    val start: ZonedDateTime,\n    val end: ZonedDateTime\n) {\n    operator fun contains(session: Session) = start <= session.startTime && end >= session.endTime\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/ConferenceWifiInfo.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\ndata class ConferenceWifiInfo(val ssid: String, val password: String)\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Moment.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport androidx.annotation.ColorInt\nimport org.threeten.bp.ZonedDateTime\n\ndata class Moment(\n    val id: String,\n    val title: String?,\n    val startTime: ZonedDateTime,\n    val endTime: ZonedDateTime,\n    val timeVisible: Boolean,\n    @ColorInt val textColor: Int,\n    val imageUrl: String,\n    val imageUrlDarkTheme: String,\n    val attendeeRequired: Boolean,\n    val ctaType: String, // MAP_LOCATION, LIVE_STREAM, SIGN_IN, NO_ACTION\n    val featureId: String?, // if ctaType is MapLocation\n    val featureName: String?, // if ctaType is MapLocation\n    val streamUrl: String? // if ctaType is LiveStream\n) {\n    companion object {\n        const val CTA_LIVE_STREAM = \"LIVE_STREAM\"\n        const val CTA_MAP_LOCATION = \"MAP_LOCATION\"\n        const val CTA_SIGNIN = \"SIGN_IN\"\n        const val CTA_NO_ACTION = \"NO_ACTION\"\n    }\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Room.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\n/**\n * Describes a venue associated with the conference.\n */\ndata class Room(\n    /**\n     * Unique string identifying this room.\n     */\n    val id: String,\n\n    /**\n     * The name of the room.\n     */\n    val name: String\n) {\n    val abbreviatedName\n        get() = name.split(\"|\")[0]\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Session.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport com.google.samples.apps.iosched.model.SessionType.Companion.reservableTypes\nimport org.threeten.bp.ZonedDateTime\n\ntypealias SessionId = String\n\n/**\n * Describes a conference session. Sessions have specific start and end times, and they represent a\n * variety of conference events: talks, sandbox demos, office hours, etc. A session is usually\n * associated with one or more [Tag]s.\n */\ndata class Session(\n    /**\n     * Unique string identifying this session.\n     */\n    val id: SessionId,\n\n    /**\n     * Start time of the session\n     */\n    val startTime: ZonedDateTime,\n\n    /**\n     * End time of the session\n     */\n    val endTime: ZonedDateTime,\n\n    /**\n     * Session title.\n     */\n    val title: String,\n\n    /**\n     * Body of text explaining this session in detail.\n     */\n    val description: String,\n\n    /**\n     * The session room.\n     */\n    val room: Room?,\n\n    /**\n     * Full URL for the session online.\n     */\n    val sessionUrl: String,\n\n    /**\n     * Indicates if the Session has a live stream.\n     */\n    val isLivestream: Boolean,\n\n    /**\n     * Full URL to YouTube.\n     */\n    val youTubeUrl: String,\n\n    /**\n     * URL to the Dory page.\n     */\n    val doryLink: String,\n\n    /**\n     * The [Tag]s associated with the session. Ordered, with the most important tags appearing\n     * first.\n     */\n    val tags: List<Tag>,\n\n    /**\n     * Subset of [Tag]s that are for visual consumption.\n     */\n    val displayTags: List<Tag>,\n\n    /**\n     * The session speakers.\n     */\n    val speakers: Set<Speaker>,\n\n    /**\n     * The session's photo URL.\n     */\n    val photoUrl: String,\n\n    /**\n     * IDs of the sessions related to this session.\n     */\n    val relatedSessions: Set<SessionId>\n) {\n\n    /**\n     * Returns whether the session is currently being live streamed or not.\n     */\n    fun isLive(): Boolean {\n        val now = ZonedDateTime.now()\n        // TODO: Determine when a session is live based on the time AND the liveStream being\n        // available.\n        return startTime <= now && endTime >= now\n    }\n\n    val hasPhoto inline get() = photoUrl.isNotEmpty()\n\n    /**\n     * Returns whether the session has a video or not. A session could be live streaming or have a\n     * recorded session. Both live stream and recorded videos are stored in [Session.youTubeUrl].\n     */\n    val hasVideo inline get() = youTubeUrl.isNotEmpty()\n\n    val hasPhotoOrVideo inline get() = hasPhoto || hasVideo\n\n    /**\n     * The year the session was held.\n     */\n    val year = startTime.year\n\n    /**\n     * The duration of the session.\n     */\n    // TODO: Get duration from the YouTube video. Not every talk fills the full session time.\n    val duration = endTime.toInstant().toEpochMilli() - startTime.toInstant().toEpochMilli()\n\n    /**\n     * The type of the event e.g. Session, Codelab etc.\n     */\n    val type: SessionType by lazy(LazyThreadSafetyMode.PUBLICATION) {\n        SessionType.fromTags(tags)\n    }\n\n    fun levelTag(): Tag? {\n        return tags.firstOrNull { it.category == Tag.CATEGORY_LEVEL }\n    }\n\n    /**\n     * Whether this event is reservable, based upon [type].\n     */\n    val isReservable: Boolean by lazy(LazyThreadSafetyMode.PUBLICATION) {\n        type in reservableTypes\n    }\n\n    fun isOverlapping(session: Session): Boolean {\n        return this.startTime < session.endTime && this.endTime > session.startTime\n    }\n\n    /**\n     * Detailed description of this event. Includes description, speakers, and live-streaming URL.\n     */\n    fun getCalendarDescription(\n        paragraphDelimiter: String,\n        speakerDelimiter: String\n    ): String = buildString {\n        append(description)\n        append(paragraphDelimiter)\n        append(speakers.joinToString(speakerDelimiter) { speaker -> speaker.name })\n        if (!isLivestream && !youTubeUrl.isEmpty()) {\n            append(paragraphDelimiter)\n            append(youTubeUrl)\n        }\n    }\n}\n\n/**\n * Represents the type of the event e.g. Session, Codelab etc.\n */\nenum class SessionType(val displayName: String) {\n\n    KEYNOTE(\"Keynote\"),\n    SESSION(\"Session\"),\n    APP_REVIEW(\"App Reviews\"),\n    GAME_REVIEW(\"Game Reviews\"),\n    OFFICE_HOURS(\"Office Hours\"),\n    CODELAB(\"Codelab\"),\n    MEETUP(\"Meetup\"),\n    AFTER_DARK(\"After Dark\"),\n    UNKNOWN(\"Unknown\");\n\n    companion object {\n\n        /**\n         * Examine the given [tags] to determine the [SessionType]. Defaults to [SESSION] if no\n         * category tag is found.\n         */\n        fun fromTags(tags: List<Tag>): SessionType {\n            val typeTag = tags.firstOrNull { it.category == Tag.CATEGORY_TYPE }\n\n            return when (typeTag?.tagName) {\n                Tag.TYPE_KEYNOTE -> KEYNOTE\n                Tag.TYPE_SESSIONS -> SESSION\n                Tag.TYPE_APP_REVIEWS -> APP_REVIEW\n                Tag.TYPE_GAME_REVIEWS -> GAME_REVIEW\n                Tag.TYPE_OFFICEHOURS -> OFFICE_HOURS\n                Tag.TYPE_CODELABS -> CODELAB\n                Tag.TYPE_MEETUPS -> MEETUP\n                Tag.TYPE_AFTERDARK -> AFTER_DARK\n                else -> UNKNOWN\n            }\n        }\n\n        internal val reservableTypes = listOf(SESSION, OFFICE_HOURS, APP_REVIEW, GAME_REVIEW)\n    }\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Speaker.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\ntypealias SpeakerId = String\n\n/**\n * Describes a speaker at the conference.\n */\ndata class Speaker(\n    /**\n     * Unique string identifying this speaker.\n     */\n    val id: SpeakerId,\n\n    /**\n     * Name of this speaker.\n     */\n    val name: String,\n\n    /**\n     * Profile photo of this speaker.\n     */\n    val imageUrl: String,\n\n    /**\n     * Company this speaker works for.\n     */\n    val company: String,\n\n    /**\n     * Text describing this speaker in detail.\n     */\n    val biography: String,\n\n    /**\n     * Full URL of the speaker's website.\n     */\n    val websiteUrl: String? = null,\n\n    /**\n     * Full URL of the speaker's Twitter profile.\n     */\n    val twitterUrl: String? = null,\n\n    /**\n     * Full URL of the speaker's GitHub profile.\n     */\n    val githubUrl: String? = null,\n\n    /**\n     * Full URL of the speaker's LinkedIn profile.\n     */\n    val linkedInUrl: String? = null\n) {\n    val hasCompany inline get() = company.isNotEmpty()\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Tag.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\n/**\n * Describes a tag, which contains meta-information about a conference session. A tag has two\n * components, a category, and a name, and together these give a tag its semantic meaning. For\n * example, a session may contain the following tags: {category: \"TRACK\", name: \"ANDROID\"} and\n * {category: \"TYPE\", name: \"OFFICEHOURS\"}. The first tag defines the session track as Android, and\n * the second tag defines the session type as an office hour.\n */\ndata class Tag(\n    /**\n     * Unique string identifying this tag.\n     */\n    val id: String,\n\n    /**\n     * Tag category type. For example, \"track\", \"level\", \"type\", \"theme\", etc.\n     */\n    val category: String,\n\n    /**\n     * Tag name. For example, \"topic_iot\", \"type_afterhours\", \"topic_ar&vr\", etc. Used to resolve\n     * references to this tag from other entities during data deserialization and normalization.\n     * For UI, use [displayName] instead.\n     */\n    val tagName: String,\n\n    /**\n     * This tag's order within its [category].\n     */\n    val orderInCategory: Int,\n\n    /**\n     * Display name within a category. For example, \"Android\", \"Ads\", \"Design\".\n     */\n    val displayName: String,\n\n    /**\n     * The color associated with this tag as a color integer.\n     */\n    val color: Int,\n\n    /**\n     * The font color associated with this tag as a color integer.\n     */\n    val fontColor: Int? = null\n) {\n\n    companion object {\n        /** Category value for topic tags */\n        const val CATEGORY_TOPIC = \"topic\"\n        /** Category value for type tags */\n        const val CATEGORY_TYPE = \"type\"\n        /** Category value for theme tags */\n        const val CATEGORY_THEME = \"theme\"\n        /** Category value for level tags */\n        const val CATEGORY_LEVEL = \"level\"\n\n        // Exhaustive list of IDs for tags with category = TYPE\n        const val TYPE_KEYNOTE = \"type_keynotes\"\n        const val TYPE_SESSIONS = \"type_sessions\"\n        const val TYPE_APP_REVIEWS = \"type_appreviews\"\n        const val TYPE_AFTERDARK = \"type_afterdark\"\n        const val TYPE_CODELABS = \"type_codelabs\"\n        const val TYPE_GAME_REVIEWS = \"type_gamereviews\"\n        const val TYPE_MEETUPS = \"type_meetups\"\n        const val TYPE_OFFICEHOURS = \"type_officehours\"\n    }\n\n    /** Only IDs are used for equality. */\n    override fun equals(other: Any?): Boolean = this === other || (other is Tag && other.id == id)\n\n    /** Only IDs are used for equality. */\n    override fun hashCode(): Int = id.hashCode()\n\n    fun isUiContentEqual(other: Tag) = color == other.color && displayName == other.displayName\n\n    fun isLightFontColor() = fontColor?.toLong() == 0xFFFFFFFF\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/Theme.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\n/**\n * Represents the available UI themes for the application\n */\nenum class Theme(val storageKey: String) {\n    LIGHT(\"light\"),\n    DARK(\"dark\"),\n    SYSTEM(\"system\"),\n    BATTERY_SAVER(\"battery_saver\")\n}\n\n/**\n * Returns the matching [Theme] for the given [storageKey] value.\n */\nfun themeFromStorageKey(storageKey: String): Theme? {\n    return Theme.values().firstOrNull { it.storageKey == storageKey }\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/User.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\n\n/**\n * Data for a user stored in a Firestore document. The events which have been personalized\n * by the user correspond to the `events` subcollection.\n */\ndata class User(\n    /**\n     * The unique id for the user. Corresponds to the value returned by\n     * https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount.html#getId()\n     */\n    val uid: String,\n\n    /**\n     * The token that identifies the user's devices so that Firebase Messaging can send\n     * downstream messages to those devices. Corresponds to the value returned by calling\n     * https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId.html#getToken(java.lang.String, java.lang.String).\n     */\n    val fcmIds: List<String>,\n\n    /**\n     * Tracks whether the user is an attendee or a remote user.\n     */\n    val isRegistered: Boolean,\n\n    /**\n     * Corresponds to the Firestore subcollection of documents that sture the user's events data.\n     */\n    val events: List<UserEvent>\n)\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/filters/Filter.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model.filters\n\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.Tag\n\nsealed class Filter {\n\n    data class TagFilter(val tag: Tag) : Filter()\n\n    data class DateFilter(val day: ConferenceDay) : Filter()\n\n    object MyScheduleFilter : Filter()\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/reservations/ReservationRequest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model.reservations\n\n/**\n * Entity that represents the client's latest reservation or cancellation request. Used to figure\n * out whether a reservation request is pending or completed.\n */\ndata class ReservationRequest(\n    /**\n     * The action of the reservation request (REQUEST/CANCEL).\n     */\n    val action: ReservationRequestEntityAction,\n\n    /**\n     * An ID set by the client that will be added to the reservation result on completion.\n     */\n    val requestId: String\n) {\n\n    enum class ReservationRequestEntityAction {\n        /** The reservation was granted */\n        RESERVE_REQUESTED,\n\n        /** The reservation was granted but the user was placed on a waitlist. */\n        CANCEL_REQUESTED;\n\n        companion object {\n\n            fun getIfPresent(string: String): ReservationRequestEntityAction? {\n                return try {\n                    valueOf(string)\n                } catch (e: IllegalArgumentException) {\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/reservations/ReservationRequestResult.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model.reservations\n\n/**\n * Data for a reservation request stored in a Firebase document.\n *\n * Default values needed for Firestore's deserialization.\n */\ndata class ReservationRequestResult(\n    /**\n     * The status of the reservation request.\n     */\n    val requestResult: ReservationRequestStatus? = null,\n\n    /* ID of the [ReservationRequest] that originated this result.*/\n    val requestId: String,\n\n    /** The time the status was acquired. */\n    val timestamp: Long = -1\n) {\n\n    enum class ReservationRequestStatus {\n        /** The reservation was granted */\n        RESERVE_SUCCEEDED,\n\n        /** The reservation was granted but the user was placed on a waitlist. */\n        RESERVE_WAITLISTED,\n\n        /** The reservation request was denied because it was too close to the start of the\n         * event. */\n        RESERVE_DENIED_CUTOFF,\n\n        /** The reservation was denied because it overlapped with another reservation or\n         * waitlist. */\n        RESERVE_DENIED_CLASH,\n\n        /** The reservation was denied for unknown reasons. */\n        RESERVE_DENIED_UNKNOWN,\n\n        /** The reservation was successfully canceled. */\n        CANCEL_SUCCEEDED,\n\n        /** The cancellation request was denied because it was too close to the start of\n         * the event. */\n        CANCEL_DENIED_CUTOFF,\n\n        /** The cancellation request was denied for unknown reasons. */\n        CANCEL_DENIED_UNKNOWN,\n\n        /** The reservation was granted by a Swap request. */\n        SWAP_SUCCEEDED,\n\n        /** The reservation was granted but the user was placed on a waitlist by a Swap request. */\n        SWAP_WAITLISTED,\n\n        /** The reservation request was denied because it was too close to the start of the\n         * event by a Swap request. */\n        SWAP_DENIED_CUTOFF,\n\n        /** The reservation was denied because it overlapped with another reservation or\n         * waitlist by a Swap request. */\n        SWAP_DENIED_CLASH,\n\n        /** The reservation was denied for unknown reasons by a Swap request. */\n        SWAP_DENIED_UNKNOWN, ;\n\n        companion object {\n\n            fun getIfPresent(string: String): ReservationRequestStatus? {\n                return try {\n                    valueOf(string)\n                } catch (e: IllegalArgumentException) {\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/schedule/PinnedSessionsSchedule.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model.schedule\n\n/**\n * Class representation of JSON format passed to the AR module for showing user's pinned sessions.\n * The field name must not be changed.\n */\ndata class PinnedSessionsSchedule(val schedule: List<PinnedSession>)\n\n/**\n * Class representation of JSON format for a single session.\n * The field names must not be changed.\n *\n * Example entity is like\n * {\n *    \"name\": \"session1\",\n *    \"location\": \"Room 1\",\n *    \"day\": \"3/29\",\n *    \"time\": \"13:30\",\n *    \"timestamp\": 82547983,\n *    \"description\": \"Session description\"\n * }\n */\ndata class PinnedSession(\n    val name: String,\n    val location: String,\n    val day: String,\n    val time: String,\n    val timestamp: Long,\n    val description: String\n)\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/userdata/UserEvent.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model.userdata\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequest\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequest.ReservationRequestEntityAction.CANCEL_REQUESTED\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequest.ReservationRequestEntityAction.RESERVE_REQUESTED\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.CANCEL_DENIED_CUTOFF\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.CANCEL_DENIED_UNKNOWN\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.CANCEL_SUCCEEDED\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_DENIED_CLASH\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_DENIED_CUTOFF\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_DENIED_UNKNOWN\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_SUCCEEDED\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_WAITLISTED\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.SWAP_DENIED_CLASH\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.SWAP_DENIED_CUTOFF\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.SWAP_DENIED_UNKNOWN\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.SWAP_SUCCEEDED\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.SWAP_WAITLISTED\n\n/**\n * Data for a user's personalized event stored in a Firestore document.\n */\ndata class UserEvent(\n    /**\n     * The unique ID for the event.\n     */\n    val id: SessionId,\n\n    /** Tracks whether the user has starred the event. */\n    val isStarred: Boolean = false,\n\n    /** Tracks whether the user has provided feedback for the event. */\n    val isReviewed: Boolean = false,\n\n    /** Source of truth of the state of a reservation */\n    private val reservationStatus: ReservationStatus? = null,\n\n    /** Stores the result of a reservation request for the event. */\n    private val reservationRequestResult: ReservationRequestResult? = null,\n\n    /** Stores the user's latest reservation action  */\n    private val reservationRequest: ReservationRequest? = null\n) {\n    fun isStarredOrReserved(): Boolean {\n        return isStarred || isReserved() || isWaitlisted()\n    }\n\n    /**\n     * An request is pending if the result has a saved request with a different ID than the\n     * latest request made by the user.\n     */\n    private fun isPending(): Boolean {\n        // Request but no result = pending\n        if (reservationRequest != null && reservationRequestResult == null) return true\n\n        // If request and result exist they need to have different IDs to be pending.\n        return reservationRequest != null &&\n            reservationRequest.requestId != reservationRequestResult?.requestId\n    }\n\n    fun isReserved(): Boolean {\n        return reservationStatus == ReservationStatus.RESERVED\n    }\n\n    fun isWaitlisted(): Boolean {\n        return reservationStatus == ReservationStatus.WAITLISTED\n    }\n\n    fun getReservationRequestResultId(): String? {\n        return reservationRequestResult?.requestId\n    }\n\n    fun isDifferentRequestResult(otherId: String?): Boolean {\n        return reservationRequestResult?.requestId != otherId\n    }\n\n    fun isReservedAndPendingCancel(): Boolean {\n        return isReserved() && isCancelPending()\n    }\n\n    fun isWaitlistedAndPendingCancel(): Boolean {\n        return isWaitlisted() && isCancelPending()\n    }\n\n    fun hasRequestResultError(): Boolean {\n        return requestResultError() != null\n    }\n\n    fun requestResultError(): ReservationRequestResult.ReservationRequestStatus? {\n        // The request result is garbage if there's a pending request\n        if (isPending()) return null\n\n        return when (reservationRequestResult?.requestResult) {\n            null -> null // If there's no request result, there's no error\n            RESERVE_SUCCEEDED -> null\n            RESERVE_WAITLISTED -> null\n            CANCEL_SUCCEEDED -> null\n            SWAP_SUCCEEDED -> null\n            SWAP_WAITLISTED -> null\n            else -> reservationRequestResult.requestResult\n        }\n    }\n\n    fun isRequestResultErrorReserveDeniedCutoff(): Boolean {\n        val e = requestResultError()\n        return e == RESERVE_DENIED_CUTOFF || e == SWAP_DENIED_CUTOFF\n    }\n\n    fun isRequestResultErrorReserveDeniedClash(): Boolean {\n        val e = requestResultError()\n        return e == RESERVE_DENIED_CLASH || e == SWAP_DENIED_CLASH\n    }\n\n    fun isRequestResultErrorReserveDeniedUnknown(): Boolean {\n        val e = requestResultError()\n        return e == RESERVE_DENIED_UNKNOWN || e == SWAP_DENIED_UNKNOWN\n    }\n\n    fun isRequestResultErrorCancelDeniedCutoff(): Boolean {\n        val e = requestResultError()\n        return e == CANCEL_DENIED_CUTOFF || e == SWAP_DENIED_CUTOFF\n    }\n\n    fun isRequestResultErrorCancelDeniedUnknown(): Boolean {\n        return requestResultError() == CANCEL_DENIED_UNKNOWN\n    }\n\n    fun isReservationPending(): Boolean {\n        return (reservationStatus == ReservationStatus.NONE || reservationStatus == null) &&\n            isPending() &&\n            reservationRequest?.action == RESERVE_REQUESTED\n    }\n\n    fun isCancelPending(): Boolean {\n        return reservationStatus != ReservationStatus.NONE &&\n            isPending() &&\n            reservationRequest?.action == CANCEL_REQUESTED\n    }\n\n    fun isLastRequestResultBySwap(): Boolean {\n        val r = reservationRequestResult?.requestResult ?: return false\n        return r == SWAP_SUCCEEDED || r == SWAP_WAITLISTED || r == SWAP_DENIED_CLASH ||\n            r == SWAP_DENIED_CUTOFF || r == SWAP_DENIED_UNKNOWN\n    }\n\n    fun isPreSessionNotificationRequired(): Boolean {\n        return isStarred || isReserved()\n    }\n\n    /**\n     * The source of truth for a reservation status.\n     */\n    enum class ReservationStatus {\n        /** The reservation was granted */\n        RESERVED,\n\n        /** The reservation was granted but the user was placed on a waitlist. */\n        WAITLISTED,\n\n        /** The reservation request was denied because it was too close to the start of the\n         * event. */\n        NONE;\n\n        companion object {\n\n            fun getIfPresent(string: String): ReservationStatus? {\n                return try {\n                    valueOf(string)\n                } catch (e: IllegalArgumentException) {\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "model/src/main/java/com/google/samples/apps/iosched/model/userdata/UserSession.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model.userdata\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionType\n\n/**\n * Wrapper class to hold the [Session] and associating [UserEvent].\n */\ndata class UserSession(\n    val session: Session,\n    val userEvent: UserEvent\n) {\n\n    fun isPostSessionNotificationRequired(): Boolean {\n        return userEvent.isReserved() &&\n            !userEvent.isReviewed &&\n            session.type == SessionType.SESSION\n    }\n}\n"
  },
  {
    "path": "playstore/listing_ar.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n******************** Title in locale <ar> ********************\nGoogle I/O 2016\n******************** Full description in locale <ar> ********************\nصمم تطبيق Google I/O 2016 الرسمي ليكون مساعدك في استكشاف المؤتمر، سواء كنت ستحضر بشكل شخصي أو عن بعد.\n-- استكشف أجندة المؤتمر، وتفاصيل الأفكار الرئيسية، والمواضيع والمتحدثين\n-- أضف الفعاليات إلى جدول زمني مخصص\n-- احصل على تذكيرات قبل الفعاليات من خلال الجدول الزمني\n-- شاهد البث المباشر للخطاب الرئيسي والجلسات \n-- زامن جدولك الزمني مع جميع أجهزتك وموقع I/O\n-- قم بتوجيه نفسك من خلال خريطة المؤتمر ذات الرسومات المتجهة \n-- تابع النقاشات العامة المتعلقة بـ I/O\n-- شاهد محتوى I/O من الأعوام الماضية بالفيديوهات\n\n* حصري للحاضرين شخصيا*\n--استفد من تهيئة الواي فاي المتاحة قبل بداية الفعالية\n\nتم تحسين هذا التطبيق للهواتف والأجهزة اللوحية من جميع الأشكال والأحجام.\nسيكون الرمز الآمن للتطبيق متاحًا قريبًا بعد I/O.\n\nv4.0: تم تحديثها لتعمل مع Google I/O 2016\n******************** Short description in locale <ar> ********************\nمساعدك في التنقل في I/O، سواءً كنت تحضر بنفسك أو عن بعد."
  },
  {
    "path": "playstore/listing_de.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n******************** Short description in locale <de> ********************\nIhr Co-Pilot zur I/O, ob Sie nun persönlich oder von außerhalb dabei sind.\n******************** Title in locale <de> ********************\nGoogle I/O 2016\n******************** Full description in locale <de> ********************\nDie offizielle Google I/O 2016-App ist Ihr Co-Pilot für die Konferenz, ob Sie persönlich oder von außerhalb teilnehmen.\n– Erkunden Sie die Konferenz-Agenda mit Details über Themen, Bereiche und Referenten\n– Speichern Sie Sitzungen in Ihrem persönlichen Zeitplan\n– Erhalten Sie Erinnerungen, bevor Sitzungen in Ihrem Zeitplan beginnen\n– Sehen Sie sich die Keynotes und Sitzungen im Live-Stream an\n– Synchronisieren Sie Ihren Zeitplan zwischen allen Geräten und der I/O-Website\n– Finden Sie den Weg mit Hilfe der Vektor-basierten Konferenzkarte\n– Folgen Sie den I/O-relevanten Gesprächen in den sozialen Medien\n– Schauen Sie sich I/O-Inhalte per Videos aus den Vorjahren an\n\n* Exklusiv wenn Sie persönlich teilnehmen: *\nNutzen Sie die App um das Konferenz-WLAN einzurichten.\n\nDiese App wurde für Handys und Tablets aller Formen und Größen optimiert.\nDer Quellcode der App wird nach Abschluss der I/O zur Verfügung gestellt.\n\nv4.0: Aktualisiert für Google I/O 2016"
  },
  {
    "path": "playstore/listing_en.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS 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******************** Title in locale <es-ES> ********************\nGoogle I/O 2016\n******************** Short description in locale <en> ********************\nYour co-pilot to navigate I/O, whether you’re attending in-person or remotely.\n******************** Full description in locale <es> ********************\nThe official Google I/O 2016 app was built to be your co-pilot to navigate the conference, whether you’re attending in-person or remotely. \n-- Explore the conference agenda, with details on themes, topics and speakers \n-- Add events to a personalized schedule\n-- Get reminders before events in your schedule start \n-- Watch the keynote and sessions live stream \n-- Sync your schedule between all of your devices and the I/O website\n-- Guide yourself using the vector-based conference map\n-- Follow public social I/O related conversations\n-- See I/O content from previous years in the Videos\n\n*Exclusive for In person attendees:*\n-- Take advantage of facilitated pre-event WiFi configuration\n\nThis app is optimized for phones and tablets of all shapes and sizes.\nSource code for the app will be available soon after I/O.\n\n******************** Updates ********************\nv 4.0: Updated for Google I/O 2016\n\n******************** Keywords ********************\nGoogle \nI/O\nio\ni-o\nConference\nDevelopers\nDevelop\nDesigners\nDesign\nLive stream\nAndroid\nChrome\n"
  },
  {
    "path": "playstore/listing_es-rES.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n******************** Full description in locale <es> ********************\nLa app oficial de Google I/O 2016 fue desarrollada para que sea su copiloto al navegar la conferencia, ya sea que esté asistiendo en persona o de forma remota. -- Explore la agenda de la conferencia, con detalles sobre los temas, categorías y conferencistas\n-- Añada eventos a su programación personalizada\n-- Obtenga recordatorios antes que comiencen los eventos de su programación\n-- Observe las presentaciones y las sesiones con transmisiones en vivo\n-- Sincronice su programación entre todos sus dispositivos y el sitio web de I/O\n-- Oriéntese usando el mapa de la conferencia basado en vectores\n-- Siga las conversaciones sociales públicas relacionadas con I/O\n-- Vea el contenido I/O de los años anteriores en los vídeos\n\n*Exclusivo para quienes asisten en persona:* \n-- Aproveche la configuración Wi-Fi facilitada antes del evento\n\nEsta app está optimizada para teléfonos y tabletas de todos los tamaños y formas. \nEl código fuente de la app estará disponible poco después de I/O.\n\nv4.0: Actualizada para Google I/O 2016\n******************** Short description in locale <es> ********************\nSu copiloto para navegar I/O, ya sea que asista en persona o de forma remota.\n******************** Title in locale <es> ********************\nGoogle I/O 2016"
  },
  {
    "path": "playstore/listing_fr.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n******************** Short description in locale <fr> ********************\nVotre copilote pour l'I/O, que vous y assistiez en personne ou à distance.\n******************** Title in locale <fr> ********************\nGoogle I/O 2016\n******************** Full description in locale <fr> ********************\nL’appli officielle Google I/O 2016 a été développée pour être votre copilote pour vous guider lors de la conférence, que vous y assistiez en personne ou à distance.\n- Explorez le programme de la conférence, avec des détails sur les thèmes, les sujets et les intervenants\n- Ajoutez des événements à un emploi du temps personnalisé\n- Recevez des rappels avant que les événements de votre emploi du temps ne commencent\n- Regardez les discours et les sessions en flux direct\n- Synchronisez votre emploi du temps sur tous vos appareils et le site I/O\n- Orientez-vous en utilisant le plan de conférence vectoriel\n- Suivez les conversations I/O sociales publiques connexes\n- Regardez le contenu I/O des années précédentes dans les Vidéos\n\n*Exclusif pour les participants présents en personne :*\n- Profitez de la configuration wifi pré-événement facilitée\n\nCette application est optimisée pour les téléphones et les tablettes de toutes formes et de toutes tailles.\nLe code source de l'application sera disponible sous peu après l'I/O.\n\nv4.0 : Mise à jour pour Google I/O 2016"
  },
  {
    "path": "playstore/listing_it.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n******************** Full description in locale <it> ********************\nL'App ufficiale di Google I/O 2016 è stata progettata per essere il tuo copilota durante la conferenza, a prescindere che tu stia partecipando di persona o da remoto.\n- Esplora il programma della conferenza, con i dettagli su temi, argomenti e relatori\n- Aggiungi eventi per un programma personalizzato\n- Ricevi promemoria prima dell'inizio degli eventi del tuo programma\n- Guarda i punti salienti e le sessioni in diretta streaming\n- Sincronizza il tuo programma tra tutti i tuoi dispositivi e il sito web di I/O\n- Orientati da solo, usando la mappa vettoriale della conferenza\n- Segui le conversazioni pubbliche social connesse a I/O\n- Visualizza i video sui contenuti di I/O degli anni precedenti\n\n*In esclusiva per i partecipanti di persona:*\n-- Approfitta della configurazione facilitata pre-evento della rete Wi-Fi\n\nQuesta App è stata ottimizzata per telefoni e Tablet di tutti i tipi e dimensioni.\nIl Source Code per l'App sarà disponibile subito dopo l'evento I/O.\n\nV4.0: aggiornamento per Google I/O 2016\n******************** Short description in locale <it> ********************\nIl tuo copilota di navigazione per I/O, per partecipanti di persona o da remoto\n******************** Title in locale <it> ********************\nGoogle I/O 2016"
  },
  {
    "path": "playstore/listing_ja.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n******************** Full description in locale <ja> ********************\n公式Google I/O 2016アプリは、リモート参加および直接参加したい会議をスマートにナビゲートするために開発されたお役立ちアプリです。\n-- 会議の議題および「テーマ、トピック、後援者に関する詳細」を確認できます\n-- 自分のスケジュールにイベントを追加できます\n-- スケジュールされたイベントの開始前に、リマインダーを受け取れます\n-- キーノートおよびセッション ライブ ストリームを閲覧できます\n-- 全てのデバイスとI/O website間で、スケジュールを同期できます\n-- 便利なベクターベースの会議マップをご利用いただけます\n-- 公式ソーシャルでやり取りされているI/O関連の会話をフォロー\n-- ビデオで過去のI/Oコンテンツを閲覧する\n\n*直接参加者のみご利用いただける特典*\n-- ファシリティ プレイベントのWi-Fi設定をご利用いただけます\n\nこのアプリは、すべての形や大きさのタブレット端末および携帯電話用に最適化されています。アプリ用のソースコードは、I/Oの開催後すぐに、ご利用可能となります。\n\nv4.0: Google I/O 2016向けに更新されました\n******************** Short description in locale <ja> ********************\nこれは、会議へのリモート参加および直接参加に関わらず、I/Oをナビゲートしてくれるお役立ちアプリです。\n******************** Title in locale <ja> ********************\nGoogle I/O 2016"
  },
  {
    "path": "playstore/listing_ko.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n******************** Short description in locale <ko> ********************\n직접 참석하건 원격으로 참여하건, I/O를 보다 가까이 누릴 수 있는 도우미도우미\n******************** Full description in locale <ko> ********************\nGoogle I/O 2016 컨퍼런스에 직접 또는 원격으로 참석하시는 여러분이 컨퍼런스를 탐구하는데 도움을 드릴 수 있도록 공식앱을 만들었습니다. \n-- 테마, 주제 및 강연자 세부정보와 컨퍼런스 의제를 살펴보세요. \n-- 개인 일정에 이벤트를 추가하세요.\n-- 이벤트가 시작하기 전 알림을 받으세요.\n-- 키노트와 세션을 라이브 스트리밍으로 보세요.\n-- 일정을 모든 기기 및 I/O 웹사이트에 동기화하세요.\n-- 벡터 기반 컨퍼런스 맵을 사용하여 안내를 받으세요.\n-- 공식 소셜 계정을 팔로우하세요.\n-- 이전 년도의 I/O 콘텐츠를 동영상으로 보세요.\n\n*직접 참석자만을 위한 혜택:*\n-- 무료 와이파이 구성의 혜택을 받아보세요.\n\n이 앱은 모든 모양과 크기의 전화기 및 태블릿에 최적화되어 있습니다. 앱의 소스 코드는 I/O 이후 곧 공개됩니다.\n\nv4.0: Google I/O 2016에 대해 업데이트됨\n******************** Title in locale <ko> ********************\nGoogle I/O 2016"
  },
  {
    "path": "playstore/listing_pt-rBR.txt",
    "content": "#  Copyright 2015 Google Inc. All rights reserved.\n#\n#  Licensed under the Apache License, Version 2.0 (the \"License\");\n#  you may not use this file except in compliance with the License.\n#  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n#  Unless required by applicable law or agreed to in writing, software\n#  distributed under the License is distributed on an \"AS IS\" BASIS,\n#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#  See the License for the specific language governing permissions and\n#  limitations under the License.\n******************** Title in locale <pt> ********************\nGoogle I/O 2016\n******************** Full description in locale <pt> ********************\nO app oficial do Google I/O 2016 foi desenvolvido para atuar como seu co-piloto ao navegar pela conferência, quer sua participação seja remota ou em pessoa.\n- Explore a pauta da conferência, com informações sobre os temas, tópicos e palestrantes\n- Adicione eventos a um calendário personalizado\n- Receba lembretes antes dos eventos em sua programação\n- Assista às transmissões ao vivo das palestras e sessões\n- Sincronize seu calendário em todos os seus dispositivos e no site do I/O\n- Oriente-se utilizando o mapa da conferência, baseado em vetores\n- Siga conversas sociais públicas relativas ao I/O\n- Veja os conteúdos do I/O de anos anteriores em vídeos\n\n* Exclusivo para participantes presenciais:*\n- Aproveite a configuração Wi-Fi pré-evento facilitada\n\nEste aplicativo foi otimizado para celulares e tablets de todos os formatos e tamanhos.\nO código-fonte para o aplicativo estará disponível logo após o I/O.\n\nv4.0: Atualizada para o Google I/O 2016\n******************** Short description in locale <pt> ********************\nSeu co-piloto para navegar pelo I/O, participando pessoalmente ou remotamente"
  },
  {
    "path": "playstore/listing_ru-rRU.txt",
    "content": "Your store listing text is now localized. To make this available on Google Play store, you will need to submit this content on Google Developer Console.\n******************** Short description in locale <ru> ********************\nВаш путеводитель по I/O, присутствуете вы лично или дистанционно.\n******************** Title in locale <ru> ********************\nGoogle I/O 2016\n******************** Full description in locale <ru> ********************\nОфициальное приложение Google I/O 2016 было создано, чтобы стать вашим проводником по конференции, независимо от того, присутствуете вы лично или удаленно.\n- Узнайте повестку дня конференции, с подробной информацией о темах, обсуждаемых вопросах и докладчиках\n- Добавляйте события в ваше индивидуальное расписание\n- Получайте напоминания о начинающихся вскоре мероприятиях из вашего графика\n- Смотрите прямые трансляции сессий\n- Синхронизация расписания между всеми вашими устройствами и сайтом I/O\n- Пользуйтесь векторной картой конференции для ориентировки\n- Следите за общественной дискуссией, касающейся I/O \n- Просматривайте видеоматериалы с предыдущих I/O\n\n*Специально для участников, присутствующих лично:*\n- Воспользуйтесь удобной предварительной настройкой WiFi\n\nЭто приложение оптимизировано для телефонов и планшетов всех форм и размеров.\nИсходный код приложения будет доступен вскоре после окончания I/O.\n\nv4.0: Обновлено для Google I/O 2016"
  },
  {
    "path": "playstore/listing_zh-rCN.txt",
    "content": "Your store listing text is now localized. To make this available on Google Play store, you will need to submit this content on Google Developer Console.\n******************** Short description in locale <zh-CN> ********************\n您的I/O大会导航助手，不管您是亲临现场或远程参与都能为您提供帮助。\n******************** Full description in locale <zh-CN> ********************\nGoogle I/O 2016官方应用程序旨在成为您的I/O大会导航助手，不管您是亲临现场或远程参与都能为您提供帮助。\n-- 探索会议日程，了解主题、话题和演讲者的详细信息\n-- 添加活动到个性化的日程表\n-- 在日程表中的活动开始之前收到提醒\n-- 观看主题演讲和活动现场直播\n-- 在您的所有设备和I/O网站之间同步您的日程表\n-- 使用向量式大会地图为自己指引路线\n-- 关注I/O相关的公共社交对话\n-- 在视频中查看往年的I/O内容\n\n*亲临大会现场参与者专享：*\n - 利用在大会前预先配置的WiFi网络\n\n这款应用程序针对各种形状和尺寸的手机及平板电脑进行了优化。\n应用程序的源代码将在I/O后不久发布。\n\nv4.0：Google I/O 2016更新\n******************** Title in locale <zh-CN> ********************\nGoogle I/O 2016"
  },
  {
    "path": "playstore/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"playstore_title\" translation_description=\"The title of the app on Play Store. Max 50 characters.\">Google I/O 2019</string>\n    <string name=\"playstore_tagline\" translation_description=\"Short description on the Play Store. Max 80 characters\">Your co-pilot to navigate I/O, whether you\\'re attending in-person or remotely.</string>\n    <string name=\"playstore_description\" translation_description=\"Description on the Play Store. Max 4000 characters\">The official Google I/O 2019 conference app is your co-pilot to navigate the conference, whether you\\'re attending in-person or remotely. With the app, you can:\\n\\n• Explore the conference schedule, with details on topics and speakers\\n• Save events to Schedule, your personalized schedule\\n• Get reminders before events you\\'ve saved in Schedule start\\n• Sync your custom schedule between all of your devices and the I/O website\\n• Guide yourself using the vector-based conference map\\n• Opt-in to receive important notifications about the event, schedule, travel, after hours, session recordings and more\\n\\nExclusive for onsite attendees:\\n• Take advantage of facilitated pre-event WiFi configuration\\n• Reserve seats for events ahead of schedule\\n\\nSource code for the app will be available soon after I/O.</string>\n    <string name=\"playstore_change\" translation_description=\"What's new text on the Play Store. Max 500 characters\">Updated for Google I/O 2019\\n• Add events to your personal calendar\\n• Explore I/O in Augmented Reality (onsite attendees only)\\n• Use the home page to view upcoming sessions, announcements, and more\\n• Search for sessions by topics and speakers</string>\n    <string name=\"playstore_required_permissions\" translation_description=\"Header label on Play Store for the list of required permissions\">Required permissions</string>\n    <string name=\"playstore_optional_permissions\" translation_description=\"Header label on Play Store for the list of option permissions\">Optional permissions</string>\n    <string name=\"playstore_permission_location_information\" translation_description=\"Explanation on the Play Store about why we need permission for location information\">Location information: Needed for showing the venue map around the user\\'s location.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">مساعِدك للتنقّل في مؤتمر I/O، سواء أكنت تشارك شخصيًّا أم عن بُعد.</string>\n\n    <string name=\"playstore_change\">تمّ التحديث لـ Google I/O 2018\\n• حجز المقاعد للأحداث قبل جدولها الزمني \\n• الاطّلاع على المزيد من المعلومات المهمّة عن الحدث، وتفاصيل السفر، والأسئلة الشائعة.</string>\n    <string name=\"playstore_required_permissions\">الأذونات المطلوبة</string>\n    <string name=\"playstore_optional_permissions\">الأُذونات الاختياريّة</string>\n    <string name=\"playstore_permission_location_information\">مطلوب معلومات عن الموقع الجغرافي لإظهار خريطة المكان حول الموقع الجغرافي للمُستخدِم.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-ar-rEG/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">مساعِدك للتنقّل في مؤتمر I/O، سواء أكنت تشارك شخصيًّا أم عن بُعد.</string>\n\n    <string name=\"playstore_change\">تمّ التحديث لـ Google I/O 2018\\n• حجز المقاعد للأحداث قبل جدولها الزمني \\n• الاطّلاع على المزيد من المعلومات المهمّة عن الحدث، وتفاصيل السفر، والأسئلة الشائعة.</string>\n    <string name=\"playstore_required_permissions\">الأذونات المطلوبة</string>\n    <string name=\"playstore_optional_permissions\">الأُذونات الاختياريّة</string>\n    <string name=\"playstore_permission_location_information\">مطلوب معلومات عن الموقع الجغرافي لإظهار خريطة المكان حول الموقع الجغرافي للمُستخدِم.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-ar-rSA/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">مساعِدك للتنقّل في مؤتمر I/O، سواء أكنت تشارك شخصيًّا أم عن بُعد.</string>\n\n    <string name=\"playstore_change\">تمّ التحديث لـ Google I/O 2018\\n• حجز المقاعد للأحداث قبل جدولها الزمني \\n• الاطّلاع على المزيد من المعلومات المهمّة عن الحدث، وتفاصيل السفر، والأسئلة الشائعة.</string>\n    <string name=\"playstore_required_permissions\">الأذونات المطلوبة</string>\n    <string name=\"playstore_optional_permissions\">الأُذونات الاختياريّة</string>\n    <string name=\"playstore_permission_location_information\">مطلوب معلومات عن الموقع الجغرافي لإظهار خريطة المكان حول الموقع الجغرافي للمُستخدِم.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Ihr Co-Pilot für die Navigation auf der I/O – vor Ort oder per Fernzugriff.</string>\n\n    <string name=\"playstore_change\">Aktualisiert für Google I/O 2018\\n• Vorab-Reservierung von Plätzen für Veranstaltungen\\n• Lesen Sie die wichtigen Informationen zur Veranstaltung, Reisedetails und FAQ.</string>\n    <string name=\"playstore_required_permissions\">Erforderliche Berechtigung</string>\n    <string name=\"playstore_optional_permissions\">Optionale Berechtigungen</string>\n    <string name=\"playstore_permission_location_information\">Standortinformationen: werden benötigt, um die Karte des Veranstaltungsorts entsprechend der Position des Nutzers anzuzeigen.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-de-rAT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Ihr Co-Pilot für die Navigation auf der I/O – vor Ort oder per Fernzugriff.</string>\n\n    <string name=\"playstore_change\">Aktualisiert für Google I/O 2018\\n• Vorab-Reservierung von Plätzen für Veranstaltungen\\n• Lesen Sie die wichtigen Informationen zur Veranstaltung, Reisedetails und FAQ.</string>\n    <string name=\"playstore_required_permissions\">Erforderliche Berechtigung</string>\n    <string name=\"playstore_optional_permissions\">Optionale Berechtigungen</string>\n    <string name=\"playstore_permission_location_information\">Standortinformationen: werden benötigt, um die Karte des Veranstaltungsorts entsprechend der Position des Nutzers anzuzeigen.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-de-rCH/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Ihr Co-Pilot für die Navigation auf der I/O – vor Ort oder per Fernzugriff.</string>\n\n    <string name=\"playstore_change\">Aktualisiert für Google I/O 2018\\n• Vorab-Reservierung von Plätzen für Veranstaltungen\\n• Lesen Sie die wichtigen Informationen zur Veranstaltung, Reisedetails und FAQ.</string>\n    <string name=\"playstore_required_permissions\">Erforderliche Berechtigung</string>\n    <string name=\"playstore_optional_permissions\">Optionale Berechtigungen</string>\n    <string name=\"playstore_permission_location_information\">Standortinformationen: werden benötigt, um die Karte des Veranstaltungsorts entsprechend der Position des Nutzers anzuzeigen.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rAR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rBO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rCL/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rCO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rCR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rDO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rEC/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rGT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rHN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rMX/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rNI/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rPA/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rPE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rPR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rPY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rSV/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rUS/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rUY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-es-rVE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Tu copiloto para explorar el evento I/O, ya sea en persona o de forma remota.</string>\n\n    <string name=\"playstore_change\">Actualizado para Google I/O 2018\\n• Reserva puestos con anticipación para los eventos.\\n• Lee información importante sobre el evento, información sobre el viaje y preguntas frecuentes.</string>\n    <string name=\"playstore_required_permissions\">Permisos necesarios</string>\n    <string name=\"playstore_optional_permissions\">Permisos opcionales</string>\n    <string name=\"playstore_permission_location_information\">Información de la ubicación: Se necesita para mostrar el mapa del evento en la ubicación del usuario.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">دستیار شما برای پیمایش I/O، چه به‌صورت حضوری شرکت داشته باشید چه از راه دور.</string>\n\n    <string name=\"playstore_change\">به‌روزرسانی‌شده برای Google I/O 2018‏\\n• رزرو صندلی برای رویدادها جلوتر از زما‌ن‌بندی\\n• مطالعه اطلاعات مهم درباره «رویداد»، جزئیات «سفر» و سوالات متداول.</string>\n    <string name=\"playstore_required_permissions\">مجوزهای لازم</string>\n    <string name=\"playstore_optional_permissions\">مجوزهای اختیاری</string>\n    <string name=\"playstore_permission_location_information\">اطلاعات مکان: برای نشان دادن نقشه محل برگزاری در اطراف مکان کاربر نیاز است.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Votre copilote dans I/O, que vous y assistiez en personne ou à distance.</string>\n\n    <string name=\"playstore_change\">Mise à jour pour Google I/O 2018\\n• Réservez des places à des événements en avance\\n• Consultez les informations importantes sur l\\'événement, les détails relatifs aux trajets et la FAQ.</string>\n    <string name=\"playstore_required_permissions\">Autorisations requises</string>\n    <string name=\"playstore_optional_permissions\">Autorisations facultatives</string>\n    <string name=\"playstore_permission_location_information\">Données de localisation : nécessaire pour afficher le plan du site autour de l\\'emplacement de l\\'utilisateur.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-fr-rCH/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Votre copilote dans I/O, que vous y assistiez en personne ou à distance.</string>\n\n    <string name=\"playstore_change\">Mise à jour pour Google I/O 2018\\n• Réservez des places à des événements en avance\\n• Consultez les informations importantes sur l\\'événement, les détails relatifs aux trajets et la FAQ.</string>\n    <string name=\"playstore_required_permissions\">Autorisations requises</string>\n    <string name=\"playstore_optional_permissions\">Autorisations facultatives</string>\n    <string name=\"playstore_permission_location_information\">Données de localisation : nécessaire pour afficher le plan du site autour de l\\'emplacement de l\\'utilisateur.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-gsw/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Ihr Co-Pilot für die Navigation auf der I/O – vor Ort oder per Fernzugriff.</string>\n\n    <string name=\"playstore_change\">Aktualisiert für Google I/O 2018\\n• Vorab-Reservierung von Plätzen für Veranstaltungen\\n• Lesen Sie die wichtigen Informationen zur Veranstaltung, Reisedetails und FAQ.</string>\n    <string name=\"playstore_required_permissions\">Erforderliche Berechtigung</string>\n    <string name=\"playstore_optional_permissions\">Optionale Berechtigungen</string>\n    <string name=\"playstore_permission_location_information\">Standortinformationen: werden benötigt, um die Karte des Veranstaltungsorts entsprechend der Position des Nutzers anzuzeigen.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Il tuo co-pilota esplorerà I/O, che tu partecipi di persona o da remoto.</string>\n\n    <string name=\"playstore_change\">Aggiornamento per Google I/O 2018\\n• Prenota in anticipo posti per gli eventi\\n• Leggi le informazioni importanti nelle sezioni Evento, Dettagli di viaggio e Domande frequenti.</string>\n    <string name=\"playstore_required_permissions\">Autorizzazioni obbligatorie</string>\n    <string name=\"playstore_optional_permissions\">Autorizzazioni facoltative</string>\n    <string name=\"playstore_permission_location_information\">Informazioni sulla posizione: necessarie per mostrare la mappa del luogo dell\\'evento in base alla posizione dell\\'utente.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">現地での参加、リモートでの参加を問わず、I/O をナビゲートしてくれるアシスタントです。</string>\n\n    <string name=\"playstore_change\">Google I/O 2018 用の更新\\n• イベントの座席を事前に予約する\\n• イベント、来場方法の詳細、よくある質問に関する重要な情報を見る</string>\n    <string name=\"playstore_required_permissions\">必要な権限</string>\n    <string name=\"playstore_optional_permissions\">オプションの権限</string>\n    <string name=\"playstore_permission_location_information\">位置情報: ユーザーの現在地周辺の会場の地図を表示するために必要です。</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">직접 참석하거나 온라인으로 참여 시 이 앱으로 I/O를 둘러볼 수 있습니다.</string>\n\n    <string name=\"playstore_change\">Google I/O 2018에 맞게 업데이트되었습니다.\\n• 일정보다 앞서 이벤트 좌석 예약\\n• 이벤트, 이동 정보, FAQ에 대한 중요 정보 읽기</string>\n    <string name=\"playstore_required_permissions\">필수 권한</string>\n    <string name=\"playstore_optional_permissions\">선택 권한</string>\n    <string name=\"playstore_permission_location_information\">위치 정보: 사용자 위치 주변의 이벤트 장소 지도를 표시하는 데 필요합니다.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-ln/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Votre copilote dans I/O, que vous y assistiez en personne ou à distance.</string>\n\n    <string name=\"playstore_change\">Mise à jour pour Google I/O 2018\\n• Réservez des places à des événements en avance\\n• Consultez les informations importantes sur l\\'événement, les détails relatifs aux trajets et la FAQ.</string>\n    <string name=\"playstore_required_permissions\">Autorisations requises</string>\n    <string name=\"playstore_optional_permissions\">Autorisations facultatives</string>\n    <string name=\"playstore_permission_location_information\">Données de localisation : nécessaire pour afficher le plan du site autour de l\\'emplacement de l\\'utilisateur.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Seu copiloto para navegar pelo I/O, seja pessoal ou remotamente.</string>\n\n    <string name=\"playstore_change\">Atualizado para o Google I/O 2018\\n• Reserve assentos em eventos antecipadamente\\n• Leia informações importantes sobre o evento, detalhes da viagem e perguntas frequentes.</string>\n    <string name=\"playstore_required_permissions\">Permissões necessárias</string>\n    <string name=\"playstore_optional_permissions\">Permissões opcionais</string>\n    <string name=\"playstore_permission_location_information\">Informações de local: permissão necessária para mostrar o mapa do local próximo ao usuário.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Seu copiloto para navegar pelo I/O, seja pessoal ou remotamente.</string>\n\n    <string name=\"playstore_change\">Atualizado para o Google I/O 2018\\n• Reserve assentos em eventos antecipadamente\\n• Leia informações importantes sobre o evento, detalhes da viagem e perguntas frequentes.</string>\n    <string name=\"playstore_required_permissions\">Permissões necessárias</string>\n    <string name=\"playstore_optional_permissions\">Permissões opcionais</string>\n    <string name=\"playstore_permission_location_information\">Informações de local: permissão necessária para mostrar o mapa do local próximo ao usuário.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Официальное приложение Google I/O 2018 – ваш гид по мероприятиям фестиваля.</string>\n\n    <string name=\"playstore_change\">Добавлены сведения о фестивале Google I/O 2018 года.\\n• Есть возможность заранее забронировать билеты на интересующие вас мероприятия.\\n• Можно ознакомиться с информацией о фестивале и месте его проведения, узнать как туда добраться, а также найти ответы на часто задаваемые вопросы.</string>\n    <string name=\"playstore_required_permissions\">Необходимые разрешения</string>\n    <string name=\"playstore_optional_permissions\">Дополнительные разрешения</string>\n    <string name=\"playstore_permission_location_information\">Чтобы мы могли создать для вас карту, откройте приложению доступ к местоположению.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-th/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">ผู้ช่วยในการนำทางไปยัง I/O ไม่ว่าคุณจะมาด้วยตนเองหรือเข้าร่วมจากระยะไกล</string>\n\n    <string name=\"playstore_change\">อัปเดตสำหรับ Google I/O 2018\\n• จองที่นั่งก่อนกิจกรรมจะเริ่มขึ้น\\n• อ่านข้อมูลสำคัญเกี่ยวกับกิจกรรม รายละเอียดการเดินทาง และคำถามที่พบบ่อย</string>\n    <string name=\"playstore_required_permissions\">สิทธิ์ที่จำเป็น</string>\n    <string name=\"playstore_optional_permissions\">สิทธิ์ที่ไม่บังคับ</string>\n    <string name=\"playstore_permission_location_information\">ข้อมูลตำแหน่งที่ตั้ง: จำเป็นต้องใช้ในการแสดงแผนที่รอบๆ ตำแหน่งที่ตั้งของผู้ใช้</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-vi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">Người đồng hành của bạn sẽ điều hướng I/O, cho dù bạn tham gia trực tiếp hay từ xa.</string>\n\n    <string name=\"playstore_change\">Cập nhật cho Google I/O 2018\\n• Đặt chỗ cho sự kiện trước lịch tổ chức\\n• Đọc thông tin quan trọng về Sự kiện, Thông tin di chuyển và Câu hỏi thường gặp.</string>\n    <string name=\"playstore_required_permissions\">Các quyền bắt buộc</string>\n    <string name=\"playstore_optional_permissions\">Các quyền tùy chọn</string>\n    <string name=\"playstore_permission_location_information\">Thông tin vị trí: Cần thiết để hiển thị bản đồ địa điểm xung quanh vị trí của người dùng.</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-zh/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">无论您是亲临会议还是远程参加，都可以可协助您了解 I/O 大会。</string>\n\n    <string name=\"playstore_change\">更新 2018 年 Google I/O 大会相关信息\\n• 提前预约活动席位\\n• 了解有关活动的重要信息、交通方式详情和常见问题解答。</string>\n    <string name=\"playstore_required_permissions\">所需权限</string>\n    <string name=\"playstore_optional_permissions\">可选权限</string>\n    <string name=\"playstore_permission_location_information\">位置信息：需要获取位置信息，以便显示用户所在位置周围的场地地图。</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">无论您是亲临会议还是远程参加，都可以可协助您了解 I/O 大会。</string>\n\n    <string name=\"playstore_change\">更新 2018 年 Google I/O 大会相关信息\\n• 提前预约活动席位\\n• 了解有关活动的重要信息、交通方式详情和常见问题解答。</string>\n    <string name=\"playstore_required_permissions\">所需权限</string>\n    <string name=\"playstore_optional_permissions\">可选权限</string>\n    <string name=\"playstore_permission_location_information\">位置信息：需要获取位置信息，以便显示用户所在位置周围的场地地图。</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-zh-rHK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">不論是親臨 I/O 大會現場或以遠端方式參加，這款應用程式都是你的最佳導航幫手。</string>\n\n    <string name=\"playstore_change\">更新 2018 年 Google I/O 大會相關訊息\\n• 可事先預約活動席位\\n• 可查看有關大會活動的重要資訊、交通方式詳細資訊和常見問題。</string>\n    <string name=\"playstore_required_permissions\">必要權限</string>\n    <string name=\"playstore_optional_permissions\">選用權限</string>\n    <string name=\"playstore_permission_location_information\">位置資訊：授予這項權限後，應用程式即可顯示使用者所在位置一帶的會場地圖。</string>\n</resources>\n"
  },
  {
    "path": "playstore/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n\n    <string name=\"playstore_tagline\">不論是親臨 I/O 大會現場或以遠端方式參加，這款應用程式都是你的最佳導航幫手。</string>\n\n    <string name=\"playstore_change\">更新 2018 年 Google I/O 大會相關訊息\\n• 可事先預約活動席位\\n• 可查看有關大會活動的重要資訊、交通方式詳細資訊和常見問題。</string>\n    <string name=\"playstore_required_permissions\">必要權限</string>\n    <string name=\"playstore_optional_permissions\">選用權限</string>\n    <string name=\"playstore_permission_location_information\">位置資訊：授予這項權限後，應用程式即可顯示使用者所在位置一帶的會場地圖。</string>\n</resources>\n"
  },
  {
    "path": "playstore/storelisting_zh-TW.txt",
    "content": "Your store listing text is now localized. To make this available on Google Play store, you will need to submit this content on Google Developer Console.\n******************** Short description in locale <zh-TW> ********************\n您的I/O大會導航助手，不管您是親臨現場或遠端參與都能為您提供幫助。\n******************** Title in locale <zh-TW> ********************\nGoogle I/O 2016\n******************** Full description in locale <zh-TW> ********************\nGoogle I/O 2016官方應用程式旨在成為您的I/O大會導航助手，不管您是親臨現場或遠端參與都能為您提供幫助。 \n-- 探索會議日程，瞭解主題、話題和演講者的詳細資訊 \n-- 新增活動到個性化的日程表 \n-- 在日程表中的活動開始之前收到提醒 \n-- 觀看主題演講和活動現場直播 \n-- 在您的所有裝置和I/O網站之間同步您的日程表 \n-- 使用向量式大會地圖為自己指引路線 \n-- 關注I/O相關的公共社交對話 \n-- 在影片中檢視往年的I/O內容\n\n*親臨大會現場參與者專享：* \n- 利用在大會前預先設定的WiFi網路\n\n這款應用程式針對各種形狀和尺寸的手機及平板電腦進行了最佳化。\n應用程式的原始程式碼將在I/O後不久發佈。\n\nv4.0：Google I/O 2016更新"
  },
  {
    "path": "settings.gradle.kts",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninclude(\n  \":mobile\",\n  \":shared\",\n  \":test-shared\",\n  \":model\",\n  \":androidTest-shared\",\n  \"ar\",\n  \"benchmark\",\n  \"depconstraints\",\n  \":macrobenchmark\"\n)\n"
  },
  {
    "path": "shared/build.gradle.kts",
    "content": "/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id(\"com.android.library\")\n    kotlin(\"android\")\n    kotlin(\"kapt\")\n    id(\"dagger.hilt.android.plugin\")\n}\n\nandroid {\n    compileSdk = Versions.COMPILE_SDK\n    defaultConfig {\n        minSdk = Versions.MIN_SDK\n        targetSdk = Versions.TARGET_SDK\n        testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n\n        buildConfigField(\"String\", \"CONFERENCE_TIMEZONE\", project.properties[\"conference_timezone\"] as String)\n        buildConfigField(\"String\", \"CONFERENCE_DAY1_START\", project.properties[\"conference_day1_start\"] as String)\n        buildConfigField(\"String\", \"CONFERENCE_DAY1_END\", project.properties[\"conference_day1_end\"] as String)\n        buildConfigField(\"String\", \"CONFERENCE_DAY2_START\", project.properties[\"conference_day2_start\"] as String)\n        buildConfigField(\"String\", \"CONFERENCE_DAY2_END\", project.properties[\"conference_day2_end\"] as String)\n        buildConfigField(\"String\", \"CONFERENCE_DAY3_START\", project.properties[\"conference_day3_start\"] as String)\n        buildConfigField(\"String\", \"CONFERENCE_DAY3_END\", project.properties[\"conference_day3_end\"] as String)\n\n        buildConfigField(\"String\", \"CONFERENCE_DAY1_AFTERHOURS_START\", project.properties[\"conference_day1_afterhours_start\"] as String)\n        buildConfigField(\"String\", \"CONFERENCE_DAY2_CONCERT_START\", project.properties[\"conference_day2_concert_start\"] as String)\n\n        buildConfigField(\n            \"String\",\n            \"BOOTSTRAP_CONF_DATA_FILENAME\", project.properties[\"bootstrap_conference_data_filename\"] as String\n        )\n\n        buildConfigField(\n            \"String\",\n            \"CONFERENCE_WIFI_OFFERING_START\", project.properties[\"conference_wifi_offering_start\"] as String\n        )\n\n        consumerProguardFiles(\"consumer-proguard-rules.pro\")\n\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments[\"room.incremental\"] = \"true\"\n            }\n        }\n    }\n\n    buildTypes {\n        getByName(\"release\") {\n            buildConfigField(\"String\", \"REGISTRATION_ENDPOINT_URL\", \"\\\"https://events-d07ac.appspot.com/_ah/api/registration/v1/register\\\"\")\n            buildConfigField(\"String\", \"CONFERENCE_DATA_URL\", \"\\\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus-prod/o/sessions.json?alt=media&token=89140adf-e228-45a5-9ae3-8ed01547166a\\\"\")\n        }\n        getByName(\"debug\") {\n            buildConfigField(\"String\", \"REGISTRATION_ENDPOINT_URL\", \"\\\"https://events-dev-62d2e.appspot.com/_ah/api/registration/v1/register\\\"\")\n            buildConfigField(\"String\", \"CONFERENCE_DATA_URL\", \"\\\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/sessions.json?alt=media&token=019af2ec-9fd1-408e-9b86-891e4f66e674\\\"\")\n        }\n        maybeCreate(\"staging\")\n        getByName(\"staging\") {\n            initWith(getByName(\"debug\"))\n\n            // Specifies a sorted list of fallback build types that the\n            // plugin should try to use when a dependency does not include a\n            // \"staging\" build type.\n            // Used with :test-shared, which doesn't have a staging variant.\n            matchingFallbacks += listOf(\"debug\")\n        }\n        maybeCreate(\"benchmark\")\n        getByName(\"benchmark\") {\n            initWith(getByName(\"staging\"))\n            // Specifies a sorted list of fallback build types that the\n            // plugin should try to use when a dependency does not include a\n            // \"staging\" build type.\n            // Used with :test-shared, which doesn't have a staging variant.\n            matchingFallbacks += listOf(\"staging\", \"debug\")\n        }\n    }\n\n    lint {\n        disable += listOf(\"InvalidPackage\", \"MissingTranslation\")\n        // Version changes are beyond our control, so don't warn. The IDE will still mark these.\n        disable += \"GradleDependency\"\n        // Timber needs to update to new Lint API\n        disable += \"ObsoleteLintCustomCheck\"\n    }\n\n    // debug and release variants share the same source dir\n    sourceSets {\n        getByName(\"debug\") {\n            java.srcDir(\"src/debugRelease/java\")\n        }\n        getByName(\"release\") {\n            java.srcDir(\"src/debugRelease/java\")\n        }\n        getByName(\"benchmark\") {\n            java.srcDir(\"src/staging/java\")\n            res.srcDir(\"src/staging/res\")\n        }\n    }\n\n    // Some libs (such as androidx.core:core-ktx 1.2.0 and newer) require Java 8\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_1_8\n        targetCompatibility = JavaVersion.VERSION_1_8\n    }\n\n    // To avoid the compile error: \"Cannot inline bytecode built with JVM target 1.8\n    // into bytecode that is being built with JVM target 1.6\"\n    kotlinOptions {\n        val options = this as org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions\n        options.jvmTarget = \"1.8\"\n    }\n}\n\ndependencies {\n    api(platform(project(\":depconstraints\")))\n    kapt(platform(project(\":depconstraints\")))\n    api(project(\":model\"))\n    implementation(fileTree(mapOf(\"dir\" to \"libs\", \"include\" to listOf(\"*.jar\"))))\n    testImplementation(project(\":test-shared\"))\n    testImplementation(project(\":androidTest-shared\"))\n\n    // AppCompat\n    implementation(Libs.APPCOMPAT)\n\n    // Architecture Components\n    implementation(Libs.LIFECYCLE_LIVE_DATA_KTX)\n    implementation(Libs.LIFECYCLE_VIEW_MODEL_KTX)\n    implementation(Libs.ROOM_KTX)\n    implementation(Libs.ROOM_RUNTIME)\n    kapt(Libs.ROOM_COMPILER)\n    testImplementation(Libs.ARCH_TESTING)\n\n    // Maps\n    api(Libs.GOOGLE_MAP_UTILS_KTX) {\n        exclude(group = \"com.google.android.gms\")\n    }\n    api(Libs.GOOGLE_PLAY_SERVICES_MAPS_KTX)\n\n    // Utils\n    api(Libs.TIMBER)\n    implementation(Libs.GSON)\n    implementation(Libs.CORE_KTX)\n\n    // OkHttp\n    implementation(Libs.OKHTTP)\n    implementation(Libs.OKHTTP_LOGGING_INTERCEPTOR)\n\n    // Kotlin\n    implementation(Libs.KOTLIN_STDLIB)\n\n    // Coroutines\n    api(Libs.COROUTINES)\n    testImplementation(Libs.COROUTINES_TEST)\n\n    // Dagger Hilt\n    implementation(Libs.HILT_ANDROID)\n    kapt(Libs.HILT_COMPILER)\n\n    // DataStore\n    implementation(Libs.DATA_STORE_PREFERENCES)\n\n    // Firebase\n    api(Libs.FIREBASE_AUTH)\n    api(Libs.FIREBASE_CONFIG)\n    api(Libs.FIREBASE_ANALYTICS)\n    api(Libs.FIREBASE_FIRESTORE)\n    api(Libs.FIREBASE_FUNCTIONS)\n    api(Libs.FIREBASE_MESSAGING)\n\n    // Has to be replaced to avoid compile / runtime conflicts between okhttp and firestore\n    api(Libs.OKIO)\n\n    // ThreeTenBP for the shared module only. Date and time API for Java.\n    testImplementation(Libs.THREETENBP)\n    compileOnly(\"org.threeten:threetenbp:${Versions.THREETENBP}:no-tzdb\")\n\n    // Unit tests\n    testImplementation(Libs.JUNIT)\n    testImplementation(Libs.HAMCREST)\n    testImplementation(Libs.MOCKITO_CORE)\n    testImplementation(Libs.MOCKITO_KOTLIN)\n\n    // unit tests livedata\n    testImplementation(Libs.ARCH_TESTING)\n}\n\napply(plugin = \"com.google.gms.google-services\")\n"
  },
  {
    "path": "shared/consumer-proguard-rules.pro",
    "content": "# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# ProGuard configuration for the shared module\n# The configuration in this file is used among all the modules depending on this library module.\n\n# Dagger2\n-dontwarn com.google.errorprone.annotations.**\n\n# OkHttp3\n-dontwarn okhttp3.**\n-dontwarn okio.**\n-dontwarn javax.annotation.**\n-dontwarn org.conscrypt.**\n# A resource is loaded with a relative path so the package of this class must be preserved.\n-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase\n\n# Firebase\n-dontwarn retrofit2.Call\n\n# Databinding CardViewBindingAdapter\n-dontwarn androidx.cardview.widget.CardView\n\n-keepclassmembers class com.google.samples.apps.iosched.model.** { <fields>; }\n"
  },
  {
    "path": "shared/google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_number\": \"447780894619\",\n    \"firebase_url\": \"https://events-dev-62d2e.firebaseio.com\",\n    \"project_id\": \"events-dev-62d2e\",\n    \"storage_bucket\": \"events-dev-62d2e.appspot.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:447780894619:android:f642e16a06f96c5c\",\n        \"android_client_info\": {\n          \"package_name\": \"com.google.samples.apps.iosched.shared\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"447780894619-an6s48nvj18f25v4nc5te03q2c4g9dqf.apps.googleusercontent.com\",\n          \"client_type\": 3\n        },\n        {\n          \"client_id\": \"447780894619-nko1el7a76etvlbn1vhc3b03tmpbjs5g.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.google.samples.apps.iosched.shared\",\n            \"certificate_hash\": \"e499e9081b4ddf63788f4dfb4e7018c54f93188b\"\n          }\n        },\n        {\n          \"client_id\": \"447780894619-tbe57ou9oflnoic5scbc8mj8tnnj9o2r.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyC_LbkKaCrAaBJSBp7DbDZgwLLR3BYUJV0\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"appinvite_service\": {\n          \"status\": 2,\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"447780894619-an6s48nvj18f25v4nc5te03q2c4g9dqf.apps.googleusercontent.com\",\n              \"client_type\": 3\n            },\n            {\n              \"client_id\": \"447780894619-c9ovo169ue58khaq7pmj9pvvkbmjt6l2.apps.googleusercontent.com\",\n              \"client_type\": 2,\n              \"ios_info\": {\n                \"bundle_id\": \"com.google.iosched.dev\"\n              }\n            }\n          ]\n        },\n        \"ads_service\": {\n          \"status\": 2\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}"
  },
  {
    "path": "shared/src/debugRelease/java/com/google/samples/apps/iosched/shared/di/SharedModule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.di\n\nimport android.content.Context\nimport com.google.firebase.firestore.FirebaseFirestore\nimport com.google.firebase.firestore.ktx.firestore\nimport com.google.firebase.firestore.ktx.firestoreSettings\nimport com.google.firebase.functions.FirebaseFunctions\nimport com.google.firebase.functions.ktx.functions\nimport com.google.firebase.ktx.Firebase\nimport com.google.firebase.remoteconfig.FirebaseRemoteConfig\nimport com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings\nimport com.google.firebase.remoteconfig.ktx.remoteConfig\nimport com.google.firebase.remoteconfig.ktx.remoteConfigSettings\nimport com.google.samples.apps.iosched.shared.BuildConfig\nimport com.google.samples.apps.iosched.shared.R\nimport com.google.samples.apps.iosched.shared.data.BootstrapConferenceDataSource\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataSource\nimport com.google.samples.apps.iosched.shared.data.NetworkConferenceDataSource\nimport com.google.samples.apps.iosched.shared.data.ar.ArDebugFlagEndpoint\nimport com.google.samples.apps.iosched.shared.data.ar.DefaultArDebugFlagEndpoint\nimport com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource\nimport com.google.samples.apps.iosched.shared.data.config.RemoteAppConfigDataSource\nimport com.google.samples.apps.iosched.shared.data.db.AppDatabase\nimport com.google.samples.apps.iosched.shared.data.feed.AnnouncementDataSource\nimport com.google.samples.apps.iosched.shared.data.feed.DefaultFeedRepository\nimport com.google.samples.apps.iosched.shared.data.feed.FeedRepository\nimport com.google.samples.apps.iosched.shared.data.feed.FirestoreAnnouncementDataSource\nimport com.google.samples.apps.iosched.shared.data.feed.FirestoreMomentDataSource\nimport com.google.samples.apps.iosched.shared.data.feed.MomentDataSource\nimport com.google.samples.apps.iosched.shared.data.feedback.DefaultFeedbackEndpoint\nimport com.google.samples.apps.iosched.shared.data.feedback.FeedbackEndpoint\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.session.SessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventDataSource\nimport com.google.samples.apps.iosched.shared.domain.search.FtsMatchStrategy\nimport com.google.samples.apps.iosched.shared.domain.search.SessionTextMatchStrategy\nimport com.google.samples.apps.iosched.shared.domain.search.SimpleMatchStrategy\nimport com.google.samples.apps.iosched.shared.fcm.FcmTopicSubscriber\nimport com.google.samples.apps.iosched.shared.fcm.TopicSubscriber\nimport com.google.samples.apps.iosched.shared.time.DefaultTimeProvider\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport com.google.samples.apps.iosched.shared.util.NetworkUtils\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Named\nimport javax.inject.Singleton\n\n/**\n * Module where classes created in the shared module are created.\n */\n@InstallIn(SingletonComponent::class)\n@Module\nclass SharedModule {\n\n// Define the data source implementations that should be used. All data sources are singletons.\n\n    @Singleton\n    @Provides\n    @Named(\"remoteConfDatasource\")\n    fun provideConferenceDataSource(\n        @ApplicationContext context: Context,\n        networkUtils: NetworkUtils\n    ): ConferenceDataSource {\n        return NetworkConferenceDataSource(context, networkUtils)\n    }\n\n    @Singleton\n    @Provides\n    @Named(\"bootstrapConfDataSource\")\n    fun provideBootstrapRemoteSessionDataSource(): ConferenceDataSource {\n        return BootstrapConferenceDataSource\n    }\n\n    @Singleton\n    @Provides\n    fun provideConferenceDataRepository(\n        @Named(\"remoteConfDatasource\") remoteDataSource: ConferenceDataSource,\n        @Named(\"bootstrapConfDataSource\") boostrapDataSource: ConferenceDataSource,\n        appDatabase: AppDatabase\n    ): ConferenceDataRepository {\n        return ConferenceDataRepository(remoteDataSource, boostrapDataSource, appDatabase)\n    }\n\n    @Singleton\n    @Provides\n    fun provideAnnouncementDataSource(firestore: FirebaseFirestore): AnnouncementDataSource {\n        return FirestoreAnnouncementDataSource(firestore)\n    }\n\n    @Singleton\n    @Provides\n    fun provideMomentsDataSource(firestore: FirebaseFirestore): MomentDataSource {\n        return FirestoreMomentDataSource(firestore)\n    }\n\n    @Singleton\n    @Provides\n    fun provideFeedRepository(\n        dataSource: AnnouncementDataSource,\n        momentsDataSource: MomentDataSource\n    ): FeedRepository {\n        return DefaultFeedRepository(dataSource, momentsDataSource)\n    }\n\n    @Singleton\n    @Provides\n    fun provideSessionRepository(\n        conferenceDataRepository: ConferenceDataRepository\n    ): SessionRepository {\n        return DefaultSessionRepository(conferenceDataRepository)\n    }\n\n    @Singleton\n    @Provides\n    fun provideUserEventDataSource(\n        firestore: FirebaseFirestore,\n        @IoDispatcher ioDispatcher: CoroutineDispatcher\n    ): UserEventDataSource {\n        return FirestoreUserEventDataSource(firestore, ioDispatcher)\n    }\n\n    @Singleton\n    @Provides\n    fun provideFeedbackEndpoint(functions: FirebaseFunctions): FeedbackEndpoint {\n        return DefaultFeedbackEndpoint(functions)\n    }\n\n    @Singleton\n    @Provides\n    fun provideSessionAndUserEventRepository(\n        userEventDataSource: UserEventDataSource,\n        sessionRepository: SessionRepository\n    ): SessionAndUserEventRepository {\n        return DefaultSessionAndUserEventRepository(\n            userEventDataSource,\n            sessionRepository\n        )\n    }\n\n    @Singleton\n    @Provides\n    fun provideFirebaseFireStore(): FirebaseFirestore {\n        return Firebase.firestore.apply {\n            // This is to enable the offline data\n            // https://firebase.google.com/docs/firestore/manage-data/enable-offline\n            firestoreSettings = firestoreSettings { isPersistenceEnabled = true }\n        }\n    }\n\n    @Singleton\n    @Provides\n    fun provideFirebaseFunctions(): FirebaseFunctions {\n        return Firebase.functions\n    }\n\n    @Singleton\n    @Provides\n    fun provideArDebugFlagEndpoint(functions: FirebaseFunctions): ArDebugFlagEndpoint {\n        return DefaultArDebugFlagEndpoint(functions)\n    }\n\n    @Singleton\n    @Provides\n    fun provideTopicSubscriber(): TopicSubscriber {\n        return FcmTopicSubscriber()\n    }\n\n    @Singleton\n    @Provides\n    fun provideFirebaseRemoteConfigSettings(): FirebaseRemoteConfigSettings {\n        return if (BuildConfig.DEBUG) {\n            remoteConfigSettings { minimumFetchIntervalInSeconds = 0 }\n        } else {\n            remoteConfigSettings { }\n        }\n    }\n\n    @Singleton\n    @Provides\n    fun provideFirebaseRemoteConfig(\n        configSettings: FirebaseRemoteConfigSettings\n    ): FirebaseRemoteConfig {\n        return Firebase.remoteConfig.apply {\n            setConfigSettingsAsync(configSettings)\n            setDefaultsAsync(R.xml.remote_config_defaults)\n        }\n    }\n\n    @Singleton\n    @Provides\n    fun provideAppConfigDataSource(\n        remoteConfig: FirebaseRemoteConfig,\n        configSettings: FirebaseRemoteConfigSettings,\n        @IoDispatcher ioDispatcher: CoroutineDispatcher\n    ): AppConfigDataSource {\n        return RemoteAppConfigDataSource(remoteConfig, configSettings, ioDispatcher)\n    }\n\n    @Singleton\n    @Provides\n    fun provideTimeProvider(): TimeProvider {\n        return DefaultTimeProvider\n    }\n\n    @Singleton\n    @Provides\n    fun provideSessionTextMatchStrategy(\n        @SearchUsingRoomEnabledFlag useRoom: Boolean,\n        appDatabase: AppDatabase\n    ): SessionTextMatchStrategy {\n        return if (useRoom) FtsMatchStrategy(appDatabase) else SimpleMatchStrategy\n    }\n}\n"
  },
  {
    "path": "shared/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.google.samples.apps.iosched.shared\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n\n    <application android:label=\"@string/app_name\">\n\n        <service\n            android:name=\".data.job.ConferenceDataService\"\n            android:permission=\"android.permission.BIND_JOB_SERVICE\" />\n        <service\n            android:name=\".fcm.IoschedFirebaseMessagingService\"\n            android:exported=\"false\">\n            <intent-filter>\n                <action android:name=\"com.google.firebase.MESSAGING_EVENT\" />\n            </intent-filter>\n        </service>\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/analytics/AnalyticsHelper.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.analytics\n\nimport android.app.Activity\n\n/** Analytics API surface */\ninterface AnalyticsHelper {\n    /** Record a screen view */\n    fun sendScreenView(screenName: String, activity: Activity)\n\n    /** Record a UI event, e.g. user clicks a button */\n    fun logUiEvent(itemId: String, action: String)\n\n    /** Set the user signed in property */\n    fun setUserSignedIn(isSignedIn: Boolean)\n\n    /** Set the user registered property */\n    fun setUserRegistered(isRegistered: Boolean)\n}\n\n/** Actions that should be used when sending analytics events */\nobject AnalyticsActions {\n    // UI Actions\n    const val STARRED = \"Bookmarked\"\n    const val CLICK = \"Clicked\"\n    const val RESERVE = \"Reserved\"\n    const val RESERVE_FAILED = \"Reserved (Failed)\"\n    const val RES_CANCEL_FAILED = \"Reservation Cancellation (Failed)\"\n    const val RES_CANCEL = \"Reservation Cancellation\"\n\n    const val MAP_MARKER_SELECT = \"Selected Map Marker\"\n    const val MAP_MARKER_DETAILS = \"Viewed Map Marker Details\"\n    const val WIFI_CONNECT = \"Connected to Wifi\"\n    const val YOUTUBE_LINK = \"Youtube link click\"\n    const val SEARCH_QUERY_SUBMIT = \"Submitted search query\"\n    const val SEARCH_RESULT_CLICK = \"Clicked on search result\"\n\n    const val HOME_TO_MAP = \"Home to Map transition\"\n    const val HOME_TO_SCHEDULE = \"Home to Schedule transition\"\n    const val HOME_TO_SESSION_DETAIL = \"Home to Session Detail transition\"\n    const val HOME_TO_SIGN_IN = \"Home to Sign In transition\"\n    const val HOME_TO_LIVESTREAM = \"Home to Live stream transition\"\n\n    const val HOME_TO_ANNOUNCEMENTS = \"Home to Announcements transition\"\n\n    // Settings Actions\n    const val ENABLE = \"Enabled\"\n    const val DISABLE = \"Disabled\"\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/BootstrapConferenceDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.shared.BuildConfig\n\n/**\n * Loads bootstrap data file from resources and parses it.\n */\nobject BootstrapConferenceDataSource : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        throw Exception(\"Bootstrap data source doesn't have remote data\")\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return loadAndParseBootstrapData()\n    }\n\n    fun loadAndParseBootstrapData(): ConferenceData {\n\n        val conferenceDataStream = this.javaClass.classLoader!!\n            .getResource(BuildConfig.BOOTSTRAP_CONF_DATA_FILENAME).openStream()\n\n        return ConferenceDataJsonParser.parseConferenceData(conferenceDataStream)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/ConferenceDataDownloader.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport android.content.Context\nimport androidx.annotation.WorkerThread\nimport com.google.samples.apps.iosched.shared.BuildConfig\nimport java.io.IOException\nimport okhttp3.Cache\nimport okhttp3.CacheControl\nimport okhttp3.HttpUrl\nimport okhttp3.OkHttpClient\nimport okhttp3.Protocol\nimport okhttp3.Request\nimport okhttp3.Response\nimport okhttp3.logging.HttpLoggingInterceptor\nimport timber.log.Timber\n\n/**\n * Downloads session data.\n */\nclass ConferenceDataDownloader(\n    private val context: Context,\n    private val bootstrapVersion: String\n) {\n\n    private val client: OkHttpClient by lazy {\n        val logInterceptor = HttpLoggingInterceptor()\n        logInterceptor.level = HttpLoggingInterceptor.Level.BASIC\n\n        val protocols = arrayListOf(Protocol.HTTP_1_1, Protocol.HTTP_2) // Support h2\n\n        val cacheSize = 2L * 1024 * 1024 // 2 MiB\n        val cacheDir = context.getDir(\"conference_data\", Context.MODE_PRIVATE)\n        val cache = Cache(cacheDir, cacheSize)\n\n        OkHttpClient.Builder()\n            .protocols(protocols)\n            .cache(cache)\n            .addInterceptor(logInterceptor)\n            .build()\n    }\n\n    @Throws(IOException::class)\n    @WorkerThread\n    fun fetch(): Response {\n\n        val url = BuildConfig.CONFERENCE_DATA_URL\n\n        Timber.d(\"Download started from: $url\")\n\n        val httpBuilder = HttpUrl.parse(url)?.newBuilder()\n            ?: throw IllegalArgumentException(\"Malformed Session data URL\")\n        httpBuilder.addQueryParameter(\"bootstrapVersion\", bootstrapVersion)\n\n        val request = Request.Builder()\n            .url(httpBuilder.build())\n            .cacheControl(CacheControl.FORCE_NETWORK)\n            .build()\n\n        // Blocking call\n        val response = client.newCall(request).execute()\n\n        Timber.d(\"Downloaded bytes: ${response.body()?.contentLength() ?: 0}\")\n\n        return response ?: throw IOException(\"Network error\")\n    }\n\n    fun fetchCached(): Response? {\n\n        val url = BuildConfig.CONFERENCE_DATA_URL\n\n        Timber.d(\"Fetching cached file for url: $url\")\n\n        val httpBuilder = HttpUrl.parse(url)?.newBuilder()\n            ?: throw IllegalArgumentException(\"Malformed Session data URL\")\n        httpBuilder.addQueryParameter(\"bootstrapVersion\", bootstrapVersion)\n\n        val request = Request.Builder()\n            .url(httpBuilder.build())\n            .cacheControl(CacheControl.FORCE_CACHE)\n            .build()\n\n        // Blocking call\n        val response = client.newCall(request).execute()\n\n        Timber.d(\"Loaded cache. Bytes: ${response.body()?.contentLength() ?: 0}\")\n        if (response.code() == 504) {\n            return null\n        }\n        return response ?: throw IOException(\"Network error\")\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/ConferenceDataJsonParser.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport androidx.annotation.Keep\nimport com.google.gson.GsonBuilder\nimport com.google.gson.JsonIOException\nimport com.google.gson.JsonSyntaxException\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.model.Room\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionType\nimport com.google.samples.apps.iosched.model.SessionType.KEYNOTE\nimport com.google.samples.apps.iosched.model.SessionType.SESSION\nimport com.google.samples.apps.iosched.model.Speaker\nimport com.google.samples.apps.iosched.model.Tag\nimport com.google.samples.apps.iosched.shared.data.session.json.CodelabDeserializer\nimport com.google.samples.apps.iosched.shared.data.session.json.CodelabTemp\nimport com.google.samples.apps.iosched.shared.data.session.json.RoomDeserializer\nimport com.google.samples.apps.iosched.shared.data.session.json.SessionDeserializer\nimport com.google.samples.apps.iosched.shared.data.session.json.SessionTemp\nimport com.google.samples.apps.iosched.shared.data.session.json.SpeakerDeserializer\nimport com.google.samples.apps.iosched.shared.data.session.json.TagDeserializer\nimport java.io.InputStream\n\nobject ConferenceDataJsonParser {\n\n    @Throws(JsonIOException::class, JsonSyntaxException::class)\n    fun parseConferenceData(unprocessedSessionData: InputStream): ConferenceData {\n        val jsonReader = com.google.gson.stream.JsonReader(unprocessedSessionData.reader())\n\n        val gson = GsonBuilder()\n            .registerTypeAdapter(SessionTemp::class.java, SessionDeserializer())\n            .registerTypeAdapter(Tag::class.java, TagDeserializer())\n            .registerTypeAdapter(Speaker::class.java, SpeakerDeserializer())\n            .registerTypeAdapter(Room::class.java, RoomDeserializer())\n            .registerTypeAdapter(CodelabTemp::class.java, CodelabDeserializer())\n            .create()\n\n        val tempData: TempConferenceData = gson.fromJson(jsonReader, TempConferenceData::class.java)\n        return normalize(tempData)\n    }\n\n    /**\n     * Adds nested objects like `session.tags` to `sessions`\n     */\n    private fun normalize(data: TempConferenceData): ConferenceData {\n        val sessions = mutableListOf<Session>()\n        data.sessions.forEach { session: SessionTemp ->\n            val tags = data.tags.filter { it.tagName in session.tagNames }\n            val type = SessionType.fromTags(tags)\n            val displayTags = if (type == SESSION || type == KEYNOTE) {\n                tags.filter { it.category == Tag.CATEGORY_TOPIC }\n            } else {\n                emptyList()\n            }\n            val newSession = Session(\n                id = session.id,\n                startTime = session.startTime,\n                endTime = session.endTime,\n                title = session.title,\n                description = session.description,\n                sessionUrl = session.sessionUrl,\n                isLivestream = session.isLivestream,\n                youTubeUrl = session.youTubeUrl,\n                doryLink = session.doryLink,\n                tags = tags,\n                displayTags = displayTags,\n                speakers = session.speakers.mapNotNull { data.speakers[it] }.toSet(),\n                photoUrl = session.photoUrl,\n                relatedSessions = session.relatedSessions,\n                room = data.rooms.firstOrNull { it.id == session.room }\n            )\n            sessions.add(newSession)\n        }\n\n        val codelabs = mutableListOf<Codelab>()\n        data.codelabs.forEach { codelab: CodelabTemp ->\n            val tags = data.tags.filter {\n                it.category == Tag.CATEGORY_TOPIC && it.tagName in codelab.tagNames\n            }\n            val newCodelab = Codelab(\n                id = codelab.id,\n                title = codelab.title,\n                description = codelab.description,\n                durationMinutes = codelab.durationMinutes,\n                iconUrl = codelab.iconUrl,\n                codelabUrl = codelab.codelabUrl,\n                sortPriority = codelab.sortPriority,\n                tags = tags\n            )\n            codelabs.add(newCodelab)\n        }\n\n        return ConferenceData(\n            sessions = sessions,\n            speakers = data.speakers.values.toList(),\n            rooms = data.rooms,\n            codelabs = codelabs,\n            tags = data.tags,\n            version = data.version\n        )\n    }\n}\n\n/**\n * Temporary data type for conference data where some collections are lists of IDs instead\n * of lists of domain objects.\n */\n@Keep\ndata class TempConferenceData(\n    val sessions: List<SessionTemp>,\n    val speakers: Map<String, Speaker>,\n    val rooms: List<Room>,\n    val codelabs: List<CodelabTemp>,\n    val tags: List<Tag>,\n    val version: Int\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/ConferenceDataRepository.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.shared.data.db.AppDatabase\nimport com.google.samples.apps.iosched.shared.data.db.CodelabFtsEntity\nimport com.google.samples.apps.iosched.shared.data.db.SessionFtsEntity\nimport com.google.samples.apps.iosched.shared.data.db.SpeakerFtsEntity\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport java.io.IOException\nimport javax.inject.Inject\nimport javax.inject.Named\nimport javax.inject.Singleton\n\n/**\n * Single point of access to session data for the presentation layer.\n *\n * The session data is loaded from the bootstrap file.\n */\n@Singleton\nopen class ConferenceDataRepository @Inject constructor(\n    @Named(\"remoteConfDatasource\") private val remoteDataSource: ConferenceDataSource,\n    @Named(\"bootstrapConfDataSource\") private val boostrapDataSource: ConferenceDataSource,\n    private val appDatabase: AppDatabase\n) {\n\n    // In-memory cache of the conference data\n    private var conferenceDataCache: ConferenceData? = null\n\n    val currentConferenceDataVersion: Int\n        get() = conferenceDataCache?.version ?: 0\n\n    var latestException: Exception? = null\n        private set\n\n    var latestUpdateSource: UpdateSource = UpdateSource.NONE\n        private set\n\n    // Using a SharedFlow instead of StateFlow as there isn't an initial value to be emitted\n    private val dataLastUpdatedFlow = MutableSharedFlow<Long>(replay = 1)\n    val dataLastUpdatedObservable: Flow<Long> = dataLastUpdatedFlow\n\n    // Prevents multiple consumers requesting data at the same time\n    private val loadConfDataLock = Any()\n\n    fun refreshCacheWithRemoteConferenceData() {\n        val conferenceData = try {\n            remoteDataSource.getRemoteConferenceData()\n        } catch (e: IOException) {\n            latestException = e\n            throw e\n        }\n        if (conferenceData == null) {\n            val e = Exception(\"Remote returned no conference data\")\n            latestException = e\n            throw e\n        }\n\n        // Network data success!\n        // Update cache\n        synchronized(loadConfDataLock) {\n            conferenceDataCache = conferenceData\n            populateSearchData(conferenceData)\n        }\n\n        // Update meta\n        latestException = null\n        dataLastUpdatedFlow.tryEmit(System.currentTimeMillis())\n        latestUpdateSource = UpdateSource.NETWORK\n        latestException = null\n    }\n\n    fun getOfflineConferenceData(): ConferenceData {\n        synchronized(loadConfDataLock) {\n            val offlineData = conferenceDataCache ?: getCacheOrBootstrapDataAndPopulateSearch()\n            conferenceDataCache = offlineData\n            return offlineData\n        }\n    }\n\n    private fun getCacheOrBootstrapDataAndPopulateSearch(): ConferenceData {\n        val conferenceData = getCacheOrBootstrapData()\n        populateSearchData(conferenceData)\n        return conferenceData\n    }\n\n    private fun getCacheOrBootstrapData(): ConferenceData {\n        // First, try the local cache:\n        var conferenceData = remoteDataSource.getOfflineConferenceData()\n\n        // Cache success!\n        if (conferenceData != null) {\n            latestUpdateSource = UpdateSource.CACHE\n            return conferenceData\n        }\n\n        // Second, use the bootstrap file:\n        conferenceData = boostrapDataSource.getOfflineConferenceData()!!\n        latestUpdateSource = UpdateSource.BOOTSTRAP\n        return conferenceData\n    }\n\n    open fun populateSearchData(conferenceData: ConferenceData) {\n        val sessionFtsEntities = conferenceData.sessions.map { session ->\n            SessionFtsEntity(\n                sessionId = session.id,\n                title = session.title,\n                description = session.description,\n                speakers = session.speakers.joinToString { it.name }\n            )\n        }\n        appDatabase.sessionFtsDao().insertAll(sessionFtsEntities)\n        val speakers = conferenceData.speakers.map {\n            SpeakerFtsEntity(\n                speakerId = it.id,\n                name = it.name,\n                description = it.biography\n            )\n        }\n        appDatabase.speakerFtsDao().insertAll(speakers)\n        val codelabs = conferenceData.codelabs.map {\n            CodelabFtsEntity(\n                codelabId = it.id,\n                title = it.title,\n                description = it.description\n            )\n        }\n        appDatabase.codelabFtsDao().insertAll(codelabs)\n    }\n\n    open fun getConferenceDays(): List<ConferenceDay> = TimeUtils.ConferenceDays\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/ConferenceDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport com.google.samples.apps.iosched.model.ConferenceData\n\ninterface ConferenceDataSource {\n    fun getRemoteConferenceData(): ConferenceData?\n    fun getOfflineConferenceData(): ConferenceData?\n}\n\nenum class UpdateSource {\n    NONE,\n    NETWORK,\n    CACHE,\n    BOOTSTRAP\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/FirestoreExtensions.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport com.google.firebase.firestore.DocumentReference\nimport com.google.firebase.firestore.FirebaseFirestore\n\nfun FirebaseFirestore.document2020(): DocumentReference =\n    // This is a prefix for Firestore document for this year\n    collection(\"google_io_events\").document(\"2020\")\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/NetworkConferenceDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport android.content.Context\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.shared.util.NetworkUtils\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport timber.log.Timber\nimport java.io.IOException\nimport javax.inject.Inject\n\n/**\n * Downloads and parses conference data.\n */\nclass NetworkConferenceDataSource @Inject constructor(\n    @ApplicationContext val context: Context,\n    private val networkUtils: NetworkUtils\n) : ConferenceDataSource {\n\n    override fun getRemoteConferenceData(): ConferenceData? {\n        if (!networkUtils.hasNetworkConnection()) {\n            Timber.d(\"Network not connected\")\n            return null\n        }\n\n        Timber.d(\"Trying to download data from network\")\n        val responseSource = try {\n            ConferenceDataDownloader(context, \"1\").fetch() // TODO(jalc): pass bootstrap version\n        } catch (e: IOException) {\n            Timber.e(e)\n            throw e\n        }\n        val body = responseSource.body()?.byteStream() ?: return null\n\n        Timber.d(\"Parsing new data\")\n        val parsedData = try {\n            ConferenceDataJsonParser.parseConferenceData(body)\n        } catch (e: RuntimeException) {\n            Timber.e(e, \"Error parsing cached data\")\n            null\n        }\n        responseSource.close()\n        return parsedData\n    }\n\n    /**\n     * Returns the cached conference data or null if there's no cache.\n     */\n    override fun getOfflineConferenceData(): ConferenceData? {\n\n        val responseSource = try {\n            ConferenceDataDownloader(context, \"1\").fetchCached()\n        } catch (e: IOException) {\n            return null\n        }\n        val body = responseSource?.body()?.byteStream()\n        if (body == null) {\n            Timber.i(\"No cache found\")\n            return null\n        }\n        Timber.d(\"Parsing cached data:\")\n        val parsedData = try {\n            ConferenceDataJsonParser.parseConferenceData(body)\n        } catch (e: RuntimeException) {\n            Timber.e(e, \"Error parsing cached data\")\n            null\n        }\n        responseSource.close()\n        return parsedData\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/agenda/AgendaBlocks.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.agenda\n\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.shared.data.config.AgendaTimestampsKey\nimport com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Generates a list of [Block]s. Default values of each [Block] is supplied from the\n * default values stored as shared/src/main/res/xml/remote_config_defaults.xml.\n * Add a corresponding entry in RemoteConfig is any [Block]s need to be overridden.\n */\nfun generateBlocks(dataSource: AppConfigDataSource): List<Block> {\n    return listOf(\n        Block(\n            title = BADGE_PICKUP_TITLE,\n            type = BADGE_PICKUP_TYPE,\n            color = BADGE_PICKUP_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BADGE_PICK_UP_DAY0_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BADGE_PICK_UP_DAY0_END_TIME.key)\n            )\n        ),\n        Block(\n            title = BADGE_PICKUP_TITLE,\n            type = BADGE_PICKUP_TYPE,\n            color = BADGE_PICKUP_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BADGE_PICK_UP_DAY1_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BADGE_PICK_UP_DAY1_END_TIME.key)\n            )\n        ),\n        Block(\n            title = BREAKFAST_TITLE,\n            type = MEAL_TYPE,\n            color = MEAL_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BREAKFAST_DAY1_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BREAKFAST_DAY1_END_TIME.key)\n            )\n        ),\n        Block(\n            title = GOOGLE_KEYNOTE_TITLE,\n            type = KEYNOTE_TYPE,\n            color = KEYNOTE_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.GOOGLE_KEYNOTE_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.GOOGLE_KEYNOTE_END_TIME.key)\n            )\n        ),\n        Block(\n            title = IO_STORE_TITLE,\n            type = STORE_TYPE,\n            color = STORE_COLOR.toInt(),\n            strokeColor = STORE_STROKE_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.IO_STORE_DAY1_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.IO_STORE_DAY1_END_TIME.key)\n            )\n        ),\n        Block(\n            title = LUNCH_TITLE,\n            type = MEAL_TYPE,\n            color = MEAL_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.LUNCH_DAY1_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.LUNCH_DAY1_END_TIME.key)\n            )\n        ),\n        Block(\n            title = DEVELOPER_KEYNOTE_TITLE,\n            type = KEYNOTE_TYPE,\n            color = KEYNOTE_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.DEVELOPER_KEYNOTE_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.DEVELOPER_KEYNOTE_END_TIME.key)\n            )\n        ),\n        Block(\n            title = SESSIONS_TITLE,\n            type = SESSIONS_TYPE,\n            isDark = true,\n            color = SESSION_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SESSIONS_DAY1_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SESSIONS_DAY1_END_TIME.key)\n            )\n        ),\n        Block(\n            title = CODELABS_TITLE,\n            type = CODELABS_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.CODELABS_DAY1_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.CODELABS_DAY1_END_TIME.key)\n            )\n        ),\n        Block(\n            title = OFFICE_HOURS_APP_REVIEWS_TITLE,\n            type = OFFICE_HOURS_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.OFFICE_HOURS_DAY1_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.OFFICE_HOURS_DAY1_END_TIME.key)\n            )\n        ),\n        Block(\n            title = SANDBOXES_TITLE,\n            type = SANDBOXES_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SANDBOXES_DAY1_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SANDBOXES_DAY1_END_TIME.key)\n            )\n        ),\n        Block(\n            title = AFTER_DARK_TITLE,\n            type = AFTER_HOURS_TYPE,\n            color = AFTER_DARK_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.AFTER_DARK_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.AFTER_DARK_END_TIME.key)\n\n            )\n        ),\n        Block(\n            title = BADGE_PICKUP_TITLE,\n            type = BADGE_PICKUP_TYPE,\n            color = BADGE_PICKUP_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(\n                    AgendaTimestampsKey.BADGE_DEVICE_PICK_UP_DAY2_START_TIME.key\n                )\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(\n                    AgendaTimestampsKey.BADGE_DEVICE_PICK_UP_DAY2_END_TIME.key\n                )\n            )\n        ),\n        Block(\n            title = BREAKFAST_TITLE,\n            type = MEAL_TYPE,\n            color = MEAL_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BREAKFAST_DAY2_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BREAKFAST_DAY2_END_TIME.key)\n            )\n        ),\n        Block(\n            title = IO_STORE_TITLE,\n            type = STORE_TYPE,\n            color = STORE_COLOR.toInt(),\n            strokeColor = STORE_STROKE_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.IO_STORE_DAY2_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.IO_STORE_DAY2_END_TIME.key)\n            )\n        ),\n        Block(\n            title = LUNCH_TITLE,\n            type = MEAL_TYPE,\n            color = MEAL_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.LUNCH_DAY2_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.LUNCH_DAY2_END_TIME.key)\n            )\n        ),\n        Block(\n            title = SESSIONS_TITLE,\n            type = SESSIONS_TYPE,\n            isDark = true,\n            color = SESSION_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SESSIONS_DAY2_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SESSIONS_DAY2_END_TIME.key)\n            )\n        ),\n        Block(\n            title = CODELABS_TITLE,\n            type = CODELABS_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.CODELABS_DAY2_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.CODELABS_DAY2_END_TIME.key)\n            )\n        ),\n        Block(\n            title = OFFICE_HOURS_APP_REVIEWS_TITLE,\n            type = OFFICE_HOURS_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.OFFICE_HOURS_DAY2_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.OFFICE_HOURS_DAY2_END_TIME.key)\n            )\n        ),\n        Block(\n            title = SANDBOXES_TITLE,\n            type = SANDBOXES_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SANDBOXES_DAY2_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SANDBOXES_DAY2_END_TIME.key)\n            )\n        ),\n        Block(\n            title = CONCERT_TITLE,\n            type = CONCERT_TYPE,\n            color = AFTER_DARK_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.CONCERT_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.CONCERT_END_TIME.key)\n            )\n        ),\n        Block(\n            title = BADGE_PICKUP_TITLE,\n            type = BADGE_PICKUP_TYPE,\n            color = BADGE_PICKUP_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource\n                    .getTimestamp(\n                        AgendaTimestampsKey.BADGE_DEVICE_PICK_UP_DAY3_START_TIME.key\n                    )\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource\n                    .getTimestamp(\n                        AgendaTimestampsKey.BADGE_DEVICE_PICK_UP_DAY3_END_TIME.key\n                    )\n            )\n        ),\n        Block(\n            title = BREAKFAST_TITLE,\n            type = MEAL_TYPE,\n            color = MEAL_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BREAKFAST_DAY3_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.BREAKFAST_DAY3_END_TIME.key)\n            )\n        ),\n        Block(\n            title = IO_STORE_TITLE,\n            type = STORE_TYPE,\n            color = STORE_COLOR.toInt(),\n            strokeColor = STORE_STROKE_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.IO_STORE_DAY3_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.IO_STORE_DAY3_END_TIME.key)\n            )\n        ),\n        Block(\n            title = LUNCH_TITLE,\n            type = MEAL_TYPE,\n            color = MEAL_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.LUNCH_DAY3_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.LUNCH_DAY3_END_TIME.key)\n            )\n        ),\n        Block(\n            title = SESSIONS_TITLE,\n            type = SESSIONS_TYPE,\n            isDark = true,\n            color = SESSION_COLOR.toInt(),\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SESSIONS_DAY3_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SESSIONS_DAY3_END_TIME.key)\n            )\n        ),\n        Block(\n            title = CODELABS_TITLE,\n            type = CODELABS_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.CODELABS_DAY3_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.CODELABS_DAY3_END_TIME.key)\n            )\n        ),\n        Block(\n            title = OFFICE_HOURS_APP_REVIEWS_TITLE,\n            type = OFFICE_HOURS_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.OFFICE_HOURS_DAY3_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.OFFICE_HOURS_DAY3_END_TIME.key)\n            )\n        ),\n        Block(\n            title = SANDBOXES_TITLE,\n            type = SANDBOXES_TYPE,\n            color = OTHER_BOOTH_COLOR.toInt(),\n            isDark = true,\n            startTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SANDBOXES_DAY3_START_TIME.key)\n            ),\n            endTime = ZonedDateTime.parse(\n                dataSource.getTimestamp(AgendaTimestampsKey.SANDBOXES_DAY3_END_TIME.key)\n            )\n        )\n    )\n}\n\nprivate const val AFTER_DARK_TITLE = \"After Dark\"\nprivate const val BADGE_PICKUP_TITLE = \"Badge pick-up\"\nprivate const val BREAKFAST_TITLE = \"Breakfast\"\nprivate const val CODELABS_TITLE = \"Codelabs\"\nprivate const val CONCERT_TITLE = \"Concert\"\nprivate const val DEVELOPER_KEYNOTE_TITLE = \"Developer Keynote\"\nprivate const val GOOGLE_KEYNOTE_TITLE = \"Google Keynote\"\nprivate const val IO_STORE_TITLE = \"I/O Store\"\nprivate const val LUNCH_TITLE = \"Lunch\"\nprivate const val OFFICE_HOURS_APP_REVIEWS_TITLE = \"Office Hours & App Reviews\"\nprivate const val SANDBOXES_TITLE = \"Sandboxes\"\nprivate const val SESSIONS_TITLE = \"Sessions\"\n\nprivate const val AFTER_HOURS_TYPE = \"after_hours\"\nprivate const val BADGE_PICKUP_TYPE = \"badge\"\nprivate const val CONCERT_TYPE = \"concert\"\nprivate const val MEAL_TYPE = \"meal\"\nprivate const val CODELABS_TYPE = \"codelab\"\nprivate const val KEYNOTE_TYPE = \"keynote\"\nprivate const val STORE_TYPE = \"store\"\nprivate const val OFFICE_HOURS_TYPE = \"office_hours\"\nprivate const val SANDBOXES_TYPE = \"sandbox\"\nprivate const val SESSIONS_TYPE = \"session\"\n\nprivate const val OTHER_BOOTH_COLOR = 0xff4285f4\nprivate const val MEAL_COLOR = 0xfffad2ce\nprivate const val KEYNOTE_COLOR = 0xfffbbc05\nprivate const val BADGE_PICKUP_COLOR = 0xffe6e6e6\nprivate const val STORE_COLOR = 0xffffffff\nprivate const val SESSION_COLOR = 0xff5bb975\nprivate const val AFTER_DARK_COLOR = 0xff164fa5\nprivate const val STORE_STROKE_COLOR = 0xffff6c00\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/agenda/AgendaRepository.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.agenda\n\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource\n\n/**\n * Single point of access to agenda data for the presentation layer.\n */\ninterface AgendaRepository {\n    /**\n     * Returns a list of [Block]s. When the parameter is passed as true,\n     * it's guaranteed the data loaded from this use case is up to date with the\n     * remote data source (Remote Config)\n     */\n    suspend fun getAgenda(forceRefresh: Boolean): List<Block>\n}\n\nclass DefaultAgendaRepository(private val appConfigDataSource: AppConfigDataSource) :\n    AgendaRepository {\n\n    override suspend fun getAgenda(forceRefresh: Boolean): List<Block> {\n        if (forceRefresh) {\n            appConfigDataSource.syncStrings()\n        }\n        return generateBlocks(appConfigDataSource)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/ar/ArDebugFlagEndpoint.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.ar\n\nimport com.google.firebase.functions.FirebaseFunctions\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport javax.inject.Inject\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.resumeWithException\n\n/**\n * Interface that checkes if a signed user is able to demo the AR feature\n */\ninterface ArDebugFlagEndpoint {\n\n    /**\n     * Asks if the signed in user can demo the AR feature (bypass the teaser page)\n     */\n    suspend fun canDemoAr(): Boolean\n}\n\nclass DefaultArDebugFlagEndpoint @Inject constructor(private val functions: FirebaseFunctions) :\n    ArDebugFlagEndpoint {\n\n    override suspend fun canDemoAr(): Boolean = suspendCancellableCoroutine { cont ->\n        functions\n            .getHttpsCallable(\"canDemoAr\")\n            .call()\n            .addOnCompleteListener { task ->\n                if (task.isSuccessful) {\n                    val taskResult = task.result?.data as Map<*, *>\n                    if (taskResult[\"whitelisted\"] == true) {\n                        cont.resume(true)\n                    } else {\n                        cont.resume(false)\n                    }\n                } else {\n                    cont.resumeWithException(RuntimeException(task.exception))\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/codelabs/CodelabsRepository.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.codelabs\n\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nopen class CodelabsRepository @Inject constructor(\n    private val conferenceDataRepository: ConferenceDataRepository\n) {\n    fun getCodelabs(): List<Codelab> = conferenceDataRepository.getOfflineConferenceData().codelabs\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/config/AppConfigDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.config\n\nimport com.google.samples.apps.iosched.model.ConferenceWifiInfo\n\ninterface AppConfigDataSource {\n\n    fun getTimestamp(key: String): String // TODO: change name\n    /**\n     * Sync the strings with the latest values with Remote Config\n     */\n    suspend fun syncStrings()\n    fun getWifiInfo(): ConferenceWifiInfo\n    fun isMapFeatureEnabled(): Boolean\n    fun isExploreArFeatureEnabled(): Boolean\n    fun isCodelabsFeatureEnabled(): Boolean\n    fun isSearchScheduleFeatureEnabled(): Boolean\n    fun isSearchUsingRoomFeatureEnabled(): Boolean\n    fun isAssistantAppFeatureEnabled(): Boolean\n    fun isReservationFeatureEnabled(): Boolean\n    fun isFeedEnabled(): Boolean\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/config/RemoteAppConfigDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.config\n\nimport android.content.res.Resources.NotFoundException\nimport com.google.firebase.remoteconfig.FirebaseRemoteConfig\nimport com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings\nimport com.google.samples.apps.iosched.model.ConferenceWifiInfo\nimport com.google.samples.apps.iosched.shared.BuildConfig\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport kotlinx.coroutines.withContext\nimport timber.log.Timber\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport kotlin.coroutines.resume\n\nclass RemoteAppConfigDataSource @Inject constructor(\n    private val firebaseRemoteConfig: FirebaseRemoteConfig,\n    configSettings: FirebaseRemoteConfigSettings,\n    @IoDispatcher private val ioDispatcher: CoroutineDispatcher\n) : AppConfigDataSource {\n\n    val times = mutableMapOf<String, String>()\n\n    // Set cache expiration to 0s when debugging to allow easy testing, otherwise\n    // use the default value.\n    private val cacheExpirySeconds: Long = if (BuildConfig.DEBUG) 0 else DEFAULT_CACHE_EXPIRY_S\n\n    init {\n        // Do an initial load of default values\n        updateStrings()\n        firebaseRemoteConfig.fetch(cacheExpirySeconds).addOnCompleteListener { task ->\n            // Async\n            if (task.isSuccessful) {\n                firebaseRemoteConfig.activate().addOnCompleteListener {\n                    updateStrings()\n                }\n            }\n        }\n    }\n\n    private fun updateStrings() {\n        AgendaTimestampsKey.values().forEach {\n            times[it.key] = firebaseRemoteConfig.getString(it.key)\n        }\n    }\n\n    override suspend fun syncStrings() {\n        withContext(ioDispatcher) {\n            val task = firebaseRemoteConfig.fetch(cacheExpirySeconds)\n            suspendCancellableCoroutine<Unit> { continuation ->\n                task.addOnCompleteListener {\n                    firebaseRemoteConfig.activate().addOnCompleteListener {\n                        updateStrings()\n                        continuation.resume(Unit)\n                    }.addOnFailureListener { exception ->\n                        Timber.w(exception, \"Sync strings failed\")\n                    }\n                }\n                task.addOnFailureListener { exception ->\n                    Timber.w(exception, \"Sync strings failed\")\n                }\n            }\n        }\n    }\n\n    override fun getTimestamp(key: String): String =\n        times[key] ?: throw NotFoundException(\"Value for $key not found\")\n\n    override fun getWifiInfo(): ConferenceWifiInfo {\n        return ConferenceWifiInfo(\n            ssid = firebaseRemoteConfig.getString(WIFI_SSID_KEY),\n            password = firebaseRemoteConfig.getString(WIFI_PASSWORD_KEY)\n        )\n    }\n\n    override fun isMapFeatureEnabled(): Boolean =\n        firebaseRemoteConfig.getBoolean(MAP_FEATURE_ENABLED)\n\n    override fun isExploreArFeatureEnabled(): Boolean =\n        firebaseRemoteConfig.getBoolean(EXPLORE_AR_FEATURE_ENABLED)\n\n    override fun isCodelabsFeatureEnabled(): Boolean =\n        firebaseRemoteConfig.getBoolean(CODELABS_FEATURE_ENABLED)\n\n    override fun isSearchScheduleFeatureEnabled(): Boolean =\n        firebaseRemoteConfig.getBoolean(SEARCH_SCHEDULE_FEATURE_ENABLED)\n\n    override fun isSearchUsingRoomFeatureEnabled(): Boolean =\n        firebaseRemoteConfig.getBoolean(SEARCH_USING_ROOM_FEATURE_ENABLED)\n\n    override fun isAssistantAppFeatureEnabled(): Boolean =\n        firebaseRemoteConfig.getBoolean(ASSISTANT_APP_FEATURE_ENABLED)\n\n    override fun isReservationFeatureEnabled(): Boolean =\n        firebaseRemoteConfig.getBoolean(RESERVATION_FEATURE_ENABLED)\n\n    override fun isFeedEnabled(): Boolean =\n        firebaseRemoteConfig.getBoolean(FEED_FEATURE_ENABLED)\n\n    companion object {\n        const val WIFI_SSID_KEY = \"wifi_ssid\"\n        const val WIFI_PASSWORD_KEY = \"wifi_password\"\n\n        const val MAP_FEATURE_ENABLED = \"map_enabled\"\n        const val EXPLORE_AR_FEATURE_ENABLED = \"explore_ar_enabled\"\n        const val CODELABS_FEATURE_ENABLED = \"codelabs_enabled\"\n        const val SEARCH_SCHEDULE_FEATURE_ENABLED = \"search_schedule_enabled\"\n        const val SEARCH_USING_ROOM_FEATURE_ENABLED = \"search_using_room_enabled\"\n        const val ASSISTANT_APP_FEATURE_ENABLED = \"io_assistant_app_enabled\"\n        const val RESERVATION_FEATURE_ENABLED = \"reservation_enabled\"\n        const val FEED_FEATURE_ENABLED = \"feed_enabled\"\n\n        val DEFAULT_CACHE_EXPIRY_S = TimeUnit.MINUTES.toSeconds(12)\n    }\n}\n\nenum class AgendaTimestampsKey(val key: String) {\n    BADGE_PICK_UP_DAY0_START_TIME(\"badge_pick_up_day0_start_time\"),\n    BADGE_PICK_UP_DAY0_END_TIME(\"badge_pick_up_day0_end_time\"),\n    BADGE_PICK_UP_DAY1_START_TIME(\"badge_pick_up_day1_start_time\"),\n    BADGE_PICK_UP_DAY1_END_TIME(\"badge_pick_up_day1_end_time\"),\n    BREAKFAST_DAY1_START_TIME(\"breakfast_day1_start_time\"),\n    BREAKFAST_DAY1_END_TIME(\"breakfast_day1_end_time\"),\n    GOOGLE_KEYNOTE_START_TIME(\"google_keynote_start_time\"),\n    GOOGLE_KEYNOTE_END_TIME(\"google_keynote_end_time\"),\n    IO_STORE_DAY1_START_TIME(\"io_store_day1_start_time\"),\n    IO_STORE_DAY1_END_TIME(\"io_store_day1_end_time\"),\n    LUNCH_DAY1_START_TIME(\"lunch_day1_start_time\"),\n    LUNCH_DAY1_END_TIME(\"lunch_day1_end_time\"),\n    DEVELOPER_KEYNOTE_START_TIME(\"developer_keynote_start_time\"),\n    DEVELOPER_KEYNOTE_END_TIME(\"developer_keynote_end_time\"),\n    SESSIONS_DAY1_START_TIME(\"sessions_day1_start_time\"),\n    SESSIONS_DAY1_END_TIME(\"sessions_day1_end_time\"),\n    CODELABS_DAY1_START_TIME(\"codelabs_day1_start_time\"),\n    CODELABS_DAY1_END_TIME(\"codelabs_day1_end_time\"),\n    OFFICE_HOURS_DAY1_START_TIME(\"office_hours_day1_start_time\"),\n    OFFICE_HOURS_DAY1_END_TIME(\"office_hours_day1_end_time\"),\n    SANDBOXES_DAY1_START_TIME(\"sandboxes_day1_start_time\"),\n    SANDBOXES_DAY1_END_TIME(\"sandboxes_day1_end_time\"),\n    AFTER_DARK_START_TIME(\"after_dark_start_time\"),\n    AFTER_DARK_END_TIME(\"after_dark_end_time\"),\n    BADGE_DEVICE_PICK_UP_DAY2_START_TIME(\"badge_device_pick_up_day2_start_time\"),\n    BADGE_DEVICE_PICK_UP_DAY2_END_TIME(\"badge_device_pick_up_day2_end_time\"),\n    BREAKFAST_DAY2_START_TIME(\"breakfast_day2_start_time\"),\n    BREAKFAST_DAY2_END_TIME(\"breakfast_day2_end_time\"),\n    IO_STORE_DAY2_START_TIME(\"io_store_day2_start_time\"),\n    IO_STORE_DAY2_END_TIME(\"io_store_day2_end_time\"),\n    LUNCH_DAY2_START_TIME(\"lunch_day2_start_time\"),\n    LUNCH_DAY2_END_TIME(\"lunch_day2_end_time\"),\n    SESSIONS_DAY2_START_TIME(\"sessions_day2_start_time\"),\n    SESSIONS_DAY2_END_TIME(\"sessions_day2_end_time\"),\n    CODELABS_DAY2_START_TIME(\"codelabs_day2_start_time\"),\n    CODELABS_DAY2_END_TIME(\"codelabs_day2_end_time\"),\n    OFFICE_HOURS_DAY2_START_TIME(\"office_hours_day2_start_time\"),\n    OFFICE_HOURS_DAY2_END_TIME(\"office_hours_day2_end_time\"),\n    SANDBOXES_DAY2_START_TIME(\"sandboxes_day2_start_time\"),\n    SANDBOXES_DAY2_END_TIME(\"sandboxes_day2_end_time\"),\n    CONCERT_START_TIME(\"concert_start_time\"),\n    CONCERT_END_TIME(\"concert_end_time\"),\n    BADGE_DEVICE_PICK_UP_DAY3_START_TIME(\"badge_device_pick_up_day3_start_time\"),\n    BADGE_DEVICE_PICK_UP_DAY3_END_TIME(\"badge_device_pick_up_day3_end_time\"),\n    BREAKFAST_DAY3_START_TIME(\"breakfast_day3_start_time\"),\n    BREAKFAST_DAY3_END_TIME(\"breakfast_day3_end_time\"),\n    IO_STORE_DAY3_START_TIME(\"io_store_day3_start_time\"),\n    IO_STORE_DAY3_END_TIME(\"io_store_day3_end_time\"),\n    LUNCH_DAY3_START_TIME(\"lunch_day3_start_time\"),\n    LUNCH_DAY3_END_TIME(\"lunch_day3_end_time\"),\n    SESSIONS_DAY3_START_TIME(\"sessions_day3_start_time\"),\n    SESSIONS_DAY3_END_TIME(\"sessions_day3_end_time\"),\n    CODELABS_DAY3_START_TIME(\"codelabs_day3_start_time\"),\n    CODELABS_DAY3_END_TIME(\"codelabs_day3_end_time\"),\n    OFFICE_HOURS_DAY3_START_TIME(\"office_hours_day3_start_time\"),\n    OFFICE_HOURS_DAY3_END_TIME(\"office_hours_day3_end_time\"),\n    SANDBOXES_DAY3_START_TIME(\"sandboxes_day3_start_time\"),\n    SANDBOXES_DAY3_END_TIME(\"sandboxes_day3_end_time\"),\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/AppDatabase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.db\n\nimport android.content.Context\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room.RoomDatabase\n\n/**\n * The [Room] database for this app.\n */\n@Database(\n    entities = [\n        SessionFtsEntity::class,\n        SpeakerFtsEntity::class,\n        CodelabFtsEntity::class\n    ],\n    version = 3,\n    exportSchema = false\n)\nabstract class AppDatabase : RoomDatabase() {\n    abstract fun sessionFtsDao(): SessionFtsDao\n    abstract fun speakerFtsDao(): SpeakerFtsDao\n    abstract fun codelabFtsDao(): CodelabFtsDao\n\n    companion object {\n        private const val databaseName = \"iosched-db\"\n\n        fun buildDatabase(context: Context): AppDatabase {\n            // Since Room is only used for FTS, destructive migration is enough because the tables\n            // are cleared every time the app launches.\n            // https://medium.com/androiddevelopers/understanding-migrations-with-room-f01e04b07929\n            return Room.databaseBuilder(context, AppDatabase::class.java, databaseName)\n                .fallbackToDestructiveMigration()\n                .build()\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/CodelabFtsDao.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n/**\n * The Data Access Object for the [CodelabFtsEntity] class.\n */\n@Dao\ninterface CodelabFtsDao {\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    fun insertAll(codelabs: List<CodelabFtsEntity>)\n\n    @Query(\"SELECT codelabId FROM codelabsFts WHERE codelabsFts MATCH :query\")\n    fun searchAllCodelabs(query: String): List<String>\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/CodelabFtsEntity.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Fts4\n\n/**\n * This class represents Codelab data for searching with FTS.\n *\n * The [ColumnInfo] name is explicitly declared to allow flexibility for renaming the data class\n * properties without requiring changing the column name.\n */\n@Entity(tableName = \"codelabsFts\")\n@Fts4\ndata class CodelabFtsEntity(\n\n    /**\n     * An FTS entity table always has a column named rowid that is the equivalent of an\n     * INTEGER PRIMARY KEY index. Therefore, an FTS entity can only have a single field\n     * annotated with PrimaryKey, it must be named rowid and must be of INTEGER affinity.\n     *\n     * The field can be optionally omitted in the class (as is done here),\n     * but can still be used in queries.\n     */\n\n    @ColumnInfo(name = \"codelabId\")\n    val codelabId: String,\n\n    @ColumnInfo(name = \"title\")\n    val title: String,\n\n    /**\n     * Body of text with the codelab's description.\n     */\n    @ColumnInfo(name = \"description\")\n    val description: String\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/SessionFtsDao.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n/**\n * The Data Access Object for the [SessionFtsEntity] class.\n */\n@Dao\ninterface SessionFtsDao {\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    fun insertAll(sessions: List<SessionFtsEntity>)\n\n    @Query(\"SELECT sessionId FROM sessionsFts WHERE sessionsFts MATCH :query\")\n    fun searchAllSessions(query: String): List<String>\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/SessionFtsEntity.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Fts4\nimport com.google.samples.apps.iosched.model.Session\n\n/**\n * This class represents [Session] data for searching with FTS.\n *\n * The [ColumnInfo] name is explicitly declared to allow flexibility for renaming the data class\n * properties without requiring changing the column name.\n */\n@Entity(tableName = \"sessionsFts\")\n@Fts4\ndata class SessionFtsEntity(\n\n    /**\n     * An FTS entity table always has a column named rowid that is the equivalent of an\n     * INTEGER PRIMARY KEY index. Therefore, an FTS entity can only have a single field\n     * annotated with PrimaryKey, it must be named rowid and must be of INTEGER affinity.\n     *\n     * The field can be optionally omitted in the class (as is done here),\n     * but can still be used in queries.\n     */\n\n    /**\n     * Unique string identifying this session.\n     */\n    @ColumnInfo(name = \"sessionId\")\n    val sessionId: String,\n\n    /**\n     * Session title.\n     */\n    @ColumnInfo(name = \"title\")\n    val title: String,\n\n    /**\n     * Body of text with the session's description.\n     */\n    @ColumnInfo(name = \"description\")\n    val description: String,\n\n    /**\n     * The session speaker(s), stored as a CSV String.\n     */\n    @ColumnInfo(name = \"speakers\")\n    val speakers: String\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/SpeakerFtsDao.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n/**\n * The Data Access Object for the [SpeakerFtsEntity] class.\n */\n@Dao\ninterface SpeakerFtsDao {\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    fun insertAll(speakers: List<SpeakerFtsEntity>)\n\n    @Query(\"SELECT speakerId FROM speakersFts WHERE speakersFts MATCH :query\")\n    fun searchAllSpeakers(query: String): List<String>\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/db/SpeakerFtsEntity.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Fts4\n\n/**\n * This class represents Speaker data for searching with FTS.\n *\n * The [ColumnInfo] name is explicitly declared to allow flexibility for renaming the data class\n * properties without requiring changing the column name.\n */\n@Entity(tableName = \"speakersFts\")\n@Fts4\ndata class SpeakerFtsEntity(\n\n    /**\n     * An FTS entity table always has a column named rowid that is the equivalent of an\n     * INTEGER PRIMARY KEY index. Therefore, an FTS entity can only have a single field\n     * annotated with PrimaryKey, it must be named rowid and must be of INTEGER affinity.\n     *\n     * The field can be optionally omitted in the class (as is done here),\n     * but can still be used in queries.\n     */\n\n    @ColumnInfo(name = \"speakerId\")\n    val speakerId: String,\n\n    @ColumnInfo(name = \"name\")\n    val name: String,\n\n    /**\n     * Body of text with the speaker's description. Note that this is named \"biography\" in Speaker.\n     */\n    @ColumnInfo(name = \"description\")\n    val description: String\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/feed/DefaultFeedRepository.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.feed\n\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.model.Moment\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * Single point of access to feed data for the presentation layer.\n */\ninterface FeedRepository {\n    fun getAnnouncements(): List<Announcement>\n    fun getMoments(): List<Moment>\n}\n\n@Singleton\nopen class DefaultFeedRepository @Inject constructor(\n    private val announcementDataSource: AnnouncementDataSource,\n    private val momentDataSource: MomentDataSource\n) : FeedRepository {\n\n    override fun getAnnouncements(): List<Announcement> = announcementDataSource.getAnnouncements()\n\n    override fun getMoments(): List<Moment> = momentDataSource.getMoments()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/feed/FirestoreAnnouncementDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.feed\n\nimport com.google.android.gms.tasks.Tasks\nimport com.google.firebase.Timestamp\nimport com.google.firebase.firestore.DocumentSnapshot\nimport com.google.firebase.firestore.FirebaseFirestore\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.shared.data.document2020\nimport com.google.samples.apps.iosched.shared.util.ColorUtils\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport org.threeten.bp.Instant\nimport org.threeten.bp.ZoneOffset.UTC\n\ninterface AnnouncementDataSource {\n    fun getAnnouncements(): List<Announcement>\n}\n\n/**\n * Feed data source backed by items in a FireStore collection.\n */\nclass FirestoreAnnouncementDataSource @Inject constructor(\n    val firestore: FirebaseFirestore\n) : AnnouncementDataSource {\n\n    override fun getAnnouncements(): List<Announcement> {\n        val task = firestore\n            .document2020()\n            .collection(FEED_COLLECTION)\n            .whereEqualTo(ACTIVE, true)\n            .get()\n        val snapshot = Tasks.await(task, 20, TimeUnit.SECONDS)\n        return snapshot.documents.map { parseFeedItem(it) }\n            .sortedWith(\n                compareByDescending<Announcement> { it.priority }\n                    .thenByDescending { it.timestamp }\n            )\n    }\n\n    private fun parseFeedItem(snapshot: DocumentSnapshot): Announcement {\n\n        return Announcement(\n            id = snapshot.id,\n            title = snapshot[TITLE] as? String ?: \"\",\n            category = snapshot[CATEGORY] as? String ?: \"\",\n            imageUrl = snapshot[IMAGE_URL] as? String,\n            message = snapshot[MESSAGE] as? String ?: \"\",\n            timestamp = Instant.ofEpochSecond(\n                (snapshot[TIMESTAMP] as Timestamp).seconds\n            ).atZone(UTC),\n            color = ColorUtils.parseHexColor(snapshot[COLOR] as? String ?: \"\"),\n            priority = snapshot[PRIORITY] as? Boolean ?: false,\n            emergency = snapshot[EMERGENCY] as? Boolean ?: false\n        )\n    }\n\n    companion object {\n        /**\n         * Firestore constants.\n         */\n        private const val FEED_COLLECTION = \"feed\"\n        private const val ACTIVE = \"active\"\n        private const val CATEGORY = \"category\"\n        private const val COLOR = \"color\"\n        private const val TIMESTAMP = \"timeStamp\"\n        private const val IMAGE_URL = \"imageUrl\"\n        private const val MESSAGE = \"message\"\n        private const val PRIORITY = \"priority\"\n        private const val TITLE = \"title\"\n        private const val EMERGENCY = \"emergency\"\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/feed/FirestoreMomentDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.feed\n\nimport com.google.android.gms.tasks.Tasks\nimport com.google.firebase.Timestamp\nimport com.google.firebase.firestore.DocumentSnapshot\nimport com.google.firebase.firestore.FirebaseFirestore\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.shared.data.document2020\nimport com.google.samples.apps.iosched.shared.util.ColorUtils\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport org.threeten.bp.Instant\nimport org.threeten.bp.ZoneId\n\ninterface MomentDataSource {\n    fun getMoments(): List<Moment>\n}\n\n/**\n * Moments data source backed by items in a FireStore collection.\n */\nclass FirestoreMomentDataSource @Inject constructor(\n    val firestore: FirebaseFirestore\n) : MomentDataSource {\n\n    override fun getMoments(): List<Moment> {\n        val task = firestore\n            .document2020()\n            .collection(MOMENT_COLLECTION)\n            .get()\n        val snapshot = Tasks.await(task, 20, TimeUnit.SECONDS)\n        return snapshot.documents.map { parseMomentItem(it) }.sortedBy { it.startTime }\n    }\n\n    private fun parseMomentItem(snapshot: DocumentSnapshot): Moment {\n        return Moment(\n            id = snapshot.id,\n            title = snapshot[TITLE] as? String ?: \"\",\n            streamUrl = snapshot[STREAM_URL] as? String ?: \"\",\n            startTime = Instant.ofEpochSecond(\n                (snapshot[START_TIME] as Timestamp).seconds\n            ).atZone(ZoneId.systemDefault()),\n            endTime = Instant.ofEpochSecond(\n                (snapshot[END_TIME] as Timestamp).seconds\n            ).atZone(ZoneId.systemDefault()),\n            textColor = ColorUtils.parseHexColor(snapshot[TEXT_COLOR] as? String ?: \"\"),\n            ctaType = snapshot[CTA_TYPE] as? String ?: \"\",\n            imageUrl = snapshot[IMAGE_URL] as? String ?: \"\",\n            imageUrlDarkTheme = snapshot[IMAGE_URL_DARK] as? String ?: \"\",\n            attendeeRequired = snapshot[ATTENDEE_REQUIRED] as? Boolean ?: false,\n            timeVisible = snapshot[TIME_VISIBLE] as? Boolean ?: false,\n            featureId = snapshot[FEATURE_ID] as? String,\n            featureName = snapshot[FEATURE_NAME] as? String\n        )\n    }\n\n    companion object {\n        private const val MOMENT_COLLECTION = \"moments\"\n        private const val TITLE = \"title\"\n        private const val START_TIME = \"startTime\"\n        private const val END_TIME = \"endTime\"\n        private const val ATTENDEE_REQUIRED = \"attendeeRequired\"\n        private const val STREAM_URL = \"streamUrl\"\n        private const val TEXT_COLOR = \"textColor\"\n        private const val IMAGE_URL = \"imageUrl\"\n        private const val IMAGE_URL_DARK = \"imageUrlDarkTheme\"\n        private const val CTA_TYPE = \"ctaType\"\n        private const val TIME_VISIBLE = \"timeVisible\"\n        private const val FEATURE_ID = \"featureId\"\n        private const val FEATURE_NAME = \"featureName\"\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/feedback/FeedbackEndpoint.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.feedback\n\nimport com.google.firebase.functions.FirebaseFunctions\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.result.Result\nimport javax.inject.Inject\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport kotlin.coroutines.resume\n\ninterface FeedbackEndpoint {\n    suspend fun sendFeedback(sessionId: SessionId, responses: Map<String, Int>): Result<Unit>\n}\n\nclass DefaultFeedbackEndpoint @Inject constructor(\n    private val functions: FirebaseFunctions\n) : FeedbackEndpoint {\n\n    override suspend fun sendFeedback(\n        sessionId: SessionId,\n        responses: Map<String, Int>\n    ): Result<Unit> {\n        return suspendCancellableCoroutine { continuation ->\n            functions\n                .getHttpsCallable(\"sendFeedback\")\n                .call(\n                    hashMapOf(\n                        \"sessionId\" to sessionId,\n                        \"responses\" to responses,\n                        \"client\" to \"ANDROID\"\n                    )\n                )\n                .addOnCompleteListener { task ->\n                    if (task.isSuccessful) {\n                        continuation.resume(Result.Success(Unit))\n                    } else {\n                        continuation.resume(Result.Error(RuntimeException(task.exception)))\n                    }\n                }\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/job/ConferenceDataService.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.job\n\nimport android.app.job.JobParameters\nimport android.app.job.JobService\nimport com.google.samples.apps.iosched.shared.domain.RefreshConferenceDataUseCase\nimport com.google.samples.apps.iosched.shared.result.succeeded\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport javax.inject.Inject\n\n/**\n * A Job that refreshes the conference data in the repository (if the app is active) and\n * in the cache (if the app is not active).\n */\n@AndroidEntryPoint\nclass ConferenceDataService : JobService() {\n\n    @Inject\n    lateinit var refreshEventDataUseCase: RefreshConferenceDataUseCase\n\n    private val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)\n\n    override fun onStartJob(params: JobParameters?): Boolean {\n\n        Timber.i(\"ConferenceDataService triggering refresh conference data.\")\n\n        serviceScope.launch {\n            val result = refreshEventDataUseCase(Unit)\n\n            when {\n                result.succeeded -> {\n                    Timber.d(\"ConferenceDataService finished successfuly.\")\n                    // Finishing indicating this job doesn't need to be rescheduled.\n                    jobFinished(params, false)\n                }\n                else -> {\n                    Timber.e(\"ConferenceDataService failed. It will retry.\")\n                    // Indicating job shold be rescheduled\n                    jobFinished(params, true)\n                }\n            }\n        }\n        // Returning true to indicate we're not done yet (execution still running in the background)\n        return true\n    }\n\n    override fun onStopJob(params: JobParameters?): Boolean {\n        // Return true to indicate this job should run again.\n        return true\n    }\n\n    override fun onDestroy() {\n        serviceScope.cancel()\n        super.onDestroy()\n    }\n\n    companion object {\n        const val JOB_ID = 0xFE0FE0\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.prefs\n\nimport androidx.datastore.core.DataStore\nimport androidx.datastore.preferences.core.Preferences\nimport androidx.datastore.preferences.core.booleanPreferencesKey\nimport androidx.datastore.preferences.core.edit\nimport androidx.datastore.preferences.core.stringPreferencesKey\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_CODELABS_INFO_SHOWN\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_CONFERENCE_TIME_ZONE\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_MY_LOCATION_OPTED_IN\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_NOTIFICATIONS_SHOWN\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_ONBOARDING\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_RECEIVE_NOTIFICATIONS\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_SCHED_UI_HINTS_SHOWN\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_SELECTED_FILTERS\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_SELECTED_THEME\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_SEND_USAGE_STATISTICS\nimport com.google.samples.apps.iosched.shared.data.prefs.DataStorePreferenceStorage.PreferencesKeys.PREF_SNACKBAR_IS_STOPPED\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * Storage for app and user preferences.\n */\ninterface PreferenceStorage {\n    suspend fun completeOnboarding(complete: Boolean)\n    val onboardingCompleted: Flow<Boolean>\n\n    suspend fun showScheduleUiHints(show: Boolean)\n    suspend fun areScheduleUiHintsShown(): Boolean\n\n    suspend fun showNotificationsPreference(show: Boolean)\n    val notificationsPreferenceShown: Flow<Boolean>\n\n    suspend fun preferToReceiveNotifications(prefer: Boolean)\n    val preferToReceiveNotifications: Flow<Boolean>\n\n    suspend fun optInMyLocation(optIn: Boolean)\n    val myLocationOptedIn: Flow<Boolean>\n\n    suspend fun stopSnackbar(stop: Boolean)\n    // TODO make this a flow or a suspend function\n    suspend fun isSnackbarStopped(): Boolean\n\n    suspend fun sendUsageStatistics(send: Boolean)\n    val sendUsageStatistics: Flow<Boolean>\n\n    suspend fun preferConferenceTimeZone(preferConferenceTimeZone: Boolean)\n    val preferConferenceTimeZone: Flow<Boolean>\n\n    suspend fun selectFilters(filters: String)\n    val selectedFilters: Flow<String>\n\n    suspend fun selectTheme(theme: String)\n    val selectedTheme: Flow<String>\n\n    suspend fun showCodelabsInfo(show: Boolean)\n    val codelabsInfoShown: Flow<Boolean>\n}\n\n@Singleton\nclass DataStorePreferenceStorage @Inject constructor(\n    private val dataStore: DataStore<Preferences>\n) : PreferenceStorage {\n    companion object {\n        const val PREFS_NAME = \"iosched\"\n    }\n\n    object PreferencesKeys {\n        val PREF_ONBOARDING = booleanPreferencesKey(\"pref_onboarding\")\n        val PREF_SCHED_UI_HINTS_SHOWN = booleanPreferencesKey(\"pref_sched_ui_hints_shown\")\n        val PREF_NOTIFICATIONS_SHOWN = booleanPreferencesKey(\"pref_notifications_shown\")\n        val PREF_RECEIVE_NOTIFICATIONS = booleanPreferencesKey(\"pref_receive_notifications\")\n        val PREF_MY_LOCATION_OPTED_IN = booleanPreferencesKey(\"pref_my_location_opted_in\")\n        val PREF_SNACKBAR_IS_STOPPED = booleanPreferencesKey(\"pref_snackbar_is_stopped\")\n        val PREF_SEND_USAGE_STATISTICS = booleanPreferencesKey(\"pref_send_usage_statistics\")\n        val PREF_CONFERENCE_TIME_ZONE = booleanPreferencesKey(\"pref_conference_time_zone\")\n        val PREF_SELECTED_FILTERS = stringPreferencesKey(\"pref_selected_filters\")\n        val PREF_SELECTED_THEME = stringPreferencesKey(\"pref_dark_mode\")\n        val PREF_CODELABS_INFO_SHOWN = booleanPreferencesKey(\"pref_codelabs_info_shown\")\n    }\n\n    override suspend fun completeOnboarding(complete: Boolean) {\n        dataStore.edit {\n            it[PREF_ONBOARDING] = complete\n        }\n    }\n\n    override val onboardingCompleted: Flow<Boolean> =\n        dataStore.data.map { it[PREF_ONBOARDING] ?: false }\n\n    override suspend fun showScheduleUiHints(show: Boolean) {\n        dataStore.edit {\n            it[PREF_SCHED_UI_HINTS_SHOWN] = show\n        }\n    }\n\n    override suspend fun areScheduleUiHintsShown() =\n        dataStore.data.map { it[PREF_SCHED_UI_HINTS_SHOWN] ?: false }.first()\n\n    override suspend fun showNotificationsPreference(show: Boolean) {\n        dataStore.edit {\n            it[PREF_NOTIFICATIONS_SHOWN] = show\n        }\n    }\n\n    override val notificationsPreferenceShown = dataStore.data.map {\n        it[PREF_NOTIFICATIONS_SHOWN] ?: false\n    }\n\n    override suspend fun preferToReceiveNotifications(prefer: Boolean) {\n        dataStore.edit {\n            it[PREF_RECEIVE_NOTIFICATIONS] = prefer\n        }\n    }\n\n    override val preferToReceiveNotifications = dataStore.data.map {\n        it[PREF_RECEIVE_NOTIFICATIONS] ?: false\n    }\n\n    override suspend fun optInMyLocation(optIn: Boolean) {\n        dataStore.edit {\n            it[PREF_MY_LOCATION_OPTED_IN] = optIn\n        }\n    }\n\n    override val myLocationOptedIn = dataStore.data.map {\n        it[PREF_MY_LOCATION_OPTED_IN] ?: false\n    }\n\n    override suspend fun stopSnackbar(stop: Boolean) {\n        dataStore.edit {\n            it[PREF_SNACKBAR_IS_STOPPED] = stop\n        }\n    }\n\n    override suspend fun isSnackbarStopped(): Boolean {\n        return dataStore.data.map { it[PREF_SNACKBAR_IS_STOPPED] ?: false }.first()\n    }\n\n    override suspend fun sendUsageStatistics(send: Boolean) {\n        dataStore.edit {\n            it[PREF_SEND_USAGE_STATISTICS] = send\n        }\n    }\n\n    override val sendUsageStatistics = dataStore.data.map {\n        it[PREF_SEND_USAGE_STATISTICS] ?: true\n    }\n\n    override suspend fun preferConferenceTimeZone(preferConferenceTimeZone: Boolean) {\n        dataStore.edit {\n            it[PREF_CONFERENCE_TIME_ZONE] = preferConferenceTimeZone\n        }\n    }\n\n    override val preferConferenceTimeZone =\n        dataStore.data.map { it[PREF_CONFERENCE_TIME_ZONE] ?: true }\n\n    override suspend fun selectFilters(filters: String) {\n        dataStore.edit {\n            it[PREF_SELECTED_FILTERS] = filters\n        }\n    }\n\n    override val selectedFilters = dataStore.data.map {\n        it[PREF_SELECTED_FILTERS] ?: \"\"\n    }\n\n    override suspend fun selectTheme(theme: String) {\n        dataStore.edit {\n            it[PREF_SELECTED_THEME] = theme\n        }\n    }\n\n    override val selectedTheme =\n        dataStore.data.map { it[PREF_SELECTED_THEME] ?: Theme.SYSTEM.storageKey }\n\n    override suspend fun showCodelabsInfo(show: Boolean) {\n        dataStore.edit {\n            it[PREF_CODELABS_INFO_SHOWN] = show\n        }\n    }\n\n    override val codelabsInfoShown = dataStore.data.map {\n        it[PREF_CODELABS_INFO_SHOWN] ?: false\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/SessionRepository.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session\n\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.domain.sessions.SessionNotFoundException\nimport javax.inject.Inject\n\n/**\n * Single point of access to session data for the presentation layer.\n *\n * The session data is loaded from the bootstrap file.\n */\ninterface SessionRepository {\n    fun getSessions(): List<Session>\n    fun getSession(eventId: SessionId): Session\n    fun getConferenceDays(): List<ConferenceDay>\n}\n\nclass DefaultSessionRepository @Inject constructor(\n    private val conferenceDataRepository: ConferenceDataRepository\n) : SessionRepository {\n\n    override fun getSessions(): List<Session> {\n        return conferenceDataRepository.getOfflineConferenceData().sessions\n    }\n\n    override fun getSession(eventId: SessionId): Session {\n        return conferenceDataRepository.getOfflineConferenceData().sessions.firstOrNull { session ->\n            session.id == eventId\n        } ?: throw SessionNotFoundException()\n    }\n\n    override fun getConferenceDays(): List<ConferenceDay> {\n        return conferenceDataRepository.getConferenceDays()\n    }\n}\n\nclass SessionNotFoundException : Throwable()\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/CodelabDeserializer.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\nimport com.google.gson.JsonDeserializationContext\nimport com.google.gson.JsonDeserializer\nimport com.google.gson.JsonElement\nimport java.lang.reflect.Type\n\n/**\n * Deserializer for Codelabs. Returns temporary Codelab objects, which are later normalized once\n * tags have also been parsed.\n */\nclass CodelabDeserializer : JsonDeserializer<CodelabTemp> {\n\n    override fun deserialize(\n        json: JsonElement?,\n        typeOfT: Type?,\n        context: JsonDeserializationContext?\n    ): CodelabTemp {\n        val obj = json?.asJsonObject!!\n        return CodelabTemp(\n            id = obj.get(\"id\").asString,\n            title = obj.get(\"title\").asString,\n            description = obj.get(\"description\").asString,\n            durationMinutes = obj.get(\"duration\").asInt,\n            iconUrl = obj.get(\"icon\")?.asString,\n            codelabUrl = obj.get(\"link\").asString,\n            sortPriority = obj.get(\"priority\")?.asInt ?: 0,\n            tagNames = getListFromJsonArray(obj, \"tagNames\")\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/CodelabTemp.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\n/** Like `Codelab` but with a list of IDs instead of tags. */\ndata class CodelabTemp(\n    /** Unique ID identifying this Codelab */\n    val id: String,\n    /** Codelab title */\n    val title: String,\n    /** A short description of the codelab content */\n    val description: String,\n    /** Approximate time in minutes a user would spend doing this codelab */\n    val durationMinutes: Int,\n    /** URL for an icon to display */\n    val iconUrl: String?,\n    /** URL to access this codelab on the web */\n    val codelabUrl: String,\n    /** Names of Tags applicable to this codelab */\n    val tagNames: List<String>,\n    /** Sort priorty. Higher sort priority should come before lower ones. */\n    val sortPriority: Int\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/ColorDeserializer.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\nimport android.graphics.Color\nimport com.google.samples.apps.iosched.shared.util.ColorUtils\nimport timber.log.Timber\n\nfun parseColor(colorString: String?): Int {\n    return if (colorString != null) {\n        try {\n            ColorUtils.parseHexColor(colorString)\n        } catch (t: Throwable) {\n            Timber.d(t, \"Failed to parse color\")\n            Color.TRANSPARENT\n        }\n    } else {\n        Color.TRANSPARENT\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/DeserializerUtils.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\nimport com.google.gson.JsonObject\n\ninternal fun getListFromJsonArray(obj: JsonObject, key: String): List<String> {\n    val array = obj.get(key).asJsonArray\n    return array.map { it.asString }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/RoomDeserializer.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\nimport com.google.gson.JsonDeserializationContext\nimport com.google.gson.JsonDeserializer\nimport com.google.gson.JsonElement\nimport com.google.samples.apps.iosched.model.Room\nimport java.lang.reflect.Type\n\n/**\n * Deserializer for [Room]s.\n */\nclass RoomDeserializer : JsonDeserializer<Room> {\n\n    override fun deserialize(\n        json: JsonElement?,\n        typeOfT: Type?,\n        context: JsonDeserializationContext?\n    ): Room {\n        val obj = json?.asJsonObject!!\n        return Room(\n            id = obj.get(\"id\").asString,\n            name = obj.get(\"name\").asString\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/SessionDeserializer.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\nimport com.google.gson.JsonDeserializationContext\nimport com.google.gson.JsonDeserializer\nimport com.google.gson.JsonElement\nimport java.lang.reflect.Type\nimport org.threeten.bp.Instant\nimport org.threeten.bp.ZoneOffset\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Deserializer for sessions. Returns temporary session objects, which are later normalized once\n * other objects have also been parsed.\n */\nclass SessionDeserializer : JsonDeserializer<SessionTemp> {\n\n    override fun deserialize(\n        json: JsonElement?,\n        typeOfT: Type?,\n        context: JsonDeserializationContext?\n    ): SessionTemp {\n        val obj = json?.asJsonObject!!\n\n        val tagNames: List<String> = getListFromJsonArray(obj, \"tagNames\")\n\n        val speakers = getListFromJsonArray(obj, \"speakers\")\n\n        val relatedSessions = getListFromJsonArray(obj, \"relatedSessions\")\n\n        @Suppress(\"UNNECESSARY_SAFE_CALL\") // obj.get can return null\n        return SessionTemp(\n            id = obj.get(\"id\").asString,\n            sessionUrl = getUrlFromId(obj.get(\"id\").asString),\n            title = obj.get(\"title\").asString,\n            startTime = ZonedDateTime.ofInstant(\n                Instant.ofEpochMilli(obj.get(\"startTimestamp\").asLong), ZoneOffset.UTC\n            ),\n            endTime = ZonedDateTime.ofInstant(\n                Instant.ofEpochMilli(obj.get(\"endTimestamp\").asLong), ZoneOffset.UTC\n            ),\n            description = obj.get(\"description\").asString,\n            photoUrl = obj.get(\"photoUrl\")?.asString ?: \"\",\n            isLivestream = obj.get(\"youtubeVideoType\")?.asString == \"livestream\" ||\n                obj.get(\"livestream\")?.asBoolean == true,\n            doryLink = obj.get(\"doryLink\")?.asString ?: \"\",\n            speakers = speakers.toSet(),\n            tagNames = tagNames.toList(),\n            relatedSessions = relatedSessions.toSet(),\n            youTubeUrl = obj.get(\"youtubeUrl\")?.asString ?: \"\",\n            room = obj.get(\"room\").asString\n        )\n    }\n\n    private fun getUrlFromId(id: String): String {\n        val prefix = \"https://events.google.com/io/schedule/events/\"\n        return if (id.isNotEmpty()) prefix + id else \"\"\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/SessionTemp.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Like `Session` but with list of IDs instead of objects in tags, speakers and related sessions.\n */\ndata class SessionTemp(\n    /**\n     * Unique string identifying this session.\n     */\n    val id: SessionId,\n\n    /**\n     * Start time of the session\n     */\n    val startTime: ZonedDateTime,\n\n    /**\n     * End time of the session\n     */\n    val endTime: ZonedDateTime,\n\n    /**\n     * Session title.\n     */\n    val title: String,\n\n    /**\n     * Body of text explaining this session in detail.\n     */\n    val description: String,\n\n    /**\n     * Full URL for the session online.\n     */\n    val sessionUrl: String,\n\n    /**\n     * The session room.\n     */\n    val room: String,\n\n    /**\n     * Indicates if the Session has a live stream.\n     */\n    val isLivestream: Boolean,\n\n    /**\n     * Full URL to YouTube.\n     */\n    val youTubeUrl: String,\n\n    /**\n     * URL to the Dory page.\n     */\n    val doryLink: String,\n\n    /**\n     * IDs of the `Tag`s associated with the session. Ordered, with the most important tags\n     * appearing first.\n     */\n    val tagNames: List<String>,\n\n    /**\n     * IDs of the session speakers.\n     */\n    val speakers: Set<String>,\n\n    /**\n     * The session's photo URL.\n     */\n    val photoUrl: String,\n\n    /**\n     * IDs of the sessions related to this session.\n     */\n    val relatedSessions: Set<String>\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/SpeakerDeserializer.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\nimport com.google.gson.JsonDeserializationContext\nimport com.google.gson.JsonDeserializer\nimport com.google.gson.JsonElement\nimport com.google.samples.apps.iosched.model.Speaker\nimport java.lang.reflect.Type\n\n/**\n * Deserializer for [Speaker]s.\n */\nclass SpeakerDeserializer : JsonDeserializer<Speaker> {\n\n    override fun deserialize(\n        json: JsonElement?,\n        typeOfT: Type?,\n        context: JsonDeserializationContext?\n    ): Speaker {\n        val obj = json?.asJsonObject!!\n        val social = obj.getAsJsonObject(\"socialLinks\")\n        return Speaker(\n            id = obj.get(\"id\").asString,\n            name = obj.get(\"name\").asString,\n            imageUrl = obj.get(\"thumbnailUrl\")?.asString ?: \"\",\n            company = obj.get(\"company\")?.asString ?: \"\",\n            biography = obj.get(\"bio\")?.asString ?: \"\",\n            websiteUrl = social?.get(\"Website\")?.asString,\n            twitterUrl = social?.get(\"Twitter\")?.asString,\n            githubUrl = social?.get(\"GitHub\")?.asString,\n            linkedInUrl = social?.get(\"LinkedIn\")?.asString\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/session/json/TagDeserializer.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.session.json\n\nimport com.google.gson.JsonDeserializationContext\nimport com.google.gson.JsonDeserializer\nimport com.google.gson.JsonElement\nimport com.google.samples.apps.iosched.model.Tag\nimport java.lang.reflect.Type\n\n/**\n * Deserializer for [Tag]s.\n */\nclass TagDeserializer : JsonDeserializer<Tag> {\n\n    override fun deserialize(\n        json: JsonElement?,\n        typeOfT: Type?,\n        context: JsonDeserializationContext?\n    ): Tag {\n        val obj = json?.asJsonObject!!\n        return Tag(\n            id = obj.get(\"id\").asString,\n            category = obj.get(\"category\").asString,\n            tagName = obj.get(\"tag\").asString,\n            orderInCategory = obj.get(\"order_in_category\")?.asInt ?: 999,\n            color = parseColor(obj.get(\"color\")?.asString),\n            fontColor = parseColor(obj.get(\"fontColor\")?.asString),\n            displayName = obj.get(\"name\").asString\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/AuthenticatedUserInfo.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin\n\nimport android.net.Uri\nimport com.google.firebase.auth.UserInfo\n\n/**\n * Interface to decouple the user info from Firebase.\n *\n * @see [FirebaseRegisteredUserInfo]\n */\ninterface AuthenticatedUserInfo : AuthenticatedUserInfoBasic, AuthenticatedUserInfoRegistered\n\n/**\n * Basic user info.\n */\ninterface AuthenticatedUserInfoBasic {\n\n    fun isSignedIn(): Boolean\n\n    fun getEmail(): String?\n\n    fun getProviderData(): MutableList<out UserInfo>?\n\n    fun getLastSignInTimestamp(): Long?\n\n    fun getCreationTimestamp(): Long?\n\n    fun isAnonymous(): Boolean?\n\n    fun getPhoneNumber(): String?\n\n    fun getUid(): String?\n\n    fun isEmailVerified(): Boolean?\n\n    fun getDisplayName(): String?\n\n    fun getPhotoUrl(): Uri?\n\n    fun getProviderId(): String?\n}\n\n/**\n * Extra information about the auth and registration state of the user.\n */\ninterface AuthenticatedUserInfoRegistered {\n\n    fun isRegistered(): Boolean\n\n    fun isRegistrationDataReady(): Boolean\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/AuthenticatedUserRegistration.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin\n\nimport com.google.samples.apps.iosched.shared.BuildConfig\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport java.io.IOException\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport okhttp3.logging.HttpLoggingInterceptor\nimport timber.log.Timber\n\n/**\n * Uses an HTTP client to hit an endpoint when the user changes.\n */\nobject AuthenticatedUserRegistration {\n\n    private val client: OkHttpClient by lazy {\n        val logInterceptor = HttpLoggingInterceptor()\n        logInterceptor.level = HttpLoggingInterceptor.Level.BASIC\n\n        OkHttpClient.Builder()\n            .addInterceptor(logInterceptor)\n            .build()\n    }\n\n    suspend fun callRegistrationEndpoint(token: String, coroutineDispatcher: CoroutineDispatcher) {\n        withContext(coroutineDispatcher) {\n            val request = Request.Builder()\n                .header(\"Authorization\", \"Bearer $token\")\n                .url(BuildConfig.REGISTRATION_ENDPOINT_URL)\n                .build()\n\n            // Blocking call\n            val response = try {\n                client.newCall(request).execute()\n            } catch (e: IOException) {\n                Timber.e(e)\n                return@withContext\n            }\n            val body = response.body()?.string() ?: \"\"\n\n            if (body.isEmpty() || !response.isSuccessful) {\n                Timber.e(\"Network error calling registration point (response ${response.code()} )\")\n                return@withContext\n            }\n            Timber.d(\"Registration point called, user is registered: $body\")\n            response.body()?.close()\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/FirebaseRegisteredUserInfo.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin\n\nimport android.net.Uri\nimport com.google.firebase.auth.FirebaseUser\nimport com.google.firebase.auth.UserInfo\n\n/**\n * Delegates [AuthenticatedUserInfo] calls to a [FirebaseUser] to be used in production.\n */\nclass FirebaseRegisteredUserInfo(\n    private val basicUserInfo: AuthenticatedUserInfoBasic?,\n    private val isRegistered: Boolean?\n) : AuthenticatedUserInfo {\n\n    override fun isRegistered(): Boolean = isRegistered ?: false\n\n    override fun isSignedIn(): Boolean = basicUserInfo?.isSignedIn() == true\n\n    override fun getEmail(): String? = basicUserInfo?.getEmail()\n\n    override fun getProviderData(): MutableList<out UserInfo>? = basicUserInfo?.getProviderData()\n\n    override fun isAnonymous(): Boolean? = basicUserInfo?.isAnonymous()\n\n    override fun getPhoneNumber(): String? = basicUserInfo?.getPhoneNumber()\n\n    override fun getUid(): String? = basicUserInfo?.getUid()\n\n    override fun isEmailVerified(): Boolean? = basicUserInfo?.isEmailVerified()\n\n    override fun getDisplayName(): String? = basicUserInfo?.getDisplayName()\n\n    override fun getPhotoUrl(): Uri? = basicUserInfo?.getPhotoUrl()\n\n    override fun getProviderId(): String? = basicUserInfo?.getProviderId()\n\n    override fun getLastSignInTimestamp(): Long? = basicUserInfo?.getLastSignInTimestamp()\n\n    override fun getCreationTimestamp(): Long? = basicUserInfo?.getCreationTimestamp()\n\n    override fun isRegistrationDataReady(): Boolean = isRegistered != null\n}\n\nopen class FirebaseUserInfo(\n    private val firebaseUser: FirebaseUser?\n) : AuthenticatedUserInfoBasic {\n\n    override fun isSignedIn(): Boolean = firebaseUser != null\n\n    override fun getEmail(): String? = firebaseUser?.email\n\n    override fun getProviderData(): MutableList<out UserInfo>? = firebaseUser?.providerData\n\n    override fun isAnonymous(): Boolean? = firebaseUser?.isAnonymous\n\n    override fun getPhoneNumber(): String? = firebaseUser?.phoneNumber\n\n    override fun getUid(): String? = firebaseUser?.uid\n\n    override fun isEmailVerified(): Boolean? = firebaseUser?.isEmailVerified\n\n    override fun getDisplayName(): String? = firebaseUser?.displayName\n\n    override fun getPhotoUrl(): Uri? = firebaseUser?.photoUrl\n\n    override fun getProviderId(): String? = firebaseUser?.providerId\n\n    override fun getLastSignInTimestamp(): Long? = firebaseUser?.metadata?.lastSignInTimestamp\n\n    override fun getCreationTimestamp(): Long? = firebaseUser?.metadata?.creationTimestamp\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/datasources/AuthIdDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin.datasources\n\n/**\n * Interface to simply get the current authenticated user ID.\n */\ninterface AuthIdDataSource {\n    fun getUserId(): String?\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/datasources/AuthStateUserDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin.datasources\n\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfoBasic\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.flow.Flow\n\n/**\n * Listens to an Authentication state data source that emits updates on the current user.\n *\n * @see FirebaseAuthStateUserDataSource\n */\ninterface AuthStateUserDataSource {\n    /**\n     * Returns an observable of the [AuthenticatedUserInfoBasic].\n     */\n    fun getBasicUserInfo(): Flow<Result<AuthenticatedUserInfoBasic?>>\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/datasources/FirebaseAuthStateUserDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin.datasources\n\nimport com.google.firebase.auth.FirebaseAuth\nimport com.google.firebase.auth.FirebaseUser\nimport com.google.firebase.auth.GetTokenResult\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfoBasic\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserRegistration\nimport com.google.samples.apps.iosched.shared.data.signin.FirebaseUserInfo\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.sessions.NotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.fcm.FcmTokenUpdater\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport com.google.samples.apps.iosched.shared.util.suspendAndWait\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.callbackFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.shareIn\nimport timber.log.Timber\nimport javax.inject.Inject\n\n/**\n * An [AuthStateUserDataSource] that listens to changes in [FirebaseAuth].\n *\n * When a [FirebaseUser] is available, it\n *  * Posts it to the user observable\n *  * Fetches the ID token\n *  * Uses the ID token to trigger the registration point\n *  * Stores the FCM ID Token in Firestore\n *  * Posts the user ID to the observable\n *\n * This data source doesn't find if a user is registered or not (is an attendee). Once the\n * registration point is called, the server will generate a field in the user document, which\n * is observed by [RegisteredUserDataSource] in its implementation\n * [FirestoreRegisteredUserDataSource].\n */\nclass FirebaseAuthStateUserDataSource @Inject constructor(\n    val firebase: FirebaseAuth,\n    private val tokenUpdater: FcmTokenUpdater,\n    private val notificationAlarmUpdater: NotificationAlarmUpdater,\n    @ApplicationScope private val externalScope: CoroutineScope,\n    @IoDispatcher private val ioDispatcher: CoroutineDispatcher\n) : AuthStateUserDataSource {\n\n    // lastUid can be potentially consumed and written from different threads\n    // Making it thread safe with @Volatile\n    @Volatile\n    private var lastUid: String? = null\n\n    /**\n     * The `shareIn` operator lets us reuse the flow when multiple subscribers collect at the same\n     * time. With the `SharingStarted.WhileSubscribed()` policy, the flow starts when the first\n     * subscriber appears and stops when there are no subscribers. This optimizes the implementation\n     * of the flow since we'll have **only one** authStateListener added to Firebase when there is\n     * at least one subscriber, and no listeners in Firebase when there are no subscribers.\n     */\n    private val basicUserInfo: SharedFlow<Result<AuthenticatedUserInfoBasic?>> =\n        callbackFlow<FirebaseAuth> {\n            val authStateListener: ((FirebaseAuth) -> Unit) = { auth ->\n                // This callback gets always executed on the main thread because of Firebase\n                tryOffer(auth)\n            }\n            firebase.addAuthStateListener(authStateListener)\n            awaitClose { firebase.removeAuthStateListener(authStateListener) }\n        }\n            .map { authState ->\n                // This map gets executed in the Flow's context\n                processAuthState(authState)\n            }\n            .shareIn(\n                scope = externalScope,\n                replay = 1,\n                started = SharingStarted.WhileSubscribed()\n            )\n\n    override fun getBasicUserInfo(): Flow<Result<AuthenticatedUserInfoBasic?>> = basicUserInfo\n\n    private suspend fun processAuthState(auth: FirebaseAuth): Result<AuthenticatedUserInfoBasic?> {\n        // Listener that saves the [FirebaseUser], fetches the ID token\n        // and updates the user ID observable.\n        Timber.d(\"Received a FirebaseAuth update.\")\n\n        auth.currentUser?.let { currentUser ->\n            // Get the ID token (force refresh)\n            val tokenTask = currentUser.getIdToken(true)\n            try {\n                val tokenResult: GetTokenResult = tokenTask.suspendAndWait()\n                tokenResult.token?.let {\n                    // Call registration point to generate a result in Firestore\n                    Timber.d(\"User authenticated, hitting registration endpoint\")\n                    AuthenticatedUserRegistration.callRegistrationEndpoint(it, ioDispatcher)\n                }\n            } catch (e: Exception) {\n                Timber.e(e)\n                return@let\n            }\n            // Save the FCM ID token in firestore\n            tokenUpdater.updateTokenForUser(currentUser.uid)\n        }\n\n        if (auth.currentUser == null) {\n            // Logout, cancel all alarms\n            notificationAlarmUpdater.cancelAll()\n        }\n\n        auth.currentUser?.let {\n            if (lastUid != auth.uid) { // Prevent duplicates\n                notificationAlarmUpdater.updateAll(it.uid)\n            }\n        }\n\n        // Save the last UID to prevent setting too many alarms.\n        lastUid = auth.uid\n\n        // Send the current user for observers\n        return Success(FirebaseUserInfo(auth.currentUser))\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/datasources/FirestoreRegisteredUserDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin.datasources\n\nimport com.google.firebase.firestore.DocumentSnapshot\nimport com.google.firebase.firestore.FirebaseFirestore\nimport com.google.firebase.firestore.FirebaseFirestoreException\nimport com.google.samples.apps.iosched.shared.data.document2020\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.callbackFlow\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport timber.log.Timber\nimport javax.inject.Inject\n\n/**\n * A [RegisteredUserDataSource] that listens to changes in firestore to indicate whether the\n * current user is registered in the event or not as an attendee.\n */\nclass FirestoreRegisteredUserDataSource @Inject constructor(\n    val firestore: FirebaseFirestore\n) : RegisteredUserDataSource {\n\n    companion object {\n        private const val USERS_COLLECTION = \"users\"\n        private const val REGISTERED_KEY = \"registered\"\n    }\n\n    override fun observeUserChanges(userId: String): Flow<Result<Boolean?>> {\n        return callbackFlow<Result<Boolean?>> {\n            // Watch the document\n            val registeredChangedListener =\n                { snapshot: DocumentSnapshot?, _: FirebaseFirestoreException? ->\n                    if (snapshot == null || !snapshot.exists()) {\n                        // When the account signs in for the first time, the document doesn't exist\n                        Timber.d(\"Document for snapshot $userId doesn't exist\")\n                        tryOffer(Result.Success(false))\n                    } else {\n                        val isRegistered: Boolean? = snapshot.get(REGISTERED_KEY) as? Boolean\n                        Timber.d(\"Received registered flag: $isRegistered\")\n                        tryOffer(Result.Success(isRegistered))\n                    }\n                    Unit // Avoids returning the Boolean from channel.offer\n                }\n\n            val registeredChangedListenerSubscription = firestore\n                .document2020()\n                .collection(USERS_COLLECTION)\n                .document(userId)\n                .addSnapshotListener(registeredChangedListener)\n\n            awaitClose { registeredChangedListenerSubscription.remove() }\n        }\n            // Only emit a value if it's a new value or a value change.\n            .distinctUntilChanged()\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/signin/datasources/RegisteredUserDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin.datasources\n\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.flow.Flow\n\n/**\n * A data source that listens to changes in the user data related to event\n * registration.\n */\ninterface RegisteredUserDataSource {\n    /**\n     * Returns the holder of the result of listening to the data source.\n     */\n    fun observeUserChanges(userId: String): Flow<Result<Boolean?>>\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/tag/TagDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.tag\n\nimport com.google.samples.apps.iosched.model.Tag\n\ninterface TagDataSource {\n    fun getTags(): List<Tag>\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/tag/TagRepository.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.tag\n\nimport com.google.samples.apps.iosched.model.Tag\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * Single point of access to tag data for the presentation layer.\n */\n@Singleton\nopen class TagRepository @Inject constructor(\n    private val conferenceDataRepository: ConferenceDataRepository\n) {\n    fun getTags(): List<Tag> = conferenceDataRepository.getOfflineConferenceData().tags\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepository.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.userevent\n\nimport androidx.annotation.WorkerThread\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.session.SessionRepository\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCaseResult\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.SwapAction\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestParameters\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport javax.inject.Inject\nimport javax.inject.Singleton\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.emitAll\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.map\nimport timber.log.Timber\n\n/**\n * Single point of access to user events data associated with a user for the presentation layer.\n */\n@ExperimentalCoroutinesApi\n@Singleton\nopen class DefaultSessionAndUserEventRepository @Inject constructor(\n    private val userEventDataSource: UserEventDataSource,\n    private val sessionRepository: SessionRepository\n) : SessionAndUserEventRepository {\n\n    @WorkerThread\n    override fun getObservableUserEvents(\n        userId: String?\n    ): Flow<Result<ObservableUserEvents>> {\n        return flow {\n            emit(Result.Loading)\n            // If there is no logged-in user, return the map with null UserEvents\n            if (userId == null) {\n                Timber.d(\n                    \"\"\"EventRepository: No user logged in,\n                            |returning sessions without user events.\"\"\".trimMargin()\n                )\n                val allSessions = sessionRepository.getSessions()\n                val userSessions = mergeUserDataAndSessions(null, allSessions)\n                emit(\n                    Result.Success(\n                        ObservableUserEvents(\n                            userSessions = userSessions\n                        )\n                    )\n                )\n            } else {\n                emitAll(\n                    userEventDataSource.getObservableUserEvents(userId).map { userEvents ->\n                        Timber.d(\n                            \"\"\"EventRepository: Received ${userEvents.userEvents.size}\n                            |user events changes\"\"\".trimMargin()\n                        )\n                        // Get the sessions, synchronously\n                        val allSessions = sessionRepository.getSessions()\n                        val userSessions = mergeUserDataAndSessions(userEvents, allSessions)\n                        // TODO(b/122306429) expose user events messages separately\n                        val userEventsMessageSession = allSessions.firstOrNull {\n                            it.id == userEvents.userEventsMessage?.sessionId\n                        }\n                        Result.Success(\n                            ObservableUserEvents(\n                                userSessions = userSessions,\n                                userMessage = userEvents.userEventsMessage,\n                                userMessageSession = userEventsMessageSession\n                            )\n                        )\n                    }\n                )\n            }\n        }\n    }\n\n    override fun getObservableUserEvent(\n        userId: String?,\n        eventId: SessionId\n    ): Flow<Result<LoadUserSessionUseCaseResult>> {\n        // If there is no logged-in user, return the session with a null UserEvent\n        if (userId == null) {\n            Timber.d(\"EventRepository: No user logged in, returning session without user event\")\n            return flow {\n                val session = sessionRepository.getSession(eventId)\n                emit(\n                    Result.Success(\n                        LoadUserSessionUseCaseResult(\n                            userSession = UserSession(session, createDefaultUserEvent(session))\n                        )\n                    )\n                )\n            }\n        }\n\n        // Observes the user events and merges them with session data.\n        return userEventDataSource.getObservableUserEvent(userId, eventId).map { userEventResult ->\n            Timber.d(\"EventRepository: Received user event changes\")\n            // Get the session, synchronously\n            val event = sessionRepository.getSession(eventId)\n\n            // Merges session with user data and emits the result\n            val userSession = UserSession(\n                event,\n                userEventResult.userEvent ?: createDefaultUserEvent(event)\n            )\n\n            Result.Success(LoadUserSessionUseCaseResult(userSession = userSession))\n        }\n    }\n\n    override fun getUserEvents(userId: String?): List<UserEvent> {\n        return userEventDataSource.getUserEvents(userId ?: \"\")\n    }\n\n    override fun getUserSession(userId: String, sessionId: SessionId): UserSession {\n        val session = sessionRepository.getSession(sessionId)\n        val userEvent = userEventDataSource.getUserEvent(userId, sessionId)\n            ?: throw Exception(\"UserEvent not found\")\n\n        return UserSession(\n            session = session,\n            userEvent = userEvent\n        )\n    }\n    override suspend fun starEvent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<StarUpdatedStatus> = userEventDataSource.starEvent(userId, userEvent)\n\n    override suspend fun recordFeedbackSent(userId: String, userEvent: UserEvent): Result<Unit> {\n        return userEventDataSource.recordFeedbackSent(userId, userEvent)\n    }\n\n    override suspend fun changeReservation(\n        userId: String,\n        sessionId: SessionId,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction> {\n        val sessions = sessionRepository.getSessions().associateBy { it.id }\n        val userEvents = getUserEvents(userId)\n        val session = sessionRepository.getSession(sessionId)\n        val overlappingId = findOverlappingReservationId(session, action, sessions, userEvents)\n        if (overlappingId != null) {\n            // If there is already an overlapping reservation, return the result as\n            // SwapAction is needed.\n            val overlappingSession = sessionRepository.getSession(overlappingId)\n            Timber.d(\n                \"\"\"User is trying to reserve a session that overlaps with the\n                |session id: $overlappingId, title: ${overlappingSession.title}\"\"\".trimMargin()\n            )\n            return Result.Success(\n                SwapAction(\n                    SwapRequestParameters(\n                        userId,\n                        fromId = overlappingId,\n                        fromTitle = overlappingSession.title,\n                        toId = sessionId,\n                        toTitle = session.title\n                    )\n                )\n            )\n        }\n        return userEventDataSource.requestReservation(userId, session, action)\n    }\n\n    override suspend fun swapReservation(\n        userId: String,\n        fromId: SessionId,\n        toId: SessionId\n    ): Result<SwapRequestAction> {\n        val toSession = sessionRepository.getSession(toId)\n        val fromSession = sessionRepository.getSession(fromId)\n        return userEventDataSource.swapReservation(userId, fromSession, toSession)\n    }\n\n    private fun findOverlappingReservationId(\n        session: Session,\n        action: ReservationRequestAction,\n        sessions: Map<String, Session>,\n        userEvents: List<UserEvent>\n    ): String? {\n        if (action !is RequestAction) return null\n        val overlappingUserEvent = userEvents.find {\n            sessions[it.id]?.isOverlapping(session) == true &&\n                (it.isReserved() || it.isWaitlisted())\n        }\n        return overlappingUserEvent?.id\n    }\n\n    private fun createDefaultUserEvent(session: Session): UserEvent {\n        return UserEvent(id = session.id)\n    }\n\n    /**\n     * Merges user data with sessions.\n     */\n    @WorkerThread\n    private fun mergeUserDataAndSessions(\n        userData: UserEventsResult?,\n        allSessions: List<Session>\n    ): List<UserSession> {\n        // If there is no logged-in user, return the map with null UserEvents\n        if (userData == null) {\n            return allSessions.map { UserSession(it, createDefaultUserEvent(it)) }\n        }\n\n        val (userEvents, _) = userData\n        val eventIdToUserEvent = userEvents.associateBy { it.id }\n        return allSessions.map {\n            UserSession(it, eventIdToUserEvent[it.id] ?: createDefaultUserEvent(it))\n        }\n    }\n\n    override fun getConferenceDays(): List<ConferenceDay> = sessionRepository.getConferenceDays()\n}\n\ninterface SessionAndUserEventRepository {\n\n    // TODO(b/122112739): Repository should not have source dependency on UseCase result\n    fun getObservableUserEvents(\n        userId: String?\n    ): Flow<Result<ObservableUserEvents>>\n\n    // TODO(b/122112739): Repository should not have source dependency on UseCase result\n    fun getObservableUserEvent(\n        userId: String?,\n        eventId: SessionId\n    ): Flow<Result<LoadUserSessionUseCaseResult>>\n\n    fun getUserEvents(userId: String?): List<UserEvent>\n\n    suspend fun changeReservation(\n        userId: String,\n        sessionId: SessionId,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction>\n\n    suspend fun swapReservation(\n        userId: String,\n        fromId: SessionId,\n        toId: SessionId\n    ): Result<SwapRequestAction>\n\n    suspend fun starEvent(userId: String, userEvent: UserEvent): Result<StarUpdatedStatus>\n\n    suspend fun recordFeedbackSent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<Unit>\n\n    fun getConferenceDays(): List<ConferenceDay>\n\n    fun getUserSession(userId: String, sessionId: SessionId): UserSession\n}\n\ndata class ObservableUserEvents(\n    val userSessions: List<UserSession>,\n\n    /** A message to show to the user with important changes like reservation confirmations */\n    val userMessage: UserEventMessage? = null,\n\n    /** The session the user message is about, if any. */\n    val userMessageSession: Session? = null\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/userevent/FirestoreUserEventDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.userevent\n\nimport com.google.android.gms.tasks.Tasks\nimport com.google.firebase.firestore.FieldValue\nimport com.google.firebase.firestore.FirebaseFirestore\nimport com.google.firebase.firestore.SetOptions\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.data.document2020\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.CancelAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.SwapAction\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestAction\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Error\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport com.google.samples.apps.iosched.shared.util.tryOffer\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.callbackFlow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport kotlinx.coroutines.withContext\nimport timber.log.Timber\nimport java.util.UUID\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.resumeWithException\n\n/**\n * The data source for user data stored in firestore. It observes user data and also updates\n * stars and reservations.\n */\n@ExperimentalCoroutinesApi\nclass FirestoreUserEventDataSource @Inject constructor(\n    val firestore: FirebaseFirestore,\n    @IoDispatcher private val ioDispatcher: CoroutineDispatcher\n) : UserEventDataSource {\n\n    companion object {\n        /**\n         * Firestore constants.\n         */\n        private const val USERS_COLLECTION = \"users\"\n        private const val EVENTS_COLLECTION = \"events\"\n        private const val QUEUE_COLLECTION = \"queue\"\n        internal const val ID = \"id\"\n        internal const val IS_STARRED = \"isStarred\"\n        internal const val REVIEWED = \"reviewed\"\n\n        internal const val RESERVATION_REQUEST_KEY = \"reservationRequest\"\n\n        private const val RESERVE_REQ_ACTION = \"RESERVE_REQUESTED\"\n        private const val RESERVE_CANCEL_ACTION = \"CANCEL_REQUESTED\"\n\n        internal const val RESERVATION_REQUEST_ACTION_KEY = \"action\"\n        internal const val RESERVATION_REQUEST_REQUEST_ID_KEY = \"requestId\"\n        private const val RESERVATION_REQUEST_TIMESTAMP_KEY = \"timestamp\"\n\n        private const val REQUEST_QUEUE_ACTION_KEY = \"action\"\n        private const val REQUEST_QUEUE_SESSION_KEY = \"sessionId\"\n        private const val REQUEST_QUEUE_REQUEST_ID_KEY = \"requestId\"\n        private const val REQUEST_QUEUE_ACTION_RESERVE = \"RESERVE\"\n        private const val REQUEST_QUEUE_ACTION_CANCEL = \"CANCEL\"\n        private const val REQUEST_QUEUE_ACTION_SWAP = \"SWAP\"\n        private const val SWAP_QUEUE_RESERVE_SESSION_ID_KEY = \"reserveSessionId\"\n        private const val SWAP_QUEUE_CANCEL_SESSION_ID_KEY = \"cancelSessionId\"\n\n        internal const val RESERVATION_RESULT_KEY = \"reservationResult\"\n        internal const val RESERVATION_RESULT_TIME_KEY = \"timestamp\"\n        internal const val RESERVATION_RESULT_RESULT_KEY = \"requestResult\"\n        internal const val RESERVATION_RESULT_REQ_ID_KEY = \"requestId\"\n\n        internal const val RESERVATION_STATUS_KEY = \"reservationStatus\"\n    }\n\n    /**\n     * Asynchronous method to get the user events.\n     *\n     * This method generates important messages to the user if a reservation is confirmed or\n     * waitlisted.\n     */\n    override fun getObservableUserEvents(userId: String): Flow<UserEventsResult> {\n        if (userId.isEmpty()) {\n            return flow { emit(UserEventsResult(emptyList())) }\n        } else {\n            return (\n                callbackFlow<UserEventsResult> {\n                    val eventsCollection = firestore\n                        .document2020()\n                        .collection(USERS_COLLECTION)\n                        .document(userId)\n                        .collection(EVENTS_COLLECTION)\n\n                    var currentValue: UserEventsResult? = null\n\n                    // TODO: Flow refactor check addSnapshotListener documentation (null value?)\n                    val subscription = eventsCollection.addSnapshotListener { snapshot, _ ->\n                        if (snapshot == null) {\n                            return@addSnapshotListener\n                        }\n\n                        Timber.d(\"Events changes detected: ${snapshot.documentChanges.size}\")\n\n                        // Generate important user messages, like new reservations, if any.\n                        val userMessage =\n                            generateReservationChangeMsg(snapshot, currentValue)\n                        val userEventsResult = UserEventsResult(\n                            userEvents = snapshot.documents.map { parseUserEvent(it) },\n                            userEventsMessage = userMessage\n                        )\n                        currentValue = userEventsResult\n                        tryOffer(userEventsResult)\n                    }\n\n                    // The callback inside awaitClose will be executed when the flow is\n                    // either closed or cancelled\n                    awaitClose { subscription.remove() }\n                }\n                )\n                .flowOn(Dispatchers.Main)\n        }\n    }\n\n    override fun getObservableUserEvent(\n        userId: String,\n        eventId: SessionId\n    ): Flow<UserEventResult> {\n        return if (userId.isEmpty()) {\n            flow {\n                emit(UserEventResult(userEvent = null))\n            }\n        } else {\n            (\n                callbackFlow<UserEventResult> {\n                    val eventDocument = firestore\n                        .document2020()\n                        .collection(USERS_COLLECTION)\n                        .document(userId)\n                        .collection(EVENTS_COLLECTION)\n                        .document(eventId)\n                    var currentValue: UserEventResult? = null\n                    val subscription = eventDocument.addSnapshotListener { snapshot, _ ->\n                        if (snapshot == null) {\n                            return@addSnapshotListener\n                        }\n                        Timber.d(\"Event changes detected on session: $eventId\")\n                        val userEvent = if (snapshot.exists()) {\n                            parseUserEvent(snapshot)\n                        } else {\n                            UserEvent(id = eventId)\n                        }\n                        val userMessage = currentValue?.userEvent?.let {\n                            getUserMessageFromChange(it, snapshot, eventId)\n                        }\n\n                        val userEventResult = UserEventResult(\n                            userEvent = userEvent,\n                            userEventMessage = userMessage\n                        )\n                        currentValue = userEventResult\n                        tryOffer(userEventResult)\n                    }\n                    // The callback inside awaitClose will be executed when the flow is\n                    // either closed or cancelled\n                    awaitClose { subscription.remove() }\n                }\n                )\n                .flowOn(ioDispatcher)\n        }\n    }\n\n    override fun getUserEvents(userId: String): List<UserEvent> {\n        if (userId.isEmpty()) {\n            return emptyList()\n        }\n\n        val task = firestore\n            .document2020()\n            .collection(USERS_COLLECTION)\n            .document(userId)\n            .collection(EVENTS_COLLECTION).get()\n        val snapshot = Tasks.await(task, 20, TimeUnit.SECONDS)\n        return snapshot.documents.map { parseUserEvent(it) }\n    }\n\n    override fun getUserEvent(userId: String, eventId: SessionId): UserEvent? {\n        if (userId.isEmpty()) {\n            return null\n        }\n\n        val task = firestore\n            .document2020()\n            .collection(USERS_COLLECTION)\n            .document(userId)\n            .collection(EVENTS_COLLECTION)\n            .document(eventId).get()\n        val snapshot = Tasks.await(task, 20, TimeUnit.SECONDS)\n        return parseUserEvent(snapshot)\n    }\n\n    override fun clearSingleEventSubscriptions() {\n        Timber.d(\"Firestore Event data source: Clearing subscriptions\")\n    }\n\n    /** Firestore writes **/\n\n    /**\n     * Stars or unstars an event.\n     *\n     * @returns a result via as a [Result].\n     */\n    override suspend fun starEvent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<StarUpdatedStatus> = withContext(ioDispatcher) {\n        // The suspendCancellableCoroutine method suspends a coroutine manually. With the\n        // continuation object you receive in the lambda, you can resume the coroutine\n        // after the work is done.\n        suspendCancellableCoroutine<Result<StarUpdatedStatus>> { continuation ->\n\n            val data = mapOf(\n                ID to userEvent.id,\n                IS_STARRED to userEvent.isStarred\n            )\n\n            firestore\n                .document2020()\n                .collection(USERS_COLLECTION)\n                .document(userId)\n                .collection(EVENTS_COLLECTION)\n                .document(userEvent.id).set(data, SetOptions.merge())\n                .addOnCompleteListener {\n                    if (it.isSuccessful) {\n                        continuation.resume(\n                            Success(\n                                if (userEvent.isStarred) StarUpdatedStatus.STARRED\n                                else StarUpdatedStatus.UNSTARRED\n                            )\n                        )\n                    } else {\n                        continuation.resume(\n                            Error(\n                                it.exception ?: RuntimeException(\"Error updating star.\")\n                            )\n                        )\n                    }\n                }.addOnFailureListener {\n                    continuation.resumeWithException(it)\n                }\n        }\n    }\n\n    override suspend fun recordFeedbackSent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<Unit> {\n        val data = mapOf(\n            ID to userEvent.id,\n            \"reviewed\" to true\n        )\n\n        return suspendCancellableCoroutine { continuation ->\n\n            firestore\n                .document2020()\n                .collection(USERS_COLLECTION)\n                .document(userId)\n                .collection(EVENTS_COLLECTION)\n                .document(userEvent.id).set(data, SetOptions.merge())\n                .addOnCompleteListener { task ->\n                    if (task.isSuccessful) {\n                        continuation.resume(Success(Unit))\n                    } else {\n                        continuation.resume(\n                            Error(\n                                task.exception ?: RuntimeException(\n                                    \"Error updating feedback.\"\n                                )\n                            )\n                        )\n                    }\n                }\n        }\n    }\n\n    /**\n     * Requests a reservation for an event.\n     *\n     * This method makes two write operations at once.\n     *\n     * @return a Result indicating whether the request was successful (not whether the event\n     * was reserved)\n     */\n    override suspend fun requestReservation(\n        userId: String,\n        session: Session,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction> {\n        val logCancelOrReservation = if (action is CancelAction) \"Cancel\" else \"Request\"\n\n        Timber.d(\"Requesting $logCancelOrReservation for session ${session.id}\")\n\n        // Get a new write batch. This is a lightweight transaction.\n        val batch = firestore.batch()\n\n        val newRandomRequestId = UUID.randomUUID().toString()\n\n        // Write #1: Mark this session as reserved. This is for clients to track.\n        val userSession = firestore\n            .document2020()\n            .collection(USERS_COLLECTION)\n            .document(userId)\n            .collection(EVENTS_COLLECTION)\n            .document(session.id)\n\n        val reservationRequest = mapOf(\n            RESERVATION_REQUEST_ACTION_KEY to getReservationRequestedEventAction(action),\n            RESERVATION_REQUEST_REQUEST_ID_KEY to newRandomRequestId,\n            RESERVATION_REQUEST_TIMESTAMP_KEY to FieldValue.serverTimestamp()\n        )\n\n        val userSessionData = mapOf(\n            ID to session.id,\n            RESERVATION_REQUEST_KEY to reservationRequest\n        )\n\n        batch.set(userSession, userSessionData, SetOptions.merge())\n\n        // Write #2: Send a request to the server. The result will appear in the UserSession. A\n        // success in this reservation only means that the request was accepted. Even offline, this\n        // request will succeed.\n        val newRequest = firestore\n            .document2020()\n            .collection(QUEUE_COLLECTION)\n            .document(userId)\n\n        val queueReservationRequest = mapOf(\n            REQUEST_QUEUE_ACTION_KEY to getReservationRequestedQueueAction(action),\n            REQUEST_QUEUE_SESSION_KEY to session.id,\n            REQUEST_QUEUE_REQUEST_ID_KEY to newRandomRequestId\n        )\n\n        batch.set(newRequest, queueReservationRequest)\n\n        return withContext(ioDispatcher) {\n            suspendCancellableCoroutine<Result<ReservationRequestAction>> { continuation ->\n                // Commit write batch\n                batch.commit().addOnSuccessListener {\n                    Timber.d(\"$logCancelOrReservation request for session ${session.id} succeeded\")\n                    continuation.resume(Success(action))\n                }.addOnFailureListener {\n                    Timber.e(it, \"$logCancelOrReservation request for session ${session.id} failed\")\n                    continuation.resume(Error(it))\n                }\n            }\n        }\n    }\n\n    override suspend fun swapReservation(\n        userId: String,\n        fromSession: Session,\n        toSession: Session\n    ): Result<SwapRequestAction> {\n        Timber.d(\"Swapping reservations from: ${fromSession.id} to: ${toSession.id}\")\n\n        // Get a new write batch. This is a lightweight transaction.\n        val batch = firestore.batch()\n\n        val newRandomRequestId = UUID.randomUUID().toString()\n        val serverTimestamp = FieldValue.serverTimestamp()\n\n        // Write #1: Mark the toSession as reserved. This is for clients to track.\n        val toUserSession = firestore\n            .document2020()\n            .collection(USERS_COLLECTION)\n            .document(userId)\n            .collection(EVENTS_COLLECTION)\n            .document(toSession.id)\n        val toSwapRequest = mapOf(\n            RESERVATION_REQUEST_ACTION_KEY to RESERVE_REQ_ACTION,\n            RESERVATION_REQUEST_REQUEST_ID_KEY to newRandomRequestId,\n            RESERVATION_REQUEST_TIMESTAMP_KEY to serverTimestamp\n        )\n        val userSessionData = mapOf(\n            ID to toSession.id,\n            RESERVATION_REQUEST_KEY to toSwapRequest\n        )\n        batch.set(toUserSession, userSessionData, SetOptions.merge())\n\n        // Write #2: Mark the fromSession as canceled. This is for clients to track.\n        val fromUserSession = firestore\n            .document2020()\n            .collection(USERS_COLLECTION)\n            .document(userId)\n            .collection(EVENTS_COLLECTION)\n            .document(fromSession.id)\n        val fromSwapRequest = mapOf(\n            RESERVATION_REQUEST_ACTION_KEY to RESERVE_CANCEL_ACTION,\n            RESERVATION_REQUEST_REQUEST_ID_KEY to newRandomRequestId,\n            RESERVATION_REQUEST_TIMESTAMP_KEY to serverTimestamp\n        )\n        val fromUserSessionData = mapOf(\n            ID to fromSession.id,\n            RESERVATION_REQUEST_KEY to fromSwapRequest\n        )\n        batch.set(fromUserSession, fromUserSessionData, SetOptions.merge())\n\n        // Write #3: Send a request to the server. The result will appear in the both UserSessions\n        // (from and to). success in this reservation only means that the request was accepted.\n        // Even offline, this request will succeed.\n        val newRequest = firestore\n            .document2020()\n            .collection(QUEUE_COLLECTION)\n            .document(userId)\n\n        val queueSwapRequest = mapOf(\n            REQUEST_QUEUE_ACTION_KEY to REQUEST_QUEUE_ACTION_SWAP,\n            SWAP_QUEUE_RESERVE_SESSION_ID_KEY to toSession.id,\n            SWAP_QUEUE_CANCEL_SESSION_ID_KEY to fromSession.id,\n            REQUEST_QUEUE_REQUEST_ID_KEY to newRandomRequestId\n        )\n\n        batch.set(newRequest, queueSwapRequest)\n\n        return withContext(ioDispatcher) {\n            suspendCancellableCoroutine<Result<SwapRequestAction>> { continuation ->\n                // Commit write batch\n                batch.commit().addOnSuccessListener {\n                    Timber.d(\n                        \"\"\"Queueing the swap request from:\n                            |${fromSession.id} to: ${toSession.id} succeeded\"\"\".trimMargin()\n                    )\n                    continuation.resume(Success(SwapRequestAction()))\n                }.addOnFailureListener {\n                    Timber.d(\n                        \"\"\"Queueing the swap request from:\n                            |${fromSession.id} to: ${toSession.id} failed\"\"\".trimMargin()\n                    )\n                    continuation.resume(Error(it))\n                }\n            }\n        }\n    }\n\n    private fun getReservationRequestedEventAction(action: ReservationRequestAction): String =\n        when (action) {\n            is RequestAction -> RESERVE_REQ_ACTION\n            is CancelAction -> RESERVE_CANCEL_ACTION\n            // This should not happen because there is a dedicated method for the swap request\n            is SwapAction -> throw IllegalStateException()\n        }\n\n    private fun getReservationRequestedQueueAction(action: ReservationRequestAction) =\n        when (action) {\n            is RequestAction -> REQUEST_QUEUE_ACTION_RESERVE\n            is CancelAction -> REQUEST_QUEUE_ACTION_CANCEL\n            // This should not happen because there is a dedicated method for the swap request\n            is SwapAction -> throw IllegalStateException()\n        }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/userevent/FirestoreUserEventParser.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.userevent\n\nimport com.google.firebase.firestore.DocumentSnapshot\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequest\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource.Companion.RESERVATION_REQUEST_ACTION_KEY\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource.Companion.RESERVATION_REQUEST_KEY\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource.Companion.RESERVATION_REQUEST_REQUEST_ID_KEY\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource.Companion.RESERVATION_RESULT_KEY\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource.Companion.RESERVATION_RESULT_REQ_ID_KEY\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource.Companion.RESERVATION_RESULT_RESULT_KEY\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource.Companion.RESERVATION_RESULT_TIME_KEY\nimport com.google.samples.apps.iosched.shared.data.userevent.FirestoreUserEventDataSource.Companion.RESERVATION_STATUS_KEY\nimport timber.log.Timber\n\n/**\n * Parse a user event that includes information about the reservation status.\n */\nfun parseUserEvent(snapshot: DocumentSnapshot): UserEvent {\n\n    val reservationRequestResult: ReservationRequestResult? =\n        generateReservationRequestResult(snapshot)\n\n    val reservationRequest = parseReservationRequest(snapshot)\n\n    val reservationStatus = (snapshot[RESERVATION_STATUS_KEY] as? String)?.let {\n        UserEvent.ReservationStatus.getIfPresent(it)\n    }\n    return UserEvent(\n        id = snapshot.id,\n        reservationRequestResult = reservationRequestResult,\n        reservationStatus = reservationStatus,\n        isStarred = snapshot[FirestoreUserEventDataSource.IS_STARRED] as? Boolean ?: false,\n        reservationRequest = reservationRequest,\n        isReviewed = snapshot[FirestoreUserEventDataSource.REVIEWED] as? Boolean ?: false\n    )\n}\n\n/**\n * Parse the result of a reservation request.\n */\nprivate fun generateReservationRequestResult(\n    snapshot: DocumentSnapshot\n): ReservationRequestResult? {\n\n    (snapshot[RESERVATION_RESULT_KEY] as? Map<*, *>)?.let { reservation ->\n        val requestResult = (reservation[RESERVATION_RESULT_RESULT_KEY] as? String)\n            ?.let { ReservationRequestResult.ReservationRequestStatus.getIfPresent(it) }\n\n        val requestId = (reservation[RESERVATION_RESULT_REQ_ID_KEY] as? String)\n\n        val timestamp = reservation[RESERVATION_RESULT_TIME_KEY] as? Long ?: -1\n\n        // Mandatory fields or fail:\n        if (requestResult == null || requestId == null) {\n            Timber.e(\"Error parsing reservation request result: some fields null\")\n            return null\n        }\n\n        return ReservationRequestResult(\n            requestResult = requestResult,\n            requestId = requestId,\n            timestamp = timestamp\n        )\n    }\n    // If there's no reservation:\n    return null\n}\n\n/**\n * Parse the reservation request.\n */\nprivate fun parseReservationRequest(snapshot: DocumentSnapshot): ReservationRequest? {\n\n    (snapshot[RESERVATION_REQUEST_KEY] as? Map<*, *>)?.let { request ->\n        val action = (request[RESERVATION_REQUEST_ACTION_KEY] as? String)?.let {\n            ReservationRequest.ReservationRequestEntityAction.getIfPresent(it)\n        }\n        val requestId = (request[RESERVATION_REQUEST_REQUEST_ID_KEY] as? String)\n\n        // Mandatory fields or fail:\n        if (action == null || requestId == null) {\n            Timber.e(\"Error parsing reservation request from Firestore\")\n            return null\n        }\n\n        return ReservationRequest(action, requestId)\n    }\n    // If there's no reservation request:\n    return null\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/userevent/UserEventDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.userevent\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestAction\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.flow.Flow\n\ninterface UserEventDataSource {\n\n    fun getObservableUserEvents(userId: String): Flow<UserEventsResult>\n\n    fun getObservableUserEvent(userId: String, eventId: SessionId): Flow<UserEventResult>\n\n    fun getUserEvents(userId: String): List<UserEvent>\n\n    fun getUserEvent(userId: String, eventId: SessionId): UserEvent?\n\n    /**\n     * Toggle the isStarred status for an event.\n     *\n     * @param userId the userId ([FirebaseUser#uid]) of the current logged in user\n     * @param userEvent the [UserEvent], which isStarred is going to be the updated status\n     * @return the Result that represents the status of the star operation.\n     */\n    suspend fun starEvent(userId: String, userEvent: UserEvent): Result<StarUpdatedStatus>\n\n    suspend fun recordFeedbackSent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<Unit>\n\n    suspend fun requestReservation(\n        userId: String,\n        session: Session,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction>\n\n    suspend fun swapReservation(\n        userId: String,\n        fromSession: Session,\n        toSession: Session\n    ): Result<SwapRequestAction>\n\n    fun clearSingleEventSubscriptions()\n}\n\ndata class UserEventsResult(\n    val userEvents: List<UserEvent>,\n    val userEventsMessage: UserEventMessage? = null\n)\n\ndata class UserEventResult(\n    val userEvent: UserEvent?,\n    val userEventMessage: UserEventMessage? = null\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/data/userevent/UserEventsMessageGenerator.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.userevent\n\nimport androidx.annotation.VisibleForTesting\nimport com.google.firebase.firestore.DocumentSnapshot\nimport com.google.firebase.firestore.QuerySnapshot\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CANCELLATION_DENIED_CUTOFF\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CANCELLATION_DENIED_UNKNOWN\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CHANGES_IN_RESERVATIONS\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.CHANGES_IN_WAITLIST\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATIONS_REPLACED\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_CANCELED\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_CLASH\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_CUTOFF\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.RESERVATION_DENIED_UNKNOWN\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessageChangeType.WAITLIST_CANCELED\nimport timber.log.Timber\n\n/**\n * Go through all the changes and generate user messages in case there are reservation changes.\n */\nfun generateReservationChangeMsg(\n    snapshot: QuerySnapshot,\n    oldValue: UserEventsResult?\n): UserEventMessage? {\n\n    // If oldValue doesn't exist, it's the first run so don't generate messages.\n    if (oldValue == null) return null\n\n    var userMessage: UserEventMessage? = null\n\n    snapshot.documentChanges.forEach { change ->\n\n        val changedId: String = change.document.data[FirestoreUserEventDataSource.ID]\n            as? String ?: return null\n\n        val eventOldValue = oldValue.userEvents.firstOrNull { it.id == changedId } ?: return null\n\n        val newMessage = getUserMessageFromChange(eventOldValue, change.document, changedId)\n\n        // If there are multiple messages, show just one according to order in enum.\n        if (newMessage != null) {\n            val userMessageSnapshot = userMessage\n            // Order in enum is definition order\n            if (userMessageSnapshot == null || newMessage.type < userMessageSnapshot.type) {\n                userMessage = newMessage\n            }\n        }\n    }\n    return userMessage\n}\n\n/**\n * Given a change in a document, generate a user message to indicate a change in reservations.\n */\nfun getUserMessageFromChange(\n    oldValue: UserEvent,\n    documentSnapshot: DocumentSnapshot,\n    changeId: String\n): UserEventMessage? {\n\n    // Get the new state\n    val newState = parseUserEvent(documentSnapshot)\n\n    return compareOldAndNewUserEvents(oldValue, newState, changeId)\n}\n\n@VisibleForTesting\nfun compareOldAndNewUserEvents(\n    oldState: UserEvent,\n    newState: UserEvent,\n    changedId: String\n): UserEventMessage? {\n\n    // If the old data wasn't reserved and it's reserved now, there's a change.\n    if (!oldState.isReserved() && newState.isReserved()) {\n        Timber.d(\"Request change detected: $changedId\")\n        return if (newState.isLastRequestResultBySwap()) {\n            UserEventMessage(\n                RESERVATIONS_REPLACED, newState.id, newState.getReservationRequestResultId()\n            )\n        } else {\n            UserEventMessage(\n                CHANGES_IN_RESERVATIONS,\n                newState.id,\n                newState.getReservationRequestResultId()\n            )\n        }\n    }\n    // If the user was waiting for a reservation and they're waitlisted, there's a change.\n    if (oldState.isReservationPending() && newState.isWaitlisted()) {\n        Timber.d(\"Waitlist change detected: $changedId\")\n        return UserEventMessage(\n            CHANGES_IN_WAITLIST,\n            newState.id,\n            newState.getReservationRequestResultId()\n        )\n    }\n\n    // User canceled reservation\n    if (oldState.isReserved() && !newState.isReserved()) {\n        Timber.d(\"Reservation cancellation detected: $changedId\")\n        return UserEventMessage(\n            RESERVATION_CANCELED,\n            newState.id,\n            newState.getReservationRequestResultId()\n        )\n    }\n\n    // User canceled waitlist\n    if (oldState.isWaitlisted() && !newState.isReserved() && !newState.isWaitlisted()) {\n        Timber.d(\"Reservation cancellation detected: $changedId\")\n        return UserEventMessage(\n            WAITLIST_CANCELED,\n            newState.id,\n            newState.getReservationRequestResultId()\n        )\n    }\n\n    // Errors: only show if it's a new one.\n    if (newState.hasRequestResultError() &&\n        newState.isDifferentRequestResult(oldState.getReservationRequestResultId())\n    ) {\n\n        // Reserve cut-off\n        if (newState.isRequestResultErrorReserveDeniedCutoff()) {\n            Timber.d(\"Reservation error cut-off: $changedId\")\n            return UserEventMessage(\n                RESERVATION_DENIED_CUTOFF,\n                newState.id,\n                newState.getReservationRequestResultId()\n            )\n        }\n        // Reserve clash\n        if (newState.isRequestResultErrorReserveDeniedClash()) {\n            Timber.d(\"Reservation error clash: $changedId\")\n            return UserEventMessage(\n                RESERVATION_DENIED_CLASH,\n                newState.id,\n                newState.getReservationRequestResultId()\n            )\n        }\n        // Reserve unknown\n        if (newState.isRequestResultErrorReserveDeniedUnknown()) {\n            Timber.d(\"Reservation unknown error: $changedId\")\n            return UserEventMessage(\n                RESERVATION_DENIED_UNKNOWN,\n                newState.id,\n                newState.getReservationRequestResultId()\n            )\n        }\n        // Cancel cut-off\n        if (newState.isRequestResultErrorCancelDeniedCutoff()) {\n            Timber.d(\"Cancellation error cut-off: $changedId\")\n            return UserEventMessage(\n                CANCELLATION_DENIED_CUTOFF,\n                newState.id,\n                newState.getReservationRequestResultId()\n            )\n        }\n        // Cancel unknown\n        if (newState.isRequestResultErrorCancelDeniedUnknown()) {\n            Timber.d(\"Cancellation unknown error: $changedId\")\n            return UserEventMessage(\n                CANCELLATION_DENIED_UNKNOWN,\n                newState.id,\n                newState.getReservationRequestResultId()\n            )\n        }\n    }\n    return null\n}\n\ndata class UserEventMessage(\n    val type: UserEventMessageChangeType,\n    val sessionId: String? = null,\n    val changeRequestId: String? = null\n)\n\n/**\n * Enum of messages notified to the end user.\n * Need to be ordered by importance\n * (e.g. CHANGE_IN_RESERVATIONS is more important than CHANGES_IN_WAITLIST)\n */\nenum class UserEventMessageChangeType {\n    CHANGES_IN_RESERVATIONS,\n    RESERVATIONS_REPLACED,\n    CHANGES_IN_WAITLIST,\n    RESERVATION_CANCELED,\n    WAITLIST_CANCELED,\n    RESERVATION_DENIED_CUTOFF,\n    RESERVATION_DENIED_CLASH,\n    RESERVATION_DENIED_UNKNOWN,\n    CANCELLATION_DENIED_CUTOFF,\n    CANCELLATION_DENIED_UNKNOWN\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/di/CoroutinesQualifiers.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.di\n\nimport javax.inject.Qualifier\n\n@Retention(AnnotationRetention.BINARY)\n@Qualifier\nannotation class DefaultDispatcher\n\n@Retention(AnnotationRetention.BINARY)\n@Qualifier\nannotation class IoDispatcher\n\n@Retention(AnnotationRetention.BINARY)\n@Qualifier\nannotation class MainDispatcher\n\n@Retention(AnnotationRetention.BINARY)\n@Qualifier\nannotation class MainImmediateDispatcher\n\n@Retention(AnnotationRetention.BINARY)\n@Qualifier\nannotation class ApplicationScope\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/di/FeatureFlagAnnotations.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.di\n\nimport javax.inject.Qualifier\n\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER\n)\n@Retention(AnnotationRetention.BINARY)\nannotation class ExploreArEnabledFlag\n\n// Whether or not the Map feature is enabled\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER\n)\n@Retention(AnnotationRetention.BINARY)\nannotation class MapFeatureEnabledFlag\n\n// Whether or not the Codelabs feature is enabled\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER\n)\n@Retention(AnnotationRetention.BINARY)\nannotation class CodelabsEnabledFlag\n\n// Whether or not the Search Schedule feature is enabled\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER\n)\n@Retention(AnnotationRetention.BINARY)\nannotation class SearchScheduleEnabledFlag\n\n// Whether or not the Search feature uses Room\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER\n)\n@Retention(AnnotationRetention.BINARY)\nannotation class SearchUsingRoomEnabledFlag\n\n// Whether or not the I/O app for Google Assistant callout is enabled\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER\n)\n@Retention(AnnotationRetention.BINARY)\nannotation class AssistantAppEnabledFlag\n\n// Whether or not the reservation feature is enabled\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER\n)\n@Retention(AnnotationRetention.BINARY)\nannotation class ReservationEnabledFlag\n\n// Whether or not the Feed feature is enabled\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER\n)\n@Retention(AnnotationRetention.BINARY)\nannotation class FeedEnabledFlag\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/di/FeatureFlagsModule.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.di\n\nimport com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nclass FeatureFlagsModule {\n\n    @Provides\n    @Singleton\n    @ExploreArEnabledFlag\n    fun provideEnableExploreArFlag(appConfig: AppConfigDataSource): Boolean {\n        return appConfig.isExploreArFeatureEnabled()\n    }\n\n    @Provides\n    @MapFeatureEnabledFlag\n    fun provideMapFeatureEnabledFlag(appConfig: AppConfigDataSource): Boolean {\n        return appConfig.isMapFeatureEnabled()\n    }\n\n    @Provides\n    @CodelabsEnabledFlag\n    fun provideCodelabsEnabledFlag(appConfig: AppConfigDataSource): Boolean {\n        return appConfig.isCodelabsFeatureEnabled()\n    }\n\n    @Provides\n    @SearchScheduleEnabledFlag\n    fun provideSearchScheduleEnabledFlag(appConfig: AppConfigDataSource): Boolean {\n        return appConfig.isSearchScheduleFeatureEnabled()\n    }\n\n    @Provides\n    @SearchUsingRoomEnabledFlag\n    fun provideSearchUsingRoomEnabledFlag(appConfig: AppConfigDataSource): Boolean {\n        return appConfig.isSearchUsingRoomFeatureEnabled()\n    }\n\n    @Provides\n    @AssistantAppEnabledFlag\n    fun provideAssistantAppEnabledFlag(appConfig: AppConfigDataSource): Boolean {\n        return appConfig.isAssistantAppFeatureEnabled()\n    }\n\n    @Provides\n    @ReservationEnabledFlag\n    fun provideReservationEnabledFlag(appConfig: AppConfigDataSource): Boolean {\n        return appConfig.isReservationFeatureEnabled()\n    }\n\n    @Provides\n    @FeedEnabledFlag\n    fun provideFeedEnabledFlag(appConfig: AppConfigDataSource): Boolean {\n        return appConfig.isFeedEnabled()\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/di/MainThreadHandler.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.di\n\nimport javax.inject.Qualifier\n\n@Qualifier\n@Target(\n    AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER,\n    AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD,\n    AnnotationTarget.VALUE_PARAMETER\n)\nannotation class MainThreadHandler\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/CoroutineUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain\n\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport timber.log.Timber\n\n/**\n * Executes business logic synchronously or asynchronously using Coroutines.\n */\nabstract class UseCase<in P, R>(private val coroutineDispatcher: CoroutineDispatcher) {\n\n    /** Executes the use case asynchronously and returns a [Result].\n     *\n     * @return a [Result].\n     *\n     * @param parameters the input parameters to run the use case with\n     */\n    suspend operator fun invoke(parameters: P): Result<R> {\n        return try {\n            // Moving all use case's executions to the injected dispatcher\n            // In production code, this is usually the Default dispatcher (background thread)\n            // In tests, this becomes a TestCoroutineDispatcher\n            withContext(coroutineDispatcher) {\n                execute(parameters).let {\n                    Result.Success(it)\n                }\n            }\n        } catch (e: Exception) {\n            Timber.d(e)\n            Result.Error(e)\n        }\n    }\n\n    /**\n     * Override this to set the code to be executed.\n     */\n    @Throws(RuntimeException::class)\n    protected abstract suspend fun execute(parameters: P): R\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/FlowUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain\n\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.flowOn\n\n/**\n * Executes business logic in its execute method and keep posting updates to the result as\n * [Result<R>].\n * Handling an exception (emit [Result.Error] to the result) is the subclasses's responsibility.\n */\nabstract class FlowUseCase<in P, R>(private val coroutineDispatcher: CoroutineDispatcher) {\n    operator fun invoke(parameters: P): Flow<Result<R>> = execute(parameters)\n        .catch { e -> emit(Result.Error(Exception(e))) }\n        .flowOn(coroutineDispatcher)\n\n    protected abstract fun execute(parameters: P): Flow<Result<R>>\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/MediatorUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain\n\nimport androidx.lifecycle.MediatorLiveData\nimport com.google.samples.apps.iosched.shared.result.Result\n\n/**\n * Executes business logic in its execute method and keep posting updates to the result as\n * [Result<R>].\n * Handling an exception (emit [Result.Error] to the result) is the subclasses's responsibility.\n */\nabstract class MediatorUseCase<in P, R> {\n    protected val result = MediatorLiveData<Result<R>>()\n\n    // Make this as open so that mock instances can mock this method\n    open fun observe(): MediatorLiveData<Result<R>> {\n        return result\n    }\n\n    abstract fun execute(parameters: P)\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/RefreshConferenceDataUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain\n\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport timber.log.Timber\n\n/**\n * Forces a refresh in the conference data repository.\n */\nopen class RefreshConferenceDataUseCase @Inject constructor(\n    private val repository: ConferenceDataRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Any, Boolean>(dispatcher) {\n\n    override suspend fun execute(parameters: Any): Boolean {\n        try {\n            repository.refreshCacheWithRemoteConferenceData()\n        } catch (e: Exception) {\n            Timber.e(e, \"Conference data refresh failed\")\n            throw e\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/agenda/LoadAgendaUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.agenda\n\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.shared.data.agenda.AgendaRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * Loads the agenda. When the parameter is passed as true, it's guaranteed the data\n * loaded from this use case is up to date with the remote data source (Remote Config)\n */\nopen class LoadAgendaUseCase @Inject constructor(\n    private val repository: AgendaRepository,\n    @IoDispatcher ioDispatcher: CoroutineDispatcher\n) : UseCase<Boolean, List<Block>>(ioDispatcher) {\n\n    override suspend fun execute(parameters: Boolean): List<Block> =\n        repository.getAgenda(parameters)\n            .filterNot { it.startTime == it.endTime }\n            .distinct()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/ar/ArConstants.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.ar\n\nobject ArConstants {\n    const val PINNED_SESSIONS_JSON_KEY = \"pinned_sessions_json\"\n    const val CAN_SIGNED_IN_USER_DEMO_AR = \"can_demo_ar\"\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/ar/LoadArDebugFlagUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.ar\n\nimport com.google.samples.apps.iosched.shared.data.ar.ArDebugFlagEndpoint\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\n/**\n * UseCase that loads if a signed in user can demo the AR feature (bypass teaser).\n * Should post Result.Success(true) to result when the signed in user can demo the AR feature.\n */\nclass LoadArDebugFlagUseCase @Inject constructor(\n    private val endpoint: ArDebugFlagEndpoint,\n    @IoDispatcher private val ioDispatcher: CoroutineDispatcher\n) : UseCase<Unit, Boolean>(ioDispatcher) {\n\n    override suspend fun execute(parameters: Unit): Boolean = endpoint.canDemoAr()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/auth/ObserveUserAuthStateUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.auth\n\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfo\nimport com.google.samples.apps.iosched.shared.data.signin.AuthenticatedUserInfoBasic\nimport com.google.samples.apps.iosched.shared.data.signin.FirebaseRegisteredUserInfo\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthStateUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.RegisteredUserDataSource\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.fcm.TopicSubscriber\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.util.cancelIfActive\nimport javax.inject.Inject\nimport javax.inject.Singleton\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.channels.ProducerScope\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.callbackFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.launch\n\n/**\n * A [FlowUseCase] that observes two data sources to generate an [AuthenticatedUserInfo]\n * that includes whether the user is registered (is an attendee).\n *\n * [AuthStateUserDataSource] provides general user information, like user IDs, while\n * [RegisteredUserDataSource] observes a different data source to provide a flag indicating\n * whether the user is registered.\n */\n@Singleton\nopen class ObserveUserAuthStateUseCase @Inject constructor(\n    private val registeredUserDataSource: RegisteredUserDataSource,\n    private val authStateUserDataSource: AuthStateUserDataSource,\n    private val topicSubscriber: TopicSubscriber,\n    @ApplicationScope private val externalScope: CoroutineScope,\n    @IoDispatcher private val ioDispatcher: CoroutineDispatcher\n) : FlowUseCase<Any, AuthenticatedUserInfo>(ioDispatcher) {\n\n    private var observeUserRegisteredChangesJob: Job? = null\n\n    // As a separate coroutine needs to listen for user registration changes and emit to the\n    // flow, a callbackFlow is used\n    private val authStateChanges = callbackFlow<Result<AuthenticatedUserInfo>> {\n        authStateUserDataSource.getBasicUserInfo().collect { userResult ->\n            // Cancel observing previous user registered changes\n            observeUserRegisteredChangesJob.cancelIfActive()\n\n            if (userResult is Success) {\n                if (userResult.data != null) {\n                    processUserData(userResult.data)\n                } else {\n                    send(Success(FirebaseRegisteredUserInfo(null, false)))\n                }\n            } else {\n                send(Result.Error(Exception(\"FirebaseAuth error\")))\n            }\n        }\n\n        // Always wait for the flow to be closed. Specially important for tests.\n        awaitClose { observeUserRegisteredChangesJob.cancelIfActive() }\n    }\n        .shareIn(externalScope, SharingStarted.WhileSubscribed())\n\n    override fun execute(parameters: Any): Flow<Result<AuthenticatedUserInfo>> = authStateChanges\n\n    private fun subscribeToRegisteredTopic() {\n        topicSubscriber.subscribeToAttendeeUpdates()\n    }\n\n    private fun unsubscribeFromRegisteredTopic() {\n        topicSubscriber.unsubscribeFromAttendeeUpdates()\n    }\n\n    private suspend fun ProducerScope<Result<AuthenticatedUserInfo>>.processUserData(\n        userData: AuthenticatedUserInfoBasic\n    ) {\n        if (!userData.isSignedIn()) {\n            userSignedOut(userData)\n        } else if (userData.getUid() != null) {\n            userSignedIn(userData.getUid()!!, userData)\n        } else {\n            send(Success(FirebaseRegisteredUserInfo(userData, false)))\n        }\n    }\n\n    private suspend fun ProducerScope<Result<AuthenticatedUserInfo>>.userSignedIn(\n        userId: String,\n        userData: AuthenticatedUserInfoBasic\n    ) {\n        // Observing the user registration changes from another scope to able to listen\n        // for this and updates to getBasicUserInfo() simultaneously\n        observeUserRegisteredChangesJob = externalScope.launch(ioDispatcher) {\n            // Start observing the user in Firestore to fetch the `registered` flag\n            registeredUserDataSource.observeUserChanges(userId).collect { result ->\n                val isRegisteredValue: Boolean? = result.data\n                // When there's new user data and the user is an attendee, subscribe to topic:\n                if (isRegisteredValue == true && userData.isSignedIn()) {\n                    subscribeToRegisteredTopic()\n                }\n\n                send(Success(FirebaseRegisteredUserInfo(userData, isRegisteredValue)))\n            }\n        }\n    }\n\n    private suspend fun ProducerScope<Result<AuthenticatedUserInfo>>.userSignedOut(\n        userData: AuthenticatedUserInfoBasic?\n    ) {\n        send(Success(FirebaseRegisteredUserInfo(userData, false)))\n        unsubscribeFromRegisteredTopic() // Stop receiving notifications for attendees\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/codelabs/GetCodelabsInfoCardShownUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.codelabs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\n\nopen class GetCodelabsInfoCardShownUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<Unit, Boolean>(dispatcher) {\n    override fun execute(parameters: Unit) = preferenceStorage.codelabsInfoShown.map {\n        Result.Success(it)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/codelabs/LoadCodelabsUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.codelabs\n\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.shared.data.codelabs.CodelabsRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\nclass LoadCodelabsUseCase @Inject constructor(\n    private val repository: CodelabsRepository,\n    @IoDispatcher ioDispatcher: CoroutineDispatcher\n) : UseCase<Unit, List<Codelab>>(ioDispatcher) {\n\n    override suspend fun execute(parameters: Unit): List<Codelab> {\n        return repository.getCodelabs()\n            .sortedWith(compareByDescending<Codelab> { it.sortPriority }.thenBy { it.title })\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/codelabs/SetCodelabsInfoCardShownUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.codelabs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * Use case to record that the user has seen the Codelabs information card\n */\nclass SetCodelabsInfoCardShownUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, Unit>(dispatcher) {\n    override suspend fun execute(parameters: Unit) {\n        preferenceStorage.showCodelabsInfo(true)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/feed/GetConferenceStateUseCase.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.feed\n\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.ENDED\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.STARTED\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.UPCOMING\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.map\nimport org.threeten.bp.Duration\n\nenum class ConferenceState { UPCOMING, STARTED, ENDED }\n\n/**\n * Gets the current [ConferenceState].\n */\nclass GetConferenceStateUseCase @Inject constructor(\n    @MainDispatcher val mainDispatcher: CoroutineDispatcher,\n    private val timeProvider: TimeProvider\n) : FlowUseCase<Unit?, ConferenceState>(mainDispatcher) {\n\n    override fun execute(parameters: Unit?): Flow<Result<ConferenceState>> {\n        return moveToNextState().map { Result.Success(it) }\n    }\n\n    private fun moveToNextState(): Flow<ConferenceState> = flow {\n        do {\n            val (nextState, delayForLaterState) = getNextStateWithDelay()\n            emit(nextState)\n            delay(delayForLaterState ?: 0)\n        } while (nextState != ENDED)\n    }\n\n    private fun getNextStateWithDelay(): Pair<ConferenceState, Long?> {\n        val timeUntilStart = Duration.between(timeProvider.now(), TimeUtils.getKeynoteStartTime())\n        return if (timeUntilStart.isNegative) {\n            val timeUntilEnd =\n                Duration.between(timeProvider.now(), TimeUtils.getConferenceEndTime())\n            if (timeUntilEnd.isNegative) {\n                Pair(ENDED, null)\n            } else {\n                Pair(STARTED, timeUntilEnd.toMillis())\n            }\n        } else {\n            Pair(UPCOMING, timeUntilStart.toMillis())\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/feed/LoadAnnouncementsUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.feed\n\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.shared.data.feed.FeedRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport org.threeten.bp.Instant\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Loads all feed items into a list.\n */\nopen class LoadAnnouncementsUseCase @Inject constructor(\n    private val repository: FeedRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Instant, List<Announcement>>(dispatcher) {\n\n    override suspend fun execute(parameters: Instant): List<Announcement> {\n        val announcements = repository.getAnnouncements()\n        val now = ZonedDateTime.ofInstant(parameters, ZoneId.systemDefault())\n        return announcements.filter {\n            now.isAfter(it.timestamp)\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/feed/LoadCurrentMomentUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.feed\n\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.shared.data.feed.FeedRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport org.threeten.bp.Instant\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Loads a [Moment] corresponding to the given time passed as a parameter.\n */\nclass LoadCurrentMomentUseCase @Inject constructor(\n    private val repository: FeedRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Instant, Moment?>(dispatcher) {\n\n    override suspend fun execute(parameters: Instant): Moment? {\n        val time = ZonedDateTime.ofInstant(parameters, ZoneId.systemDefault())\n        return repository.getMoments()\n            .firstOrNull { it.startTime <= time && time < it.endTime }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/filters/UserSessionFilterMatcher.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.filters\n\nimport com.google.samples.apps.iosched.model.filters.Filter\nimport com.google.samples.apps.iosched.model.filters.Filter.DateFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.MyScheduleFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.TagFilter\nimport com.google.samples.apps.iosched.model.userdata.UserSession\n\nclass UserSessionFilterMatcher(filters: List<Filter>) {\n    private val mySchedule = MyScheduleFilter in filters\n    private val days = filters.filterIsInstance<DateFilter>().map { it.day }\n    private val tagsByCategory =\n        filters.filterIsInstance<TagFilter>().map { it.tag }.groupBy { it.category }\n\n    internal fun matches(userSession: UserSession): Boolean {\n        if (mySchedule && !userSession.userEvent.isStarredOrReserved()) {\n            return false\n        }\n        if (days.isNotEmpty() && days.none { day -> userSession.session in day }) {\n            return false\n        }\n        // For each category, session must have a tag that matches.\n        val sessionTags = userSession.session.tags\n        tagsByCategory.forEach { (_, tagsInCategory) ->\n            if (sessionTags.intersect(tagsInCategory).isEmpty()) {\n                return false\n            }\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/internal/IOSchedHandler.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.internal\n\nimport android.os.Handler\nimport android.os.Looper\n\n/**\n * A forwarding interface for [Handler] to support mocking in tests.\n */\ninterface IOSchedHandler {\n    /**\n     * See [Handler.post]\n     */\n    fun post(runnable: Runnable): Boolean\n\n    /**\n     * See [Handler.postDelayed]\n     */\n    fun postDelayed(runnable: Runnable, millis: Long): Boolean\n\n    /**\n     * See [Handler.removeCallbacks]\n     */\n    fun removeCallbacks(runnable: Runnable)\n}\n\n/**\n * Main thread handler to be used across ioshced.\n */\nclass IOSchedMainHandler : IOSchedHandler {\n    private val handler = Handler(Looper.getMainLooper())\n\n    override fun post(runnable: Runnable) = handler.post(runnable)\n\n    override fun postDelayed(runnable: Runnable, millis: Long) =\n        handler.postDelayed(runnable, millis)\n\n    override fun removeCallbacks(runnable: Runnable) = handler.removeCallbacks(runnable)\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/logistics/LoadWifiInfoUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.logistics\n\nimport com.google.samples.apps.iosched.model.ConferenceWifiInfo\nimport com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport javax.inject.Singleton\nimport kotlinx.coroutines.CoroutineDispatcher\n\n@Singleton\nopen class LoadWifiInfoUseCase @Inject constructor(\n    private val appConfigDataSource: AppConfigDataSource,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, ConferenceWifiInfo>(dispatcher) {\n\n    override suspend fun execute(parameters: Unit): ConferenceWifiInfo {\n        return appConfigDataSource.getWifiInfo()\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/MarkScheduleUiHintsShownUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * Use case when the schedule UI hints are shown\n */\nclass MarkScheduleUiHintsShownUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, Unit>(dispatcher) {\n    override suspend fun execute(parameters: Unit) {\n        preferenceStorage.showScheduleUiHints(true)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/MyLocationOptedInUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.first\n\nopen class MyLocationOptedInUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, Boolean>(dispatcher) {\n    // TODO use this as flow\n    override suspend fun execute(parameters: Unit) = preferenceStorage.myLocationOptedIn.first()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/NotificationsPrefIsShownUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.first\n\n/**\n * Returns whether the notifications preference has been shown to the user.\n */\nopen class NotificationsPrefIsShownUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, Boolean>(dispatcher) {\n    // TODO use as flow\n    override suspend fun execute(parameters: Unit): Boolean =\n        preferenceStorage.notificationsPreferenceShown.first()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/NotificationsPrefSaveActionUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * Records the user preference if the user wants to receive notifications from iosched.\n */\nopen class NotificationsPrefSaveActionUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Boolean, Boolean>(dispatcher) {\n    override suspend fun execute(parameters: Boolean): Boolean {\n        preferenceStorage.preferToReceiveNotifications(parameters)\n        return parameters\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/NotificationsPrefShownActionUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * Records whether the notifications preference has been shown to the user\n */\nclass NotificationsPrefShownActionUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Boolean, Unit>(dispatcher) {\n    override suspend fun execute(parameters: Boolean) {\n        preferenceStorage.showNotificationsPreference(parameters)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompleteActionUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * Records whether onboarding has been completed.\n */\nopen class OnboardingCompleteActionUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Boolean, Unit>(dispatcher) {\n    override suspend fun execute(parameters: Boolean) {\n        preferenceStorage.completeOnboarding(parameters)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/OnboardingCompletedUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\n\n/**\n * Returns whether onboarding has been completed.\n */\nopen class OnboardingCompletedUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<Unit, Boolean>(dispatcher) {\n    override fun execute(parameters: Unit): Flow<Result<Boolean>> =\n        preferenceStorage.onboardingCompleted.map { Result.Success(it) }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/OptIntoMyLocationUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\nopen class OptIntoMyLocationUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Boolean, Boolean>(dispatcher) {\n    override suspend fun execute(parameters: Boolean): Boolean {\n        preferenceStorage.optInMyLocation(parameters)\n        return parameters\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/ScheduleUiHintsShownUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * Returns whether the schedule UI hints have been shown.\n */\nopen class ScheduleUiHintsShownUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, Boolean>(dispatcher) {\n    override suspend fun execute(parameters: Unit): Boolean =\n        preferenceStorage.areScheduleUiHintsShown()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/prefs/StopSnackbarActionUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.prefs\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\n/**\n * Use case to update the preference whether Snackbar messages should be stopped.\n * Only the Snackbars that have R.string.dont_show actionId as its action, the rest\n * of the Snackbars should still show even after setting this preference as true.\n */\nopen class StopSnackbarActionUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Boolean, Unit>(dispatcher) {\n    override suspend fun execute(parameters: Boolean) {\n        preferenceStorage.stopSnackbar(parameters)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/search/LoadSearchFiltersUseCase.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.search\n\nimport com.google.samples.apps.iosched.model.Tag\nimport com.google.samples.apps.iosched.model.filters.Filter\nimport com.google.samples.apps.iosched.model.filters.Filter.DateFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.TagFilter\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.data.tag.TagRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\nprivate val FILTER_CATEGORIES = listOf(\n    Tag.CATEGORY_TYPE,\n    Tag.CATEGORY_TOPIC,\n    Tag.CATEGORY_LEVEL\n)\n\n/** Loads filters for the Search screen. */\nclass LoadSearchFiltersUseCase @Inject constructor(\n    private val conferenceRepository: ConferenceDataRepository,\n    private val tagRepository: TagRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, List<Filter>>(dispatcher) {\n\n    override suspend fun execute(parameters: Unit): List<Filter> {\n        val filters = mutableListOf<Filter>()\n        filters.addAll(conferenceRepository.getConferenceDays().map { DateFilter(it) })\n        filters.addAll(\n            tagRepository.getTags()\n                .filter { it.category in FILTER_CATEGORIES }\n                .sortedWith(\n                    compareBy({ FILTER_CATEGORIES.indexOf(it.category) }, { it.orderInCategory })\n                )\n                .map { TagFilter(it) }\n        )\n        return filters\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/search/Searchable.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.search\n\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.Speaker\n\n/**\n * Sealed class that represents searchable contents.\n */\nsealed class Searchable {\n\n    class SearchedSession(val session: Session) : Searchable()\n    class SearchedSpeaker(val speaker: Speaker) : Searchable()\n    class SearchedCodelab(val codelab: Codelab) : Searchable()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/search/SessionSearchUseCase.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.search\n\nimport androidx.core.os.trace\nimport com.google.samples.apps.iosched.model.filters.Filter\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.domain.filters.UserSessionFilterMatcher\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Error\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\n\ndata class SessionSearchUseCaseParams(\n    val userId: String?,\n    val query: String,\n    val filters: List<Filter>\n)\n\nclass SessionSearchUseCase @Inject constructor(\n    private val repository: SessionAndUserEventRepository,\n    private val textMatchStrategy: SessionTextMatchStrategy,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<SessionSearchUseCaseParams, List<UserSession>>(dispatcher) {\n\n    override fun execute(parameters: SessionSearchUseCaseParams): Flow<Result<List<UserSession>>> {\n        val (userId, query, filters) = parameters\n        trace(\"search-path-usecase\") {\n            val filterMatcher = UserSessionFilterMatcher(filters)\n            return repository.getObservableUserEvents(userId).map { result ->\n                when (result) {\n                    is Success -> {\n                        val searchResults = textMatchStrategy.searchSessions(\n                            result.data.userSessions, query\n                        ).filter { filterMatcher.matches(it) }\n                        Success(searchResults)\n                    }\n                    is Loading -> result\n                    is Error -> result\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/search/SessionTextMatchStrategy.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.search\n\nimport androidx.core.os.trace\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.db.AppDatabase\nimport javax.inject.Inject\n\ninterface SessionTextMatchStrategy {\n    suspend fun searchSessions(userSessions: List<UserSession>, query: String): List<UserSession>\n}\n\n/** Searches sessions by simple string comparison against title and description. */\nobject SimpleMatchStrategy : SessionTextMatchStrategy {\n\n    override suspend fun searchSessions(\n        userSessions: List<UserSession>,\n        query: String\n    ): List<UserSession> {\n        trace(\"search-path-simplematchstrategy\") {\n            if (query.isEmpty()) {\n                return userSessions\n            }\n            val lowercaseQuery = query.toLowerCase()\n            return userSessions.filter {\n                it.session.title.toLowerCase().contains(lowercaseQuery) ||\n                    it.session.description.toLowerCase().contains(lowercaseQuery)\n            }\n        }\n    }\n}\n\n/** Searches sessions using FTS. */\nclass FtsMatchStrategy @Inject constructor(\n    private val appDatabase: AppDatabase\n) : SessionTextMatchStrategy {\n\n    override suspend fun searchSessions(\n        userSessions: List<UserSession>,\n        query: String\n    ): List<UserSession> {\n        trace(\"search-path-ftsmatchstrategy\") {\n            if (query.isEmpty()) {\n                return userSessions\n            }\n            val sessionIds = trace(\"search-path-roomquery\") {\n                appDatabase.sessionFtsDao().searchAllSessions(query.toLowerCase()).toSet()\n            }\n            return userSessions.filter { it.session.id in sessionIds }\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/ConferenceDayIndexer.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.ConferenceDay\n\nclass ConferenceDayIndexer(\n    /**\n     * Mapping of ConferenceDay to start position.\n     * Values (indexes) must be >= 0 and in ascending order.\n     */\n    mapping: Map<ConferenceDay, Int>\n) {\n    init {\n        var previous = -1\n        mapping.forEach { (_, value) ->\n            if (value <= previous) {\n                throw IllegalArgumentException(\"Index values must be >= 0 and in ascending order.\")\n            }\n            previous = value\n        }\n    }\n\n    /** The ConferenceDays that are indexed. */\n    val days = mapping.map { it.key }\n    private val startPositions = mapping.map { it.value }\n\n    fun dayForPosition(position: Int): ConferenceDay? {\n        startPositions.asReversed().forEachIndexed { index, intVal ->\n            if (intVal <= position) {\n                // Indexes are inverted because of asReversed()\n                return days[days.size - index - 1]\n            }\n        }\n        return null\n    }\n\n    fun positionForDay(day: ConferenceDay): Int {\n        val index = days.indexOf(day)\n        if (index == -1) {\n            throw IllegalArgumentException(\"Unknown day\")\n        }\n        return startPositions[index]\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/GetConferenceDaysUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport javax.inject.Inject\n\nclass GetConferenceDaysUseCase @Inject constructor(\n    private val conferenceDataRepository: ConferenceDataRepository\n) {\n    operator fun invoke(): List<ConferenceDay> {\n        return conferenceDataRepository.getConferenceDays()\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.gson.Gson\nimport com.google.samples.apps.iosched.model.schedule.PinnedSession\nimport com.google.samples.apps.iosched.model.schedule.PinnedSessionsSchedule\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.ObservableUserEvents\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.shared.util.toEpochMilli\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\n\n/**\n * Load a list of pinned (starred or reserved) [UserSession]s for a given user as a json format.\n *\n * Example JSON is structured as\n *\n * { schedule : [\n *   {\n *     \"name\": \"session1\",\n *     \"location\": \"Room 1\",\n *     \"day\": \"5/07\",\n *     \"time\": \"13:30\",\n *     \"timestamp\": 82547983,\n *     \"description\": \"Session description1\"\n *   },\n *   {\n *     \"name\": \"session2\",\n *     \"location\": \"Room 2\",\n *     \"day\": \"5/08\",\n *     \"time\": \"13:30\",\n *     \"timestamp\": 19238489,\n *     \"description\": \"Session description2\"\n *   }, .....\n *   ]\n * }\n */\nopen class LoadPinnedSessionsJsonUseCase @Inject constructor(\n    private val userEventRepository: DefaultSessionAndUserEventRepository,\n    private val gson: Gson,\n    @IoDispatcher private val ioDispatcher: CoroutineDispatcher\n) : FlowUseCase<String, String>(ioDispatcher) {\n\n    override fun execute(parameters: String): Flow<Result<String>> {\n        return userEventRepository.getObservableUserEvents(parameters)\n            .map { observableResult: Result<ObservableUserEvents> ->\n                when (observableResult) {\n                    is Result.Success -> {\n                        val useCaseResult = observableResult.data.userSessions.filter {\n                            it.userEvent.isStarredOrReserved()\n                        }.map {\n                            val session = it.session\n                            // We assume the conference time zone because only on-site attendees are\n                            // going to use the feature\n                            val zonedTime =\n                                TimeUtils.zonedTime(\n                                    session.startTime,\n                                    TimeUtils.CONFERENCE_TIMEZONE\n                                )\n                            PinnedSession(\n                                name = session.title,\n                                location = session.room?.name ?: \"\",\n                                day = TimeUtils.abbreviatedDayForAr(zonedTime),\n                                time = TimeUtils.abbreviatedTimeForAr(zonedTime),\n                                timestamp = session.startTime.toEpochMilli(),\n                                description = session.description\n                            )\n                        }\n                        val jsonResult = gson.toJson(PinnedSessionsSchedule(useCaseResult))\n                        Result.Success(jsonResult)\n                    }\n                    is Result.Error -> Result.Error(observableResult.exception)\n                    is Result.Loading -> observableResult\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadScheduleUserSessionsUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.util.TimeUtils.ConferenceDays\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport org.threeten.bp.ZonedDateTime\nimport timber.log.Timber\nimport javax.inject.Inject\n\n/**\n * Loads sorted sessions for the Schedule.\n */\nopen class LoadScheduleUserSessionsUseCase @Inject constructor(\n    private val userEventRepository: DefaultSessionAndUserEventRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<LoadScheduleUserSessionsParameters, LoadScheduleUserSessionsResult>(dispatcher) {\n\n    override fun execute(\n        parameters: LoadScheduleUserSessionsParameters\n    ): Flow<Result<LoadScheduleUserSessionsResult>> {\n        Timber.d(\"LoadFilteredUserSessionsUseCase: Refreshing sessions with user data\")\n        return userEventRepository.getObservableUserEvents(parameters.userId).map { result ->\n            when (result) {\n                is Result.Success -> {\n                    val sortedSessions = result.data.userSessions\n                        .sortedWith(compareBy({ it.session.startTime }, { it.session.type }))\n\n                    // Compute type from tags now so it's done in the background\n                    sortedSessions.forEach { it.session.type }\n\n                    val usecaseResult = LoadScheduleUserSessionsResult(\n                        userSessions = sortedSessions,\n                        // TODO(b/122306429) expose user events messages separately\n                        userMessage = result.data.userMessage,\n                        userMessageSession = result.data.userMessageSession,\n                        userSessionCount = sortedSessions.size,\n                        firstUnfinishedSessionIndex = findFirstUnfinishedSession(\n                            sortedSessions, parameters.now\n                        ),\n                        dayIndexer = buildConferenceDayIndexer(sortedSessions)\n                    )\n                    Result.Success(usecaseResult)\n                }\n                is Result.Error -> {\n                    Result.Error(result.exception)\n                }\n                is Result.Loading -> Result.Loading\n            }\n        }\n    }\n\n    /**\n     * During the conference, find the first session which has not finished so that the UI can\n     * scroll to it.\n     */\n    private fun findFirstUnfinishedSession(\n        userSessions: List<UserSession>,\n        now: ZonedDateTime\n    ): Int {\n        if (now.isAfter(ConferenceDays.first().start) && now.isBefore(ConferenceDays.last().end)) {\n            return userSessions.indexOfFirst { it.session.endTime.isAfter(now) }\n        }\n        return -1\n    }\n\n    /**\n     * Finds indices in [sessions] where each ConferenceDay begins. This method assumes [sessions]\n     * is sorted by start time.\n     */\n    private fun buildConferenceDayIndexer(sessions: List<UserSession>): ConferenceDayIndexer {\n        val mapping = ConferenceDays\n            .associateWith { day ->\n                sessions.indexOfFirst {\n                    day.contains(it.session)\n                }\n            }\n            .filterValues { it >= 0 } // exclude days with no matching sessions\n\n        return ConferenceDayIndexer(mapping)\n    }\n}\n\ndata class LoadScheduleUserSessionsParameters(\n    val userId: String?,\n\n    val now: ZonedDateTime = ZonedDateTime.now()\n)\n\ndata class LoadScheduleUserSessionsResult(\n\n    val userSessions: List<UserSession>,\n\n    /** A message to show to the user with important changes like reservation confirmations */\n    val userMessage: UserEventMessage? = null,\n\n    /** The session the user message is about, if any. */\n    val userMessageSession: Session? = null,\n\n    /** The total number of sessions. */\n    val userSessionCount: Int = userSessions.size,\n\n    /** The location of the first session which has not finished. */\n    val firstUnfinishedSessionIndex: Int = -1,\n\n    val dayIndexer: ConferenceDayIndexer\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadSessionOneShotUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.data.session.SessionRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\nopen class LoadSessionOneShotUseCase @Inject constructor(\n    private val repository: SessionRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<SessionId, Session>(dispatcher) {\n\n    override suspend fun execute(parameters: SessionId): Session {\n        return repository.getSession(parameters)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadSessionUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.data.session.SessionRepository\nimport com.google.samples.apps.iosched.shared.domain.MediatorUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport javax.inject.Inject\n\nopen class LoadSessionUseCase @Inject constructor(private val repository: SessionRepository) :\n    MediatorUseCase<String, Session>() {\n\n    override fun execute(parameters: SessionId) {\n        val session = repository.getSessions().firstOrNull { it -> it.id == parameters }\n\n        if (session == null) {\n            result.postValue(Result.Error(SessionNotFoundException()))\n        } else {\n            session.type // Compute type from tags now so it's done in the background\n            result.postValue(Result.Success(session))\n        }\n    }\n}\n\nclass SessionNotFoundException : Exception()\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadStarredAndReservedSessionsUseCase.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\n\n/**\n * Load starred and reserved [UserSession]s for a given user.\n */\n@ExperimentalCoroutinesApi\nclass LoadStarredAndReservedSessionsUseCase @Inject constructor(\n    private val userEventRepository: DefaultSessionAndUserEventRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<String?, List<UserSession>>(dispatcher) {\n\n    override fun execute(parameters: String?): Flow<Result<List<UserSession>>> {\n        // Shortcut: if there's no userId, there won't be any starred or reserved sessions.\n        val userId = parameters ?: return flowOf(Result.Success(emptyList()))\n        // Observe *all* user events\n        return userEventRepository.getObservableUserEvents(userId).map { result ->\n            when (result) {\n                is Result.Success -> {\n                    val relevantUserSessions = result.data.userSessions.filter {\n                        it.userEvent.isStarredOrReserved()\n                    }\n                    if (relevantUserSessions.isNotEmpty()) {\n                        Result.Success(relevantUserSessions)\n                    } else {\n                        Result.Success(emptyList())\n                    }\n                }\n                is Result.Loading -> result\n                is Result.Error -> result\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionOneShotUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * A [UseCase] that returns the [UserSession]s for a user.\n */\nclass LoadUserSessionOneShotUseCase @Inject constructor(\n    private val userEventRepository: DefaultSessionAndUserEventRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Pair<String, SessionId>, UserSession>(dispatcher) {\n\n    override suspend fun execute(parameters: Pair<String, SessionId>): UserSession {\n        val (userId, eventId) = parameters\n\n        return userEventRepository.getUserSession(userId, eventId)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventMessage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\n\n@ExperimentalCoroutinesApi\nopen class LoadUserSessionUseCase @Inject constructor(\n    private val userEventRepository: DefaultSessionAndUserEventRepository,\n    @IoDispatcher ioDispatcher: CoroutineDispatcher\n) : FlowUseCase<Pair<String?, SessionId>, LoadUserSessionUseCaseResult>(ioDispatcher) {\n\n    override fun execute(parameters: Pair<String?, SessionId>):\n        Flow<Result<LoadUserSessionUseCaseResult>> {\n            val (userId, eventId) = parameters\n            return userEventRepository.getObservableUserEvent(userId, eventId).map {\n                if (it is Success) {\n                    Success(LoadUserSessionUseCaseResult(userSession = it.data.userSession))\n                } else {\n                    it\n                }\n            }\n        }\n}\n\ndata class LoadUserSessionUseCaseResult(\n    val userSession: UserSession,\n\n    /** A message to show to the user with important changes like reservation confirmations */\n    val userMessage: UserEventMessage? = null\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadUserSessionsUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\n\n/**\n * Load [UserSession]s for a given list of sessions.\n */\n@ExperimentalCoroutinesApi\nopen class LoadUserSessionsUseCase @Inject constructor(\n    private val userEventRepository: DefaultSessionAndUserEventRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<Pair<String?, Set<SessionId>>, List<UserSession>>(dispatcher) {\n\n    override fun execute(parameters: Pair<String?, Set<String>>): Flow<Result<List<UserSession>>> {\n        val (userId, eventIds) = parameters\n        // Observe *all* user events\n        return userEventRepository.getObservableUserEvents(userId).map { observableResult ->\n            when (observableResult) {\n                is Result.Success -> {\n                    // Filter down to events for sessions we're interested in\n                    val relevantUserSessions = observableResult.data.userSessions\n                        .filter { it.session.id in eventIds }\n                        .sortedBy { it.session.startTime }\n                    if (relevantUserSessions.isNotEmpty()) {\n                        val useCaseResult: List<UserSession> = relevantUserSessions\n                        Result.Success(useCaseResult)\n                    } else {\n                        Result.Error(IllegalStateException(\"RelevantUserSessions is empty\"))\n                    }\n                }\n                is Result.Error -> observableResult\n                else -> Result.Error(IllegalStateException(\"Result must be Success or Error\"))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/NotificationAlarmUpdater.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.ObservableUserEvents\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.notifications.SessionAlarmManager\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.data\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * Sets a notification for each session that is starred or reserved by the user.\n */\n@Singleton\nclass NotificationAlarmUpdater @Inject constructor(\n    private val alarmManager: SessionAlarmManager,\n    private val repository: SessionAndUserEventRepository,\n    @ApplicationScope private val externalScope: CoroutineScope\n) {\n\n    fun updateAll(userId: String) {\n        externalScope.launch {\n            val events = repository.getObservableUserEvents(userId).first { it is Result.Success }\n            events.data?.let { data ->\n                processEvents(userId, data)\n            }\n        }\n    }\n\n    private fun processEvents(\n        userId: String,\n        sessions: ObservableUserEvents\n    ) {\n        Timber.d(\"Setting all the alarms for user $userId\")\n        val startWork = System.currentTimeMillis()\n        sessions.userSessions.forEach { session: UserSession ->\n            if (session.userEvent.isStarred || session.userEvent.isReserved()) {\n                alarmManager.setAlarmForSession(session)\n            }\n        }\n        Timber.d(\"Work finished in ${System.currentTimeMillis() - startWork} ms\")\n    }\n\n    fun cancelAll() {\n        externalScope.launch {\n            val events = repository.getObservableUserEvents(null).first { it is Result.Success }\n            events.data?.let { data ->\n                cancelAllSessions(data)\n            }\n        }\n    }\n\n    private fun cancelAllSessions(sessions: ObservableUserEvents) {\n        Timber.d(\"Cancelling all the alarms\")\n        sessions.userSessions.forEach {\n            alarmManager.cancelAlarmForSession(it.session.id)\n        }\n    }\n}\n\n@Singleton\nopen class StarReserveNotificationAlarmUpdater @Inject constructor(\n    private val alarmManager: SessionAlarmManager\n) {\n    open fun updateSession(\n        userSession: UserSession,\n        requestNotification: Boolean\n    ) {\n        if (requestNotification) {\n            alarmManager.setAlarmForSession(userSession)\n        } else {\n            alarmManager.cancelAlarmForSession(userSession.session.id)\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/sessions/ObserveConferenceDataUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\n\n/**\n * Forces a refresh in the conference data repository.\n */\nopen class ObserveConferenceDataUseCase @Inject constructor(\n    private val repository: ConferenceDataRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<Unit, Long>(dispatcher) {\n\n    override fun execute(parameters: Unit): Flow<Result<Long>> =\n        repository.dataLastUpdatedObservable.map {\n            Result.Success(it)\n        }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/GetAnalyticsSettingUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.map\nimport javax.inject.Inject\n\nclass GetAnalyticsSettingUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<Unit, Boolean>(dispatcher) {\n    override fun execute(parameters: Unit) =\n        preferenceStorage.sendUsageStatistics.map { Result.Success(it) }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/GetAvailableThemesUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport androidx.core.os.BuildCompat\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.shared.di.MainImmediateDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\nclass GetAvailableThemesUseCase @Inject constructor(\n    @MainImmediateDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, List<Theme>>(dispatcher) {\n\n    override suspend fun execute(parameters: Unit): List<Theme> = when {\n        BuildCompat.isAtLeastQ() -> {\n            listOf(Theme.LIGHT, Theme.DARK, Theme.SYSTEM)\n        }\n        else -> {\n            listOf(Theme.LIGHT, Theme.DARK, Theme.BATTERY_SAVER)\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/GetNotificationsSettingUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.first\nimport javax.inject.Inject\n\nclass GetNotificationsSettingUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, Boolean>(dispatcher) {\n    // TODO use preferToReceiveNotifications as flow\n    override suspend fun execute(parameters: Unit) =\n        preferenceStorage.preferToReceiveNotifications.first()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/GetThemeUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport android.os.Build\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.model.Theme.BATTERY_SAVER\nimport com.google.samples.apps.iosched.model.themeFromStorageKey\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.first\n\nclass GetThemeUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, Theme>(dispatcher) {\n    override suspend fun execute(parameters: Unit): Theme {\n        // TODO use as flow\n        val selectedTheme = preferenceStorage.selectedTheme.first()\n        return themeFromStorageKey(selectedTheme)\n            ?: when {\n                Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> Theme.SYSTEM\n                else -> BATTERY_SAVER\n            }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/GetTimeZoneUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.first\nimport javax.inject.Inject\n\nclass GetTimeZoneUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Unit, Boolean>(dispatcher) {\n    // TODO use as flow\n    override suspend fun execute(parameters: Unit) =\n        preferenceStorage.preferConferenceTimeZone.first()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/ObserveThemeModeUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport android.os.Build\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.model.Theme.BATTERY_SAVER\nimport com.google.samples.apps.iosched.model.themeFromStorageKey\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.DefaultDispatcher\nimport com.google.samples.apps.iosched.shared.domain.FlowUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\n\nopen class ObserveThemeModeUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @DefaultDispatcher dispatcher: CoroutineDispatcher\n) : FlowUseCase<Unit, Theme>(dispatcher) {\n    override fun execute(parameters: Unit): Flow<Result<Theme>> {\n        return preferenceStorage.selectedTheme.map {\n            val theme = themeFromStorageKey(it)\n                ?: when {\n                    Build.VERSION.SDK_INT >= 29 -> Theme.SYSTEM\n                    else -> BATTERY_SAVER\n                }\n            Result.Success(theme)\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/SetAnalyticsSettingUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\nopen class SetAnalyticsSettingUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Boolean, Boolean>(dispatcher) {\n    override suspend fun execute(parameters: Boolean): Boolean {\n        preferenceStorage.sendUsageStatistics(parameters)\n        return parameters\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/SetThemeUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport com.google.samples.apps.iosched.model.Theme\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\nopen class SetThemeUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Theme, Unit>(dispatcher) {\n    override suspend fun execute(parameters: Theme) {\n        preferenceStorage.selectTheme(parameters.storageKey)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/settings/SetTimeZoneUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.settings\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\nclass SetTimeZoneUseCase @Inject constructor(\n    private val preferenceStorage: PreferenceStorage,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<Boolean, Boolean>(dispatcher) {\n    override suspend fun execute(parameters: Boolean): Boolean {\n        preferenceStorage.preferConferenceTimeZone(parameters)\n        return parameters\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/speakers/LoadSpeakerSessionsUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.speakers\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.Speaker\nimport com.google.samples.apps.iosched.model.SpeakerId\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineDispatcher\n\n/**\n * Loads a [Speaker] and the IDs of any [com.google.samples.apps.iosched.model.Session]s\n * they are speaking in.\n */\nopen class LoadSpeakerUseCase @Inject constructor(\n    private val conferenceDataRepository: ConferenceDataRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<SpeakerId, LoadSpeakerUseCaseResult>(dispatcher) {\n\n    override suspend fun execute(parameters: SpeakerId): LoadSpeakerUseCaseResult {\n        val speaker = conferenceDataRepository.getOfflineConferenceData().speakers\n            .firstOrNull { it.id == parameters }\n            ?: throw SpeakerNotFoundException(\"No speaker found with id $parameters\")\n        val sessionIds = conferenceDataRepository.getOfflineConferenceData().sessions\n            .filter {\n                it.speakers.find { speaker -> speaker.id == parameters } != null\n            }\n            .map { it.id }\n            .toSet()\n        return LoadSpeakerUseCaseResult(speaker, sessionIds)\n    }\n}\n\ndata class LoadSpeakerUseCaseResult(\n    val speaker: Speaker,\n    val sessionIds: Set<SessionId>\n)\n\nclass SpeakerNotFoundException(message: String) : Throwable(message)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/users/FeedbackUseCase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.users\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.data.feedback.FeedbackEndpoint\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\nopen class FeedbackUseCase @Inject constructor(\n    private val endpoint: FeedbackEndpoint,\n    private val repository: SessionAndUserEventRepository,\n    @IoDispatcher dispatcher: CoroutineDispatcher\n) : UseCase<FeedbackParameter, Unit>(dispatcher) {\n\n    override suspend fun execute(parameters: FeedbackParameter) {\n        endpoint.sendFeedback(parameters.sessionId, parameters.responses)\n        repository.recordFeedbackSent(parameters.userId, parameters.userEvent)\n    }\n}\n\ndata class FeedbackParameter(\n    val userId: String,\n    val userEvent: UserEvent,\n    val sessionId: SessionId,\n    val responses: Map<String, Int>\n)\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/users/ReservationActionUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.users\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.StarReserveNotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\n/**\n * Sends a request to reserve or cancel a reservation for a session.\n */\n// TODO: Verify after b/149544822 is fixed.\nopen class ReservationActionUseCase @Inject constructor(\n    private val repository: SessionAndUserEventRepository,\n    private val alarmUpdater: StarReserveNotificationAlarmUpdater,\n    @IoDispatcher ioDispatcher: CoroutineDispatcher\n) : UseCase<ReservationRequestParameters, ReservationRequestAction>(ioDispatcher) {\n\n    override suspend fun execute(parameters: ReservationRequestParameters):\n        ReservationRequestAction {\n            val (userId, sessionId, action) = parameters\n            return when (\n                val updateResult =\n                    repository.changeReservation(userId, sessionId, action)\n            ) {\n                is Success -> {\n                    if (parameters.userSession != null) {\n                        alarmUpdater.updateSession(\n                            parameters.userSession,\n                            parameters.userSession.userEvent.isStarred ||\n                                // TODO(b/130515170)\n                                updateResult.data is ReservationRequestAction.RequestAction\n                        )\n                    }\n                    updateResult.data\n                }\n                is Result.Error -> throw updateResult.exception\n                Loading -> throw IllegalStateException()\n            }\n        }\n}\n\ndata class ReservationRequestParameters(\n    val userId: String,\n    val sessionId: SessionId,\n    val action: ReservationRequestAction,\n    val userSession: UserSession?\n)\n\nsealed class ReservationRequestAction {\n    class RequestAction : ReservationRequestAction() {\n        override fun equals(other: Any?): Boolean {\n            return other is RequestAction\n        }\n\n        // This class isn't intended to be used as a key of a collection. Overriding this to remove\n        // the lint warning\n        @Suppress(\"redundant\")\n        override fun hashCode(): Int {\n            return super.hashCode()\n        }\n    }\n\n    class CancelAction : ReservationRequestAction() {\n        override fun equals(other: Any?): Boolean {\n            return other is CancelAction\n        }\n\n        // This class isn't intended to be used as a key of a collection. Overriding this to remove\n        // the lint warning\n        @Suppress(\"redundant\")\n        override fun hashCode(): Int {\n            return super.hashCode()\n        }\n    }\n\n    /**\n     * The action when the user is trying to reserve a session, but there is already an overlapping\n     * reservation.\n     */\n    class SwapAction(val parameters: SwapRequestParameters) : ReservationRequestAction()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/users/StarEventAndNotifyUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.users\n\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.StarReserveNotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.result.Result\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\nopen class StarEventAndNotifyUseCase @Inject constructor(\n    private val repository: SessionAndUserEventRepository,\n    private val alarmUpdater: StarReserveNotificationAlarmUpdater,\n    @IoDispatcher ioDispatcher: CoroutineDispatcher\n) : UseCase<StarEventParameter, StarUpdatedStatus>(ioDispatcher) {\n\n    override suspend fun execute(parameters: StarEventParameter): StarUpdatedStatus {\n        return when (\n            val result = repository.starEvent(\n                parameters.userId, parameters.userSession.userEvent\n            )\n        ) {\n            is Result.Success -> {\n                val updateResult = result.data\n                alarmUpdater.updateSession(\n                    parameters.userSession,\n                    parameters.userSession.userEvent.isStarred\n                )\n                updateResult\n            }\n            is Result.Error -> throw result.exception\n            else -> throw IllegalStateException()\n        }\n    }\n}\n\ndata class StarEventParameter(\n    val userId: String,\n    val userSession: UserSession\n)\n\nenum class StarUpdatedStatus {\n    STARRED,\n    UNSTARRED\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/domain/users/SwapActionUseCase.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.users\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.di.IoDispatcher\nimport com.google.samples.apps.iosched.shared.domain.UseCase\nimport com.google.samples.apps.iosched.shared.result.Result.Error\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport kotlinx.coroutines.CoroutineDispatcher\nimport javax.inject.Inject\n\n/**\n * Sends a request to replace reservations.\n */\nopen class SwapActionUseCase @Inject constructor(\n    private val repository: SessionAndUserEventRepository,\n    @IoDispatcher ioDispatcher: CoroutineDispatcher\n) : UseCase<SwapRequestParameters, SwapRequestAction>(ioDispatcher) {\n\n    override suspend fun execute(parameters: SwapRequestParameters): SwapRequestAction {\n        val (userId, sessionId, _, toId) = parameters\n        return when (\n            val updateResult =\n                repository.swapReservation(userId, sessionId, toId)\n        ) {\n            is Success -> updateResult.data\n            is Error -> throw updateResult.exception\n            Loading -> throw IllegalStateException()\n        }\n    }\n}\n\n/**\n * Parameters required to process the swap reservations request.\n */\ndata class SwapRequestParameters(\n    val userId: String,\n    val fromId: SessionId,\n    val fromTitle: String,\n    val toId: SessionId,\n    val toTitle: String\n)\n\nclass SwapRequestAction\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/fcm/FcmTokenUpdater.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.fcm\n\nimport com.google.firebase.firestore.FieldValue\nimport com.google.firebase.firestore.FirebaseFirestore\nimport com.google.firebase.firestore.SetOptions\nimport com.google.firebase.iid.FirebaseInstanceId\nimport com.google.samples.apps.iosched.shared.data.document2020\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.di.MainDispatcher\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport timber.log.Timber\n\n/**\n * Saves the FCM ID tokens in Firestore.\n */\nclass FcmTokenUpdater @Inject constructor(\n    @ApplicationScope private val externalScope: CoroutineScope,\n    @MainDispatcher private val mainDispatcher: CoroutineDispatcher,\n    val firestore: FirebaseFirestore\n) {\n\n    fun updateTokenForUser(userId: String) {\n        FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult ->\n            val token = instanceIdResult.token\n\n            // Write token to /users/<userId>/fcmTokens/<token[0..TOKEN_ID_LENGTH]/\n            val tokenInfo = mapOf(\n                LAST_VISIT_KEY to FieldValue.serverTimestamp(),\n                TOKEN_ID_KEY to token\n            )\n\n            // All Firestore operations start from the main thread to avoid concurrency issues.\n            externalScope.launch(mainDispatcher) {\n                firestore\n                    .document2020()\n                    .collection(USERS_COLLECTION)\n                    .document(userId)\n                    .collection(FCM_IDS_COLLECTION)\n                    .document(token.take(TOKEN_ID_LENGTH))\n                    .set(tokenInfo, SetOptions.merge()).addOnCompleteListener {\n                        if (it.isSuccessful) {\n                            Timber.d(\"FCM ID token successfully uploaded for user $userId\\\"\")\n                        } else {\n                            Timber.e(\"FCM ID token: Error uploading for user $userId\")\n                        }\n                    }\n            }\n        }\n    }\n\n    companion object {\n        private const val USERS_COLLECTION = \"users\"\n        private const val LAST_VISIT_KEY = \"lastVisit\"\n        private const val TOKEN_ID_KEY = \"tokenId\"\n        private const val FCM_IDS_COLLECTION = \"fcmTokens\"\n        private const val TOKEN_ID_LENGTH = 25\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/fcm/FcmTopicSubscriber.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.fcm\n\nimport com.google.firebase.messaging.FirebaseMessaging\nimport timber.log.Timber\n\n/**\n * A [TopicSubscriber] that uses Firebase Cloud Messaging to subscribe a user to server topics.\n *\n * Calls are lightweight and can be repeated multiple times.\n */\nclass FcmTopicSubscriber : TopicSubscriber {\n    override fun subscribeToScheduleUpdates() {\n        try {\n            FirebaseMessaging.getInstance().subscribeToTopic(CONFERENCE_DATA_UPDATE_TOPIC_KEY)\n        } catch (e: Exception) {\n            Timber.e(e, \"Error subscribing to conference data update topic\")\n        }\n    }\n\n    override fun subscribeToAttendeeUpdates() {\n        Timber.d(\"Subscribing to FCM registered topic\")\n        try {\n            FirebaseMessaging.getInstance().subscribeToTopic(REGISTERED_USER_TOPIC_KEY)\n        } catch (e: Exception) {\n            Timber.e(e, \"Error subscribing to registered topic\")\n        }\n    }\n\n    override fun unsubscribeFromAttendeeUpdates() {\n        Timber.d(\"Unsubscribing from FCM registered topic\")\n        try {\n            FirebaseMessaging.getInstance().unsubscribeFromTopic(REGISTERED_USER_TOPIC_KEY)\n        } catch (e: Exception) {\n            Timber.e(e, \"Error unsubscribing from registered topic\")\n        }\n    }\n\n    companion object {\n        private const val CONFERENCE_DATA_UPDATE_TOPIC_KEY = \"CONFERENCE_DATA_SYNC_2018\"\n        private const val REGISTERED_USER_TOPIC_KEY = \"REGISTERED_2018\"\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/fcm/IoschedFirebaseMessagingService.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.fcm\n\nimport android.app.job.JobInfo\nimport android.app.job.JobScheduler\nimport android.app.job.JobScheduler.RESULT_FAILURE\nimport android.app.job.JobScheduler.RESULT_SUCCESS\nimport android.content.ComponentName\nimport android.content.Context\nimport com.google.firebase.messaging.FirebaseMessagingService\nimport com.google.firebase.messaging.RemoteMessage\nimport com.google.samples.apps.iosched.shared.data.job.ConferenceDataService\nimport timber.log.Timber\nimport java.util.concurrent.TimeUnit\n\n/**\n * Receives Firebase Cloud Messages and starts a [ConferenceDataService] to download new data.\n */\nclass IoschedFirebaseMessagingService : FirebaseMessagingService() {\n\n    override fun onNewToken(token: String) {\n        super.onNewToken(token)\n        Timber.d(\"New firebase token: $token\")\n        // Nothing to do, we update the user's firebase token via FirebaseAuthStateUserDataSource\n    }\n\n    override fun onMessageReceived(remoteMessage: RemoteMessage) {\n        Timber.d(\"Message data payload: ${remoteMessage.data}\")\n        val data = remoteMessage.data\n        if (data[TRIGGER_EVENT_DATA_SYNC_key] == TRIGGER_EVENT_DATA_SYNC) {\n            // Schedule job on JobScheduler when FCM message with action `TRIGGER_EVENT_DATA_SYNC`\n            // is received.\n            scheduleFetchEventData()\n        }\n    }\n\n    private fun scheduleFetchEventData() {\n        val serviceComponent = ComponentName(this, ConferenceDataService::class.java)\n        val builder = JobInfo.Builder(ConferenceDataService.JOB_ID, serviceComponent)\n            .setMinimumLatency(MINIMUM_LATENCY) // wait at least\n            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // Unmetered if possible\n            .setOverrideDeadline(OVERRIDE_DEADLINE) // run by deadline if conditions not met\n\n        val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler\n\n        val result = jobScheduler.schedule(builder.build())\n\n        if (result == RESULT_FAILURE) {\n            Timber.e(\n                \"Invalid param supplied to JobScheduler when starting ConferenceDataService job.\"\n            )\n        } else if (result == RESULT_SUCCESS) {\n            Timber.i(\"ConferenceDataService job scheduled..\")\n        }\n    }\n\n    companion object {\n        private const val TRIGGER_EVENT_DATA_SYNC = \"SYNC_EVENT_DATA\"\n        private const val TRIGGER_EVENT_DATA_SYNC_key = \"action\"\n\n        // Some latency to avoid load spikes\n        private val MINIMUM_LATENCY = TimeUnit.SECONDS.toMillis(5)\n\n        // Job scheduled to run only with Wi-Fi but with a deadline\n        private val OVERRIDE_DEADLINE = TimeUnit.MINUTES.toMillis(15)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/fcm/TopicSubscriber.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.fcm\n\n/**\n * Used to subscribe users to server topics.\n */\ninterface TopicSubscriber {\n    /**\n     * Used to subscribe all users that open the schedule screen to a topic, to receive future\n     * updates.\n     */\n    fun subscribeToScheduleUpdates()\n\n    /**\n     * If a user is registered subscribe them to the \"registered\" topic.\n     */\n    fun subscribeToAttendeeUpdates()\n\n    /**\n     * If a user is registered and signs out, unsubscribe them from the \"registered\" topic to stop\n     * receiving notifications.\n     */\n    fun unsubscribeFromAttendeeUpdates()\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/notifications/AlarmBroadcastReceiver.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.notifications\n\nimport android.app.Notification\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.app.TaskStackBuilder\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.Intent.ACTION_VIEW\nimport android.os.Build.VERSION\nimport android.os.Build.VERSION_CODES\nimport androidx.annotation.RequiresApi\nimport androidx.annotation.WorkerThread\nimport androidx.core.app.NotificationCompat\nimport androidx.core.content.getSystemService\nimport androidx.core.net.toUri\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.R\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthIdDataSource\nimport com.google.samples.apps.iosched.shared.di.ApplicationScope\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadSessionOneShotUseCase\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionOneShotUseCase\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\nimport org.threeten.bp.Instant\nimport timber.log.Timber\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\n\n/**\n * Receives broadcast intents with information for session notifications.\n */\n@AndroidEntryPoint\nclass AlarmBroadcastReceiver : BroadcastReceiver() {\n\n    @Inject\n    lateinit var preferencesStorage: PreferenceStorage\n\n    @Inject\n    lateinit var loadUserSession: LoadUserSessionOneShotUseCase\n\n    @Inject\n    lateinit var loadSession: LoadSessionOneShotUseCase\n\n    @Inject\n    lateinit var alarmManager: SessionAlarmManager\n\n    @Inject\n    lateinit var authIdDataSource: AuthIdDataSource\n\n    @ApplicationScope\n    @Inject\n    lateinit var externalScope: CoroutineScope\n\n    override fun onReceive(context: Context, intent: Intent) {\n        Timber.d(\"Alarm received\")\n\n        val sessionId = intent.getStringExtra(EXTRA_SESSION_ID) ?: return\n        val userId = authIdDataSource.getUserId() ?: run {\n            Timber.e(\"No user ID, not showing notification.\")\n            return\n        }\n\n        val channel = intent.getStringExtra(EXTRA_NOTIFICATION_CHANNEL)\n        when (channel) {\n            CHANNEL_ID_UPCOMING -> {\n                externalScope.launch {\n                    checkThenShowPreSessionNotification(context, sessionId, userId)\n                }\n            }\n            CHANNEL_ID_FEEDBACK -> {\n                externalScope.launch {\n                    checkThenShowPostSessionNotification(context, sessionId, userId)\n                }\n            }\n            else -> {\n                // This shouldn't happen, but we don't want the app to crash. Only logging\n                Timber.w(\"Broadcast with unknown channel received: $channel\")\n            }\n        }\n    }\n\n    @WorkerThread\n    private suspend fun checkThenShowPreSessionNotification(\n        context: Context,\n        sessionId: String,\n        userId: String\n    ) {\n        // TODO use preferToReceiveNotifications as flow\n        if (!preferencesStorage.preferToReceiveNotifications.first()) {\n            Timber.d(\"User disabled notifications, not showing\")\n            return\n        }\n\n        Timber.d(\"Showing pre session notification for $sessionId, user $userId\")\n\n        val userEvent: Result<UserSession>? = getUserEvent(userId, sessionId)\n        // Don't notify if for some reason the event is no longer starred or reserved.\n        if (userEvent is Success) {\n            val event = userEvent.data.userEvent\n            if (event.isPreSessionNotificationRequired() &&\n                isSessionCurrent(userEvent.data.session)\n            ) {\n                try {\n                    val notificationId = showPreSessionNotification(context, userEvent.data.session)\n                    // Dismiss in any case\n                    alarmManager.dismissNotificationInFiveMinutes(notificationId)\n                } catch (ex: Exception) {\n                    Timber.e(ex)\n                    return\n                }\n            }\n        } else {\n            // There was no way to get UserEvent info, notify in case of connectivity error.\n            notifyWithoutUserEvent(sessionId, context)\n        }\n    }\n\n    @WorkerThread\n    private suspend fun checkThenShowPostSessionNotification(\n        context: Context,\n        sessionId: String,\n        userId: String\n    ) {\n        // TODO use preferToReceiveNotifications as flow\n        if (!preferencesStorage.preferToReceiveNotifications.first()) {\n            Timber.d(\"User disabled notifications, not showing\")\n            return\n        }\n\n        Timber.d(\"Showing post session notification for $sessionId, user $userId\")\n\n        val userEvent: Result<UserSession>? = getUserEvent(userId, sessionId)\n        // Only notify the user when the userEvent is retrieved successfully because if the user\n        // is offline, they can't send the feedback anyway\n        val userSession = (userEvent as? Success<UserSession>)?.data ?: return\n        val now = Instant.now()\n        if (userSession.isPostSessionNotificationRequired() &&\n            now.isAfter(userSession.session.endTime.toInstant())\n        ) {\n            try {\n                showPostSessionNotification(context, userEvent.data.session)\n            } catch (ex: Exception) {\n                Timber.e(ex)\n                return\n            }\n        }\n    }\n\n    private suspend fun notifyWithoutUserEvent(sessionId: String, context: Context) {\n        return try {\n            // Using coroutineScope to propagate exception to the try/catch block\n            coroutineScope {\n                // Using async coroutine builder to wait for the result of the use case computation\n                val session = async { loadSession(sessionId) }.await()\n                if (session is Success) {\n                    val notificationId = showPreSessionNotification(context, session.data)\n                    alarmManager.dismissNotificationInFiveMinutes(notificationId)\n                } else {\n                    Timber.e(\"Session couldn't be loaded for notification\")\n                }\n            }\n        } catch (ex: Exception) {\n            Timber.e(\"Exception loading session for notification: ${ex.message}\")\n        }\n    }\n\n    private suspend fun getUserEvent(userId: String, sessionId: String): Result<UserSession>? {\n        return try {\n            // Using coroutineScope to propagate exception to the try/catch block\n            coroutineScope {\n                // Using async coroutine builder to wait for the result of the use case computation\n                async { loadUserSession(userId to sessionId) }.await()\n            }\n        } catch (ex: Exception) {\n            Timber.e(\n                \"\"\"Session notification is set, however there was an error confirming\n                    |that the event is still starred. Showing notification.\"\"\".trimMargin()\n            )\n            null\n        }\n    }\n\n    @WorkerThread\n    private fun showPreSessionNotification(context: Context, session: Session): Int {\n        val notificationManager: NotificationManager = context.getSystemService()\n            ?: throw Exception(\"Notification Manager not found.\")\n\n        if (VERSION.SDK_INT >= VERSION_CODES.O) {\n            makeNotificationChannelForPreSession(context, notificationManager)\n        }\n\n        val intent = Intent(\n            ACTION_VIEW,\n            \"iosched://sessions?$QUERY_SESSION_ID=${session.id}\".toUri()\n        )\n        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK\n\n        // Create the TaskStackBuilder\n        val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(context)\n            // Add the intent, which inflates the back stack\n            .addNextIntentWithParentStack(intent)\n            // Get the PendingIntent containing the entire back stack\n            .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)\n\n        val notification = NotificationCompat.Builder(context, CHANNEL_ID_UPCOMING)\n            .setContentTitle(session.title)\n            .setContentText(context.getString(R.string.starting_soon))\n            .setSmallIcon(R.drawable.ic_notification_io_logo)\n            .setContentIntent(resultPendingIntent)\n            .setTimeoutAfter(TimeUnit.MINUTES.toMillis(10)) // Backup (cancelled with receiver)\n            .setAutoCancel(true)\n            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n            .build()\n\n        val notificationId = session.id.hashCode()\n        notificationManager.notify(notificationId, notification)\n        return notificationId\n    }\n\n    @WorkerThread\n    private fun showPostSessionNotification(context: Context, session: Session): Int {\n        val notificationManager: NotificationManager = context.getSystemService()\n            ?: throw Exception(\"Notification Manager not found.\")\n\n        if (VERSION.SDK_INT >= VERSION_CODES.O) {\n            makeNotificationChannelForPostSession(context, notificationManager)\n        }\n\n        val intent = Intent(\n            ACTION_VIEW,\n            \"iosched://sessions?$QUERY_SESSION_ID=${session.id}\".toUri()\n        ).apply {\n            flags = Intent.FLAG_ACTIVITY_NEW_TASK\n            putExtra(EXTRA_SHOW_RATE_SESSION_FLAG, true)\n        }\n\n        // Create the TaskStackBuilder\n        val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(context)\n            // Add the intent, which inflates the back stack\n            .addNextIntentWithParentStack(intent)\n            // Get the PendingIntent containing the entire back stack\n            .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)\n\n        val notification = NotificationCompat.Builder(context, CHANNEL_ID_FEEDBACK)\n            .setContentTitle(session.title)\n            .setContentText(context.getString(R.string.please_rate_session))\n            .setSmallIcon(R.drawable.ic_notification_io_logo)\n            .setContentIntent(resultPendingIntent)\n            .setTimeoutAfter(TimeUnit.MINUTES.toMillis(20)) // Backup (cancelled with receiver)\n            .setAutoCancel(true)\n            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n            .build()\n\n        val notificationId = session.id.hashCode()\n        notificationManager.notify(notificationId, notification)\n        return notificationId\n    }\n\n    @RequiresApi(VERSION_CODES.O)\n    private fun makeNotificationChannelForPreSession(\n        context: Context,\n        notificationManager: NotificationManager\n    ) {\n        notificationManager.createNotificationChannel(\n            NotificationChannel(\n                CHANNEL_ID_UPCOMING,\n                context.getString(R.string.session_notifications),\n                NotificationManager.IMPORTANCE_DEFAULT\n            ).apply { lockscreenVisibility = Notification.VISIBILITY_PUBLIC }\n        )\n    }\n\n    @RequiresApi(VERSION_CODES.O)\n    private fun makeNotificationChannelForPostSession(\n        context: Context,\n        notificationManager: NotificationManager\n    ) {\n        notificationManager.createNotificationChannel(\n            NotificationChannel(\n                CHANNEL_ID_FEEDBACK,\n                context.getString(R.string.session_feedback_notifications),\n                NotificationManager.IMPORTANCE_LOW\n            ).apply { lockscreenVisibility = Notification.VISIBILITY_PUBLIC }\n        )\n    }\n\n    private fun isSessionCurrent(session: Session): Boolean {\n        return session.startTime.toInstant().isAfter(Instant.now())\n    }\n\n    companion object {\n        const val EXTRA_NOTIFICATION_CHANNEL = \"notification_channel\"\n        const val EXTRA_SESSION_ID = \"user_event_extra\"\n\n        /** If this flag it set to true in session detail, the show rate dialog should be opened */\n        const val EXTRA_SHOW_RATE_SESSION_FLAG = \"show_rate_session_extra\"\n\n        const val QUERY_SESSION_ID = \"session_id\"\n        const val CHANNEL_ID_UPCOMING = \"upcoming_channel_id\"\n        const val CHANNEL_ID_FEEDBACK = \"feedback_channel_id\"\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/notifications/CancelNotificationBroadcastReceiver.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.notifications\n\nimport android.app.NotificationManager\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport androidx.core.content.getSystemService\nimport dagger.hilt.android.AndroidEntryPoint\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport timber.log.Timber\nimport javax.inject.Inject\n\n/**\n * Receives broadcast intents with information to hide notifications.\n */\n@AndroidEntryPoint\nclass CancelNotificationBroadcastReceiver : BroadcastReceiver() {\n\n    companion object {\n        const val NOTIFICATION_ID_EXTRA = \"notification_id_extra\"\n    }\n\n    @Inject\n    @ApplicationContext\n    lateinit var context: Context\n\n    override fun onReceive(context: Context, intent: Intent) {\n        val notificationId = intent.getIntExtra(\n            NOTIFICATION_ID_EXTRA, 0\n        )\n        Timber.d(\"Hiding notification for $notificationId\")\n\n        val notificationManger: NotificationManager = context.getSystemService()\n            ?: throw Exception(\"Notification Manager not found.\")\n\n        notificationManger.cancel(notificationId)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/notifications/SessionAlarmManager.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.notifications\n\nimport android.app.AlarmManager\nimport android.app.AlarmManager.RTC\nimport android.app.AlarmManager.RTC_WAKEUP\nimport android.app.PendingIntent\nimport android.app.PendingIntent.FLAG_UPDATE_CURRENT\nimport android.content.Context\nimport android.content.Intent\nimport androidx.core.app.AlarmManagerCompat\nimport androidx.core.content.getSystemService\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.util.toEpochMilli\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport org.threeten.bp.Instant\nimport org.threeten.bp.temporal.ChronoUnit\nimport timber.log.Timber\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\n\n/**\n * Manages setting and cancelling alarms for sessions.\n */\nopen class SessionAlarmManager @Inject constructor(@ApplicationContext val context: Context) {\n\n    private val systemAlarmManager: AlarmManager? = context.getSystemService()\n\n    /**\n     * Schedules an alarm for a session.\n     */\n    fun setAlarmForSession(userSession: UserSession) {\n        val session = userSession.session\n        if ((session.startTime.toInstant().minusMillis(alarmTimeDelta)).isBefore(Instant.now())) {\n            Timber.d(\"Trying to schedule an alarm for a past session, ignoring.\")\n            return\n        }\n        cancelAlarmForSession(session.id)\n\n        val upcomingIntent =\n            makePendingIntent(session.id, AlarmBroadcastReceiver.CHANNEL_ID_UPCOMING)\n        upcomingIntent?.let {\n            scheduleAlarmForPreSession(it, session)\n        }\n        if (userSession.isPostSessionNotificationRequired()) {\n            val feedbackIntent =\n                makePendingIntent(session.id, AlarmBroadcastReceiver.CHANNEL_ID_FEEDBACK)\n            feedbackIntent?.let {\n                scheduleAlarmForPostSession(it, session)\n            }\n        }\n    }\n\n    open fun cancelAlarmForSession(sessionId: SessionId) {\n        val upcomingIntent =\n            makePendingIntent(sessionId, AlarmBroadcastReceiver.CHANNEL_ID_UPCOMING)\n        upcomingIntent?.let {\n            cancelAlarmFor(it)\n            Timber.d(\"Cancelled upcoming alarm for session $sessionId\")\n        }\n        val feedbackIntent =\n            makePendingIntent(sessionId, AlarmBroadcastReceiver.CHANNEL_ID_FEEDBACK)\n        feedbackIntent?.let {\n            cancelAlarmFor(it)\n            Timber.d(\"Cancelled feedback alarm for session $sessionId\")\n        }\n    }\n\n    private fun makePendingIntent(sessionId: SessionId, channel: String): PendingIntent? {\n        return PendingIntent.getBroadcast(\n            context,\n            // To make the requestCode unique for the upcoming and feedback channels for the\n            // same session, concatenating the strings\n            (sessionId + channel).hashCode(),\n            Intent(context, AlarmBroadcastReceiver::class.java)\n                .putExtra(AlarmBroadcastReceiver.EXTRA_SESSION_ID, sessionId)\n                .putExtra(\n                    AlarmBroadcastReceiver.EXTRA_NOTIFICATION_CHANNEL,\n                    channel\n                ),\n            FLAG_UPDATE_CURRENT\n        )\n    }\n\n    private fun cancelAlarmFor(pendingIntent: PendingIntent) {\n        try {\n            systemAlarmManager?.cancel(pendingIntent)\n        } catch (ex: Exception) {\n            Timber.e(\"Couldn't cancel alarm for session\")\n        }\n    }\n\n    private fun scheduleAlarmForPreSession(pendingIntent: PendingIntent, session: Session) {\n        val triggerAtMillis = session.startTime.toEpochMilli() - alarmTimeDelta\n        scheduleAlarmFor(\n            pendingIntent, session, triggerAtMillis,\n            AlarmBroadcastReceiver.CHANNEL_ID_UPCOMING\n        )\n    }\n\n    private fun scheduleAlarmForPostSession(pendingIntent: PendingIntent, session: Session) {\n        val triggerAtMillis = session.endTime.toEpochMilli() + alarmTimeDelta\n        scheduleAlarmFor(\n            pendingIntent, session, triggerAtMillis,\n            AlarmBroadcastReceiver.CHANNEL_ID_FEEDBACK\n        )\n    }\n\n    private fun scheduleAlarmFor(\n        pendingIntent: PendingIntent,\n        session: Session,\n        triggerAtMillis: Long,\n        channel: String\n    ) {\n        systemAlarmManager?.let {\n            AlarmManagerCompat.setExactAndAllowWhileIdle(\n                systemAlarmManager,\n                RTC_WAKEUP,\n                triggerAtMillis,\n                pendingIntent\n            )\n            Timber.d(\n                \"\"\"Scheduled alarm for session ${session.title} at $triggerAtMillis\n                |for channel: $channel\"\"\".trimMargin()\n            )\n        }\n    }\n\n    fun dismissNotificationInFiveMinutes(notificationId: Int) {\n        systemAlarmManager?.let {\n            val intent = Intent(context, CancelNotificationBroadcastReceiver::class.java)\n            intent.putExtra(\n                CancelNotificationBroadcastReceiver.NOTIFICATION_ID_EXTRA, notificationId\n            )\n            val pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, 0)\n            val triggerAtMillis = Instant.now().plus(5, ChronoUnit.MINUTES).toEpochMilli()\n            AlarmManagerCompat.setExactAndAllowWhileIdle(\n                systemAlarmManager,\n                RTC,\n                triggerAtMillis,\n                pendingIntent\n            )\n            Timber.d(\"Scheduled notification dismissal for $notificationId at $triggerAtMillis\")\n        }\n    }\n\n    companion object {\n        private val alarmTimeDelta = TimeUnit.MINUTES.toMillis(5)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/result/Event.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.result\n\nimport androidx.lifecycle.Observer\n\n/**\n * Used as a wrapper for data that is exposed via a LiveData that represents an event.\n */\nopen class Event<out T>(private val content: T) {\n\n    var hasBeenHandled = false\n        private set // Allow external read but not write\n\n    /**\n     * Returns the content and prevents its use again.\n     */\n    fun getContentIfNotHandled(): T? {\n        return if (hasBeenHandled) {\n            null\n        } else {\n            hasBeenHandled = true\n            content\n        }\n    }\n\n    /**\n     * Returns the content, even if it's already been handled.\n     */\n    fun peekContent(): T = content\n}\n\n/**\n * An [Observer] for [Event]s, simplifying the pattern of checking if the [Event]'s content has\n * already been handled.\n *\n * [onEventUnhandledContent] is *only* called if the [Event]'s contents has not been handled.\n */\nclass EventObserver<T>(private val onEventUnhandledContent: (T) -> Unit) : Observer<Event<T>> {\n    override fun onChanged(event: Event<T>?) {\n        event?.getContentIfNotHandled()?.let { value ->\n            onEventUnhandledContent(value)\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/result/Result.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.result\n\nimport androidx.lifecycle.MutableLiveData\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport kotlinx.coroutines.flow.MutableStateFlow\n\n/**\n * A generic class that holds a value with its loading status.\n * @param <T>\n */\nsealed class Result<out R> {\n\n    data class Success<out T>(val data: T) : Result<T>()\n    data class Error(val exception: Exception) : Result<Nothing>()\n    object Loading : Result<Nothing>()\n\n    override fun toString(): String {\n        return when (this) {\n            is Success<*> -> \"Success[data=$data]\"\n            is Error -> \"Error[exception=$exception]\"\n            Loading -> \"Loading\"\n        }\n    }\n}\n\n/**\n * `true` if [Result] is of type [Success] & holds non-null [Success.data].\n */\nval Result<*>.succeeded\n    get() = this is Success && data != null\n\nfun <T> Result<T>.successOr(fallback: T): T {\n    return (this as? Success<T>)?.data ?: fallback\n}\n\nval <T> Result<T>.data: T?\n    get() = (this as? Success)?.data\n\n/**\n * Updates value of [liveData] if [Result] is of type [Success]\n */\ninline fun <reified T> Result<T>.updateOnSuccess(liveData: MutableLiveData<T>) {\n    if (this is Success) {\n        liveData.value = data\n    }\n}\n/**\n * Updates value of [MutableStateFlow] if [Result] is of type [Success]\n */\ninline fun <reified T> Result<T>.updateOnSuccess(stateFlow: MutableStateFlow<T>) {\n    if (this is Success) {\n        stateFlow.value = data\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/time/DefaultTimeProvider.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.time\n\nimport org.threeten.bp.Instant\n\ninterface TimeProvider {\n    fun now(): Instant\n}\n\nobject DefaultTimeProvider : TimeProvider {\n    private var delegate: TimeProvider = WallclockTimeProvider\n\n    fun setDelegate(newDelegate: TimeProvider?) {\n        delegate = newDelegate ?: WallclockTimeProvider\n    }\n\n    override fun now(): Instant {\n        return delegate.now()\n    }\n}\n\ninternal object WallclockTimeProvider : TimeProvider {\n    override fun now(): Instant {\n        return Instant.now()\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/util/ColorUtils.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.util\n\nobject ColorUtils {\n\n    fun parseHexColor(colorString: String): Int {\n        if (colorString.isNotEmpty() && colorString[0] == '#') {\n            // Use a long to avoid rollovers on #ffXXXXXX\n            var color = java.lang.Long.parseLong(colorString.substring(1), 16)\n            if (colorString.length == 7) {\n                // Set the alpha value\n                color = color or 0x00000000ff000000\n            } else if (colorString.length != 9) {\n                throw IllegalArgumentException(\"Unknown color: $colorString\")\n            }\n            return color.toInt()\n        }\n        throw IllegalArgumentException(\"Unknown color\")\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/util/Extensions.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.util\n\nimport android.os.Parcel\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.LayoutRes\nimport androidx.core.os.ParcelCompat\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentTransaction\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.Transformations\nimport com.google.android.gms.tasks.Task\nimport com.google.samples.apps.iosched.shared.BuildConfig\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.channels.SendChannel\nimport kotlinx.coroutines.suspendCancellableCoroutine\nimport org.threeten.bp.ZonedDateTime\nimport timber.log.Timber\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.resumeWithException\n\n/** Convenience for callbacks/listeners whose return value indicates an event was consumed. */\ninline fun consume(f: () -> Unit): Boolean {\n    f()\n    return true\n}\n\n/**\n * Allows calls like\n *\n * `viewGroup.inflate(R.layout.foo)`\n */\nfun ViewGroup.inflate(@LayoutRes layout: Int, attachToRoot: Boolean = false): View {\n    return LayoutInflater.from(context).inflate(layout, this, attachToRoot)\n}\n\n/**\n * Allows calls like\n *\n * `supportFragmentManager.inTransaction { add(...) }`\n */\ninline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {\n    beginTransaction().func().commit()\n}\n\n// region Parcelables, Bundles\n\n/** Write a boolean to a Parcel. */\nfun Parcel.writeBooleanUsingCompat(value: Boolean) = ParcelCompat.writeBoolean(this, value)\n\n/** Read a boolean from a Parcel. */\nfun Parcel.readBooleanUsingCompat() = ParcelCompat.readBoolean(this)\n\n// endregion\n// region LiveData\n\n/** Uses `Transformations.map` on a LiveData */\nfun <X, Y> LiveData<X>.map(body: (X) -> Y): LiveData<Y> {\n    return Transformations.map(this, body)\n}\n\nfun <T> MutableLiveData<T>.setValueIfNew(newValue: T) {\n    if (this.value != newValue) value = newValue\n}\n\n// endregion\n\n// region ZonedDateTime\nfun ZonedDateTime.toEpochMilli() = this.toInstant().toEpochMilli()\n// endregion\n\n/**\n * Helper to force a when statement to assert all options are matched in a when statement.\n *\n * By default, Kotlin doesn't care if all branches are handled in a when statement. However, if you\n * use the when statement as an expression (with a value) it will force all cases to be handled.\n *\n * This helper is to make a lightweight way to say you meant to match all of them.\n *\n * Usage:\n *\n * ```\n * when(sealedObject) {\n *     is OneType -> //\n *     is AnotherType -> //\n * }.checkAllMatched\n */\nval <T> T.checkAllMatched: T\n    get() = this\n\n// region Coroutines\n\n/**\n * Cancel the Job if it's active.\n */\nfun Job?.cancelIfActive() {\n    if (this?.isActive == true) {\n        cancel()\n    }\n}\n\n/**\n * Tries to send an element to a Channel and ignores the exception.\n */\nfun <E> SendChannel<E>.tryOffer(element: E): Boolean = try {\n    trySend(element).isSuccess\n} catch (t: Throwable) {\n    false // Ignore\n}\n\n// endregion\n\n// region UI utils\n\n// endregion\n\n// region Firebase\nsuspend fun <T> Task<T>.suspendAndWait(): T =\n    suspendCancellableCoroutine { continuation ->\n        addOnSuccessListener { result ->\n            continuation.resume(result)\n        }\n        addOnFailureListener { exception ->\n            continuation.resumeWithException(exception)\n        }\n        addOnCanceledListener {\n            continuation.resumeWithException(Exception(\"Firebase Task was cancelled\"))\n        }\n    }\n// endregion\n\n/**\n * Helper to throw exceptions only in Debug builds, logging a warning otherwise.\n */\nfun exceptionInDebug(t: Throwable) {\n    if (BuildConfig.DEBUG) {\n        throw t\n    } else {\n        Timber.e(t)\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/util/NetworkUtils.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.util\n\nimport android.content.Context\nimport android.content.Context.CONNECTIVITY_SERVICE\nimport android.net.ConnectivityManager\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport javax.inject.Inject\n\n/**\n * Checks if a network connection exists.\n */\nopen class NetworkUtils @Inject constructor(@ApplicationContext val context: Context) {\n\n    open fun hasNetworkConnection(): Boolean {\n        val connectivityManager =\n            context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager\n        val activeNetworkInfo = connectivityManager.activeNetworkInfo\n        return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting\n    }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/util/SpeakerUtils.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.util\n\nimport com.google.samples.apps.iosched.model.Speaker\n\nobject SpeakerUtils {\n\n    fun alphabeticallyOrderedSpeakerList(speakerSet: Set<Speaker>) =\n        ArrayList<Speaker>(speakerSet).sortedBy { it.name }\n}\n"
  },
  {
    "path": "shared/src/main/java/com/google/samples/apps/iosched/shared/util/TimeUtils.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.util\n\nimport androidx.annotation.StringRes\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.shared.BuildConfig\nimport com.google.samples.apps.iosched.shared.R\nimport com.google.samples.apps.iosched.shared.time.DefaultTimeProvider.now\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\nimport org.threeten.bp.format.DateTimeFormatter\n\nobject TimeUtils {\n\n    val CONFERENCE_TIMEZONE: ZoneId = ZoneId.of(BuildConfig.CONFERENCE_TIMEZONE)\n\n    val ConferenceDays = listOf(\n        ConferenceDay(\n            ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_START),\n            ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY1_END)\n        ),\n        ConferenceDay(\n            ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_START),\n            ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY2_END)\n        ),\n        ConferenceDay(\n            ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY3_START),\n            ZonedDateTime.parse(BuildConfig.CONFERENCE_DAY3_END)\n        )\n    )\n\n    enum class SessionRelativeTimeState { BEFORE, DURING, AFTER, UNKNOWN }\n\n    /** Determine whether the current time is before, during, or after a Session's time slot **/\n    fun getSessionState(\n        session: Session?,\n        currentTime: ZonedDateTime = ZonedDateTime.now()\n    ): SessionRelativeTimeState {\n        return when {\n            session == null -> SessionRelativeTimeState.UNKNOWN\n            currentTime < session.startTime -> SessionRelativeTimeState.BEFORE\n            currentTime > session.endTime -> SessionRelativeTimeState.AFTER\n            else -> SessionRelativeTimeState.DURING\n        }\n    }\n\n    /** Return a string resource to use for the label of this day, e.g. \"Tuesday, May 7\". */\n    @StringRes\n    fun getLabelResForDay(day: ConferenceDay, inConferenceTimeZone: Boolean = true): Int {\n        return when (day) {\n            ConferenceDays[0] -> if (inConferenceTimeZone) R.string.day1_day_date else R.string.day1\n            ConferenceDays[1] -> if (inConferenceTimeZone) R.string.day2_day_date else R.string.day2\n            ConferenceDays[2] -> if (inConferenceTimeZone) R.string.day3_day_date else R.string.day3\n            else -> throw IllegalArgumentException(\"Unknown ConferenceDay\")\n        }\n    }\n\n    /** Return a short string resource to use for the label of this day, e.g. \"May 7\". */\n    @StringRes\n    fun getShortLabelResForDay(day: ConferenceDay, inConferenceTimeZone: Boolean = true): Int {\n        return when (day) {\n            ConferenceDays[0] -> if (inConferenceTimeZone) R.string.day1_date else R.string.day1\n            ConferenceDays[1] -> if (inConferenceTimeZone) R.string.day2_date else R.string.day2\n            ConferenceDays[2] -> if (inConferenceTimeZone) R.string.day3_date else R.string.day3\n            else -> throw IllegalArgumentException(\"Unknown ConferenceDay\")\n        }\n    }\n\n    /** Return a string resource to use for the nearest day to the given time. */\n    @StringRes\n    fun getLabelResForTime(time: ZonedDateTime, inConferenceTimeZone: Boolean = true): Int {\n        return when {\n            time.isBefore(ConferenceDays[0].start) ->\n                if (inConferenceTimeZone) R.string.day0_day_date else R.string.day0\n            time.isBefore(ConferenceDays[1].start) ->\n                if (inConferenceTimeZone) R.string.day1_day_date else R.string.day1\n            time.isBefore(ConferenceDays[2].start) ->\n                if (inConferenceTimeZone) R.string.day2_day_date else R.string.day2\n            else -> if (inConferenceTimeZone) R.string.day3_day_date else R.string.day3\n        }\n    }\n\n    fun zonedTime(time: ZonedDateTime, zoneId: ZoneId = ZoneId.systemDefault()): ZonedDateTime {\n        return ZonedDateTime.ofInstant(time.toInstant(), zoneId)\n    }\n\n    fun isConferenceTimeZone(zoneId: ZoneId = ZoneId.systemDefault()): Boolean {\n        return zoneId == CONFERENCE_TIMEZONE\n    }\n\n    fun abbreviatedTimeString(startTime: ZonedDateTime): String {\n        return DateTimeFormatter.ofPattern(\"EEE, MMM d\").format(startTime)\n    }\n\n    /** Format a time to show month and day, e.g. \"May 7\" */\n    fun dateString(startTime: ZonedDateTime): String {\n        return DateTimeFormatter.ofPattern(\"MMM d\").format(startTime)\n    }\n\n    /** Format a time to show month, day, and time, e.g. \"May 7, 10:00 AM\" */\n    fun dateTimeString(startTime: ZonedDateTime): String {\n        return DateTimeFormatter.ofPattern(\"MMM d, h:mm a\").format(startTime)\n    }\n\n    fun timeString(\n        startTime: ZonedDateTime,\n        endTime: ZonedDateTime,\n        withDate: Boolean = true\n    ): String {\n        val sb = StringBuilder()\n\n        val dateFormat = if (withDate) \"EEE, MMM d, h:mm \" else \"h:mm \"\n        sb.append(DateTimeFormatter.ofPattern(dateFormat).format(startTime))\n\n        val startTimeMeridiem: String = DateTimeFormatter.ofPattern(\"a\").format(startTime)\n        val endTimeMeridiem: String = DateTimeFormatter.ofPattern(\"a\").format(endTime)\n        if (startTimeMeridiem != endTimeMeridiem) {\n            sb.append(startTimeMeridiem).append(\" \")\n        }\n\n        sb.append(DateTimeFormatter.ofPattern(\"- h:mm a\").format(endTime))\n        return sb.toString()\n    }\n\n    fun abbreviatedDayForAr(startTime: ZonedDateTime): String {\n        return DateTimeFormatter.ofPattern(\"MM/dd\").format(startTime)\n    }\n\n    fun abbreviatedTimeForAr(startTime: ZonedDateTime): String {\n        return DateTimeFormatter.ofPattern(\"HH:mm\").format(startTime)\n    }\n\n    fun abbreviatedTimeForAnnouncements(startTime: ZonedDateTime): String {\n        val now = ZonedDateTime.now(startTime.zone)\n        val dateFormat = if (startTime.dayOfMonth == now.dayOfMonth) \"h:mm a\" else \"MMM d, h:mm a\"\n        return DateTimeFormatter.ofPattern(dateFormat).format(startTime)\n    }\n\n    fun conferenceHasStarted(): Boolean {\n        return ZonedDateTime.now().isAfter(ConferenceDays.first().start)\n    }\n\n    fun conferenceHasEnded(): Boolean {\n        return ZonedDateTime.now().isAfter(ConferenceDays.last().end)\n    }\n\n    // TODO(b/132697497) replace with a UseCase\n    fun getKeynoteStartTime(): ZonedDateTime {\n        return ConferenceDays.first().start.plusHours(3L)\n    }\n\n    /**\n     * @return the current day of the conference. Returns null if the conference is yet to start or\n     * has ended.\n     */\n    fun getCurrentConferenceDay(): ConferenceDay? {\n        val now = ZonedDateTime.now()\n        if (now.isBefore(ConferenceDays.first().start)) {\n            return null\n        }\n        return ConferenceDays.firstOrNull { now.isBefore(it.end) }\n    }\n\n    fun getConferenceEndTime() = ConferenceDays.last().end\n}\n"
  },
  {
    "path": "shared/src/main/res/drawable/ic_default_avatar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"56dp\"\n    android:height=\"56dp\"\n    android:viewportWidth=\"56\"\n    android:viewportHeight=\"56\"\n    android:tint=\"?colorPrimary\">\n    <path\n        android:fillColor=\"#000\"\n        android:pathData=\"M28,0C12.54,0 0,12.54 0,28C0,43.46 12.54,56 28,56C43.46,56 56,43.46 56,28C56,12.54 43.46,0 28,0ZM28,8.4C32.65,8.4 36.4,12.15 36.4,16.8C36.4,21.45 32.65,25.2 28,25.2C23.35,25.2 19.6,21.45 19.6,16.8C19.6,12.15 23.35,8.4 28,8.4ZM28,48.16C21,48.16 14.81,44.58 11.2,39.14C11.28,33.57 22.4,30.52 28,30.52C33.57,30.52 44.72,33.57 44.8,39.14C41.19,44.58 35,48.16 28,48.16Z\" />\n</vector>\n"
  },
  {
    "path": "shared/src/main/res/drawable/ic_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?colorControlNormal\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17,12h-5v5h5v-5zM16,1v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2h-1L18,1h-2zM19,19L5,19L5,8h14v11z\" />\n</vector>\n"
  },
  {
    "path": "shared/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M0,0,H108V108H0z\" />\n    <path\n        android:name=\"slash\"\n        android:pathData=\"M53.28,34.5l-8.95,39.16\"\n        android:strokeColor=\"#5bb974\"\n        android:strokeLineCap=\"square\"\n        android:strokeWidth=\"2\" />\n</vector>\n"
  },
  {
    "path": "shared/src/main/res/drawable/ic_livestreamed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M17,10.5V7c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1v10c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1v-3.5l4,4v-11l-4,4z\" />\n</vector>\n"
  },
  {
    "path": "shared/src/main/res/drawable/ic_notification_io_logo.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"64dp\"\n    android:height=\"64dp\"\n    android:viewportWidth=\"48\"\n    android:viewportHeight=\"48\">\n\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M8,32.245h8.448v-16.97H8z\" />\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32.138,14.972C27.305,14.972 23.388,18.908 23.388,23.76s3.917,8.788 8.75,8.788c4.832,0 8.75,-3.935 8.75,-8.788S36.97,14.972 32.138,14.972m0,0.857c4.354,0 7.897,3.558 7.897,7.931s-3.543,7.93 -7.897,7.93S24.241,28.134 24.241,23.761C24.242,19.388 27.784,15.83 32.138,15.83\" />\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M18.449,35.908l-0.902,-0.204 5.307,-23.561 0.902,0.205z\" />\n</vector>\n"
  },
  {
    "path": "shared/src/main/res/drawable/ic_star.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorPrimary\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z\" />\n</vector>\n"
  },
  {
    "path": "shared/src/main/res/drawable/ic_star_border.xml",
    "content": "<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\"\n    android:tint=\"?colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z\" />\n</vector>\n"
  },
  {
    "path": "shared/src/main/res/drawable/tag_dot.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n\n    <size\n        android:width=\"@dimen/tag_dot_size\"\n        android:height=\"@dimen/tag_dot_size\" />\n    <solid android:color=\"@color/white\" />\n\n</shape>\n"
  },
  {
    "path": "shared/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:name=\"I\"\n        android:pathData=\"M26.81,39h14.69v29.32h-14.69z\"\n        android:fillColor=\"#aecbfa\" />\n    <path\n        android:name=\"O\"\n        android:pathData=\"M67.5,40.3a14.46,14.46 0,1 1,0 28.92a14.46,14.46 0,1 1,0 -28.92z\"\n        android:strokeColor=\"#1a73e8\"\n        android:strokeWidth=\"2\" />\n    <path\n        android:name=\"finish\"\n        android:pathData=\"M0,0h108v108h-108z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:centerX=\"27\"\n                android:centerY=\"27\"\n                android:gradientRadius=\"76.37\"\n                android:type=\"radial\">\n                <item\n                    android:color=\"#1affffff\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#0dffffff\"\n                    android:offset=\"0.32\" />\n                <item\n                    android:color=\"#00ffffff\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n</vector>\n"
  },
  {
    "path": "shared/src/main/res/font/google_sans.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<font-family\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:fontProviderAuthority=\"com.google.android.gms.fonts\"\n    android:fontProviderCerts=\"@array/com_google_android_gms_fonts_certs\"\n    android:fontProviderPackage=\"com.google.android.gms\"\n    android:fontProviderQuery=\"Google Sans\"\n    app:fontProviderAuthority=\"com.google.android.gms.fonts\"\n    app:fontProviderCerts=\"@array/com_google_android_gms_fonts_certs\"\n    app:fontProviderPackage=\"com.google.android.gms\"\n    app:fontProviderQuery=\"Google Sans\"\n    tools:ignore=\"FontValidationError,FontValidationWarning,UnusedAttribute\" />\n"
  },
  {
    "path": "shared/src/main/res/font/google_sans_medium.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<font-family\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:fontProviderAuthority=\"com.google.android.gms.fonts\"\n    android:fontProviderCerts=\"@array/com_google_android_gms_fonts_certs\"\n    android:fontProviderPackage=\"com.google.android.gms\"\n    android:fontProviderQuery=\"Google Sans:500\"\n    app:fontProviderAuthority=\"com.google.android.gms.fonts\"\n    app:fontProviderCerts=\"@array/com_google_android_gms_fonts_certs\"\n    app:fontProviderPackage=\"com.google.android.gms\"\n    app:fontProviderQuery=\"Google Sans:500\"\n    tools:ignore=\"FontValidationError,FontValidationWarning,UnusedAttribute\" />\n"
  },
  {
    "path": "shared/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>\n"
  },
  {
    "path": "shared/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <!-- 2019 colors -->\n    <color name=\"deep_sky_blue\">#1a73e8</color> <!-- colorPrimary in Light mode-->\n    <color name=\"warm_blue\">#574ddd</color> <!-- colorPrimaryVariant in Light mode-->\n    <color name=\"carolina_blue\">#8ab4f8</color> <!-- colorPrimary in Dark mode-->\n    <color name=\"cornflower_blue\">#669DF6</color> <!-- colorPrimaryVariant in Dark mode-->\n\n    <color name=\"teal\">#069f86</color>\n    <color name=\"bright_light_blue\">#27e5fd</color>\n    <color name=\"sun_yellow\">#fcd230</color>\n    <color name=\"bright_orange\">#ff6c00</color>\n\n    <color name=\"white\">#fff</color>\n    <color name=\"black\">#000</color>\n    <color name=\"transparent\">#0fff</color>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <dimen name=\"tag_dot_size\">8dp</dimen>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values/font_certs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <array name=\"com_google_android_gms_fonts_certs\">\n        <item>@array/com_google_android_gms_fonts_certs_dev</item>\n        <item>@array/com_google_android_gms_fonts_certs_prod</item>\n    </array>\n    <string-array name=\"com_google_android_gms_fonts_certs_dev\">\n        <item>\n            MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=\n        </item>\n    </string-array>\n    <string-array name=\"com_google_android_gms_fonts_certs_prod\">\n        <item>\n            MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK\n        </item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values/preloaded_fonts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <array name=\"preloaded_fonts\" translatable=\"false\">\n        <item>@font/google_sans</item>\n    </array>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <string name=\"app_name\" translatable=\"false\">Google I/O</string>\n    <string name=\"feature_explore_io\" translation_description=\"The feature module name for exploring I/O venue in Augmented Readlity\">Explore I/O</string>\n\n    <string name=\"day1\" translation_description=\"Label for the first day of the conference. Please make this as short as possible.\">Day 1</string>\n    <string name=\"day2\" translation_description=\"Label for the second day of the conference. Please make this as short as possible.\">Day 2</string>\n    <string name=\"day3\" translation_description=\"Label for the third day of the conference. Please make this as short as possible.\">Day 3</string>\n    <string name=\"day1_date\" translation_description=\"Actual date of the first day of the conference. Please make this as short as possible.\">May 7</string>\n    <string name=\"day2_date\" translation_description=\"Actual date of the second day of the conference. Please make this as short as possible.\">May 8</string>\n    <string name=\"day3_date\" translation_description=\"Actual date of the third day of the conference. Please make this as short as possible.\">May 9</string>\n\n    <string name=\"day0\" translation_description=\"Label for the day before the conference.\">The day before</string>\n    <string name=\"day0_day_date\" translation_description=\"Actual day and date of the first day of the conference.\">Monday, May 6</string>\n    <string name=\"day1_day_date\" translation_description=\"Actual day and date of the first day of the conference.\">Tuesday, May 7</string>\n    <string name=\"day2_day_date\" translation_description=\"Actual day and date of the second day of the conference.\">Wednesday, May 8</string>\n    <string name=\"day3_day_date\" translation_description=\"Actual day and date of the third day of the conference.\">Thursday, May 9</string>\n\n    <string name=\"session_notifications\" translation_description=\"Title for notification channel that upcoming talk notifications will be sent to. [CHAR_LIMIT=50]\">Upcoming sessions</string>\n    <string name=\"session_feedback_notifications\" translation_description=\"Title of notification channel for asking user to rate a session. [CHAR_LIMIT=50]\">Session feedback</string>\n    <string name=\"starting_soon\" translation_description=\"displayed as subtext of session title\" translatable=\"false\">Session is starting soon!</string>\n    <string name=\"please_rate_session\" translation_description=\"displayed as subtext of session title for a notification to ask the user to rate the session [CHAR_LIMIT=50]\">Please rate session</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">استكشاف مكان عقد مؤتمر I/O</string>\n    <string name=\"day1\">اليوم 1</string>\n    <string name=\"day2\">اليوم 2</string>\n    <string name=\"day3\">اليوم 3</string>\n    <string name=\"day1_date\">7 مايو</string>\n    <string name=\"day2_date\">8 مايو</string>\n    <string name=\"day3_date\">9 مايو</string>\n    <string name=\"day0\">اليوم السابق للمؤتمر</string>\n    <string name=\"day0_day_date\">الاثنين 6 أيار (مايو)</string>\n    <string name=\"day1_day_date\">الثلاثاء 7 أيار (مايو)</string>\n    <string name=\"day2_day_date\">الأربعاء 8 أيار (مايو)</string>\n    <string name=\"day3_day_date\">الخميس 9 أيار (مايو)</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-ar-rEG/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">استكشاف مكان عقد مؤتمر I/O</string>\n    <string name=\"day1\">اليوم 1</string>\n    <string name=\"day2\">اليوم 2</string>\n    <string name=\"day3\">اليوم 3</string>\n    <string name=\"day1_date\">7 مايو</string>\n    <string name=\"day2_date\">8 مايو</string>\n    <string name=\"day3_date\">9 مايو</string>\n    <string name=\"day0\">اليوم السابق للمؤتمر</string>\n    <string name=\"day0_day_date\">الاثنين 6 أيار (مايو)</string>\n    <string name=\"day1_day_date\">الثلاثاء 7 أيار (مايو)</string>\n    <string name=\"day2_day_date\">الأربعاء 8 أيار (مايو)</string>\n    <string name=\"day3_day_date\">الخميس 9 أيار (مايو)</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-ar-rSA/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">استكشاف مكان عقد مؤتمر I/O</string>\n    <string name=\"day1\">اليوم 1</string>\n    <string name=\"day2\">اليوم 2</string>\n    <string name=\"day3\">اليوم 3</string>\n    <string name=\"day1_date\">7 مايو</string>\n    <string name=\"day2_date\">8 مايو</string>\n    <string name=\"day3_date\">9 مايو</string>\n    <string name=\"day0\">اليوم السابق للمؤتمر</string>\n    <string name=\"day0_day_date\">الاثنين 6 أيار (مايو)</string>\n    <string name=\"day1_day_date\">الثلاثاء 7 أيار (مايو)</string>\n    <string name=\"day2_day_date\">الأربعاء 8 أيار (مايو)</string>\n    <string name=\"day3_day_date\">الخميس 9 أيار (مايو)</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">I/O erkunden</string>\n    <string name=\"day1\">Tag 1</string>\n    <string name=\"day2\">Tag 2</string>\n    <string name=\"day3\">Tag 3</string>\n    <string name=\"day1_date\">7. Mai</string>\n    <string name=\"day2_date\">8. Mai</string>\n    <string name=\"day3_date\">9. Mai</string>\n    <string name=\"day0\">Der Tag davor</string>\n    <string name=\"day0_day_date\">Montag, 06. Mai</string>\n    <string name=\"day1_day_date\">Dienstag, 07. Mai</string>\n    <string name=\"day2_day_date\">Mittwoch, 08. Mai</string>\n    <string name=\"day3_day_date\">Donnerstag, 09. Mai</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-de-rAT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">I/O erkunden</string>\n    <string name=\"day1\">Tag 1</string>\n    <string name=\"day2\">Tag 2</string>\n    <string name=\"day3\">Tag 3</string>\n    <string name=\"day1_date\">7. Mai</string>\n    <string name=\"day2_date\">8. Mai</string>\n    <string name=\"day3_date\">9. Mai</string>\n    <string name=\"day0\">Der Tag davor</string>\n    <string name=\"day0_day_date\">Montag, 06. Mai</string>\n    <string name=\"day1_day_date\">Dienstag, 07. Mai</string>\n    <string name=\"day2_day_date\">Mittwoch, 08. Mai</string>\n    <string name=\"day3_day_date\">Donnerstag, 09. Mai</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-de-rCH/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">I/O erkunden</string>\n    <string name=\"day1\">Tag 1</string>\n    <string name=\"day2\">Tag 2</string>\n    <string name=\"day3\">Tag 3</string>\n    <string name=\"day1_date\">7. Mai</string>\n    <string name=\"day2_date\">8. Mai</string>\n    <string name=\"day3_date\">9. Mai</string>\n    <string name=\"day0\">Der Tag davor</string>\n    <string name=\"day0_day_date\">Montag, 06. Mai</string>\n    <string name=\"day1_day_date\">Dienstag, 07. Mai</string>\n    <string name=\"day2_day_date\">Mittwoch, 08. Mai</string>\n    <string name=\"day3_day_date\">Donnerstag, 09. Mai</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rAR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rBO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rCL/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rCO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rCR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rDO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rEC/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rGT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rHN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rMX/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rNI/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rPA/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rPE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rPR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rPY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rSV/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rUS/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rUY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-es-rVE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explora I/O</string>\n    <string name=\"day1\">Día 1</string>\n    <string name=\"day2\">Día 2</string>\n    <string name=\"day3\">Día 3</string>\n    <string name=\"day1_date\">7 de mayo</string>\n    <string name=\"day2_date\">8 de mayo</string>\n    <string name=\"day3_date\">9 de mayo</string>\n    <string name=\"day0\">Día previo</string>\n    <string name=\"day0_day_date\">Lunes, 6 de mayo</string>\n    <string name=\"day1_day_date\">Martes, 7 de mayo</string>\n    <string name=\"day2_day_date\">Miércoles, 8 de mayo</string>\n    <string name=\"day3_day_date\">Jueves, 9 de mayo</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">کاوش I/O</string>\n    <string name=\"day1\">روز اول</string>\n    <string name=\"day2\">روز دوم</string>\n    <string name=\"day3\">روز سوم</string>\n    <string name=\"day1_date\">۷ مه</string>\n    <string name=\"day2_date\">۸ مه</string>\n    <string name=\"day3_date\">۹ مه</string>\n    <string name=\"day0\">روز قبل</string>\n    <string name=\"day0_day_date\">دوشنبه، ۶ مه</string>\n    <string name=\"day1_day_date\">سه‌شنبه، ۷ مه</string>\n    <string name=\"day2_day_date\">چهارشنبه، ۸ مه</string>\n    <string name=\"day3_day_date\">پنج‌شنبه، ۹ مه</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explorer la conférence I/O</string>\n    <string name=\"day1\">Jour 1</string>\n    <string name=\"day2\">Jour 2</string>\n    <string name=\"day3\">Jour 3</string>\n    <string name=\"day1_date\">7 mai</string>\n    <string name=\"day2_date\">8 mai</string>\n    <string name=\"day3_date\">9 mai</string>\n    <string name=\"day0\">La veille</string>\n    <string name=\"day0_day_date\">Lundi 6 mai</string>\n    <string name=\"day1_day_date\">Mardi 7 mai</string>\n    <string name=\"day2_day_date\">Mercredi 8 mai</string>\n    <string name=\"day3_day_date\">Jeudi 9 mai</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-fr-rCH/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explorer la conférence I/O</string>\n    <string name=\"day1\">Jour 1</string>\n    <string name=\"day2\">Jour 2</string>\n    <string name=\"day3\">Jour 3</string>\n    <string name=\"day1_date\">7 mai</string>\n    <string name=\"day2_date\">8 mai</string>\n    <string name=\"day3_date\">9 mai</string>\n    <string name=\"day0\">La veille</string>\n    <string name=\"day0_day_date\">Lundi 6 mai</string>\n    <string name=\"day1_day_date\">Mardi 7 mai</string>\n    <string name=\"day2_day_date\">Mercredi 8 mai</string>\n    <string name=\"day3_day_date\">Jeudi 9 mai</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-gsw/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">I/O erkunden</string>\n    <string name=\"day1\">Tag 1</string>\n    <string name=\"day2\">Tag 2</string>\n    <string name=\"day3\">Tag 3</string>\n    <string name=\"day1_date\">7. Mai</string>\n    <string name=\"day2_date\">8. Mai</string>\n    <string name=\"day3_date\">9. Mai</string>\n    <string name=\"day0\">Der Tag davor</string>\n    <string name=\"day0_day_date\">Montag, 06. Mai</string>\n    <string name=\"day1_day_date\">Dienstag, 07. Mai</string>\n    <string name=\"day2_day_date\">Mittwoch, 08. Mai</string>\n    <string name=\"day3_day_date\">Donnerstag, 09. Mai</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Scopri l\\'I/O</string>\n    <string name=\"day1\">Giorno 1</string>\n    <string name=\"day2\">Giorno 2</string>\n    <string name=\"day3\">Giorno 3</string>\n    <string name=\"day1_date\">7 maggio</string>\n    <string name=\"day2_date\">8 maggio</string>\n    <string name=\"day3_date\">9 maggio</string>\n    <string name=\"day0\">Il giorno precedente</string>\n    <string name=\"day0_day_date\">Lunedì 6 maggio</string>\n    <string name=\"day1_day_date\">Martedì 7 maggio</string>\n    <string name=\"day2_day_date\">Mercoledì 8 maggio</string>\n    <string name=\"day3_day_date\">Giovedì 9 maggio</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">I/O を探索</string>\n    <string name=\"day1\">1 日目</string>\n    <string name=\"day2\">2 日目</string>\n    <string name=\"day3\">3 日目</string>\n    <string name=\"day1_date\">5月7日</string>\n    <string name=\"day2_date\">5月8日</string>\n    <string name=\"day3_date\">5月9日</string>\n    <string name=\"day0\">前日</string>\n    <string name=\"day0_day_date\">5月6日月曜日</string>\n    <string name=\"day1_day_date\">5月7日火曜日</string>\n    <string name=\"day2_day_date\">5月8日水曜日</string>\n    <string name=\"day3_day_date\">5月9日木曜日</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">I/O 둘러보기</string>\n    <string name=\"day1\">1일차</string>\n    <string name=\"day2\">2일차</string>\n    <string name=\"day3\">3일차</string>\n    <string name=\"day1_date\">5월 7일</string>\n    <string name=\"day2_date\">5월 8일</string>\n    <string name=\"day3_date\">5월 9일</string>\n    <string name=\"day0\">하루 전</string>\n    <string name=\"day0_day_date\">5월 6일 월요일</string>\n    <string name=\"day1_day_date\">5월 7일 화요일</string>\n    <string name=\"day2_day_date\">5월 8일 수요일</string>\n    <string name=\"day3_day_date\">5월 9일 목요일</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-ln/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explorer la conférence I/O</string>\n    <string name=\"day1\">Jour 1</string>\n    <string name=\"day2\">Jour 2</string>\n    <string name=\"day3\">Jour 3</string>\n    <string name=\"day1_date\">7 mai</string>\n    <string name=\"day2_date\">8 mai</string>\n    <string name=\"day3_date\">9 mai</string>\n    <string name=\"day0\">La veille</string>\n    <string name=\"day0_day_date\">Lundi 6 mai</string>\n    <string name=\"day1_day_date\">Mardi 7 mai</string>\n    <string name=\"day2_day_date\">Mercredi 8 mai</string>\n    <string name=\"day3_day_date\">Jeudi 9 mai</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explorar I/O</string>\n    <string name=\"day1\">1º dia</string>\n    <string name=\"day2\">2º dia</string>\n    <string name=\"day3\">3º dia</string>\n    <string name=\"day1_date\">7 de maio</string>\n    <string name=\"day2_date\">8 de maio</string>\n    <string name=\"day3_date\">9 de maio</string>\n    <string name=\"day0\">O dia anterior</string>\n    <string name=\"day0_day_date\">Segunda-feira, 6 de maio</string>\n    <string name=\"day1_day_date\">Terça-feira, 7 de maio</string>\n    <string name=\"day2_day_date\">Quarta-feira, 8 de maio</string>\n    <string name=\"day3_day_date\">Quinta-feira, 9 de maio</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Explorar I/O</string>\n    <string name=\"day1\">1º dia</string>\n    <string name=\"day2\">2º dia</string>\n    <string name=\"day3\">3º dia</string>\n    <string name=\"day1_date\">7 de maio</string>\n    <string name=\"day2_date\">8 de maio</string>\n    <string name=\"day3_date\">9 de maio</string>\n    <string name=\"day0\">O dia anterior</string>\n    <string name=\"day0_day_date\">Segunda-feira, 6 de maio</string>\n    <string name=\"day1_day_date\">Terça-feira, 7 de maio</string>\n    <string name=\"day2_day_date\">Quarta-feira, 8 de maio</string>\n    <string name=\"day3_day_date\">Quinta-feira, 9 de maio</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Обзор фестиваля</string>\n    <string name=\"day1\">День 1</string>\n    <string name=\"day2\">День 2</string>\n    <string name=\"day3\">День 3</string>\n    <string name=\"day1_date\">7 мая</string>\n    <string name=\"day2_date\">8 мая</string>\n    <string name=\"day3_date\">9 мая</string>\n    <string name=\"day0\">День до фестиваля</string>\n    <string name=\"day0_day_date\">6 мая (понедельник)</string>\n    <string name=\"day1_day_date\">7 мая (вторник)</string>\n    <string name=\"day2_day_date\">8 мая (среда)</string>\n    <string name=\"day3_day_date\">Четверг, 9 мая</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-th/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">สำรวจ I/O</string>\n    <string name=\"day1\">วันที่ 1</string>\n    <string name=\"day2\">วันที่ 2</string>\n    <string name=\"day3\">วันที่ 3</string>\n    <string name=\"day1_date\">7 พฤษภาคม</string>\n    <string name=\"day2_date\">8 พฤษภาคม</string>\n    <string name=\"day3_date\">9 พฤษภาคม</string>\n    <string name=\"day0\">วันก่อนการประชุม</string>\n    <string name=\"day0_day_date\">วันจันทร์ที่ 6 พฤษภาคม</string>\n    <string name=\"day1_day_date\">วันอังคารที่ 7 พฤษภาคม</string>\n    <string name=\"day2_day_date\">วันพุธที่ 8 พฤษภาคม</string>\n    <string name=\"day3_day_date\">วันพฤหัสบดีที่ 9 พฤษภาคม</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-vi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">Khám phá địa điểm diễn ra sự kiện I/O</string>\n    <string name=\"day1\">Ngày 1</string>\n    <string name=\"day2\">Ngày 2</string>\n    <string name=\"day3\">Ngày 3</string>\n    <string name=\"day1_date\">Ngày 7 tháng 5</string>\n    <string name=\"day2_date\">Ngày 8 tháng 5</string>\n    <string name=\"day3_date\">Ngày 9 tháng 5</string>\n    <string name=\"day0\">Ngày trước khi diễn ra hội nghị</string>\n    <string name=\"day0_day_date\">Thứ Hai, ngày 6 tháng 5</string>\n    <string name=\"day1_day_date\">Thứ Ba, ngày 7 tháng 5</string>\n    <string name=\"day2_day_date\">Thứ Tư, ngày 8 tháng 5</string>\n    <string name=\"day3_day_date\">Thứ Năm, ngày 9 tháng 5</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-zh/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">探索 I/O 大会</string>\n    <string name=\"day1\">第 1 天</string>\n    <string name=\"day2\">第 2 天</string>\n    <string name=\"day3\">第 3 天</string>\n    <string name=\"day1_date\">5 月 7 日</string>\n    <string name=\"day2_date\">5 月 8 日</string>\n    <string name=\"day3_date\">5 月 9 日</string>\n    <string name=\"day0\">大会前一天</string>\n    <string name=\"day0_day_date\">5 月 6 日，星期一</string>\n    <string name=\"day1_day_date\">5 月 7 日，星期二</string>\n    <string name=\"day2_day_date\">5 月 8 日，星期三</string>\n    <string name=\"day3_day_date\">5 月 9 日，星期四</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">探索 I/O 大会</string>\n    <string name=\"day1\">第 1 天</string>\n    <string name=\"day2\">第 2 天</string>\n    <string name=\"day3\">第 3 天</string>\n    <string name=\"day1_date\">5 月 7 日</string>\n    <string name=\"day2_date\">5 月 8 日</string>\n    <string name=\"day3_date\">5 月 9 日</string>\n    <string name=\"day0\">大会前一天</string>\n    <string name=\"day0_day_date\">5 月 6 日，星期一</string>\n    <string name=\"day1_day_date\">5 月 7 日，星期二</string>\n    <string name=\"day2_day_date\">5 月 8 日，星期三</string>\n    <string name=\"day3_day_date\">5 月 9 日，星期四</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-zh-rHK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">探索 I/O 大會</string>\n    <string name=\"day1\">第 1 天</string>\n    <string name=\"day2\">第 2 天</string>\n    <string name=\"day3\">第 3 天</string>\n    <string name=\"day1_date\">5 月 7 日</string>\n    <string name=\"day2_date\">5 月 8 日</string>\n    <string name=\"day3_date\">5 月 9 日</string>\n    <string name=\"day0\">前一天</string>\n    <string name=\"day0_day_date\">5 月 6 日 (週一)</string>\n    <string name=\"day1_day_date\">5 月 7 日 (週二)</string>\n    <string name=\"day2_day_date\">5 月 8 日 (週三)</string>\n    <string name=\"day3_day_date\">5 月 9 日 (週四)</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n-->\n<resources>\n    <string name=\"feature_explore_io\">探索 I/O 大會</string>\n    <string name=\"day1\">第 1 天</string>\n    <string name=\"day2\">第 2 天</string>\n    <string name=\"day3\">第 3 天</string>\n    <string name=\"day1_date\">5 月 7 日</string>\n    <string name=\"day2_date\">5 月 8 日</string>\n    <string name=\"day3_date\">5 月 9 日</string>\n    <string name=\"day0\">前一天</string>\n    <string name=\"day0_day_date\">5 月 6 日 (週一)</string>\n    <string name=\"day1_day_date\">5 月 7 日 (週二)</string>\n    <string name=\"day2_day_date\">5 月 8 日 (週三)</string>\n    <string name=\"day3_day_date\">5 月 9 日 (週四)</string>\n</resources>\n"
  },
  {
    "path": "shared/src/main/res/xml/remote_config_defaults.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2018 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n<defaultsMap>\n    <entry>\n        <key>wifi_ssid</key>\n        <value>io2019</value>\n    </entry>\n    <entry>\n        <key>wifi_password</key>\n        <value>makegoodthings</value>\n    </entry>\n    <entry>\n        <key>map_enabled</key>\n        <value>false</value>\n    </entry>\n    <entry>\n        <key>explore_ar_enabled</key>\n        <value>false</value>\n    </entry>\n    <entry>\n        <key>codelabs_enabled</key>\n        <value>true</value>\n    </entry>\n    <entry>\n        <key>feed_enabled</key>\n        <value>false</value>\n    </entry>\n    <entry>\n        <key>search_schedule_enabled</key>\n        <value>true</value>\n    </entry>\n    <entry>\n        <key>search_using_room_enabled</key>\n        <value>true</value>\n    </entry>\n    <entry>\n        <key>io_assistant_app_enabled</key>\n        <value>false</value>\n    </entry>\n    <entry>\n        <key>reservation_enabled</key>\n        <value>false</value>\n    </entry>\n    <entry>\n        <key>badge_pick_up_day0_start_time</key>\n        <value>2019-05-06T07:00-07:00</value>\n    </entry>\n    <entry>\n        <key>badge_pick_up_day0_end_time</key>\n        <value>2019-05-06T19:00-07:00</value>\n    </entry>\n    <entry>\n        <key>badge_pick_up_day1_start_time</key>\n        <value>2019-05-07T07:00-07:00</value>\n    </entry>\n    <entry>\n        <key>badge_pick_up_day1_end_time</key>\n        <value>2019-05-07T19:00-07:00</value>\n    </entry>\n    <entry>\n        <key>breakfast_day1_start_time</key>\n        <value>2019-05-07T07:00-07:00</value>\n    </entry>\n    <entry>\n        <key>breakfast_day1_end_time</key>\n        <value>2019-05-07T09:30-07:00</value>\n    </entry>\n    <entry>\n        <key>google_keynote_start_time</key>\n        <value>2019-05-07T10:00-07:00</value>\n    </entry>\n    <entry>\n        <key>google_keynote_end_time</key>\n        <value>2019-05-07T11:30-07:00</value>\n    </entry>\n    <entry>\n        <key>io_store_day1_start_time</key>\n        <value>2019-05-07T11:30-07:00</value>\n    </entry>\n    <entry>\n        <key>io_store_day1_end_time</key>\n        <value>2019-05-07T19:30-07:00</value>\n    </entry>\n    <entry>\n        <key>lunch_day1_start_time</key>\n        <value>2019-05-07T11:30-07:00</value>\n    </entry>\n    <entry>\n        <key>lunch_day1_end_time</key>\n        <value>2019-05-07T12:45-07:00</value>\n    </entry>\n    <entry>\n        <key>developer_keynote_start_time</key>\n        <value>2019-05-07T12:45-07:00</value>\n    </entry>\n    <entry>\n        <key>developer_keynote_end_time</key>\n        <value>2019-05-07T14:00-07:00</value>\n    </entry>\n    <entry>\n        <key>sessions_day1_start_time</key>\n        <value>2019-05-07T14:00-07:00</value>\n    </entry>\n    <entry>\n        <key>sessions_day1_end_time</key>\n        <value>2019-05-07T19:00-07:00</value>\n    </entry>\n    <entry>\n        <key>codelabs_day1_start_time</key>\n        <value>2019-05-07T14:00-07:00</value>\n    </entry>\n    <entry>\n        <key>codelabs_day1_end_time</key>\n        <value>2019-05-07T19:00-07:00</value>\n    </entry>\n    <entry>\n        <key>office_hours_day1_start_time</key>\n        <value>2019-05-07T14:00-07:00</value>\n    </entry>\n    <entry>\n        <key>office_hours_day1_end_time</key>\n        <value>2019-05-07T19:00-07:00</value>\n    </entry>\n    <entry>\n        <key>sandboxes_day1_start_time</key>\n        <value>2019-05-07T14:00-07:00</value>\n    </entry>\n    <entry>\n        <key>sandboxes_day1_end_time</key>\n        <value>2019-05-07T19:30-07:00</value>\n    </entry>\n    <entry>\n        <key>after_dark_start_time</key>\n        <value>2019-05-07T18:30-07:00</value>\n    </entry>\n    <entry>\n        <key>after_dark_end_time</key>\n        <value>2019-05-07T22:00-07:00</value>\n    </entry>\n    <entry>\n        <key>badge_device_pick_up_day2_start_time</key>\n        <value>2019-05-08T08:00-07:00</value>\n    </entry>\n    <entry>\n        <key>badge_device_pick_up_day2_end_time</key>\n        <value>2019-05-08T19:00-07:00</value>\n    </entry>\n    <entry>\n        <key>breakfast_day2_start_time</key>\n        <value>2019-05-08T08:00-07:00</value>\n    </entry>\n    <entry>\n        <key>breakfast_day2_end_time</key>\n        <value>2019-05-08T10:00-07:00</value>\n    </entry>\n    <entry>\n        <key>io_store_day2_start_time</key>\n        <value>2019-05-08T08:00-07:00</value>\n    </entry>\n    <entry>\n        <key>io_store_day2_end_time</key>\n        <value>2019-05-08T20:00-07:00</value>\n    </entry>\n    <entry>\n        <key>lunch_day2_start_time</key>\n        <value>2019-05-08T11:30-07:00</value>\n    </entry>\n    <entry>\n        <key>lunch_day2_end_time</key>\n        <value>2019-05-08T14:30-07:00</value>\n    </entry>\n    <entry>\n        <key>sessions_day2_start_time</key>\n        <value>2019-05-08T08:30-07:00</value>\n    </entry>\n    <entry>\n        <key>sessions_day2_end_time</key>\n        <value>2019-05-08T19:30-07:00</value>\n    </entry>\n    <entry>\n        <key>codelabs_day2_start_time</key>\n        <value>2019-05-08T08:30-07:00</value>\n    </entry>\n    <entry>\n        <key>codelabs_day2_end_time</key>\n        <value>2019-05-08T19:15-07:00</value>\n    </entry>\n    <entry>\n        <key>office_hours_day2_start_time</key>\n        <value>2019-05-08T08:30-07:00</value>\n    </entry>\n    <entry>\n        <key>office_hours_day2_end_time</key>\n        <value>2019-05-08T19:30-07:00</value>\n    </entry>\n    <entry>\n        <key>sandboxes_day2_start_time</key>\n        <value>2019-05-08T08:30-07:00</value>\n    </entry>\n    <entry>\n        <key>sandboxes_day2_end_time</key>\n        <value>2019-05-08T19:15-07:00</value>\n    </entry>\n    <entry>\n        <key>concert_start_time</key>\n        <value>2019-05-08T19:45-07:00</value>\n    </entry>\n    <entry>\n        <key>concert_end_time</key>\n        <value>2019-05-08T22:00-07:00</value>\n    </entry>\n    <entry>\n        <key>badge_device_pick_up_day3_start_time</key>\n        <value>2019-05-09T08:00-07:00</value>\n    </entry>\n    <entry>\n        <key>badge_device_pick_up_day3_end_time</key>\n        <value>2019-05-09T16:00-07:00</value>\n    </entry>\n    <entry>\n        <key>breakfast_day3_start_time</key>\n        <value>2019-05-09T08:00-07:00</value>\n    </entry>\n    <entry>\n        <key>breakfast_day3_end_time</key>\n        <value>2019-05-09T10:00-07:00</value>\n    </entry>\n    <entry>\n        <key>io_store_day3_start_time</key>\n        <value>2019-05-09T08:00-07:00</value>\n    </entry>\n    <entry>\n        <key>io_store_day3_end_time</key>\n        <value>2019-05-09T17:00-07:00</value>\n    </entry>\n    <entry>\n        <key>lunch_day3_start_time</key>\n        <value>2019-05-09T11:30-07:00</value>\n    </entry>\n    <entry>\n        <key>lunch_day3_end_time</key>\n        <value>2019-05-09T14:30-07:00</value>\n    </entry>\n    <entry>\n        <key>sessions_day3_start_time</key>\n        <value>2019-05-09T08:30-07:00</value>\n    </entry>\n    <entry>\n        <key>sessions_day3_end_time</key>\n        <value>2019-05-09T16:30-07:00</value>\n    </entry>\n    <entry>\n        <key>codelabs_day3_start_time</key>\n        <value>2019-05-09T08:30-07:00</value>\n    </entry>\n    <entry>\n        <key>codelabs_day3_end_time</key>\n        <value>2019-05-09T16:00-07:00</value>\n    </entry>\n    <entry>\n        <key>office_hours_day3_start_time</key>\n        <value>2019-05-09T08:30-07:00</value>\n    </entry>\n    <entry>\n        <key>office_hours_day3_end_time</key>\n        <value>2019-05-09T16:00-07:00</value>\n    </entry>\n    <entry>\n        <key>sandboxes_day3_start_time</key>\n        <value>2019-05-09T08:30-07:00</value>\n    </entry>\n    <entry>\n        <key>sandboxes_day3_end_time</key>\n        <value>2019-05-09T16:00-07:00</value>\n    </entry>\n</defaultsMap>\n"
  },
  {
    "path": "shared/src/main/resources/conference_data_2019.json",
    "content": "{\"codelabs\":[{\"id\":\"0c9e7540-0276-4165-8c57-6067584e71f8\",\"priority\":0,\"title\":\"Recognize text, facial features, and objects in images with ML Kit for Firebase\",\"description\":\"In this codelab, you’ll build an Android app with ML Kit for Firebase that uses on-device and cloud Machine Learning to recognize text, facial features, and objects in images.\",\"duration\":\"40\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Ffirebase.png?alt=media&token=bf4bb3a1-630d-45e3-857b-de0554b1ade7\",\"link\":\"https://codelabs.developers.google.com/codelabs/mlkit-android/\",\"tagNames\":[\"topic_firebase\",\"type_codelabs\"]},{\"id\":\"2afc2a2e-de75-4f51-91f7-f4db516d4b2d\",\"priority\":0,\"title\":\"Firebase Android Codelab\",\"description\":\"In this codelab, you’ll learn how to use the Firebase platform on Android.\",\"duration\":\"40\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Ffirebase.png?alt=media&token=bf4bb3a1-630d-45e3-857b-de0554b1ade7\",\"link\":\"https://codelabs.developers.google.com/codelabs/firebase-android/\",\"tagNames\":[\"topic_firebase\",\"type_codelabs\"]},{\"id\":\"2eb02f89-6642-47fd-aedf-a86df05d94b4\",\"priority\":0,\"title\":\"Add Structured Data to Your Web Pages\",\"description\":\"This codelab walks you through adding structured data to a simple HTML site, including where to place your structured data on a site and how to validate structured data. \",\"duration\":\"29\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fweb.png?alt=media&token=0c063ce4-e66d-48d4-8d7f-953bf2a93e53\",\"link\":\"https://codelabs.developers.google.com/codelabs/structured-data/\",\"tagNames\":[\"type_codelabs\",\"topic_web\"]},{\"id\":\"430d01f2-a3a7-44b2-aed8-735a21679010\",\"priority\":0,\"title\":\"Using Kotlin Coroutines in your Android App\",\"description\":\"In this codelab, you’ll build a coroutine-based Android app that uses Architecture Components to fetch data from the network and a Room database.\",\"duration\":\"49\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fandroid.png?alt=media&token=ed80699c-227c-40eb-8c91-237be6d972b3\",\"link\":\"https://codelabs.developers.google.com/codelabs/kotlin-coroutines/\",\"tagNames\":[\"topic_android/play\",\"type_codelabs\"]},{\"id\":\"4545d16b-aa70-4771-970d-48bb4acf06f6\",\"priority\":0,\"title\":\"Build Actions for the Google Assistant (Level 1)\",\"description\":\"Learn the basics of developing with Actions on Google, including creating an Actions Project and Dialogflow agent and handling user input.\",\"duration\":\"50\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fgoogle-assistant.png?alt=media&token=dd21312b-5ca8-4dfb-aec1-57f0e972e83a\",\"link\":\"https://codelabs.developers.google.com/codelabs/actions-1/\",\"tagNames\":[\"topic_assistant\",\"type_codelabs\"]},{\"id\":\"639c5170-75ce-4627-af3c-4c2bac0872f4\",\"priority\":0,\"title\":\"Connect and visualize all your data in Data Studio\",\"description\":\"Data Studio is Google’s business intelligence and visualization platform. In this codelab, we will show how you can connect and visualize data from any source in Data Studio by leveraging JavaScript. Using Google Apps Script, you will write code to fetch data from a Web API and then visualize that data in Data Studio.\",\"duration\":\"31\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fgsuite.png?alt=media&token=47255f12-b7ee-4cc9-829f-0b38973846fd\",\"link\":\"https://codelabs.developers.google.com/codelabs/community-connectors/\",\"tagNames\":[\"type_codelabs\",\"topic_cloud\"]},{\"id\":\"67dcfdbf-9633-4d0f-af50-a05d1a38c65e\",\"priority\":0,\"title\":\"Write Your First Flutter App, part 1\",\"description\":\"Flutter is a mobile app SDK for developing high-fidelity native apps across iOS and Android. In this codelab, you’ll learn how to build a Flutter app that lazily loads an infinite list using a package that generates random word pairings.\",\"duration\":\"43\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fflutter.png?alt=media&token=2ffa912a-a687-43b5-b6a2-ee81d6556053\",\"link\":\"https://codelabs.developers.google.com/codelabs/first-flutter-app-pt1/\",\"tagNames\":[\"topic_flutter\",\"type_codelabs\"]},{\"id\":\"b7263c4c-c875-4de3-a56c-036f964d6c38\",\"priority\":0,\"title\":\"Android App Resizing for Chrome OS\",\"description\":\"In this codelab, you’ll build an Android app that contains many of the optimizations needed for a good user experience on Chrome OS.\",\"duration\":\"60\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fandroid.png?alt=media&token=ed80699c-227c-40eb-8c91-237be6d972b3\",\"link\":\"https://codelabs.developers.google.com/codelabs/optimized-for-chromeos/\",\"tagNames\":[\"topic_android/play\",\"type_codelabs\",\"topic_chromeos\"]},{\"id\":\"bb45cefe-4ff4-4e6a-ab76-b0d360a1868d\",\"priority\":0,\"title\":\"Introduction to Sceneform\",\"description\":\"\",\"duration\":\"46\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Far-core.png?alt=media&token=56575049-d20a-4b7d-8216-f3f4c00dba24\",\"link\":\"http://codelabs.developers.google.com/codelabs/sceneform-intro\",\"tagNames\":[\"topic_augmentedreality\",\"type_codelabs\"]},{\"id\":\"c789f377-7023-47e6-b9ec-f1b9760628bf\",\"priority\":0,\"title\":\"ARCore Cloud Anchors\",\"description\":\"In this codelab, you'll start off with a simple ARCore app that can create and remove a single anchor. You'll then be guided, step-by-step, on what it takes to host these anchors to the ARCore Cloud, and how these anchors can be resolved and recreated with the same position and orientation.\",\"duration\":\"45\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Far-core.png?alt=media&token=56575049-d20a-4b7d-8216-f3f4c00dba24\",\"link\":\"https://codelabs.developers.google.com/codelabs/arcore-cloud-anchors/\",\"tagNames\":[\"topic_augmentedreality\",\"type_codelabs\"]},{\"id\":\"c8b57acf-fc0b-40fc-81eb-71032871c045\",\"priority\":0,\"title\":\"Call in sick with a custom bot for Hangouts Chat\",\"description\":\"In this codelab, you learn how to create a simple Hangouts Chatbot—\\\"\\\"Attendance Bot\\\"\\\"—using Google Apps Script. The bot integrates with Gmail to set a user's vacation responder and integrates with Calendar to put a meeting on the user's calendar.\",\"duration\":\"10\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fgsuite.png?alt=media&token=47255f12-b7ee-4cc9-829f-0b38973846fd\",\"link\":\"https://codelabs.developers.google.com/codelabs/chat-apps-script/\",\"tagNames\":[\"type_codelabs\",\"topic_cloud\"]},{\"id\":\"c9a75902-b934-4932-bb56-c27575eb7056\",\"priority\":0,\"title\":\"Build a Fast Checkout Experience on the Web with Google Pay\",\"description\":\"In this codelab, you’ll build a checkout page, and equip it with Google Pay. This will allow users to pay for items in a fast, convenient, and secure way, with just the click of a button.\",\"duration\":\"30\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fweb.png?alt=media&token=0c063ce4-e66d-48d4-8d7f-953bf2a93e53\",\"link\":\"https://codelabs.developers.google.com/codelabs/pay-web-checkout/\",\"tagNames\":[\"topic_android/play\",\"type_codelabs\"]},{\"id\":\"cabe8769-dcc2-4bf1-84cd-90e66124cf12\",\"priority\":0,\"title\":\"TensorFlow.js Transfer Learning Image Classifier\",\"description\":\"In this codelab, you will learn how to build a “Teachable machine”, a custom image classifier that you will train on the fly in the browser using TensorFlow.js. \",\"duration\":\"50\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Ftensorflow.png?alt=media&token=0602652d-a795-44c4-90aa-44132fc36556\",\"link\":\"https://codelabs.developers.google.com/codelabs/tensorflowjs-teachablemachine-codelab/\",\"tagNames\":[\"topic_ml/ai\",\"type_codelabs\"]},{\"id\":\"cc611c10-315c-4ada-8361-96c1dd16b552\",\"priority\":0,\"title\":\"MDC-102 Android: Material Structure and Layout (Java)\",\"description\":\"Learn how to use Material for structure and layout on Android in Java.\",\"duration\":\"22\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fdesign.png?alt=media&token=1683d275-0598-4307-aff7-61223d553d05\",\"link\":\"https://codelabs.developers.google.com/codelabs/mdc-102-java/\",\"tagNames\":[\"type_codelabs\",\"topic_design\"]},{\"id\":\"ce65ebdd-63f0-4472-9927-d082db775643\",\"priority\":0,\"title\":\"MDC-101 iOS: Material Components (MDC) Basics (Objective-C)\",\"description\":\"Learn the basics of using Material Components for iOS by building a simple app with core components in Objective-C.\",\"duration\":\"17\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fdesign.png?alt=media&token=1683d275-0598-4307-aff7-61223d553d05\",\"link\":\"https://codelabs.developers.google.com/codelabs/mdc-101-objc/\",\"tagNames\":[\"type_codelabs\",\"topic_design\"]},{\"id\":\"e233f974-a1ee-405b-a951-d5f7ad6aff83\",\"priority\":0,\"title\":\"Intro to Dart for Java Developers\",\"description\":\"In this codelab, you’ll convert simple examples from Java to Dart. You’ll see that  Dart is concise, familiar, and easy to learn.\",\"duration\":\"20\",\"icon\":\"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fcodelabs%2Fflutter.png?alt=media&token=2ffa912a-a687-43b5-b6a2-ee81d6556053\",\"link\":\"https://codelabs.developers.google.com/codelabs/from-java-to-dart/\",\"tagNames\":[\"topic_flutter\",\"type_codelabs\"]}],\"sessions\":[{\"id\":\"d66af708-a275-4df9-9659-00c632386dd8\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[\"453e8809-68a9-4cb5-bb67-35340355e89b\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"04a7a98b-4543-47cc-8024-017b206c8d84\",\"code\":\"\",\"title\":\"Firebase Test Lab, Performance Monitoring, and Crashlytics office hours\",\"description\":\"The Firebase team will be on hand to answer your questions about Test Lab, Performance Monitoring, and Crashlytics, and to listen to your concerns.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557360900000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"7c504cd7-0adf-430d-85e0-01a9d9e9d2d6\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"8ba0daa0-357c-4442-b769-020544a5f63d\",\"code\":\"\",\"title\":\"LatinX Developers Meetup\",\"description\":\"Meetup for LatinX developers attending the I/O - meeting Googlers, each other, and building a community.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557441600000,\"endTimestamp\":1557443400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"1a99a9af-c91a-4357-8461-02db92bc4822\",\"code\":\"\",\"title\":\"What's changing in Android Q\",\"description\":\"So your app runs great on Android 9 Pi, what do you need to change to work on Android Q? Come along and talk to a developer about what changes Android Q requires.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557348300000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"4e540a70-a768-459e-a671-02fcb587a2f9\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"9042eb64-d379-4401-a8a1-031938debc41\",\"code\":\"\",\"title\":\"Android Studio Design Tools & ConstraintLayout\",\"description\":\"Design Tools and ConstraintLayout are popular ways for developers to create their user interfaces. As such we found useful to have office hours in past IO covering those areas.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557438300000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"1d178429-53ef-40a8-9c35-034ee10ac96e\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557267300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"726c7a72-8cb6-4dc9-86a7-03746ee0c9cd\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"5405e7d5-3613-4aca-a46d-03a59682a150\",\"code\":\"\",\"title\":\"Office Hours w/ the Google Maps Platform Team\",\"description\":\"The Google Maps Platform team will be on-hand to answer questions and chat about all your questions/concerns. Members of the developer relations, eng, and support teams from Maps, Routes, and Places will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_location/maps\",\"type_officehours\"],\"startTimestamp\":1557342900000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"75d5bfc6-270f-4723-a0bf-03e1d9258c14\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"70364919-8bc8-43c2-9c94-0414f9749280\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"50fbdc77-34ee-4323-bf02-041a925c3b3d\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"f549b8d7-9b8f-4a62-b7b1-04315ebb1c46\",\"code\":\"\",\"title\":\"UK & Ireland Community Leads and Tech influencer meeting\",\"description\":\"An opportunity for community leads and industry influencers to meet and chat about community activity, industry highlights, and exciting plans for 2019.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557340800000,\"endTimestamp\":1557342600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"08ee51d5-7516-48a0-b86f-047ddddc0738\",\"code\":\"\",\"title\":\"Vitals Q&A\",\"description\":\"Enable developers to ask questions about Vitals in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557279900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"02dc52f5-afeb-46ed-823f-048b296fe9e4\",\"code\":\"\",\"title\":\"Google Programs for Higher Education\",\"description\":\"After talking to Googlers at the Higher Ed office hours, developers (faculty and students) will have a better idea how they can use Google products (especially Google Cloud) in their teaching and research.  They'll know how to apply for grants, prepare for careers in a cloud-first world, and have a good idea of the resources available.\\n\\nThose developers who already are using Google in Higher Ed will have an opportunity to ask specific questions and give feedback to the team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557348300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"0f11c227-294c-4eaa-b2e7-04daf3bcf796\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"0609a8c3-f10b-4492-83f9-04dd2403823c\",\"code\":\"\",\"title\":\"SDK Program office hours\",\"description\":\"Office hours to answer questions from SDK developers introducing them to the program and how they can work with Google. Also, offering an opportunity to app developers so they can get consultation on issues regarding 3rd party libraries and SDK partners\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557344700000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"6b9fbead-4b1a-4eab-b47b-0536d4fd8b78\",\"code\":\"\",\"title\":\"Smart Home Office Hours\",\"description\":\"Come talk to Smart Home experts about integrating your device with Google Assistant. If you have questions about how to best leverage Smart Home types and traits to describe your device and what it does, we'd love to talk to you. Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557355500000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"a7e69fa6-34fa-40cd-8126-054d34fa7bca\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"f85b7b14-7c63-4449-967c-05ce9f4321f2\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"b550d9e0-bde2-4a48-ab64-06627df89652\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"0976ed31-78e5-42b1-baf0-06a38e49d3f4\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"0901b404-857a-435f-87c7-0731c2bd3155\",\"code\":\"\",\"title\":\"Actions on Google Developers Meet and Greet\",\"description\":\"Come chat with members of the Assistant DevRel team! We want to use the time to meet developers and interact with one another. We hope participants can share experiences that will encourage others to build new Actions.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557427800000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"4f9bb174-dce9-4a98-ab50-07da921594b2\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"901c1198-76c6-47d9-81ce-081b5b593519\",\"code\":\"\",\"title\":\"Google Cast Office Hours\",\"description\":\"Come talk to Google Cast Experts about your app.  If you have questions about how best to leverage the Google Cast SDK to build your app or have an innovate app you’d like to share we’d love to talk with you.  Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557357300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"73b780ac-d478-4d04-88db-0834d1cec392\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"64c68f11-210e-43fd-a1f1-08f404512b23\",\"code\":\"\",\"title\":\"Google Assistant Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557270900000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"b5e26484-fdb1-49df-9912-091d19b36476\",\"code\":\"\",\"title\":\"Web developers + SEO roundtable\",\"description\":\"Web developers and SEOs welcome - let's discuss the state of SEO and JavaScript in the context of SEO with Googlers and each other.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557430800000,\"endTimestamp\":1557433200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"e9028ea0-1b3d-4138-8be1-0960e2170a51\",\"code\":\"\",\"title\":\"Location, Activity Recognition, and Awareness Office Hours\",\"description\":\"This team owns location services on Android and in Google Play Services, such as the FusedLocationProvider API. This team also owns the activity recognition APIs and Awareness APIs. Come with all your questions on the new location permission in Q, how to use these APIs, best practices, and how to optimize your apps! \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557341100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"0d6687b2-aa91-4fdb-8d74-0a0327c2e571\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557353700000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"42a74064-11cc-4290-9eb6-0a1864592a12\",\"code\":\"\",\"title\":\"AMP\",\"description\":\"Meet the AMP team and ask them any of your burning questions about building lightning fast and user-friendly websites.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557337500000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"a49721a8-b6db-41df-93f1-0a52b712da41\",\"code\":\"\",\"title\":\"Web & Search office hours\",\"description\":\"Similar to the Google Webmaster Office Hours it would be nice to do an in-person office hours session at I/O so people can\\nAsk follow-up questions for the sessions on technical SEO\\nGet feedback on general questions or issues\\nGet in touch with us to give us feedback on docs or challenges they face\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557418500000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"69c22855-d1ea-40f4-89f8-0addf840609a\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"d7105806-ca9c-4402-957d-0bc6e992053c\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"002b3d67-61f2-47c6-969b-0c10548b2e33\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"5fb99a5f-41c1-4515-be1d-0ca00673e18a\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"74010cf4-1e0d-4745-9490-0caeabd3135e\",\"code\":\"\",\"title\":\"G Suite Developer Office Hours\",\"description\":\"Meet with G Suite Developer experts and ask questions about Apps Script, App Maker, and APIs. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557432900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"4b8a5367-3c5b-4e04-9e1f-0d2c797b3041\",\"code\":\"\",\"title\":\"SEO for JS-based websites\",\"description\":\"Modern sites can be awesome, but also tricky to make visible through Search. Chat with us about your struggles, get advice on how to efficiently improve your site.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557355500000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"9f2b583c-2eda-4b8d-b390-0d80da3763d7\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"281e228b-662e-444d-9851-0dbf178521ca\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"fc50e3b0-e40e-4802-844b-0dd4a1db9fcf\",\"code\":\"\",\"title\":\"Android C++ / NDK Office hours \",\"description\":\"For developers using C++ on Android, the Android NDK is a toolset that lets you implement parts of your app using native-code languages. This can help you reuse libraries written in those languages, and can improve performance for critical situations like games. During this Office hour, engineers will be able to discuss technical questions on using C++, the NDK toolset, and developing native in Android Studio. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557330300000,\"endTimestamp\":1557331200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"2f3458d7-093b-4927-994f-0e4e4c5a42ab\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"44c041ec-de15-4a5a-8c5a-0ed6c23b6618\",\"code\":\"\",\"title\":\"Firebase Remote Config and A/B Testing office hours\",\"description\":\"The Firebase team will be available to answer questions & get your feedback about Remote Config and A/B Testing.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557362700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"6b5b1655-6904-4624-9db6-0f14df93c896\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557367200000,\"endTimestamp\":1557369000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"a91684f2-3947-46ff-bc8d-0f1cbfbc2111\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"c4d6b94b-3ecd-4e91-b204-0f3307f3b625\",\"code\":\"\",\"title\":\"Design and research for NBU\",\"description\":\"Demos, app review, design critique and research tips for developers working with NBU markets.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"type_officehours\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557339300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"9d4bc7fa-2225-43e9-ae52-0f63dd8b00d8\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557423900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"1fa652fe-0422-4f03-937b-0f6bb528a55e\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"ee08f81f-7194-425e-b9fb-0fd358f68ae4\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"7d940294-103a-4346-bc65-0fe9e165ef4e\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"33482cb9-d12d-4508-9472-101d3c8246b3\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557442800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"a29a6fc2-c8d7-4670-9992-10bc3cf7c03c\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"7eb55fc5-4aa0-452a-a3fb-10f9f44758fd\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"4ebeac71-8edd-4add-82e7-111e1c11c165\",\"code\":\"\",\"title\":\"Location, Activity Recognition, and Awareness Office Hours\",\"description\":\"This team owns location services on Android and in Google Play Services, such as the FusedLocationProvider API. This team also owns the activity recognition APIs and Awareness APIs. Come with all your questions on the new location permission in Q, how to use these APIs, best practices, and how to optimize your apps! \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557342900000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"51575ba0-6ade-4bde-9cbe-112143a2ee26\",\"code\":\"\",\"title\":\"R8  / shrinking app code\",\"description\":\"Come talk to the R8 team about shrinking your app code and proguard keep rules\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557337500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"f79f30b4-32bf-403a-90f1-112adc752998\",\"code\":\"\",\"title\":\"Android Camera (CameraX + Camera2)\",\"description\":\"Do you use Android Camera now or plan to? It's hard right? Ask us anything from the new CameraX framework to leveraging multi-camera setup on Android devices.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557425700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"97ae3792-c904-4849-a439-1132fce688d0\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557442800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"0b4df75b-82c3-4ba7-8d7a-1187e9cfded0\",\"code\":\"\",\"title\":\"Loading performance clinic\",\"description\":\"Come to talk about your loading performance issues, deep-dive into them and their causes and get a better understanding of current and future platform capabilities that will help them solve them.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557438300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"4bb477db-eb02-4ebc-a7c7-118a7fed2d66\",\"code\":\"\",\"title\":\"Gaming and graphics on Chrome OS Office Hours\",\"description\":\"Get time 1-1 with the Chrome OS games & graphics team to solve game technical & design issues\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557351900000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"a9bc7239-383e-4b18-8499-118e0acbfe19\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"03becb7f-3bab-4eeb-b0fa-11b6195d586f\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"2b630f7d-31bf-4b25-b75f-12942ee8cce2\",\"code\":\"\",\"title\":\"Flutter Office Hours or #AskFlutter\",\"description\":\"Want to know more about building apps in Flutter, or adding Flutter to your Android and iOS apps? Stop by and have your questions answered by the Flutter team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_flutter\",\"type_officehours\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557339300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"ac581299-94b7-4694-8633-12c0ac19d211\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"798af3ed-e188-4e99-9d82-1338cc43dc86\",\"code\":\"\",\"title\":\"R8  / shrinking app code\",\"description\":\"Come talk to the R8 team about shrinking your app code and proguard keep rules\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557337500000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"9d724596-bcaf-49c2-999a-13a3e07776b0\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"f8b2c58b-1052-48bc-83a2-141a195462e8\",\"code\":\"\",\"title\":\"Android Security office hours\",\"description\":\"Do you have questions about Android Security? Come meet the team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557339300000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"abfd7b33-1275-4954-8b5b-1426f9453f67\",\"code\":\"\",\"title\":\"Website Audits\",\"description\":\"Learn how to use tools like PageSpeed Insights, CrUX, and Lighthouse to understand UX issues on your website in areas like performance, accessibility, mobile friendliness, and more.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557432900000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"bf8b83c0-cf8d-47d6-b474-14a59a7fab71\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"5e627823-d63b-4567-bd68-14c9cf8b5add\",\"code\":\"\",\"title\":\"TensorFlow Lite\",\"description\":\"Want to use machine learning in your mobile apps and other small devices? Have questions and/or want to discuss your ideas? Come by and chat with TensorFlow Lite team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557339300000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"2da5d28f-3468-450a-a3e8-14d6b654d1ab\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"5d0c1931-256e-4e81-834a-14e3a547825d\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"c571b396-da30-48bb-b5cd-152681cf82f6\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"5f7a8e16-5e95-4e52-91cc-152fae83f275\",\"code\":\"\",\"title\":\"What's changing in Android Q\",\"description\":\"So your app runs great on Android 9 Pi, what do you need to change to work on Android Q? Come along and talk to a developer about what changes Android Q requires.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557272700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"d0528cc3-cc3c-4bae-97aa-1556e62ef0b0\",\"code\":\"\",\"title\":\"Meet the Google Developers Launchpad Community\",\"description\":\"Sharing experiences, challenges, and wins among the startups in the Google Developers Launchpad program.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557357000000,\"endTimestamp\":1557358800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"398f1224-e5ec-4e94-827b-157007733ab1\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"98ee2e8c-4f60-4829-b7ab-15d6c9c9739e\",\"code\":\"\",\"title\":\"G Suite Developer Office Hours\",\"description\":\"Meet with G Suite Developer experts and ask questions about Apps Script, App Maker, and APIs. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557432900000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"769a18e9-6a98-438c-93b9-1626a77bbace\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"289b03a6-71cd-41c6-8c21-164adcbdb5fb\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"94289fbd-47f3-40df-9b56-16527a32ccde\",\"code\":\"\",\"title\":\"Updates to Storage in Android Q\",\"description\":\"Android offers many different ways to save, retrieve and share data. Android Q changes attempts to better structure file system interactions for the shared storage space to make applications more secure, maintainable and healthy. Come to learn how to make your application ready for Android Q Storage updates.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557436500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"ae971b51-3e62-4ad5-a844-1677c8e03104\",\"code\":\"\",\"title\":\"R8  / shrinking app code\",\"description\":\"Come talk to the R8 team about shrinking your app code and proguard keep rules\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557339300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"585793e7-c46b-48c2-9401-16c62b8c8d37\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"b5bd340b-a28e-487b-bbed-171a6bcfedc1\",\"code\":\"\",\"title\":\"AMP\",\"description\":\"Meet the AMP team and ask them any of your burning questions about building lightning fast and user-friendly websites.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557337500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"3fb2ab49-a63c-46dd-bb71-17337fd4e49e\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"210bd7d3-31ed-407c-835e-179f1aeb63ee\",\"code\":\"\",\"title\":\"Android Privacy\",\"description\":\"Office hours to answer questions about all Android Privacy related features. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557359100000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"e78b5973-f4cb-4130-8e6c-180693fff367\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"cc9af477-caf1-4239-b003-18b4dccab43e\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557367200000,\"endTimestamp\":1557369000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"10c29c11-970f-4df5-8983-1910a4fec341\",\"code\":\"\",\"title\":\"Game development with Google Cloud\",\"description\":\"Meet the team behind the Google Cloud Gaming products such as Agones & OpenMatch and ask us anything.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557335700000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"23738704-346d-4a7c-8a8b-1930d220f97e\",\"code\":\"\",\"title\":\"Cloud IoT Platform Office Hours\",\"description\":\"Bring your questions about how to connect devices to the Cloud, process the data, or any of the Cloud products that we have as part of our IoT Platform.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557348300000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"ce5e0320-a854-4a8b-8c80-1982c1d07d48\",\"code\":\"\",\"title\":\"Making the right decisions for your serverless architecture Office Hours\",\"description\":\"In the right hands, Serverless can increase developer velocity and help your apps scale to new heights. During this session, we'll take a look at Google's Serverless platforms (including Cloud Run, our newest, container-based offering) and how you can build lightweight, scalable, and fault-tolerant Serverless apps on top of Google Cloud.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557440100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"55f002c2-5f6e-4fa5-acf4-19ee4bea6494\",\"code\":\"\",\"title\":\"Android Enterprise & Security Office Hours\",\"description\":\"Come learn how to build better apps for the enterprise. For ISVs, this is very important because your app could break if it's not handling all the nuance of the work profile.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557330300000,\"endTimestamp\":1557331200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"f5fd544d-44a0-4c10-9579-19f8f058e34a\",\"code\":\"\",\"title\":\"Cloud Data and ML Office Hours\",\"description\":\"Have questions about how the cloud can help infuse your apps with machiine learning?  Come chat with experts and hear about the various cloud AI options available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557333900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"f6757ec8-54ca-47ca-a926-1a8f64e3e6e1\",\"code\":\"\",\"title\":\"GDG/GDE Central and Eastern Europe Meetup\",\"description\":\"A get together for the leads of Google Developer Groups and Google Developer Experts from CEE.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557343200000,\"endTimestamp\":1557345000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"4c7d363c-f67b-45c6-8920-1ad133174c42\",\"code\":\"\",\"title\":\"ExoPlayer office hours\",\"description\":\"Bring your questions about ExoPlayer, the open source media library for Android.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557423900000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"74a4fd2b-daa4-4d48-9b53-1bd15bc00742\",\"code\":\"\",\"title\":\"WTM Ambassadors Europe\",\"description\":\"Gathering all WTM Ambassadors that are based in Europe to network, sharing best practices and learning from each other.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"d5532f22-558b-48b3-97ea-1c3e4773ec14\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"4672cc04-d318-4c00-b73a-1c565c34b005\",\"code\":\"\",\"title\":\"ExoPlayer office hours\",\"description\":\"Bring your questions about ExoPlayer, the open source media library for Android.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557425700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"f5169d98-e370-4284-a883-1c5d6d8f085e\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"58b0e027-2a2e-4c25-9f5d-1cb86ba567da\",\"code\":\"\",\"title\":\"Google Pay\",\"description\":\"Come join us to talk about Google Pay and how to leverage its APIs to improve the payment experience in sites, applications and other elements in the ecosystem such as tickets and passes, loyalty programs and discounts.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_payments\",\"type_officehours\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557265500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"475b6bad-05da-4b39-8e55-1d063cc44598\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"670a3fae-3da7-4001-b2f3-1d0a649cd846\",\"code\":\"\",\"title\":\"ExoPlayer office hours\",\"description\":\"Bring your questions about ExoPlayer, the open source media library for Android.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557278100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"5184c64c-3051-449d-8779-1d1c9edb438e\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557351900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"0eaa8d98-fd4d-4e15-a003-1d20aafcf4e5\",\"code\":\"\",\"title\":\"Android Enterprise & Security Office Hours\",\"description\":\"Come learn how to build better apps for the enterprise. For ISVs, this is very important because your app could break if it's not handling all the nuance of the work profile.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557330300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"a589e33c-b1a1-4630-ad00-1d4638789912\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"72675bad-1a91-495b-8bba-1e02f336ebd8\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557442800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"6d80131a-3616-4dac-9a0b-1e644d1403f7\",\"code\":\"\",\"title\":\"Location, Activity Recognition, and Awareness Office Hours\",\"description\":\"This team owns location services on Android and in Google Play Services, such as the FusedLocationProvider API. This team also owns the activity recognition APIs and Awareness APIs. Come with all your questions on the new location permission in Q, how to use these APIs, best practices, and how to optimize your apps! \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557342900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"33805205-ca77-43e9-a0ef-1e77accf5316\",\"code\":\"\",\"title\":\"Android Graphics\",\"description\":\"Developers will be able to ask their questions about displays, colorspaces, 3D, UI rendering and more, and get answers directly from the graphics team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557360900000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"90a89e07-2e5d-48da-bc1b-1ef16f0ff829\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"2c4c5f9b-459a-4001-b0e8-1f51d50a89c0\",\"code\":\"\",\"title\":\"Android Enterprise & Security Office Hours\",\"description\":\"Come learn how to build better apps for the enterprise. For ISVs, this is very important because your app could break if it's not handling all the nuance of the work profile.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557332100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"102421de-0981-45de-9d76-1fbf7555a69c\",\"code\":\"\",\"title\":\"AndroidX Test Office Hours\",\"description\":\"The AndroidX Test team is responsible for all Android testing libraries and infrastructure such as Espresso, Runner, Rules, Robolectric, Android Test Orchestrator and test integration in Gradle, Bazel and Android Studio.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557272700000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"727c184d-71e4-446b-82b8-1fd913518f25\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557431100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"c07cbc23-9a7f-4119-afb8-1ff23d61866a\",\"code\":\"\",\"title\":\"Updates to Storage in Android Q\",\"description\":\"Android offers many different ways to save, retrieve and share data. Android Q changes attempts to better structure file system interactions for the shared storage space to make applications more secure, maintainable and healthy. Come to learn how to make your application ready for Android Q Storage updates.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557333900000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"9fefbde0-1097-4d1c-97de-2042204ceb50\",\"code\":\"\",\"title\":\"Android TV Office Hours\",\"description\":\"Have questions about Android TV? Want to learn how to take advantage of the native integrations with Android TV? Come chat with members of the Android TV team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557422100000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"e44ac0ee-5fef-44b7-9e5a-2057cd8db7c6\",\"code\":\"\",\"title\":\"Loading performance clinic\",\"description\":\"Come to talk about your loading performance issues, deep-dive into them and their causes and get a better understanding of current and future platform capabilities that will help them solve them.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557440100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"85266c2b-fdee-42e9-a7fb-2087da6d2f82\",\"code\":\"\",\"title\":\"Updates to Storage in Android Q\",\"description\":\"Android offers many different ways to save, retrieve and share data. Android Q changes attempts to better structure file system interactions for the shared storage space to make applications more secure, maintainable and healthy. Come to learn how to make your application ready for Android Q Storage updates.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557335700000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"eb5f266d-2aca-4c4a-82cf-208b8612244e\",\"code\":\"\",\"title\":\"Office hours with the Android Bazel team\",\"description\":\"Bazel is an open source build system developed by Google. The Android Bazel team is responsible for all Bazel Android Rules. The team will be happy to answer any questions around Android integration with Bazel, migration strategies and best practices to build Android apps at scale with Bazel.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557274500000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"c8ce0ac3-5168-406a-8638-2097a97b6211\",\"code\":\"\",\"title\":\"E-commerce site clinic Office Hours\",\"description\":\"\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557342900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"4d67fa93-b4f4-4f38-a49f-20e019887ff9\",\"code\":\"\",\"title\":\"Office Hours with the AMP Story Team\",\"description\":\"Have questions about how to get started building fast, visually engaging AMP Stories? Wondering about the UX best practices for this new web format? Or need some tips on how to improve your Story's appearance in Google Search? Attend the AMP Story Office Hours to discuss these questions and more with the people who created the format.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557279900000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"a5775a6c-0563-4e4a-9b33-2101f2c28ff5\",\"code\":\"\",\"title\":\"GCP Essentials\",\"description\":\"Google Cloud Platform (GCP) is broad and it may be overwhelming if you're getting started. Come and talk to us about where you should run your code and where you should store your data.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557359100000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"10847236-3121-42ac-bc72-2130843ddfdf\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"7657eb00-948c-4cb3-a11a-21422aefc0f3\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"6e2a5d4b-1073-440a-ab5f-2196e622bf1f\",\"code\":\"\",\"title\":\"SDK Program office hours\",\"description\":\"Office hours to answer questions from SDK developers introducing them to the program and how they can work with Google. Also, offering an opportunity to app developers so they can get consultation on issues regarding 3rd party libraries and SDK partners\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557346500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"df6d1e5e-40d1-4ca6-8c09-21c331130b2e\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"44474de6-952d-4f0a-92d6-22931779c629\",\"code\":\"\",\"title\":\"Android Security office hours\",\"description\":\"Do you have questions about Android Security? Come meet the team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557263700000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"82c9db72-6802-41ff-bee1-229e455aba24\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557353700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"1a2e774e-4d66-4f27-8717-234596515d2c\",\"code\":\"\",\"title\":\"Firebase Remote Config and A/B Testing office hours\",\"description\":\"The Firebase team will be available to answer questions & get your feedback about Remote Config and A/B Testing.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557364500000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"a196b6fb-4cf2-4eb3-9b69-23584b9588f4\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"a6a8808b-b785-4fbf-9fec-236bb0e04daa\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"832a27f6-4fe6-4cda-b4da-23bc17e3621c\",\"code\":\"\",\"title\":\"Firebase Predictions, Dynamic Links and In-app Messaging office hours\",\"description\":\"The Firebase team will be available to answer questions, and to listen to your concerns and feedback about Firebase Predictions, Dynamic Links and In-app Messaging.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557265500000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"793ecce5-d8f2-44e0-a6cd-244996f0747f\",\"code\":\"\",\"title\":\"Google Programs for Higher Education\",\"description\":\"After talking to Googlers at the Higher Ed office hours, developers (faculty and students) will have a better idea how they can use Google products (especially Google Cloud) in their teaching and research.  They'll know how to apply for grants, prepare for careers in a cloud-first world, and have a good idea of the resources available.\\n\\nThose developers who already are using Google in Higher Ed will have an opportunity to ask specific questions and give feedback to the team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557350100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"a95f1f66-a291-48b9-b75a-24e9865fbba1\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"ea02673f-9f7d-497b-ab2f-25551674420c\",\"code\":\"\",\"title\":\"TPUs\",\"description\":\"Come and ask your questions about Google's Tensor Processing Units (TPUs)\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557332100000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"9f01fa85-1f98-4417-a29e-26334f5592ea\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"2739729c-f213-406b-9a23-264eef0d4f1e\",\"code\":\"\",\"title\":\"Gaming and graphics on Chrome OS Office Hours\",\"description\":\"Get time 1-1 with the Chrome OS games & graphics team to solve game technical & design issues\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557434700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"684e9487-aa0a-4cf7-a2d1-26601c9ecd9b\",\"code\":\"\",\"title\":\"Loading performance clinic\",\"description\":\"Come to talk about your loading performance issues, deep-dive into them and their causes and get a better understanding of current and future platform capabilities that will help them solve them.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557440100000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"2dad48ad-a23a-4dde-b8d3-26a27359d2fa\",\"code\":\"\",\"title\":\"TPUs\",\"description\":\"Come and ask your questions about Google's Tensor Processing Units (TPUs)\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557434700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"60bbfaf3-8fba-472e-b38b-26f5288ec8c3\",\"code\":\"\",\"title\":\"Play Instant Apps Office Hours\",\"description\":\"Office hours to help developers 1:1 to build out their Instant Apps. This includes developers at all stages of development; from those who may have considered building an instant app and want to learn more, to those who already have an instant app in Play and would like to hear about next steps to make the experience even better.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557272700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"013bfd4f-c384-40c1-ad02-270b1a85c3ec\",\"code\":\"\",\"title\":\"GCP Essentials\",\"description\":\"Google Cloud Platform (GCP) is broad and it may be overwhelming if you're getting started. Come and talk to us about where you should run your code and where you should store your data.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557359100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"f7a700da-910c-4985-b6d7-272cd1bc2760\",\"code\":\"\",\"title\":\"Android Studio Design Tools & ConstraintLayout\",\"description\":\"Design Tools and ConstraintLayout are popular ways for developers to create their user interfaces. As such we found useful to have office hours in past IO covering those areas.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557440100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"2f3a9a56-4128-4c3a-8892-273d041dc21c\",\"code\":\"\",\"title\":\"Understanding the role of voice in your app for emerging markets\",\"description\":\"As our apps grow their footprint globally, voice technology can be an enabler in bridging comprehension and literacy gaps. Learn how to effectively integrate voice into your product experience to better serve the needs of your users.\\nObjective: To enable developers to have stronger voice stories for their products.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557270900000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"157fc834-db38-4dff-a07a-2766329b7e01\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"3df7b1b8-40fb-4c7b-b2f4-27f4cfe0a68c\",\"code\":\"\",\"title\":\"Flutter Office Hours or #AskFlutter\",\"description\":\"Want to know more about building apps in Flutter, or adding Flutter to your Android and iOS apps? Stop by and have your questions answered by the Flutter team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_flutter\",\"type_officehours\"],\"startTimestamp\":1557337500000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"b0e4b0b7-e2f8-4459-bd98-28174bce212d\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557367200000,\"endTimestamp\":1557369000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"8216c250-ee02-41c2-ba54-2861ae3413ff\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557269100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"5e417e7e-167f-4ea6-8d7f-289722cb13c8\",\"code\":\"\",\"title\":\"Game development with Google Cloud\",\"description\":\"Meet the team behind the Google Cloud Gaming products such as Agones & OpenMatch and ask us anything.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557335700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"d8b36a4f-c2f9-4da3-a725-28e075884028\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"bb0acdb3-5da0-4b3f-b023-290c96c2770c\",\"code\":\"\",\"title\":\"Firebase Predictions, Dynamic Links and In-app Messaging office hours\",\"description\":\"The Firebase team will be available to answer questions, and to listen to your concerns and feedback about Firebase Predictions, Dynamic Links and In-app Messaging.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557265500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"6773f5ea-b35e-495c-a22e-293f4bd241e8\",\"code\":\"\",\"title\":\"Play Instant Games Office Hours\",\"description\":\"Office hours to help developers 1:1 to build out their Instant Games. This includes developers at all stages of development; from those who may have considered building an instant game and want to learn more, to those who already have an instant game in Play and would like to hear about next steps to make the experience even better.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557425700000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"bb9c259b-29a9-4fa7-b7b3-296082f0f5b1\",\"code\":\"\",\"title\":\"Kotlin for Android Office Hours\",\"description\":\"Have questions about using Kotlin in your Android app?  Stop by and learn about the latest best practices, including Kotlin coroutines!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557274500000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"ea820f15-4c74-44df-919f-296e8955ecae\",\"code\":\"\",\"title\":\"Web components\",\"description\":\"Building a design system for your org? Or reusing components across multiple web apps and frameworks? Talk to the Web Components team about how large enterprises and Google products like YouTube and Material Design are approaching these challenges.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557418500000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"3c6c55db-d11a-4eaa-8877-2993c84b7c25\",\"code\":\"\",\"title\":\"Google Photos APIs Office Hours\",\"description\":\"The Google Photos partner program and Library API launched at I/O last year to connect with your users, and upload and share content. Come meet the team and learn more about how to integrate your apps and services with Google Photos.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557438300000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"3593d764-fdcf-410d-9d52-29b9965ee14e\",\"code\":\"\",\"title\":\"AMA: Metrics in Play Console\",\"description\":\"Play Console offers loads of metrics - from acquisition to churn, bugs to revenue, and with our latest releases more insights than ever before. But developers often have have highly specific questions and queries about these based on their own unique needs, businesses, and situations. This is an opportunity to ask the experts who built Play Console metrics anything about what you can access.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557434700000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"03cf45c3-51e6-45aa-9d34-29d954253fa6\",\"code\":\"\",\"title\":\"Android Camera (CameraX + Camera2)\",\"description\":\"Do you use Android Camera now or plan to? It's hard right? Ask us anything from the new CameraX framework to leveraging multi-camera setup on Android devices.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557425700000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"4735f399-4ae7-4f20-ac63-2a355adc4989\",\"code\":\"\",\"title\":\"Updates to Storage in Android Q\",\"description\":\"Android offers many different ways to save, retrieve and share data. Android Q changes attempts to better structure file system interactions for the shared storage space to make applications more secure, maintainable and healthy. Come to learn how to make your application ready for Android Q Storage updates.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557436500000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"825677c3-8dc9-4880-9075-2a57d08fbb26\",\"code\":\"\",\"title\":\"Video and Podcasts Team Office Hours\",\"description\":\"Come chat 1:1 with the video and podcasts teams to give feedback and learn more about their roadmap. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557418500000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"THIS IS THE POST KEYNOTE FOR VIDEO\"},{\"id\":\"cdfe6158-5539-4669-ae67-2a861cf89a35\",\"code\":\"\",\"title\":\"Vitals Q&A\",\"description\":\"Enable developers to ask questions about Vitals in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557357300000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"8c4ff963-5829-45b7-a422-2b09be694d44\",\"code\":\"\",\"title\":\"Sign-In/Up on the Web\",\"description\":\"Ask us questions about FIDO, WebAuthn, other general identity management as well as reCAPTCHA!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557344700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"e59fbf00-ffae-4a23-86de-2b4f420b6c6b\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"00d3a71b-a2a3-414e-8f5a-2ca6074e1519\",\"code\":\"\",\"title\":\"Play Store pre- and post-launch marketing Q&A\",\"description\":\"Enable developers to ask questions on how to market their apps in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557423900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"b33a564f-9e05-419a-a6c1-2cab53b163d4\",\"code\":\"\",\"title\":\"GIFs and More: Integrating Expression Search in Your App\",\"description\":\"Come chat with the Tenor team about how to use the Tenor GIF Search API to deliver a powerful expression experience in your app\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557357300000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"717bb978-3ac9-452d-8bb9-2cd97dad9f84\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557367200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"d9894778-5d28-46b5-8fe1-2cdf1f7da4ed\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"5294c548-3940-438a-a260-2ce00b369637\",\"code\":\"\",\"title\":\"Google Developer Groups: what’s it all about?\",\"description\":\"Meet the GDG program leaders and some GDG leads to learn more about these 900+ developer meetup groups in 130 countries! Learn about the benefits of becoming a member or what it's like to become a community lead.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557333600000,\"endTimestamp\":1557335400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"7326969c-4e0c-4760-8436-2d89f3435a30\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"4a254d06-ceff-49b1-8435-2db1c9a569f1\",\"code\":\"\",\"title\":\"Android Graphics\",\"description\":\"Developers will be able to ask their questions about displays, colorspaces, 3D, UI rendering and more, and get answers directly from the graphics team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557359100000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"47643cca-cab2-41c0-874c-2de2961b191b\",\"code\":\"\",\"title\":\"Community Builders: How to grow engagement\",\"description\":\"Meetup intended for developer community organizers (online or offline) to share with each others and Googlers their tips on engaging community members.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557351600000,\"endTimestamp\":1557354000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"77629956-3356-4fde-85c8-2de5f424b31f\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"68bfc2bb-239c-4c3d-8433-2deabec84e41\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"85970e6b-1996-478d-a923-2dfd766d72ba\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"b442b962-80af-48bc-b24d-2e15e5b87d96\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557263700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"cacf02fe-fd42-4268-8ea3-2e60457dd8d2\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"4143b40b-9b9e-4191-9bc1-2f74a3412394\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557351900000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"46d8cb14-12c3-4de1-b41f-2f76bbda0235\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"943a065b-6a62-455c-9007-2f8056c46525\",\"code\":\"\",\"title\":\"Women Techmakers Meetup\",\"description\":\"Gathering of the members of the Women Techmakers program.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557265200000,\"endTimestamp\":1557267600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"468a18b8-8a72-4857-a706-306171592cd3\",\"code\":\"\",\"title\":\"ExoPlayer office hours\",\"description\":\"Bring your questions about ExoPlayer, the open source media library for Android.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557279900000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"e8ae4a7a-f336-4761-87e5-30889c3f22db\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"b7c17521-f8fb-4634-9def-311fb363b147\",\"code\":\"\",\"title\":\"Smart Home Office Hours\",\"description\":\"Come talk to Smart Home experts about integrating your device with Google Assistant. If you have questions about how to best leverage Smart Home types and traits to describe your device and what it does, we'd love to talk to you. Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557357300000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"5cae3abb-3a46-4a52-899f-3189d618107f\",\"code\":\"\",\"title\":\"TPUs\",\"description\":\"Come and ask your questions about Google's Tensor Processing Units (TPUs)\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557330300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"14c7efa4-cb76-453d-b98e-3191eb3c41a0\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"b87bd4b3-4b7f-4084-8b1b-31d6278b358b\",\"code\":\"\",\"title\":\"Updates to Storage in Android Q\",\"description\":\"Android offers many different ways to save, retrieve and share data. Android Q changes attempts to better structure file system interactions for the shared storage space to make applications more secure, maintainable and healthy. Come to learn how to make your application ready for Android Q Storage updates.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557434700000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"0bc31e7e-e3ef-4254-b07e-31e39797a4bb\",\"code\":\"\",\"title\":\"Android Studio Design Tools & ConstraintLayout\",\"description\":\"Design Tools and ConstraintLayout are popular ways for developers to create their user interfaces. As such we found useful to have office hours in past IO covering those areas.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557440100000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"57ab53a6-6146-4be5-80a9-320a23300a5f\",\"code\":\"\",\"title\":\"G Suite Developer Office Hours\",\"description\":\"Meet with G Suite Developer experts and ask questions about Apps Script, App Maker, and APIs. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557272700000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"89ea45f1-00a9-4f95-9c3a-321444faa1e9\",\"code\":\"\",\"title\":\"ExoPlayer office hours\",\"description\":\"Bring your questions about ExoPlayer, the open source media library for Android.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557279900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"cc99b59d-e106-4e43-a75d-32415b2af9e1\",\"code\":\"\",\"title\":\"Website UX review\",\"description\":\"Get a UX review of your website from Google developers and UX experts and find opportunities for improvement.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557333900000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"f8b7f8ec-8770-4184-99ff-3324fb656e41\",\"code\":\"\",\"title\":\"Play Store pre- and post-launch marketing Q&A\",\"description\":\"Enable developers to ask questions on how to market their apps in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557425700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"f07b0f61-4474-4644-9a08-339eda24b187\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"a6102e4a-5149-452a-8d8c-34e9c0eb2072\",\"code\":\"\",\"title\":\"Kotlin for Android Office Hours\",\"description\":\"Have questions about using Kotlin in your Android app?  Stop by and learn about the latest best practices, including Kotlin coroutines!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557364500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"8708765e-bd26-443e-8358-34f5a4eaed91\",\"code\":\"\",\"title\":\"Vitals Q&A\",\"description\":\"Enable developers to ask questions about Vitals in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557355500000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"42ce32b3-c683-4e88-b81e-3664d6fdfd20\",\"code\":\"\",\"title\":\"UX Research Office Hours\",\"description\":\"Come ask about methods Google researchers use to inform product direction, evaluate design docs, mocks, and PRDs, and report back on launched features. You can also learn about the value user-centered thinking and research can bring to your teams.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557267300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"6f4e986c-93c9-4564-bbc6-3672c79a7f4b\",\"code\":\"\",\"title\":\"TensorFlow Lite\",\"description\":\"Want to use machine learning in your mobile apps and other small devices? Have questions and/or want to discuss your ideas? Come by and chat with TensorFlow Lite team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557337500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"22f15e83-1055-4a6a-9a13-371ed677dc94\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"15087295-daa9-4d3c-ad71-37dc1faa396c\",\"code\":\"\",\"title\":\"Chrome Extensions Office Hours\",\"description\":\"Got questions about browser extensions? Schedule some time with the Chrome Extension team! The team is here to talk about Manifest V3 changes, extension development best practices, give out high fives, or otherwise chat about the future of browser extensions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557346500000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"a33d4967-7784-4bce-87f2-3831c97d170f\",\"code\":\"\",\"title\":\"Web components\",\"description\":\"Building a design system for your org? Or reusing components across multiple web apps and frameworks? Talk to the Web Components team about how large enterprises and Google products like YouTube and Material Design are approaching these challenges.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557418500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"17ef2f73-213a-4ca5-bd16-3888993c95aa\",\"code\":\"\",\"title\":\"ARCore office hours\",\"description\":\"Ask the AR team everything you want to know about ARCore and AR viewer for web.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557346500000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"b89613db-3f39-4180-810e-3969902ae4f0\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"27907fd7-4c37-42c6-92b6-399a187b23bc\",\"code\":\"\",\"title\":\"Building an Impactful Startup Community with Google Business Groups\",\"description\":\"Come and meet GBG leads and Googlers to discuss how can GBG community help startups and entrepreneurs.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557418200000,\"endTimestamp\":1557420000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"8e71770d-0f0f-4f64-9663-3a054763efff\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"09d091c4-83d6-466e-9d91-3a9518298730\",\"code\":\"\",\"title\":\"Google Cast Office Hours\",\"description\":\"Do you have a question about Google Cast?  Are you curious about coding for Google Home Hub and Smart Displays?  Do you have ideas you'd like to brainstorm with a member of the Google Cast Team?  Google Cast office hours are a great opportunity to meet 1on1 with members of the Google Cast team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557420300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"f1875c8a-69a6-48ad-90d1-3abeff45809e\",\"code\":\"\",\"title\":\"Subscriptions on Google Play Billing\",\"description\":\"Do you sell digital subscriptions on Google Play? Let's chat about the latest subscription features and technology. We can chat about new business models, share growth optimizations, and talk about common mistakes that could be hurting your business.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557422100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"3e8ca0f3-3e66-473c-b0f7-3ad5b67f5f98\",\"code\":\"\",\"title\":\"Firebase Remote Config and A/B Testing office hours\",\"description\":\"The Firebase team will be available to answer questions & get your feedback about Remote Config and A/B Testing.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557364500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"892bb2fe-82ae-4d25-9b51-3b248ae6cdb5\",\"code\":\"\",\"title\":\"Game development with Google Cloud\",\"description\":\"Meet the team behind the Google Cloud Gaming products such as Agones & OpenMatch and ask us anything.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557333900000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"4d745fb1-e753-4a4e-a56b-3ba2755630e1\",\"code\":\"\",\"title\":\"TensorFlow Lite\",\"description\":\"Want to use machine learning in your mobile apps and other small devices? Have questions and/or want to discuss your ideas? Come by and chat with TensorFlow Lite team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557337500000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"7d8555d9-b825-434e-a13c-3bcf53ad1fe8\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"13af9acc-14f6-49c0-b4c6-3c1a61c260a7\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"c5eb7e3e-3528-4ceb-be2d-3c58a314661d\",\"code\":\"\",\"title\":\"Google Programs for Higher Education\",\"description\":\"After talking to Googlers at the Higher Ed office hours, developers (faculty and students) will have a better idea how they can use Google products (especially Google Cloud) in their teaching and research.  They'll know how to apply for grants, prepare for careers in a cloud-first world, and have a good idea of the resources available.\\n\\nThose developers who already are using Google in Higher Ed will have an opportunity to ask specific questions and give feedback to the team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557434700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"2127f6bd-c526-4dc9-9bf5-3c77ed6c9a2f\",\"code\":\"\",\"title\":\"Website Audits\",\"description\":\"Learn how to use tools like PageSpeed Insights, CrUX, and Lighthouse to understand UX issues on your website in areas like performance, accessibility, mobile friendliness, and more.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557431100000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"810c7fd3-905d-424b-8140-3ca6cff1f4db\",\"code\":\"\",\"title\":\"Building Scalable Communities - in India and globally\",\"description\":\"Sharing best practices among community builders from around the world with a few practical tips from India.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557420600000,\"endTimestamp\":1557422400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"785c65ba-324e-4d1e-af70-3d190ceaf484\",\"code\":\"\",\"title\":\"Android TV Office Hours\",\"description\":\"Have questions about Android TV? Want to learn how to take advantage of the native integrations with Android TV? Come chat with members of the Android TV team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557420300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"7c37440a-2e1e-4b3a-b90b-3d587f37beae\",\"code\":\"\",\"title\":\"Kotlin for Android Office Hours\",\"description\":\"Have questions about using Kotlin in your Android app?  Stop by and learn about the latest best practices, including Kotlin coroutines!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557276300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"cd001ef6-6d22-48db-8127-3dc54cc8b077\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"1c9ac9f7-0eb9-478c-b39e-3e7b735747f9\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"135a0fdf-4081-42e6-b133-3ebd5cb96205\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"f02bfc26-bf01-498b-b2fb-3ed0810074d0\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"538876f3-6bb4-45da-bc00-3f5d029bdb0b\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"1262af21-419d-4317-ad07-3fcb5ea2bb15\",\"code\":\"\",\"title\":\"Gaming and graphics on Chrome OS Office Hours\",\"description\":\"Get time 1-1 with the Chrome OS games & graphics team to solve game technical & design issues\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557434700000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"29af1dd6-72a5-4e43-981f-402a2d9a374a\",\"code\":\"\",\"title\":\"UX Research Office Hours\",\"description\":\"Come ask about methods Google researchers use to inform product direction, evaluate design docs, mocks, and PRDs, and report back on launched features. You can also learn about the value user-centered thinking and research can bring to your teams.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557267300000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"ad461dbf-b2f0-4153-bef9-40b3a7cb33a8\",\"code\":\"\",\"title\":\"Android Privacy\",\"description\":\"Office hours to answer questions about all Android Privacy related features. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557360900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"7097b701-bcdd-4dc2-adca-40bf10e2bc27\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557423900000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"37f0f258-59b2-4551-b6e9-40d411b7fc2b\",\"code\":\"\",\"title\":\"Kotlin for Android Office Hours\",\"description\":\"Have questions about using Kotlin in your Android app?  Stop by and learn about the latest best practices, including Kotlin coroutines!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557364500000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"75d96dc3-f239-48c7-8838-40eb1a2ffd96\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"366c6908-42ef-4baa-94c2-40ff57e6e602\",\"code\":\"\",\"title\":\"Kotlin for Cloud Office Hours\",\"description\":\"Office hours to help developers learn more about using Kotlin for backend, running Kotlin backends in cloud, and also general help to better understand/utilize Google Cloud Platform.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557269100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"aa0a7c9a-8170-447a-a9fe-4153eadcbc94\",\"code\":\"\",\"title\":\"Vitals Q&A\",\"description\":\"Enable developers to ask questions about Vitals in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557278100000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"05d514b6-f12a-4cea-af2d-41690448021b\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"daf30106-81d5-42d4-82ac-4175c106f770\",\"code\":\"\",\"title\":\"Android Studio Profilers Office Hours\",\"description\":\"Meet with members of the Android Studio Profilers team to get help on profiling and optimizing your app.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557276300000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"d8ccf73c-2640-4908-954d-426e0b2ffe49\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"48993057-b32b-4bf6-bc04-4283447e4688\",\"code\":\"\",\"title\":\"Dynamic AMP emails\",\"description\":\"Come join us to talk about AMP for email, a new innovation that allows email senders to create emails that deliver real time information and allows consumers to take interactive actions. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557279900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"aff9c86f-3ce6-454e-90cd-42861ee7ad10\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557367200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"bf25a763-f981-475c-b47b-431469d90872\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"fb73f469-a7b6-4398-b052-4321bf7003e1\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"2738f9d1-0a42-4def-a796-43355e3b3c58\",\"code\":\"\",\"title\":\"Kotlin for Cloud Office Hours\",\"description\":\"Office hours to help developers learn more about using Kotlin for backend, running Kotlin backends in cloud, and also general help to better understand/utilize Google Cloud Platform.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557269100000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"92221ea3-49fa-4914-9ae2-4358d7bddecc\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"105fa31e-f6ba-4a3b-af6a-436d42a2a8cf\",\"code\":\"\",\"title\":\"Office Hours w/ the Google Maps Platform Team\",\"description\":\"The Google Maps Platform team will be on-hand to answer questions and chat about all your questions/concerns. Members of the developer relations, eng, and support teams from Maps, Routes, and Places will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_location/maps\",\"type_officehours\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557342900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"3ac79de5-666a-4b3a-8319-43c7d91b7df9\",\"code\":\"\",\"title\":\"Android Java Language Libraries\",\"description\":\"The Android Core Libraries team provides core libraries such as the ICU, Conscrypt, and java.*  libraries to Android developers who are using the Java or Kotlin programming languages. During this Office Hour, you'll have the opportunity to meet with the team and ask technical questions about core library performance, best practices, design patterns, and more. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557353700000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"32a6cf3a-361b-4b30-899e-43ccb79331a0\",\"code\":\"\",\"title\":\"Vitals Q&A\",\"description\":\"Enable developers to ask questions about Vitals in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557278100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"e8f4ba4a-a1f6-4745-b39a-43e6322da35c\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"469a4c91-f288-4ea2-8f57-44f503f24336\",\"code\":\"\",\"title\":\"Firebase Cloud Messaging office hours\",\"description\":\"The Firebase team will be on hand to answer your questions about Cloud Messaging, and to listen to your concerns.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557332100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"8fa7e723-1310-4a5f-8c7e-45155ff980f8\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"f34d8e4c-1c8e-48dc-af6c-4595be367c46\",\"code\":\"\",\"title\":\"ExoPlayer office hours\",\"description\":\"Bring your questions about ExoPlayer, the open source media library for Android.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557423900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"5e9be303-3181-4e5c-b8ff-46046aa8703c\",\"code\":\"\",\"title\":\"Local Execution for Smart Home Office Hours\",\"description\":\"Interested in chatting with the team about the new Local Execution for Smart Home SDK? Looking for advice to help you get started? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Local Execution for Smart Home Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557420300000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"af1b5971-c349-4860-8daf-4609878bab5c\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"2d3ae128-29be-48c4-a174-46547b81dab2\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"8b8ce92d-c1a9-4c5d-b97e-469372ca4e52\",\"code\":\"\",\"title\":\"Making the right decisions for your serverless architecture Office Hours\",\"description\":\"In the right hands, Serverless can increase developer velocity and help your apps scale to new heights. During this session, we'll take a look at Google's Serverless platforms (including Cloud Run, our newest, container-based offering) and how you can build lightweight, scalable, and fault-tolerant Serverless apps on top of Google Cloud.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557438300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"5226a1aa-9880-47d5-a1c8-469f29dfbe4b\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"433d7bea-18ee-4007-9502-46dc1570681b\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"b3bfe30e-11c3-4232-b810-46f93ff5dba0\",\"code\":\"\",\"title\":\"Google Photos APIs Office Hours\",\"description\":\"The Google Photos partner program and Library API launched at I/O last year to connect with your users, and upload and share content. Come meet the team and learn more about how to integrate your apps and services with Google Photos.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557333900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"dbd62dc8-2670-4bf6-8e8f-47651acdf18c\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"fd9ceb55-e05f-45bd-b181-4769caae318c\",\"code\":\"\",\"title\":\"AMA: Metrics in Play Console\",\"description\":\"Play Console offers loads of metrics - from acquisition to churn, bugs to revenue, and with our latest releases more insights than ever before. But developers often have have highly specific questions and queries about these based on their own unique needs, businesses, and situations. This is an opportunity to ask the experts who built Play Console metrics anything about what you can access.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557436500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"6f8a9b65-bd2d-46c7-996d-47a8afb1e079\",\"code\":\"\",\"title\":\"TensorFlow 2.0\",\"description\":\"Curious about what new features are offered in TensorFlow 2.0? Interested in upgrading your models from TensorFlow 1.x to TF 2.0? Ideas about additional functionality for the API, or questions about how to get involved? You're in luck! We'll have a member of the TensorFlow engineering team on-site.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557350100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"8ab37c51-1f49-417e-9123-47dedd80873c\",\"code\":\"\",\"title\":\"Video and Podcasts Team Office Hours\",\"description\":\"Come chat 1:1 with the video and podcasts teams to give feedback and learn more about their roadmap. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557418500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"THIS IS THE POST KEYNOTE FOR VIDEO\"},{\"id\":\"dccb0fb4-91e3-4afa-a12e-47fbfe267cfa\",\"code\":\"\",\"title\":\"Android Studio Design Tools & ConstraintLayout\",\"description\":\"Design Tools and ConstraintLayout are popular ways for developers to create their user interfaces. As such we found useful to have office hours in past IO covering those areas.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557438300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"e0e86ae2-7f79-4dee-8142-47fc11ffd7ae\",\"code\":\"\",\"title\":\"AndroidX Test Office Hours\",\"description\":\"The AndroidX Test team is responsible for all Android testing libraries and infrastructure such as Espresso, Runner, Rules, Robolectric, Android Test Orchestrator and test integration in Gradle, Bazel and Android Studio.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557272700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"41269b9d-3dcd-4550-b240-484575ce78bf\",\"code\":\"\",\"title\":\"What's changing in Android Q\",\"description\":\"So your app runs great on Android 9 Pi, what do you need to change to work on Android Q? Come along and talk to a developer about what changes Android Q requires.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557348300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"7d5c091a-e65e-485e-baa1-48b5407300ab\",\"code\":\"\",\"title\":\"Fireside Chat with Google Payments Team\",\"description\":\"\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557271200000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"3e259373-0b2c-4dd1-bf9a-492826f3c8e0\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"6f146a5e-3c55-4128-a2b9-496b47d721e4\",\"code\":\"\",\"title\":\"Flutter Office Hours or #AskFlutter\",\"description\":\"Want to know more about building apps in Flutter, or adding Flutter to your Android and iOS apps? Stop by and have your questions answered by the Flutter team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_flutter\",\"type_officehours\"],\"startTimestamp\":1557438300000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"61ad80f3-10a6-4da0-8b89-49a20c8abaec\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"1766a1f8-8815-4221-b694-49eb3ca0aede\",\"code\":\"\",\"title\":\"Google Assistant Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557350100000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"721a99df-564e-423e-a49f-4aab0c69aa10\",\"code\":\"\",\"title\":\"My First I/O\",\"description\":\"This meetup is for those who are attending their first I/O. We will talk about tips & tricks on navigating I/O and how to stay in touch with Google and related dev communities after I/O is over.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"8da0df4d-9576-4bd9-b13e-4af67f07cc30\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"143191d9-6fbd-46cd-a90d-4b608e16a4cb\",\"code\":\"\",\"title\":\"Android Graphics\",\"description\":\"Developers will be able to ask their questions about displays, colorspaces, 3D, UI rendering and more, and get answers directly from the graphics team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557359100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"4390746b-9bae-465c-8693-4bb56fdd8f20\",\"code\":\"\",\"title\":\"Android System UI (Notifications, Navigation, Multitasking, Sharing)\",\"description\":\"Meet the team that works on Android System UI including features like Notifications, Navigations, Sharing and Multitasking.  \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557265500000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"2e244050-7e6d-452c-b203-4bb57d12162d\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557425700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"e417e716-5cb2-4ccc-bb76-4bd68c76e549\",\"code\":\"\",\"title\":\"Cloud IoT Platform Office Hours\",\"description\":\"Bring your questions about how to connect devices to the Cloud, process the data, or any of the Cloud products that we have as part of our IoT Platform.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557350100000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"fd281183-722e-4e54-bd93-4bf7885b9427\",\"code\":\"\",\"title\":\"Video and Podcasts Team Office Hours\",\"description\":\"Come chat 1:1 with the video and podcasts teams to give feedback and learn more about their roadmap. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557416700000,\"endTimestamp\":1557417600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"THIS IS THE POST KEYNOTE FOR VIDEO\"},{\"id\":\"a23012c6-04f2-4275-95cc-4ce1bd2d5e3b\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"792690cb-c0dc-4da5-b96d-4d00c339bddc\",\"code\":\"\",\"title\":\"ARCore office hours\",\"description\":\"Ask the AR team everything you want to know about ARCore and AR viewer for web.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557278100000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"e97d08ab-3cad-493d-a581-4d00d7250dd3\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"c2d35b51-a0f3-4e19-8d2e-4d01fe280b8d\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"350efb2a-5024-4c0e-a21c-4d1227187d67\",\"code\":\"\",\"title\":\"Subscriptions on Google Play Billing\",\"description\":\"Do you sell digital subscriptions on Google Play? Let's chat about the latest subscription features and technology. We can chat about new business models, share growth optimizations, and talk about common mistakes that could be hurting your business.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557420300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"fe8a25e9-7baf-41ee-ae98-4da92db2373f\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557425700000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"10826b39-0905-42c7-a205-4dc91819ab0a\",\"code\":\"\",\"title\":\"Making the right decisions for your serverless architecture Office Hours\",\"description\":\"In the right hands, Serverless can increase developer velocity and help your apps scale to new heights. During this session, we'll take a look at Google's Serverless platforms (including Cloud Run, our newest, container-based offering) and how you can build lightweight, scalable, and fault-tolerant Serverless apps on top of Google Cloud.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557438300000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"47d04df9-deb9-496e-98ec-4dd0008fd55b\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557367200000,\"endTimestamp\":1557369000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"6ff5c5a9-000d-43d5-afaa-4dd8a690c144\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"5ff86db3-5027-4aed-967f-4e538f16cb8c\",\"code\":\"\",\"title\":\"Developer Student Clubs: Engaging student developers\",\"description\":\"Googlers will share what the fast growing Developer Student Clubs (DSC) program is all about and then lead a discussion about how people are engaging with students and how Google and student can collaborate.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"9a76b4be-d245-4848-9fb1-4f122a26aeab\",\"code\":\"\",\"title\":\"Google Mobile Ads SDK office hours\",\"description\":\"Get your AdMob and Ad Manager app integration questions answered. Meet 1:1 with experts to learn more about these products, debug issues with your app code or ad configuration, discuss best practices, and provide product feedback.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ads\",\"type_officehours\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557355500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"7e52f691-b5f4-441d-ac2f-4f3c2176f73d\",\"code\":\"\",\"title\":\"GIFs and More: Integrating Expression Search in Your App\",\"description\":\"Come chat with the Tenor team about how to use the Tenor GIF Search API to deliver a powerful expression experience in your app\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557357300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"b9ff8cce-39c4-4789-8869-4f96a8da826c\",\"code\":\"\",\"title\":\"Accessibility Office Hours\",\"description\":\"Experts on engineering and UX will help you make your app more accessible to all users, including people with disabilities.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"type_officehours\"],\"startTimestamp\":1557342900000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"14f6b044-e337-4a5e-b23f-4fbd85b176ef\",\"code\":\"\",\"title\":\"Office Hours with the AMP Story Team\",\"description\":\"Have questions about how to get started building fast, visually engaging AMP Stories? Wondering about the UX best practices for this new web format? Or need some tips on how to improve your Story's appearance in Google Search? Attend the AMP Story Office Hours to discuss these questions and more with the people who created the format.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557278100000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"9725d0a9-747c-454d-bb0b-502354c196e1\",\"code\":\"\",\"title\":\"Chrome Extensions Office Hours\",\"description\":\"Got questions about browser extensions? Schedule some time with the Chrome Extension team! The team is here to talk about Manifest V3 changes, extension development best practices, give out high fives, or otherwise chat about the future of browser extensions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557346500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"a78a3e62-2882-4404-9b61-509cc87152b5\",\"code\":\"\",\"title\":\"Vitals Q&A\",\"description\":\"Enable developers to ask questions about Vitals in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557279900000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"33692e48-c64f-4760-a433-50deb7d0adcc\",\"code\":\"\",\"title\":\"Google Photos APIs Office Hours\",\"description\":\"The Google Photos partner program and Library API launched at I/O last year to connect with your users, and upload and share content. Come meet the team and learn more about how to integrate your apps and services with Google Photos.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557335700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"b50ff9a6-ffa1-42b2-866c-513de5861b0b\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"d7218d01-6318-425b-ac1e-5263ab6b698c\",\"code\":\"\",\"title\":\"Chrome Extensions Office Hours\",\"description\":\"Got questions about browser extensions? Schedule some time with the Chrome Extension team! The team is here to talk about Manifest V3 changes, extension development best practices, give out high fives, or otherwise chat about the future of browser extensions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557344700000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"3bc4701c-fff8-4c53-999b-537575209357\",\"code\":\"\",\"title\":\"Android TV Office Hours\",\"description\":\"Have questions about Android TV? Want to learn how to take advantage of the native integrations with Android TV? Come chat with members of the Android TV team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557422100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"734b25a1-7a32-4a26-8712-539b4a95f102\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557442800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"e9c00a9e-23c7-443f-b729-53a34beeeb0c\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557367200000,\"endTimestamp\":1557369000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"e5dce9c1-c770-4ca7-84da-53add75a1514\",\"code\":\"\",\"title\":\"Media Actions Office Hours\",\"description\":\"Bring your media to Search, Assistant, Android TV, and Play using Google Media Actions. Members of the engineering and product team will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557330300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"7d1c9ed8-37cd-477b-ad18-53b351e677cc\",\"code\":\"\",\"title\":\"ExoPlayer office hours\",\"description\":\"Bring your questions about ExoPlayer, the open source media library for Android.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557425700000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"e46c4734-e311-4063-8623-542dd23cb116\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"9b6eb9d8-48bf-4edf-a008-543aff3fa7c9\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"4ec0269e-2b07-44db-b368-54fc503c34d2\",\"code\":\"\",\"title\":\"TensorFlow Extended (TFX)\",\"description\":\"Want to know more about Tensorflow Extended, the scalable end-to-end ML platform that Google uses to train TensorFlow models ?  Join us to learn more about TFX and our plans to make more of it available to you.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557431100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"89e274e3-8c3b-4903-b45e-5523ae8741d9\",\"code\":\"\",\"title\":\"Office Hours w/ the Google Maps Platform Team\",\"description\":\"The Google Maps Platform team will be on-hand to answer questions and chat about all your questions/concerns. Members of the developer relations, eng, and support teams from Maps, Routes, and Places will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_location/maps\",\"type_officehours\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557431100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"38fac171-f2e2-48aa-bd1f-55a2bc92efcf\",\"code\":\"\",\"title\":\"Chrome OS Android Office Hours\",\"description\":\"Visit with the Chrome OS Android/ARC++ team to discuss Android app design and technical issues and learn how you can give your users the best experience possible on Chrome OS.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557420300000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"9e9d128d-212e-4962-b8d7-55eaf99debc3\",\"code\":\"\",\"title\":\"TPUs\",\"description\":\"Come and ask your questions about Google's Tensor Processing Units (TPUs)\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557434700000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"525e845e-7830-4fcb-9956-5808e0143b64\",\"code\":\"\",\"title\":\"Android Studio Profilers Office Hours\",\"description\":\"Meet with members of the Android Studio Profilers team to get help on profiling and optimizing your app.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557276300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"4be858c8-5483-4452-b553-583c62256c1a\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"859a125d-da63-416d-870d-58543ac57190\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"7f018311-7afe-4634-b5db-58e44ee5c334\",\"code\":\"\",\"title\":\"Web Assembly\",\"description\":\"Come join us to talk about Web Assembly, a tool that allows you to bring your C++ code base to the web, and brings more consistent performance to your applications. We'll have experts on hand to dive in to your questions. Walk-ins are welcome. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557333900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"336053b9-3e57-480b-aaee-59087bca8e5f\",\"code\":\"\",\"title\":\"G Suite Developer Office Hours\",\"description\":\"Meet with G Suite Developer experts and ask questions about Apps Script, App Maker, and APIs. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557270900000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"6035928a-de16-4f44-99ac-596bc875eafc\",\"code\":\"\",\"title\":\"Optimize Your Image Search Results\",\"description\":\"Get 1:1 guidance to optimize images on your sites for visual searching and learn how to monitor traffic metrics.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557276300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"92327f1f-7739-449d-b7d8-59abeab63698\",\"code\":\"\",\"title\":\"Vitals Q&A\",\"description\":\"Enable developers to ask questions about Vitals in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557355500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"fa370d1e-6eb6-4b5b-afcd-59c4a3418a71\",\"code\":\"\",\"title\":\"Google Programs for Higher Education\",\"description\":\"After talking to Googlers at the Higher Ed office hours, developers (faculty and students) will have a better idea how they can use Google products (especially Google Cloud) in their teaching and research.  They'll know how to apply for grants, prepare for careers in a cloud-first world, and have a good idea of the resources available.\\n\\nThose developers who already are using Google in Higher Ed will have an opportunity to ask specific questions and give feedback to the team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557348300000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"c758b94c-2bc1-44a5-8f95-59ef74d3189d\",\"code\":\"\",\"title\":\"Kotlin for Android Office Hours\",\"description\":\"Have questions about using Kotlin in your Android app?  Stop by and learn about the latest best practices, including Kotlin coroutines!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557362700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"876532f4-fa21-401c-875f-59f26c59c8f6\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"9e821e18-889a-4a29-b8ab-5a330b65b361\",\"code\":\"\",\"title\":\"Play Instant Games Office Hours\",\"description\":\"Office hours to help developers 1:1 to build out their Instant Games. This includes developers at all stages of development; from those who may have considered building an instant game and want to learn more, to those who already have an instant game in Play and would like to hear about next steps to make the experience even better.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557425700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"e341b2d0-9bc8-42f7-b72d-5a97d1456195\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"945c38a9-1e42-479b-9165-5acdbb84bf3e\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"224c3b39-3332-4b1a-a752-5af77cb2829c\",\"code\":\"\",\"title\":\"Non-SDK (hidden) API usage and Android app compatibility\",\"description\":\"Android is gradually restricting the use of non-SDK interfaces, whether directly, via reflection, or via JNI. As we bump up the restrictions of the blacklist and greylist in Q, come learn how to keep your app compatible between releases, and talk with the team about public alternatives and how to detect usage in your app. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557330300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"bcb05bce-b1a0-4a9e-af77-5b0c0343d5b6\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"8e3c5e9d-d27b-46a1-ad70-5b588d9a17ff\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"bc50cdac-76f7-451b-b502-5b6dd12278a2\",\"code\":\"\",\"title\":\"Accessibility Office Hours\",\"description\":\"Experts on engineering and UX will help you make your app more accessible to all users, including people with disabilities.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"type_officehours\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557342900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"e9e96e01-9522-4c08-9bdb-5c5a960e474c\",\"code\":\"\",\"title\":\"GIFs and More: Integrating Expression Search in Your App\",\"description\":\"Come chat with the Tenor team about how to use the Tenor GIF Search API to deliver a powerful expression experience in your app\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557355500000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"f9813afb-efb0-4636-a25f-5c96b135a1ef\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"58dd60a0-254a-40f7-896e-5cac7b210051\",\"code\":\"\",\"title\":\"Web Assembly\",\"description\":\"Come join us to talk about Web Assembly, a tool that allows you to bring your C++ code base to the web, and brings more consistent performance to your applications. We'll have experts on hand to dive in to your questions. Walk-ins are welcome. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557335700000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"464c3ae2-2724-4934-b682-5cdd10aeab56\",\"code\":\"\",\"title\":\"TensorFlow 2.0\",\"description\":\"Curious about what new features are offered in TensorFlow 2.0? Interested in upgrading your models from TensorFlow 1.x to TF 2.0? Ideas about additional functionality for the API, or questions about how to get involved? You're in luck! We'll have a member of the TensorFlow engineering team on-site.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557350100000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"692eaa9a-603d-499a-9d98-5d75ed0cb42d\",\"code\":\"\",\"title\":\"Location, Activity Recognition, and Awareness Office Hours\",\"description\":\"This team owns location services on Android and in Google Play Services, such as the FusedLocationProvider API. This team also owns the activity recognition APIs and Awareness APIs. Come with all your questions on the new location permission in Q, how to use these APIs, best practices, and how to optimize your apps! \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557341100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"a9314a07-d0ca-4aba-b224-5d8c9a696d95\",\"code\":\"\",\"title\":\"Android Runtime (ART) Office hours\",\"description\":\"Android Runtime (ART) employs high-performance compiler and garbage collection technology to provide the best runtime and memory usage experience for your Android applications. During this Office Hour, engineers will be available to discuss new developments in ART and help you understand and address performance and memory issues.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557359100000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"2c9d63bc-25f5-4e72-86ac-5db75c8527c5\",\"code\":\"\",\"title\":\"Gaming and graphics on Chrome OS Office Hours\",\"description\":\"Get time 1-1 with the Chrome OS games & graphics team to solve game technical & design issues\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557436500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"d6d4fd59-da3f-458f-a826-5dd096ec9f78\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"662e433b-fde0-4ab7-b082-5ddc9e7797ef\",\"code\":\"\",\"title\":\"Google Cast Office Hours\",\"description\":\"Come talk to Google Cast Experts about your app.  If you have questions about how best to leverage the Google Cast SDK to build your app or have an innovate app you’d like to share we’d love to talk with you.  Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557357300000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"1fa78694-8bdb-4e96-9e2a-5e0de01dad17\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"09016dd0-179a-4f47-b50b-5e172819c781\",\"code\":\"\",\"title\":\"Android Studio Profilers Office Hours\",\"description\":\"Meet with members of the Android Studio Profilers team to get help on profiling and optimizing your app.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557274500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"721fc1ba-0831-4d8b-8f83-5e2410ea9352\",\"code\":\"\",\"title\":\"Sign-In/Up on the Web\",\"description\":\"Ask us questions about FIDO, WebAuthn, other general identity management as well as reCAPTCHA!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557344700000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"deaf6e4d-40b2-4c57-8fc2-5f2cd8809573\",\"code\":\"\",\"title\":\"Google Pay\",\"description\":\"Come join us to talk about Google Pay and how to leverage its APIs to improve the payment experience in sites, applications and other elements in the ecosystem such as tickets and passes, loyalty programs and discounts.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_payments\",\"type_officehours\"],\"startTimestamp\":1557416700000,\"endTimestamp\":1557417600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"ebc97a21-8ad0-4164-b0e0-5fc92fe8938b\",\"code\":\"\",\"title\":\"Office hours with the Android Bazel team\",\"description\":\"Bazel is an open source build system developed by Google. The Android Bazel team is responsible for all Bazel Android Rules. The team will be happy to answer any questions around Android integration with Bazel, migration strategies and best practices to build Android apps at scale with Bazel.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557276300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"0a80bc83-0f76-4b47-8dff-5fd839698fad\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557367200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"7b4b911e-fa58-4191-92fe-5ff90453099f\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"16bfe2db-8687-4656-aa2b-6035d7a75aa9\",\"code\":\"\",\"title\":\"Google Cast Office Hours\",\"description\":\"Come talk to Google Cast Experts about your app.  If you have questions about how best to leverage the Google Cast SDK to build your app or have an innovate app you’d like to share we’d love to talk with you.  Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557355500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"5d502586-69dd-4926-b62f-60795df643ce\",\"code\":\"\",\"title\":\"AMA with the Google Web Team\",\"description\":\"Quick introduction to the web platform by the Google Web team and then answering questions from the attendees about the web platform.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557348600000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"ca080303-5e16-43d9-8a59-60953ffc1eaa\",\"code\":\"\",\"title\":\"Android Privacy\",\"description\":\"Office hours to answer questions about all Android Privacy related features. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557279900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"fac3c17b-2ade-4052-98ed-6119f480aec3\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"3eb2bcc4-7991-47be-8849-618f747e0987\",\"code\":\"\",\"title\":\"Accessibility Office Hours\",\"description\":\"Experts on engineering and UX will help you make your app more accessible to all users, including people with disabilities.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"type_officehours\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557341100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"c68506b7-84b2-4518-a430-61d452ab39d8\",\"code\":\"\",\"title\":\"Chrome OS Android Office Hours\",\"description\":\"Visit with the Chrome OS Android/ARC++ team to discuss Android app design and technical issues and learn how you can give your users the best experience possible on Chrome OS.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557422100000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"a94c5534-a1fb-4cb2-8280-61ea2565adc8\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"fb7c02dc-2683-4737-a3a6-61ef82a8231d\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"69088a9d-3b12-4b5d-81dc-62673d4d0cef\",\"code\":\"\",\"title\":\"G Suite Developer Office Hours\",\"description\":\"Meet with G Suite Developer experts and ask questions about Apps Script, App Maker, and APIs. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557431100000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"8d26db35-02e1-4d0c-93fb-62ce81422577\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"4af90275-4b9d-4bb1-8b05-62e90ba3091d\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"180e553f-6444-4373-a98b-63b95ee03ff6\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"118014b1-d0cd-4adb-b375-63fca2fe577c\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"1911b8a6-82a2-4a95-9bbb-63fcaf7ab3e3\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"313ae014-c6b8-40ce-ba61-63fdf8297a46\",\"code\":\"\",\"title\":\"What's changing in Android Q\",\"description\":\"So your app runs great on Android 9 Pi, what do you need to change to work on Android Q? Come along and talk to a developer about what changes Android Q requires.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557350100000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"c1228d29-a458-4e15-b787-644f431683f0\",\"code\":\"\",\"title\":\"AndroidX Test Office Hours\",\"description\":\"The AndroidX Test team is responsible for all Android testing libraries and infrastructure such as Espresso, Runner, Rules, Robolectric, Android Test Orchestrator and test integration in Gradle, Bazel and Android Studio.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557270900000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"046b6d89-7791-4d93-a949-6465087d36f3\",\"code\":\"\",\"title\":\"TensorFlow Extended (TFX)\",\"description\":\"Want to know more about Tensorflow Extended, the scalable end-to-end ML platform that Google uses to train TensorFlow models ?  Join us to learn more about TFX and our plans to make more of it available to you.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557431100000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"29fef7df-73f2-402b-90fd-652b4a6594a9\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"79c665b9-7889-4955-be7b-659f9ca7bce8\",\"code\":\"\",\"title\":\"Smart Home Office Hours\",\"description\":\"Come talk to Smart Home experts about integrating your device with Google Assistant. If you have questions about how to best leverage Smart Home types and traits to describe your device and what it does, we'd love to talk to you. Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557276300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"5b7112e5-524d-40c5-b738-65a5723047bb\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"5b77ef43-9c8c-4eac-b242-65e88053ef58\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"c2f7ec3a-6d46-4d32-8e13-65efc95200c4\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"dfa40190-886e-4a65-8e45-665a8e573f32\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"f755b372-3406-44cb-8fa9-669c2678a111\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557367200000,\"endTimestamp\":1557369000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"d066146a-9c8e-4733-8b8f-66b102d68ea3\",\"code\":\"\",\"title\":\"Flutter Office Hours or #AskFlutter\",\"description\":\"Want to know more about building apps in Flutter, or adding Flutter to your Android and iOS apps? Stop by and have your questions answered by the Flutter team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_flutter\",\"type_officehours\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557440100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"66356cf8-981a-46b5-94e9-66ca1d25233d\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"c6fc1232-67d7-4f4c-9134-671e6f693a42\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557353700000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"47f0292b-4f5a-4d8f-a3ca-679eec6e6f53\",\"code\":\"\",\"title\":\"Play Store pre- and post-launch marketing Q&A\",\"description\":\"Enable developers to ask questions on how to market their apps in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557425700000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"e1d97fc3-0077-4b88-a0ca-6811e2612766\",\"code\":\"\",\"title\":\"Flutter Office Hours or #AskFlutter\",\"description\":\"Want to know more about building apps in Flutter, or adding Flutter to your Android and iOS apps? Stop by and have your questions answered by the Flutter team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_flutter\",\"type_officehours\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557337500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"fc17ec42-5399-4469-b924-69849444711d\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"b693d080-c8f3-4622-90c6-69e39a5355a2\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"9690a11c-7b5c-43f1-bf24-6a7fcf7a9205\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"2c9a2eaa-131d-4246-a1d2-6b51e8196dd5\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"70de115b-dc5d-4da2-a99b-6b6b11e0bb10\",\"code\":\"\",\"title\":\"GCP Essentials\",\"description\":\"Google Cloud Platform (GCP) is broad and it may be overwhelming if you're getting started. Come and talk to us about where you should run your code and where you should store your data.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557360900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"df3ffffb-83d4-4404-b2ce-6bc61230960c\",\"code\":\"\",\"title\":\"Location, Activity Recognition, and Awareness Office Hours\",\"description\":\"This team owns location services on Android and in Google Play Services, such as the FusedLocationProvider API. This team also owns the activity recognition APIs and Awareness APIs. Come with all your questions on the new location permission in Q, how to use these APIs, best practices, and how to optimize your apps! \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557418500000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"92e1714c-c95d-4df0-8d24-6bd00ea46341\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"a41c5b94-119e-4fb2-bbb6-6bda58cdc484\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"b80ee6ef-b5e2-44cd-9c8f-6c52f105e127\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"f63317a1-585d-45d6-8e52-6c8cd6ad1cba\",\"code\":\"\",\"title\":\"Android System UI (Notifications, Navigation, Multitasking, Sharing)\",\"description\":\"Meet the team that works on Android System UI including features like Notifications, Navigations, Sharing and Multitasking.  \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557263700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"97e86995-c0a8-49ee-bc4d-6cae62736462\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"6fad621c-40cf-408f-b039-6d1ac7e2f48e\",\"code\":\"\",\"title\":\"G Suite Developer Office Hours\",\"description\":\"Meet with G Suite Developer experts and ask questions about Apps Script, App Maker, and APIs. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557272700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"cd8673d9-451a-41f2-a02f-6d9ee89c0b08\",\"code\":\"\",\"title\":\"Chrome OS Android Office Hours\",\"description\":\"Visit with the Chrome OS Android/ARC++ team to discuss Android app design and technical issues and learn how you can give your users the best experience possible on Chrome OS.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557422100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"23c421b7-5a7e-44c8-9a1b-6db563549553\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"a07459a5-afde-4f80-955b-6de6a65ad307\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"63fb6856-b9a5-41be-8647-6e4bbbdff1a2\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"b6ff8839-bc95-48d0-8a03-6ead29369870\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"3d0e778d-914b-46cb-a120-6ebf8588641b\",\"code\":\"\",\"title\":\"Game development with Google Cloud\",\"description\":\"Meet the team behind the Google Cloud Gaming products such as Agones & OpenMatch and ask us anything.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557265500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"04ff8f64-f7e6-4c5c-865d-6ec0b392c3ec\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"62fdda75-464f-4f85-b117-6eebb7f49121\",\"code\":\"\",\"title\":\"UX Research Office Hours\",\"description\":\"Come ask about methods Google researchers use to inform product direction, evaluate design docs, mocks, and PRDs, and report back on launched features. You can also learn about the value user-centered thinking and research can bring to your teams.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557269100000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"576a5308-79cd-4c89-8810-6efa119a5f7d\",\"code\":\"\",\"title\":\"Firebase Test Lab, Performance Monitoring, and Crashlytics office hours\",\"description\":\"The Firebase team will be on hand to answer your questions about Test Lab, Performance Monitoring, and Crashlytics, and to listen to your concerns.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557360900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"fb1b4330-ff5e-41b7-be72-6f3a4c310e1e\",\"code\":\"\",\"title\":\"Media Actions Office Hours\",\"description\":\"Bring your media to Search, Assistant, Android TV, and Play using Google Media Actions. Members of the engineering and product team will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557330300000,\"endTimestamp\":1557331200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"9068273e-c3ea-4ebc-8e97-6fd58f2afc43\",\"code\":\"\",\"title\":\"Progressive Web Apps Office Hours\",\"description\":\"Come join us to talk about Progressive Web Apps, a way to develop and deploy apps via the web for both desktop and mobile. Bring your hard questions, we'll have experts on hand to dive into anything you want to know. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557436500000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"fe498a94-c48a-4cc5-967f-701e6a27ebe7\",\"code\":\"\",\"title\":\"E-commerce site clinic Office Hours\",\"description\":\"Get a review of your online store from Google e-commerce experts. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557341100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"eccb20d6-ad27-4420-88c7-70414f1d4efe\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557269100000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"33f9de53-1a9e-48c7-af7d-70819107ca24\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"57e70e48-7c02-4830-b01f-70967d6c5483\",\"code\":\"\",\"title\":\"Progressive Wordpress \",\"description\":\"Meet the team at Google that works on making WordPress the best platform to serve web content, and ask them questions about the Site Kit by Google, the official AMP plugin and PWA + Feature Policy plugins. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557429300000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"a4b04310-a4eb-4269-a021-7166f09380e1\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"843cbe4d-fc46-42f0-b6f2-716d2a4dd9f5\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"1df8fe04-720f-442f-88b6-71d924956f8d\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"76633118-620a-49ad-b869-71f4b662b26e\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"5386bd49-14e3-490b-b715-7242ebca9bf2\",\"code\":\"\",\"title\":\"AMP\",\"description\":\"Meet the AMP team and ask them any of your burning questions about building lightning fast and user-friendly websites.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557339300000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"5036c9e4-8d74-458d-b21a-7247db5dc17d\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"786290bd-22ed-4d45-b213-72989835732f\",\"code\":\"\",\"title\":\"Google Mobile Ads SDK office hours\",\"description\":\"Get your AdMob and Ad Manager app integration questions answered. Meet 1:1 with experts to learn more about these products, debug issues with your app code or ad configuration, discuss best practices, and provide product feedback.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ads\",\"type_officehours\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557357300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"eff5f282-246f-4ac1-9c87-72bb40e15edf\",\"code\":\"\",\"title\":\"Android TV Office Hours\",\"description\":\"Have questions about Android TV? Want to learn how to take advantage of the native integrations with Android TV? Come chat with members of the Android TV team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557420300000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"81a3ee17-39b8-4b18-a3cd-72bfbb793ed1\",\"code\":\"\",\"title\":\"Android Authentication & Autofill \",\"description\":\"Developers will be able to ask questions related to Android authentication and identity, app sign-in (Google Sign-in vs. SmartLock for passwords vs. Autofill), SMS OTP autofill using SMS Retriever and the new SMS User Consent APIs, and Autofill Framework/Autofill with Google. These Office Hours can provide insight into the different sign-in options available to developers, as well as best practices. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557267300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"14f4b387-1c6c-45d7-ab97-73381770a264\",\"code\":\"\",\"title\":\"Android Auto\",\"description\":\"Do you have questions about developing your app for the car? Come meet the team and learn more about how you can use tools such as Android Studio and the emulator to port your app to the car.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557427500000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"a981a575-ab14-4d0f-8bb7-7403256dd086\",\"code\":\"\",\"title\":\"Review my site! Tools & checks to improve performance, accessibility & UX\",\"description\":\"Get a review of your website from Google developers and UX experts. Find opportunities for improvement in terms of performance, UI/UX and accessibility.\\n\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557427500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"5f678d0d-e7e3-4e3a-b3fa-741b1ef49b21\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"910da4bd-5ee9-43b4-83ce-744d35b21807\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"5b6505d0-ea87-4f75-8c88-74a5137588c8\",\"code\":\"\",\"title\":\"Tech4Good - Show and Tell\",\"description\":\"Developers and entrepreneurs from around the world who have built apps/systems to solve some local problem - this meetup is for you! Join Googlers and others to network and learn from each others' experiences in using technology for social good.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"07fd5007-728e-4523-8df5-74b07f716699\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"8b484e1b-8d27-4725-b342-74badcffffe6\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"f653e646-3168-4212-a21f-750184e36f56\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557442800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"c3eb849d-6a4b-4d2d-96bb-75301c300ce3\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"a58689c2-1168-4245-96bf-758c9bb1261f\",\"code\":\"\",\"title\":\"Optimize Your Image Search Results\",\"description\":\"Get 1:1 guidance to optimize images on your sites for visual searching and learn how to monitor traffic metrics.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557274500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"36edb560-d592-49de-b3c5-75a97c0bfa0b\",\"code\":\"\",\"title\":\"AMA: Metrics in Play Console\",\"description\":\"Play Console offers loads of metrics - from acquisition to churn, bugs to revenue, and with our latest releases more insights than ever before. But developers often have have highly specific questions and queries about these based on their own unique needs, businesses, and situations. This is an opportunity to ask the experts who built Play Console metrics anything about what you can access.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557434700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"9bea9ce6-bf02-4b95-b717-75b4cdacaaef\",\"code\":\"\",\"title\":\"Progressive Web Apps Office Hours\",\"description\":\"Come join us to talk about Progressive Web Apps, a way to develop and deploy apps via the web for both desktop and mobile. Bring your hard questions, we'll have experts on hand to dive into anything you want to know. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557436500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"3f300ae4-4839-4678-b99b-75f5d5cbd3b4\",\"code\":\"\",\"title\":\"Game development with Google Cloud\",\"description\":\"Meet the team behind the Google Cloud Gaming products such as Agones & OpenMatch and ask us anything.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557263700000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"8ba4135c-f962-4df3-a7cd-7629ad8649b1\",\"code\":\"\",\"title\":\"TPUs\",\"description\":\"Come and ask your questions about Google's Tensor Processing Units (TPUs)\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557330300000,\"endTimestamp\":1557331200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"9986da44-ec78-4d50-a785-76aa116b8eca\",\"code\":\"\",\"title\":\"Play Instant Apps Office Hours\",\"description\":\"Office hours to help developers 1:1 to build out their Instant Apps. This includes developers at all stages of development; from those who may have considered building an instant app and want to learn more, to those who already have an instant app in Play and would like to hear about next steps to make the experience even better.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557272700000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"620c8218-1e23-481e-9bed-76d2ffd31c9c\",\"code\":\"\",\"title\":\"Flutter Office Hours or #AskFlutter\",\"description\":\"Want to know more about building apps in Flutter, or adding Flutter to your Android and iOS apps? Stop by and have your questions answered by the Flutter team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_flutter\",\"type_officehours\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557438300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"d64ad4e5-d70e-4fc1-9cd4-76d5c9e1ad51\",\"code\":\"\",\"title\":\"Understanding the role of voice in your app for emerging markets\",\"description\":\"As our apps grow their footprint globally, voice technology can be an enabler in bridging comprehension and literacy gaps. Learn how to effectively integrate voice into your product experience to better serve the needs of your users.\\nObjective: To enable developers to have stronger voice stories for their products.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557270900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"9ad90213-821f-4102-9e50-774c2fe0bdcd\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"49eda524-7fae-41a8-9374-77a71ed1d762\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"770b7022-4f2f-4958-9960-780d812ab21d\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"77ab3de1-5501-4250-bffa-783a5e78c994\",\"code\":\"\",\"title\":\"What's changing in Android Q\",\"description\":\"So your app runs great on Android 9 Pi, what do you need to change to work on Android Q? Come along and talk to a developer about what changes Android Q requires.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557270900000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"b218cad5-d367-4b4a-9446-7845866ba061\",\"code\":\"\",\"title\":\"Android System UI (Notifications, Navigation, Multitasking, Sharing)\",\"description\":\"Meet the team that works on Android System UI including features like Notifications, Navigations, Sharing and Multitasking.  \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557263700000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"adeba364-030e-4cbe-8118-787882753766\",\"code\":\"\",\"title\":\"What's changing in Android Q\",\"description\":\"So your app runs great on Android 9 Pi, what do you need to change to work on Android Q? Come along and talk to a developer about what changes Android Q requires.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557270900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"a8519411-c1ed-45db-8fb7-78e4df5c7e72\",\"code\":\"\",\"title\":\"Vitals Q&A\",\"description\":\"Enable developers to ask questions about Vitals in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557357300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"5f868902-630f-474b-a4b7-7905156244bd\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"eb16e0eb-0c87-4de0-812b-790e8e2fd9ec\",\"code\":\"\",\"title\":\"Web Assembly\",\"description\":\"Come join us to talk about Web Assembly, a tool that allows you to bring your C++ code base to the web, and brings more consistent performance to your applications. We'll have experts on hand to dive in to your questions. Walk-ins are welcome. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557335700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"25eea139-004b-44f5-9f65-7934b1bb86b7\",\"code\":\"\",\"title\":\"Kotlin for Android Office Hours\",\"description\":\"Have questions about using Kotlin in your Android app?  Stop by and learn about the latest best practices, including Kotlin coroutines!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557362700000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"36cd6009-8ca8-4396-a1b4-7947ddf42bb4\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"c3952ba9-f872-4ecc-b6a2-795ab33d4482\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"92172f84-c703-4377-b54a-7976bbdf7796\",\"code\":\"\",\"title\":\"SEO for JS-based websites\",\"description\":\"Modern sites can be awesome, but also tricky to make visible through Search. Chat with us about your struggles, get advice on how to efficiently improve your site.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557355500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"b2c85ad5-c250-42f4-a5ea-798106210190\",\"code\":\"\",\"title\":\"Android Runtime (ART) Office hours\",\"description\":\"Android Runtime (ART) employs high-performance compiler and garbage collection technology to provide the best runtime and memory usage experience for your Android applications. During this Office Hour, engineers will be available to discuss new developments in ART and help you understand and address performance and memory issues.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557360900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"e868ec1f-9f42-42b4-a3db-7a047ce1cd8c\",\"code\":\"\",\"title\":\"TensorFlow Lite\",\"description\":\"Want to use machine learning in your mobile apps and other small devices? Have questions and/or want to discuss your ideas? Come by and chat with TensorFlow Lite team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557339300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"e1619c01-d889-48b5-a666-7a624dca9ce2\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"f9431226-d87c-4863-b56c-7ac7db8d508e\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"182ce0cd-dafb-45fa-b54c-7ae48f4a1027\",\"code\":\"\",\"title\":\"Cloud IoT Platform Office Hours\",\"description\":\"Bring your questions about how to connect devices to the Cloud, process the data, or any of the Cloud products that we have as part of our IoT Platform.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557348300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"9911b324-dcda-4d7a-bedf-7b10244d5bf1\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"00488bd2-7ec5-4167-945c-7b12d3ed22a6\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"e2f49939-0b36-41a1-9cb1-7b6fe1985517\",\"code\":\"\",\"title\":\"TensorFlow Extended (TFX)\",\"description\":\"Want to know more about Tensorflow Extended, the scalable end-to-end ML platform that Google uses to train TensorFlow models ?  Join us to learn more about TFX and our plans to make more of it available to you.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557432900000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"4673ff39-bd95-4172-9df4-7b993db6f3f4\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"33a0ccc8-4336-4f0b-8de6-7ba7bc46fb3a\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"e4129691-6efe-49fd-8e30-7bc8c0fc5190\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"609b0567-b3ba-4bc6-bcf5-7c49b73400b6\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"d0b7eeff-da63-496a-af55-7c9c9f5d583d\",\"code\":\"\",\"title\":\"Subscriptions on Google Play Billing\",\"description\":\"Do you sell digital subscriptions on Google Play? Let's chat about the latest subscription features and technology. We can chat about new business models, share growth optimizations, and talk about common mistakes that could be hurting your business.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557422100000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"c75ed58d-ad7d-4ee6-9839-7d0fe5b88048\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"2ad32940-06ee-48b1-8db4-7d697bc8e8ad\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"768b09a5-de1c-4b74-86a6-7dcb18b67205\",\"code\":\"\",\"title\":\"Optimize Your Image Search Results\",\"description\":\"Get 1:1 guidance to optimize images on your sites for visual searching and learn how to monitor traffic metrics.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557274500000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"72fdacc6-273c-4d55-b5ba-7dd692ed3203\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"03c8730e-b378-4edd-ad1a-7dfa7d817d55\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557342900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"ce13bd10-79c3-49b0-ac96-7e073d69b102\",\"code\":\"\",\"title\":\"Google Mobile Ads SDK office hours\",\"description\":\"Get your AdMob and Ad Manager app integration questions answered. Meet 1:1 with experts to learn more about these products, debug issues with your app code or ad configuration, discuss best practices, and provide product feedback.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ads\",\"type_officehours\"],\"startTimestamp\":1557355500000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"53811591-3193-4ec7-a276-7e4bd3be7b7f\",\"code\":\"\",\"title\":\"GCP Essentials\",\"description\":\"Google Cloud Platform (GCP) is broad and it may be overwhelming if you're getting started. Come and talk to us about where you should run your code and where you should store your data.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557360900000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"eda9707c-4c16-4270-af6f-7e94c1f4176d\",\"code\":\"\",\"title\":\"Office Hours w/ the Google Maps Platform Team\",\"description\":\"The Google Maps Platform team will be on-hand to answer questions and chat about all your questions/concerns. Members of the developer relations, eng, and support teams from Maps, Routes, and Places will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_location/maps\",\"type_officehours\"],\"startTimestamp\":1557341100000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"46f97541-a5a1-4e8f-8cca-7e9faf1c2d81\",\"code\":\"\",\"title\":\"TensorFlow 2.0\",\"description\":\"Curious about what new features are offered in TensorFlow 2.0? Interested in upgrading your models from TensorFlow 1.x to TF 2.0? Ideas about additional functionality for the API, or questions about how to get involved? You're in luck! We'll have a member of the TensorFlow engineering team on-site.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557348300000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"318c61e2-42f8-499e-ae08-7ebb94a5ceec\",\"code\":\"\",\"title\":\"Camera office hours\",\"description\":\"Spend 1:1 time with camera framework and CameraX engineers. Get camera support on your existing app or a new one that you are planning to launch.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557364500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"7c6cc295-5a72-4177-9934-7f70e6afdb46\",\"code\":\"\",\"title\":\"Android Studio Build\",\"description\":\"Come talk to engineers on the Android Studio Build System team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557425700000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"f452707a-9704-4f07-b927-7fd0e7d31db5\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"7964653b-61b5-4c4b-bea1-80c66619ae4d\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"75ea5519-0313-401d-8a62-80f0f7caa412\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"693ddf81-7ac2-4682-9215-81309abaf61e\",\"code\":\"\",\"title\":\"Google Pay\",\"description\":\"Come join us to talk about Google Pay and how to leverage its APIs to improve the payment experience in sites, applications and other elements in the ecosystem such as tickets and passes, loyalty programs and discounts.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_payments\",\"type_officehours\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557416700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"bc785c0a-5cac-40de-8f2a-81ad47ea82b9\",\"code\":\"\",\"title\":\"Android Privacy\",\"description\":\"Office hours to answer questions about all Android Privacy related features. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557359100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"45d50793-074d-4a80-ad8e-81c456fb7715\",\"code\":\"\",\"title\":\"Android Privacy\",\"description\":\"Office hours to answer questions about all Android Privacy related features. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557360900000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"b1a74a5c-af9c-40b0-b16e-81f996230dff\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"f6c37f11-dbc1-4182-8cf5-81fdea1b4af5\",\"code\":\"\",\"title\":\"Cloud Data and ML Office Hours\",\"description\":\"Have questions about how the cloud can help infuse your apps with machiine learning?  Come chat with experts and hear about the various cloud AI options available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557335700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"3f52ef31-b859-490c-8384-82208351ae40\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"d6291cc6-e5fd-4c68-adef-824ba9d8eb75\",\"code\":\"\",\"title\":\"Chrome Extensions Office Hours\",\"description\":\"Got questions about browser extensions? Schedule some time with the Chrome Extension team! The team is here to talk about Manifest V3 changes, extension development best practices, give out high fives, or otherwise chat about the future of browser extensions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557344700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"dd843166-7ebc-4ec3-8ce5-8280217869a5\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557269100000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"b34e0467-840e-4ddd-93de-82f0d5d54a53\",\"code\":\"\",\"title\":\"Higher Education Meetup\",\"description\":\"A chance for educators and students to come together and discuss innovative ways to use Google in the classroom and research lab.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557359400000,\"endTimestamp\":1557361200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"bad4f20a-ad76-414c-92d5-8346b36828c5\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"c1dddb58-ae78-40e1-83b9-83d1913847da\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557263700000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"2de2d09e-e844-426c-9470-83db135b2490\",\"code\":\"\",\"title\":\"Office hours with the Android Bazel team\",\"description\":\"Bazel is an open source build system developed by Google. The Android Bazel team is responsible for all Bazel Android Rules. The team will be happy to answer any questions around Android integration with Bazel, migration strategies and best practices to build Android apps at scale with Bazel.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557274500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"1db3f5f9-f101-4ae4-ba4c-8418a913bf55\",\"code\":\"\",\"title\":\"Google Developer Groups MENA Meetup\",\"description\":\"Meetup of GDG leads from Middle East and North Africa to network and share stories of how to increase impact and build great communities\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"9811509c-d316-4e6d-befd-8477494da841\",\"code\":\"\",\"title\":\"Google Analytics, Data Studio, Reporting & Visualization Office Hours\",\"description\":\"Office hours for Google Analytics and Data Studio\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557360900000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"e3cc2657-57f8-4642-8cbc-848fe4259e5f\",\"code\":\"\",\"title\":\"Chrome OS Enterprise/Education Office Hours\",\"description\":\"Get 1-1 time with Chrome OS Enterprise/Education specialists who can help you solve specific technical issues and answer any questions you may have.  Walk-ins are welcome\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_chromeos\",\"type_officehours\"],\"startTimestamp\":1557276300000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"f5f05f8b-54bb-427c-9106-84a4a4b8a93a\",\"code\":\"\",\"title\":\"Non-SDK (hidden) API usage and Android app compatibility\",\"description\":\"Android is gradually restricting the use of non-SDK interfaces, whether directly, via reflection, or via JNI. As we bump up the restrictions of the blacklist and greylist in Q, come learn how to keep your app compatible between releases, and talk with the team about public alternatives and how to detect usage in your app. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557330300000,\"endTimestamp\":1557331200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"46a6125a-26e5-4517-9891-84a742e111fe\",\"code\":\"\",\"title\":\"AMP\",\"description\":\"Meet the AMP team and ask them any of your burning questions about building lightning fast and user-friendly websites.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557339300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"1f769b7f-69d4-4177-9f35-859bfef856e7\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557427500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"521ca9d4-0b56-42e0-b1cc-85bd0d1b501a\",\"code\":\"\",\"title\":\"Chrome OS Enterprise/Education Office Hours\",\"description\":\"Get 1-1 time with Chrome OS Enterprise/Education specialists who can help you solve specific technical issues and answer any questions you may have. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557362700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"83e4090f-0862-4b52-9c64-85d4cd0bcf1d\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"0b53e9c4-2b7d-463c-80bd-85e0a0f4491a\",\"code\":\"\",\"title\":\"Dynamic AMP emails\",\"description\":\"Come join us to talk about AMP for email, a new innovation that allows email senders to create emails that deliver real time information and allows consumers to take interactive actions. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557278100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"a28c29e1-67fe-4816-83b2-864c08ecb7f0\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"ab132138-2d77-49a2-9676-866881b814b9\",\"code\":\"\",\"title\":\"Cloud IoT Platform Office Hours\",\"description\":\"Bring your questions about how to connect devices to the Cloud, process the data, or any of the Cloud products that we have as part of our IoT Platform.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557350100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"1ea59e90-8ba9-4e13-bcbd-866cfcfa3094\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"edab06ce-55ee-4eed-8063-8788319409c3\",\"code\":\"\",\"title\":\"Flutter Office Hours or #AskFlutter\",\"description\":\"Want to know more about building apps in Flutter, or adding Flutter to your Android and iOS apps? Stop by and have your questions answered by the Flutter team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_flutter\",\"type_officehours\"],\"startTimestamp\":1557440100000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"be767b4d-3ae7-4dee-897f-8789ef942ac1\",\"code\":\"\",\"title\":\"Android Auto\",\"description\":\"Do you have questions about developing your app for the car? Come meet the team and learn more about how you can use tools such as Android Studio and the emulator to port your app to the car.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557429300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"7a9cfd1c-9a6c-4678-b5ef-88ac516c8d62\",\"code\":\"\",\"title\":\"ARCore office hours\",\"description\":\"Ask the AR team everything you want to know about ARCore and AR viewer for web.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557279900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"b81bd84b-2d93-4689-9a5d-88c91107a8e5\",\"code\":\"\",\"title\":\"Flutter Office Hours or #AskFlutter\",\"description\":\"Want to know more about building apps in Flutter, or adding Flutter to your Android and iOS apps? Stop by and have your questions answered by the Flutter team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_flutter\",\"type_officehours\"],\"startTimestamp\":1557339300000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"e9fd7bad-37d9-4803-9f6c-89672dc79af3\",\"code\":\"\",\"title\":\"Subscriptions on Google Play Billing\",\"description\":\"Do you sell digital subscriptions on Google Play? Let's chat about the latest subscription features and technology. We can chat about new business models, share growth optimizations, and talk about common mistakes that could be hurting your business.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557420300000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"06ea3e15-bf2b-4a61-91a7-899b6727a85f\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"4438f2af-6858-40d0-bebf-89b48de056fa\",\"code\":\"\",\"title\":\"Google Analytics, Data Studio, Reporting & Visualization Office Hours\",\"description\":\"Office hours for Google Analytics and Data Studio\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557359100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"7057d281-9939-4b39-8341-8a4747bc0714\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"6942cb3b-10c2-4740-9c63-8a5188f11dbc\",\"code\":\"\",\"title\":\"Progressive Wordpress Office Hours\",\"description\":\"Meet the team at Google that works on making WordPress the best platform to serve web content, and ask them questions about the Site Kit by Google, the official AMP plugin and PWA + Feature Policy plugins.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557427500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"d7e7fa2a-c2f7-4cad-a793-8a930ecc460c\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557265500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"f30e9220-e2a4-4387-bcb8-8abc7c1f61bc\",\"code\":\"\",\"title\":\"Women of Color Meetup\",\"description\":\"Meetup for Women of Color attendees at I/O - meeting Googlers, each other, and building a community.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557425400000,\"endTimestamp\":1557427200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"8c9f9683-0fdb-4708-89ea-8b36e107ca54\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"af213bd4-8fea-4fe6-806d-8b87439bb055\",\"code\":\"\",\"title\":\"Kotlin for Android Office Hours\",\"description\":\"Have questions about using Kotlin in your Android app?  Stop by and learn about the latest best practices, including Kotlin coroutines!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557276300000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"a9545568-03b2-4095-a594-8baa8d687709\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"2526c526-7922-4524-aeff-8cc931c1f85f\",\"code\":\"\",\"title\":\"Android Auto\",\"description\":\"Do you have questions about developing your app for the car? Come meet the team and learn more about how you can use tools such as Android Studio and the emulator to port your app to the car.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557353700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"d5124cc4-793b-47bd-bbdd-8d0d0b25f919\",\"code\":\"\",\"title\":\"Firebase Cloud Messaging office hours\",\"description\":\"The Firebase team will be on hand to answer your questions about Cloud Messaging, and to listen to your concerns.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557332100000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"4200a8a6-71d1-4b4b-9fc3-8d8da2f7b5c9\",\"code\":\"\",\"title\":\"Firebase Cloud Messaging office hours\",\"description\":\"The Firebase team will be on hand to answer your questions about Cloud Messaging, and to listen to your concerns.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557330300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"c46573f9-f8cc-49be-9e90-8db8b3305e6e\",\"code\":\"\",\"title\":\"Android Security office hours\",\"description\":\"Do you have questions about Android Security? Come meet the team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557337500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"8bbbcbea-6508-4cb3-8ea4-8dc69625071e\",\"code\":\"\",\"title\":\"Android Studio Build\",\"description\":\"Come talk to engineers on the Android Studio Build System team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557427500000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"89cef940-c0ea-47e0-8345-8e8464eecc53\",\"code\":\"\",\"title\":\"Google Analytics, Data Studio, Reporting & Visualization Office Hours\",\"description\":\"Office hours for Google Analytics and Data Studio\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557360900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"e7d88f4f-d36a-4e92-8bab-8fc91ec0f0d8\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"27253a27-cb85-4307-a6d1-8fcd5dfd4424\",\"code\":\"\",\"title\":\"Firebase Predictions, Dynamic Links and In-app Messaging office hours\",\"description\":\"The Firebase team will be available to answer questions, and to listen to your concerns and feedback about Firebase Predictions, Dynamic Links and In-app Messaging.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557263700000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"f3e1fbc4-b999-471d-8f1e-900464c01404\",\"code\":\"\",\"title\":\"Android Camera (CameraX + Camera2)\",\"description\":\"Do you use Android Camera now or plan to? It's hard right? Ask us anything from the new CameraX framework to leveraging multi-camera setup on Android devices.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557423900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"7a56d37a-2f5c-4914-b124-9044771de785\",\"code\":\"\",\"title\":\"Progressive Web Apps Office Hours\",\"description\":\"Come join us to talk about Progressive Web Apps, a way to develop and deploy apps via the web for both desktop and mobile. Bring your hard questions, we'll have experts on hand to dive into anything you want to know. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557434700000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"c9b3825a-b09a-4bfb-b97a-904cd1893505\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"904ea6d5-b97c-4dfa-8b54-9063f77819b4\",\"code\":\"\",\"title\":\"Video and Podcasts Team Office Hours\",\"description\":\"Come chat 1:1 with the video and podcasts teams to give feedback and learn more about their roadmap. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557416700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"THIS IS THE POST KEYNOTE FOR VIDEO\"},{\"id\":\"575be4f9-aa4e-4094-b232-9066c498e8b2\",\"code\":\"\",\"title\":\"Google Assistant Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557348300000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"ac783491-5360-40cf-9b6c-90e140c56ed2\",\"code\":\"\",\"title\":\"Android System UI (Notifications, Navigation, Multitasking, Sharing)\",\"description\":\"Meet the team that works on Android System UI including features like Notifications, Navigations, Sharing and Multitasking.  \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557265500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"a1d5ff9e-6597-4372-8015-910cef68caa7\",\"code\":\"\",\"title\":\"Web components\",\"description\":\"Building a design system for your org? Or reusing components across multiple web apps and frameworks? Talk to the Web Components team about how large enterprises and Google products like YouTube and Material Design are approaching these challenges.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557416700000,\"endTimestamp\":1557417600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"6f5e0a2a-7666-4ae6-9b1a-9187f0f8e7b2\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"69ec49b2-25c4-448b-bb45-91bf287fe7ac\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557353700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"02514a71-bdd0-4319-9c7e-91fd74cf49c3\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"b7760aca-3633-4502-b274-921dc8318a64\",\"code\":\"\",\"title\":\"Non-SDK (hidden) API usage and Android app compatibility\",\"description\":\"Android is gradually restricting the use of non-SDK interfaces, whether directly, via reflection, or via JNI. As we bump up the restrictions of the blacklist and greylist in Q, come learn how to keep your app compatible between releases, and talk with the team about public alternatives and how to detect usage in your app. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557332100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"8f4626b1-1576-431b-bc38-922860280fcb\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557267300000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"c276a9f7-e118-4a32-872e-9235bd65b24b\",\"code\":\"\",\"title\":\"Android C++ / NDK Office hours \",\"description\":\"For developers using C++ on Android, the Android NDK is a toolset that lets you implement parts of your app using native-code languages. This can help you reuse libraries written in those languages, and can improve performance for critical situations like games. During this Office hour, engineers will be able to discuss technical questions on using C++, the NDK toolset, and developing native in Android Studio. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557330300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"d1e086d1-c0c8-4097-8c9a-925936cfab0f\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"e0eb22aa-3a25-47a0-8b04-9298bf58686b\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"32e83784-9936-4dd1-aed3-92c2e065a847\",\"code\":\"\",\"title\":\"Review my site! Tools & checks to improve performance, accessibility & UX\",\"description\":\"Get a review of your website from Google developers and UX experts. Find opportunities for improvement in terms of performance, UI/UX and accessibility.\\n\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557429300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"cffcfe9a-e927-4d32-b898-92e539051296\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"0fdb8b01-d63e-4814-bd6c-935e2c3c9513\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"d3a1e92b-2f42-458f-9244-937cf7f82456\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"a7598131-15c4-4192-a7b1-93b348d087c1\",\"code\":\"\",\"title\":\"Google Cast Office Hours\",\"description\":\"Do you have a question about Google Cast?  Are you curious about coding for Google Home Hub and Smart Displays?  Do you have ideas you'd like to brainstorm with a member of the Google Cast Team?  Google Cast office hours are a great opportunity to meet 1on1 with members of the Google Cast team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557422100000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"5952b407-2407-45a6-81aa-93d8fe05280e\",\"code\":\"\",\"title\":\"Sign-In/Up on the Web\",\"description\":\"Ask us questions about FIDO, WebAuthn, other general identity management as well as reCAPTCHA!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557346500000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"4590f619-8b84-43ac-a003-94062f4b364d\",\"code\":\"\",\"title\":\"TPUs\",\"description\":\"Come and ask your questions about Google's Tensor Processing Units (TPUs)\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557436500000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"db94bf44-3f98-4ca4-96ca-9428d83fa832\",\"code\":\"\",\"title\":\"Updates to Storage in Android Q\",\"description\":\"Android offers many different ways to save, retrieve and share data. Android Q changes attempts to better structure file system interactions for the shared storage space to make applications more secure, maintainable and healthy. Come to learn how to make your application ready for Android Q Storage updates.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557335700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"5e66b79c-0564-4c77-a38f-9452d77c19bf\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"f5105127-2b85-41ff-9b09-945a87deb3ba\",\"code\":\"\",\"title\":\"Android Auto\",\"description\":\"Do you have questions about developing your app for the car? Come meet the team and learn more about how you can use tools such as Android Studio and the emulator to port your app to the car.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557351900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"93ffb553-61e7-4dc0-9b9f-94748556970e\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557267300000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"33cc99c8-d01e-424e-bb74-947dfeca1e92\",\"code\":\"\",\"title\":\"Progressive Wordpress Office Hours\",\"description\":\"Meet the team at Google that works on making WordPress the best platform to serve web content, and ask them questions about the Site Kit by Google, the official AMP plugin and PWA + Feature Policy plugins. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557427500000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"52395b59-adc8-4a7f-a8d6-94a13447748c\",\"code\":\"\",\"title\":\"Web & Search office hours\",\"description\":\"Similar to the Google Webmaster Office Hours it would be nice to do an in-person office hours session at I/O so people can\\nAsk follow-up questions for the sessions on technical SEO\\nGet feedback on general questions or issues\\nGet in touch with us to give us feedback on docs or challenges they face\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557418500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"973454c3-f13c-42b7-ad0b-94b5a1299159\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"f5b93bdc-a220-480d-9ba8-94d0586e9f38\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"006f91da-9ea2-45f5-a205-94d894406139\",\"code\":\"\",\"title\":\"Android Auto\",\"description\":\"Do you have questions about developing your app for the car? Come meet the team and learn more about how you can use tools such as Android Studio and the emulator to port your app to the car.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557351900000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"aca4155b-425a-44f2-9ed2-950af6fd3c42\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"181cb450-dab1-413d-b3ce-952fbdade7b4\",\"code\":\"\",\"title\":\"Cloud Security\",\"description\":\"TBD\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557353700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"3b817079-b36e-4925-baec-956e2244fe5b\",\"code\":\"\",\"title\":\"Understanding the role of voice in your app for emerging markets\",\"description\":\"As our apps grow their footprint globally, voice technology can be an enabler in bridging comprehension and literacy gaps. Learn how to effectively integrate voice into your product experience to better serve the needs of your users.\\nObjective: To enable developers to have stronger voice stories for their products.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557272700000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"c3a0f140-f6e8-4f5a-9ec3-95707e70c371\",\"code\":\"\",\"title\":\"Updates to Storage in Android Q\",\"description\":\"Android offers many different ways to save, retrieve and share data. Android Q changes attempts to better structure file system interactions for the shared storage space to make applications more secure, maintainable and healthy. Come to learn how to make your application ready for Android Q Storage updates.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557333900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"4669abc7-d557-479e-9538-9593b395d5e9\",\"code\":\"\",\"title\":\"Android Security office hours\",\"description\":\"Do you have questions about Android Security? Come meet the team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557339300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"efc7dc9e-ae33-4a49-ba43-95fed5411700\",\"code\":\"\",\"title\":\"Android C++ / NDK Office hours \",\"description\":\"For developers using C++ on Android, the Android NDK is a toolset that lets you implement parts of your app using native-code languages. This can help you reuse libraries written in those languages, and can improve performance for critical situations like games. During this Office hour, engineers will be able to discuss technical questions on using C++, the NDK toolset, and developing native in Android Studio. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557332100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"844a5c70-78c6-4069-a542-961b5b4d1071\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"6cbba58d-43b9-4bc6-9dad-962a84845cc5\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"cff91aae-4c17-4b34-921b-967a168b6e02\",\"code\":\"\",\"title\":\"Kotlin for Android Office Hours\",\"description\":\"Have questions about using Kotlin in your Android app?  Stop by and learn about the latest best practices, including Kotlin coroutines!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557274500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"dddd1691-9404-491f-a74f-96a23e0ed6ef\",\"code\":\"\",\"title\":\"Office Hours with the AMP Story Team\",\"description\":\"Have questions about how to get started building fast, visually engaging AMP Stories? Wondering about the UX best practices for this new web format? Or need some tips on how to improve your Story's appearance in Google Search? Attend the AMP Story Office Hours to discuss these questions and more with the people who created the format.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557279900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"10eab3a7-f86b-43c9-8f55-978566afa259\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"6645d49b-bb84-49c0-bfe8-9786eca149c2\",\"code\":\"\",\"title\":\"Smart Home Office Hours\",\"description\":\"Come talk to Smart Home experts about integrating your device with Google Assistant. If you have questions about how to best leverage Smart Home types and traits to describe your device and what it does, we'd love to talk to you. Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557274500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"49f61fa8-e96c-42b7-8b9c-97ab03893c3a\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"660f8444-e173-43e6-8408-98035f0a58e5\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"4cdd868d-f113-4d27-a52e-980ec8a3e694\",\"code\":\"\",\"title\":\"Gaming and graphics on Chrome OS Office Hours\",\"description\":\"Get time 1-1 with the Chrome OS games & graphics team to solve game technical & design issues\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557436500000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"2234d405-1d05-45e7-aa14-9850d28aace8\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"b644e05b-9168-4fcf-a797-993fb48e9e5d\",\"code\":\"\",\"title\":\"Gaming and graphics on Chrome OS Office Hours\",\"description\":\"Get time 1-1 with the Chrome OS games & graphics team to solve game technical & design issues\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557351900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"d241325f-c2d1-46bd-b0b4-99b48f4c5ead\",\"code\":\"\",\"title\":\"Web & Search office hours\",\"description\":\"Similar to the Google Webmaster Office Hours it would be nice to do an in-person office hours session at I/O so people can\\nAsk follow-up questions for the sessions on technical SEO\\nGet feedback on general questions or issues\\nGet in touch with us to give us feedback on docs or challenges they face\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557416700000,\"endTimestamp\":1557417600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"96916197-1175-4744-be6e-99d4d5a65873\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"ac2ab49e-fd1e-4880-9cb2-9a23ff25057c\",\"code\":\"\",\"title\":\"Thermal design and consideration for Android app\",\"description\":\"Android Q has added a new thermal API which will allow developer to design apps cooperated better with thermal management\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557432900000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"4379d960-9f6b-4fa6-aba6-9a3b661226af\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"103dfb09-1802-470f-ae9d-9a775cb2769b\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"cf210031-7e56-4221-9d09-9a7ae299c7be\",\"code\":\"\",\"title\":\"Play Instant Games Office Hours\",\"description\":\"Office hours to help developers 1:1 to build out their Instant Games. This includes developers at all stages of development; from those who may have considered building an instant game and want to learn more, to those who already have an instant game in Play and would like to hear about next steps to make the experience even better.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557423900000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"e9d865db-404b-4f2b-b3d9-9ad98119d8ae\",\"code\":\"\",\"title\":\"Dynamic AMP emails\",\"description\":\"Come join us to talk about AMP for email, a new innovation that allows email senders to create emails that deliver real time information and allows consumers to take interactive actions. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557279900000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"7ff30cb2-0e6b-4bbd-8519-9adfb179f45a\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"abd64949-e9f3-421f-89d9-9ae17800f3cc\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"56297f72-6f7d-4628-9227-9b97e1d86de4\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557269100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"1cecf212-4e09-4961-baa9-9b99180cf6f2\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"33f0bbc1-2699-41ca-9f7c-9bdad2d5a7d3\",\"code\":\"\",\"title\":\"Website UX review\",\"description\":\"Get a UX review of your website from Google developers and UX experts and find opportunities for improvement.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557333900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"0ce659a1-01db-410b-9953-9bf4bad3e22f\",\"code\":\"\",\"title\":\"Location, Activity Recognition, and Awareness Office Hours\",\"description\":\"This team owns location services on Android and in Google Play Services, such as the FusedLocationProvider API. This team also owns the activity recognition APIs and Awareness APIs. Come with all your questions on the new location permission in Q, how to use these APIs, best practices, and how to optimize your apps! \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557418500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"cff6c7f5-fe74-4e4b-923f-9c1c0bbad41b\",\"code\":\"\",\"title\":\"Optimize Your Image Search Results\",\"description\":\"Get 1:1 guidance to optimize images on your sites for visual searching and learn how to monitor traffic metrics.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557276300000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"b5fd1c17-aaa9-4cb0-956c-9ca7db67bced\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"d10fa82a-783f-483e-897d-9ca84d57d2eb\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"21932dbc-8b2f-4348-906d-9cbe255670c7\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557341100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"fc4ab51f-923b-47ed-a075-9d0f53d01f4a\",\"code\":\"\",\"title\":\"Chrome OS Web Office Hours\",\"description\":\"Visit with the Chrome OS Web team to discuss Chrome OS Web app design and technical issues and learn how you can give your users the best experience possible on Chrome OS.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557348300000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"c9cc4b58-ef2a-48be-b364-9d50da55186c\",\"code\":\"\",\"title\":\"Android Activities & Windows Office Hour \",\"description\":\"Have questions about Android WindowManager and ActivityManager? Want to get additional details on some of the features we are introducing in Q? Come chat with members of the Android Windows and Activity team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557267300000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"c899fc43-1080-456e-8236-9d5a4adf4e59\",\"code\":\"\",\"title\":\"Firebase Test Lab, Performance Monitoring, and Crashlytics office hours\",\"description\":\"The Firebase team will be on hand to answer your questions about Test Lab, Performance Monitoring, and Crashlytics, and to listen to your concerns.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557359100000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"5f82a910-8312-4512-b998-9d75feea9cf0\",\"code\":\"\",\"title\":\"Non-SDK (hidden) API usage and Android app compatibility\",\"description\":\"Android is gradually restricting the use of non-SDK interfaces, whether directly, via reflection, or via JNI. As we bump up the restrictions of the blacklist and greylist in Q, come learn how to keep your app compatible between releases, and talk with the team about public alternatives and how to detect usage in your app. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557332100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"a3cb7bc0-e7b9-431e-b2d8-9d789bdddc58\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"3fe7e7f5-9e2f-4f37-8eff-9dba91d2f6c2\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"9b1a1dd3-ee72-4196-a8a2-9e16f937a430\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"dfe4ac62-f33c-49fb-8003-9ef46da9a263\",\"code\":\"\",\"title\":\"UX Research Office Hours\",\"description\":\"Come ask about methods Google researchers use to inform product direction, evaluate design docs, mocks, and PRDs, and report back on launched features. You can also learn about the value user-centered thinking and research can bring to your teams.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557269100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"b61b676e-ae01-4170-9668-9f62b2b44638\",\"code\":\"\",\"title\":\"Review my site! Tools & checks to improve performance, accessibility & UX\",\"description\":\"Get a review of your website from Google developers and UX experts. Find opportunities for improvement in terms of performance, UI/UX and accessibility.\\n\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557427500000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"b70a92ea-75ce-4bc5-9b4c-a0015cc6929c\",\"code\":\"\",\"title\":\"Design and research for NBU\",\"description\":\"Demos, app review, design critique and research tips for developers working with NBU markets.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"type_officehours\"],\"startTimestamp\":1557339300000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"73f1aeb2-f954-4784-83f6-a00a760425cc\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"0e16070d-ee8e-4175-9970-a10d83cf8f0a\",\"code\":\"\",\"title\":\"Android Camera (CameraX + Camera2)\",\"description\":\"Do you use Android Camera now or plan to? It's hard right? Ask us anything from the new CameraX framework to leveraging multi-camera setup on Android devices.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557423900000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"4fe0868a-8ce4-46d6-bcdd-a11c838857d7\",\"code\":\"\",\"title\":\"For everyone, everywhere: accessibility & the next billion users\",\"description\":\"Grow your user base and increase staying power of your product by starting early with accessibility. Experience firsthand how building for the 1+ billion people around the world with disabilities is not just the right thing to do, but also good for your business. Regardless of the size of your company, you  can achieve great accessibility standards by following simple rules & practices. Experts from the Next Billion Users team will help make your app more accessible for everyone, everywhere.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"type_officehours\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557342900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"c72c2f59-e4f8-4ba4-9671-a155890d8116\",\"code\":\"\",\"title\":\"Google Assistant Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557272700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"7a3af324-d4dc-4e00-86dc-a1c6ddea8801\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557442800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"0b816cf3-c018-4182-93b6-a2119134522e\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"f8f5b903-fd8b-4194-ada9-a234a9022cb5\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"f5c17578-d04d-4957-9ee1-a2da7c28f94d\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"02fdb662-fafc-4622-88cf-a3b3965f57ec\",\"code\":\"\",\"title\":\"Latin American Developer Community Leads Meetup\",\"description\":\"Discussion between community leads, Googlers and developers about what we can do together to grow, empower, and highlight developer communities in LatAm.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557336000000,\"endTimestamp\":1557337800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"d63ddf84-9563-4366-88bc-a3bfa3ecf954\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"2838a5f7-2248-4d5e-98d0-a3d2df253ef4\",\"code\":\"\",\"title\":\"Android Security office hours\",\"description\":\"Do you have questions about Android Security? Come meet the team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557265500000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"06e8f87f-0dff-4fb2-816a-a40fabbad987\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"d96d6df6-3fe9-4846-8030-a450860cf4c9\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"a6adae82-f029-45a5-b393-a46001e8f3ad\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"a1a86b71-b402-4be0-805f-a4e567c08081\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557351900000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"995400a1-2580-4fda-974a-a4f8188d8c91\",\"code\":\"\",\"title\":\"GIFs and More: Integrating Expression Search in Your App\",\"description\":\"Come chat with the Tenor team about how to use the Tenor GIF Search API to deliver a powerful expression experience in your app\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557355500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"b31d9b49-4fb8-41e3-a8e5-a61b26d980b4\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"e27efc30-86e0-47fa-a4bb-a650b49655d8\",\"code\":\"\",\"title\":\"Google Assistant Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557348300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"fc0d531b-8b3c-4d37-9bcc-a65853413577\",\"code\":\"\",\"title\":\"Chrome OS Enterprise/Education Office Hours\",\"description\":\"Get 1-1 time with Chrome OS Enterprise/Education specialists who can help you solve specific technical issues and answer any questions you may have. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557364500000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"952f810c-fa20-4c13-ab94-a65bf651409d\",\"code\":\"\",\"title\":\"G Suite Developer Office Hours\",\"description\":\"Meet with G Suite Developer experts and ask questions about Apps Script, App Maker, and APIs. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557270900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"f0486e3d-426b-41f7-8293-a6b2ccbf30ce\",\"code\":\"\",\"title\":\"Review my site! Tools & checks to improve performance, accessibility & UX\",\"description\":\"Get a review of your website from Google developers and UX experts. Find opportunities for improvement in terms of performance, UI/UX and accessibility.\\n\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557429300000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"e0423a10-7cf6-4610-a475-a6c83c5e5915\",\"code\":\"\",\"title\":\"Google Assistant Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557350100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"be46347e-9eb4-410a-bd60-a6d58d1ce67a\",\"code\":\"\",\"title\":\"Smart Home Office Hours\",\"description\":\"Come talk to Smart Home experts about integrating your device with Google Assistant. If you have questions about how to best leverage Smart Home types and traits to describe your device and what it does, we'd love to talk to you. Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557355500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"6d80b933-cab3-470b-ba64-a6e56b7bfa8f\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"a6cdea68-6ebc-437b-8c9c-a6e759a6af4a\",\"code\":\"\",\"title\":\"Android Authentication & Autofill \",\"description\":\"Developers will be able to ask questions related to Android authentication and identity, app sign-in (Google Sign-in vs. SmartLock for passwords vs. Autofill), SMS OTP autofill using SMS Retriever and the new SMS User Consent APIs, and Autofill Framework/Autofill with Google. These Office Hours can provide insight into the different sign-in options available to developers, as well as best practices. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557267300000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"b407d700-862b-403d-b4fe-a6fb899cf297\",\"code\":\"\",\"title\":\"ARCore office hours\",\"description\":\"Ask the AR team everything you want to know about ARCore and AR viewer for web.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557346500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"6eaf067e-646b-4e1c-932d-a79757658496\",\"code\":\"\",\"title\":\"Google Assistant Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557270900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"cf67a61e-0aee-4d42-a527-a8034b8a4138\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"c7be133f-0434-4343-9b00-a824d8f045d3\",\"code\":\"\",\"title\":\"Android Auto\",\"description\":\"Do you have questions about developing your app for the car? Come meet the team and learn more about how you can use tools such as Android Studio and the emulator to port your app to the car.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557427500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"cdd1a4f0-872f-47ce-8bb5-a82bbc6f479b\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"e503f481-b77d-48d6-bbd6-a83d807f7b88\",\"code\":\"\",\"title\":\"Office Hours w/ the Google Maps Platform Team\",\"description\":\"The Google Maps Platform team will be on-hand to answer questions and chat about all your questions/concerns. Members of the developer relations, eng, and support teams from Maps, Routes, and Places will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_location/maps\",\"type_officehours\"],\"startTimestamp\":1557432900000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"32880f60-822b-44b7-bb11-a87af1de3b0e\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557367200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"55f4c4da-cfd7-4847-9f65-a8f6fd585b85\",\"code\":\"\",\"title\":\"Chrome OS Web Office Hours\",\"description\":\"Visit with the Chrome OS Web team to discuss Chrome OS Web app design and technical issues and learn how you can give your users the best experience possible on Chrome OS.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557348300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"37d846b4-cf07-4384-a79a-a8f8d0b09f05\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"76f94d36-6a7c-4d38-ae19-a99543cb4bc9\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"53c682a2-6b75-4017-8a5e-a9ccc531233b\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"f2a89501-fdc3-4776-96ce-a9d36bff6101\",\"code\":\"\",\"title\":\"Material Design Components: Web/iOS/Flutter Office Hours\",\"description\":\"Have questions about creating a reliable development workflow? Want help integrating Material Design Components (MDC) into your Flutter, iOS, or web product? Come chat with cross-platform experts on Material Design and MDC.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557265500000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"42dad4fd-9a26-4dac-9dac-a9d6b6fa6ed3\",\"code\":\"\",\"title\":\"Sign-In/Up on the Web\",\"description\":\"Ask us questions about FIDO, WebAuthn, other general identity management as well as reCAPTCHA!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557346500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"0be094ac-3624-40d3-ba30-aa35a65d908b\",\"code\":\"\",\"title\":\"Google Pay\",\"description\":\"Come join us to talk about Google Pay and how to leverage its APIs to improve the payment experience in sites, applications and other elements in the ecosystem such as tickets and passes, loyalty programs and discounts.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_payments\",\"type_officehours\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557263700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"8c7cde6d-ce7e-4993-a326-aa4a8c78e101\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"43934c69-4bc0-41cc-b7d2-aa5c2056c19b\",\"code\":\"\",\"title\":\"Chrome OS Enterprise/Education Office Hours\",\"description\":\"Get 1-1 time with Chrome OS Enterprise/Education specialists who can help you solve specific technical issues and answer any questions you may have. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557274500000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"e3866b59-ba9c-4b07-9580-aaa68ae8c92d\",\"code\":\"\",\"title\":\"Google Pay\",\"description\":\"Come join us to talk about Google Pay and how to leverage its APIs to improve the payment experience in sites, applications and other elements in the ecosystem such as tickets and passes, loyalty programs and discounts.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_payments\",\"type_officehours\"],\"startTimestamp\":1557263700000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"bf85e80b-52f8-4672-9176-aae117bdd85e\",\"code\":\"\",\"title\":\"Firebase Authentication office hours\",\"description\":\"Meet the Firebase team to ask them your Firebase Authentication question, or to express your concerns about the product.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557344700000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"046b424d-dca5-4f0a-8180-aaf3cdd105e1\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"37804665-384f-45d5-8745-ab0c825d31dc\",\"code\":\"\",\"title\":\"Cloud Security\",\"description\":\"TBD\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557351900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"a3df67aa-5d9d-4b2d-b044-ab23159c84fe\",\"code\":\"\",\"title\":\"Thermal design and consideration for Android app\",\"description\":\"Android Q has added a new thermal API which will allow developer to design apps cooperated better with thermal management\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557431100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"e08c0541-6dfe-463f-850b-ac04781d415c\",\"code\":\"\",\"title\":\"Trusted Web Apps \",\"description\":\"Come join us to talk about Trusted Web Activities, a new way to display a full screen web content inside of an Android app with no browser UI. We'll have experts on hand to dive in to your questions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557344700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"6d0f7cf6-59cd-4fb8-a175-ac9efdbfc8fd\",\"code\":\"\",\"title\":\"Media Actions Office Hours\",\"description\":\"Bring your media to Search, Assistant, Android TV, and Play using Google Media Actions. Members of the engineering and product team will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557332100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"92856162-d0b9-4dfe-ba82-acb4d48ebe4b\",\"code\":\"\",\"title\":\"Chrome OS Android Office Hours\",\"description\":\"Visit with the Chrome OS Android/ARC++ team to discuss Android app design and technical issues and learn how you can give your users the best experience possible on Chrome OS.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557420300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"7fd1a4cd-c9cc-4e65-8eda-acbbe4c02029\",\"code\":\"\",\"title\":\"ExoPlayer office hours\",\"description\":\"Bring your questions about ExoPlayer, the open source media library for Android.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557278100000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"14bc016d-636c-42e8-8727-acf345fb7bbf\",\"code\":\"\",\"title\":\"Office Hours w/ the Google Maps Platform Team\",\"description\":\"The Google Maps Platform team will be on-hand to answer questions and chat about all your questions/concerns. Members of the developer relations, eng, and support teams from Maps, Routes, and Places will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_location/maps\",\"type_officehours\"],\"startTimestamp\":1557431100000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"bc6dd754-a7cf-4f2f-aa14-add5fa6c737d\",\"code\":\"\",\"title\":\"Web Assembly \",\"description\":\"Come join us to talk about Web Assembly, a tool that allows you to bring your C++ code base to the web, and brings more consistent performance to your applications. We'll have experts on hand to dive in to your questions. Walk-ins are welcome. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557333900000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"427f295b-e159-4ed5-b6bc-adff0e03ac77\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557431100000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"bdda45bb-9664-4ba0-a6ce-ae1fd7873635\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"74aad7b9-bf21-4287-829d-ae6ba58e4c30\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"f0da4edc-a5cb-45ad-b47c-aeba84ccdc97\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"3e4baf48-200f-42c2-bd0f-aebc34adc408\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"5943ba73-176b-4263-b722-af0ed1a3d0bf\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"10d1ea45-3dc5-471a-a91a-af4eedc7f599\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"92121e9e-a0b2-4459-b280-af958838afd2\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557367200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"2bdc8474-e90c-489f-a767-afdf3f5628dd\",\"code\":\"\",\"title\":\"Office Hours w/ the Google Maps Platform Team\",\"description\":\"The Google Maps Platform team will be on-hand to answer questions and chat about all your questions/concerns. Members of the developer relations, eng, and support teams from Maps, Routes, and Places will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_location/maps\",\"type_officehours\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557341100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"4a04be67-0c60-4194-9923-b080d3a9fc9e\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"cafa2507-2911-4d50-b7b4-b09c2c61d4e6\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557367200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"6181a157-8c25-4e07-b883-b0c0ef4a56b2\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"ddfec9f8-d701-40a6-a236-b0cc898be748\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"6e0393af-0146-4790-9b19-b0d21f8bac20\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"5f33013e-f2c1-4c23-9f1c-b16f7f1aa0c1\",\"code\":\"\",\"title\":\"R8  / shrinking app code\",\"description\":\"Come talk to the R8 team about shrinking your app code and proguard keep rules\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557339300000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"5bc075fa-2f18-4ca3-a7bd-b18833909212\",\"code\":\"\",\"title\":\"App Bundle and Dynamic Delivery Q&A\",\"description\":\"Enable developers to ask questions about App Bundle and Dynamic Delivery in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557362700000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"22d7956a-2165-4627-a0b8-b2b1f48d7017\",\"code\":\"\",\"title\":\"Android Security office hours\",\"description\":\"Do you have questions about Android Security? Come meet the team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557265500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"6e0af6c5-dcd0-4bbb-a62e-b2e014e8cc70\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"4caf7ba5-8f3c-4e49-9456-b303b8e5e9c1\",\"code\":\"\",\"title\":\"Dynamic AMP emails\",\"description\":\"Come join us to talk about AMP for email, a new innovation that allows email senders to create emails that deliver real time information and allows consumers to take interactive actions. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557418500000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"153bb518-ce23-4203-833d-b34503097b50\",\"code\":\"\",\"title\":\"Android Java Language Libraries\",\"description\":\"The Android Core Libraries team provides core libraries such as the ICU, Conscrypt, and java.*  libraries to Android developers who are using the Java or Kotlin programming languages. During this Office Hour, you'll have the opportunity to meet with the team and ask technical questions about core library performance, best practices, design patterns, and more. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557353700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"a4148f67-d7e3-48bf-9276-b38274c3aac1\",\"code\":\"\",\"title\":\"AndroidX Test Office Hours\",\"description\":\"The AndroidX Test team is responsible for all Android testing libraries and infrastructure such as Espresso, Runner, Rules, Robolectric, Android Test Orchestrator and test integration in Gradle, Bazel and Android Studio.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557270900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"15f3ff1f-8a06-4da2-9684-b39e85dbd9e7\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"5bb949bc-a117-41c0-a82b-b3ac4298a19e\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"e2d0436f-5074-4ae9-af9b-b3c5c5599f8d\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"076084d3-57ed-4589-986d-b4a8c8b83b53\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"6eac43bb-b272-4187-8f1c-b52936815756\",\"code\":\"\",\"title\":\"Android C++ / NDK Office hours \",\"description\":\"For developers using C++ on Android, the Android NDK is a toolset that lets you implement parts of your app using native-code languages. This can help you reuse libraries written in those languages, and can improve performance for critical situations like games. During this Office hour, engineers will be able to discuss technical questions on using C++, the NDK toolset, and developing native in Android Studio. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557332100000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"fde8dd2a-3a9d-4aaa-814f-b57a1ae2c7f2\",\"code\":\"\",\"title\":\"Google Photos APIs Office Hours\",\"description\":\"The Google Photos partner program and Library API launched at I/O last year to connect with your users, and upload and share content. Come meet the team and learn more about how to integrate your apps and services with Google Photos.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557440100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"7782bf9c-9f77-4c10-ba70-b57c941b1bd0\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"3b3f8a97-6bbf-44f4-8e2e-b5a9494298dc\",\"code\":\"\",\"title\":\"App Bundle and Dynamic Delivery Q&A\",\"description\":\"Enable developers to ask questions about App Bundle and Dynamic Delivery in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557364500000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"79648607-9585-4be0-883b-b5af4b207d8f\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"ff9c70ab-c676-4c1e-bf7a-b5eb6181418e\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557342900000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"90b9ace1-1c24-4efb-bb26-b5ffa3b13cdf\",\"code\":\"\",\"title\":\"ARCore office hours\",\"description\":\"Ask the AR team everything you want to know about ARCore and AR viewer for web.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557344700000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"88250bfa-7389-4f2c-b552-b63b6c7d8a93\",\"code\":\"\",\"title\":\"Play Store pre- and post-launch marketing Q&A\",\"description\":\"Enable developers to ask questions on how to market their apps in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557423900000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"c18bcf99-c03d-4565-bd55-b685acce70bb\",\"code\":\"\",\"title\":\"Thermal design and consideration for Android app\",\"description\":\"Android Q has added a new thermal API which will allow developer to design apps cooperated better with thermal management\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557432900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"b7ba02df-f76b-47f9-b176-b6c36ddcb4c6\",\"code\":\"\",\"title\":\"TensorFlow.js\",\"description\":\"Want to learn about machine learning in JavaScript? Want to see the power of TensorFlow.js for bringing machine learning into browser or using it server side with Node.js? Want to know how you can get started? Have cool ideas to share about your project with TensorFlow.js? Come and chat with the creators of TensorFlow.js.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557420300000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"ff2d9ea3-fe38-446b-b11e-b6e28b176032\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"49d74db2-29da-4b33-8fbf-b71107674ce5\",\"code\":\"\",\"title\":\"Google Photos APIs Office Hours\",\"description\":\"The Google Photos partner program and Library API launched at I/O last year to connect with your users, and upload and share content. Come meet the team and learn more about how to integrate your apps and services with Google Photos.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557335700000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"c1db303f-7714-44ea-b2b1-b81216c746f7\",\"code\":\"\",\"title\":\"Game development with Google Cloud\",\"description\":\"Meet the team behind the Google Cloud Gaming products such as Agones & OpenMatch and ask us anything.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557263700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"29686603-0d92-49de-86d0-b890e1c45d0e\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"4dac37d9-0112-4a85-8228-b8a06c89c7bc\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557341100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"7431c9ed-abb1-4bbe-875c-b8ad37820d9d\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"a7982eb5-e7a5-4495-adf9-b8ea7f570c7b\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"d4a252a4-b62b-4814-b4f2-b949de740de9\",\"code\":\"\",\"title\":\"App Bundle and Dynamic Delivery Q&A\",\"description\":\"Enable developers to ask questions about App Bundle and Dynamic Delivery in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557362700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"1881de31-a57d-4721-a230-b94f4f470bdf\",\"code\":\"\",\"title\":\"Website UX review\",\"description\":\"Get a UX review of your website from Google developers and UX experts and find opportunities for improvement.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557335700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"63fa8ae9-42e8-4e62-9a19-b9652a29f3f8\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"390783d9-3749-4605-97ed-b9e04b4fcd64\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557442800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"b2fa567c-da8d-4689-89e8-b9fb02bd64fe\",\"code\":\"\",\"title\":\"Google Pay\",\"description\":\"Come join us to talk about Google Pay and how to leverage its APIs to improve the payment experience in sites, applications and other elements in the ecosystem such as tickets and passes, loyalty programs and discounts.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_payments\",\"type_officehours\"],\"startTimestamp\":1557418500000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"6c0e1e7c-5455-4f9d-9280-ba2efade5443\",\"code\":\"\",\"title\":\"ARCore office hours\",\"description\":\"Ask the AR team everything you want to know about ARCore and AR viewer for web.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557278100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"e7f4cf9c-7ed1-403d-9f5f-ba5b6fff5820\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"ff655e53-e67b-4c37-ba50-ba8ee0f67781\",\"code\":\"\",\"title\":\"Cloud Security\",\"description\":\"TBD\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557353700000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"32376fa0-1890-45cd-a88e-bab6041611f5\",\"code\":\"\",\"title\":\"Google Photos APIs Office Hours\",\"description\":\"The Google Photos partner program and Library API launched at I/O last year to connect with your users, and upload and share content. Come meet the team and learn more about how to integrate your apps and services with Google Photos.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557438300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"59d31d53-b56a-4a96-b76e-bae105982364\",\"code\":\"\",\"title\":\"Android Privacy\",\"description\":\"Office hours to answer questions about all Android Privacy related features. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557278100000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"28cfaf8c-809d-435f-b737-bae2c8629c74\",\"code\":\"\",\"title\":\"Android Java Language Libraries\",\"description\":\"The Android Core Libraries team provides core libraries such as the ICU, Conscrypt, and java.*  libraries to Android developers who are using the Java or Kotlin programming languages. During this Office Hour, you'll have the opportunity to meet with the team and ask technical questions about core library performance, best practices, design patterns, and more. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557351900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"7b083578-dcbc-43cc-8f18-bb691fbf7f13\",\"code\":\"\",\"title\":\"Firebase Remote Config and A/B Testing office hours\",\"description\":\"The Firebase team will be available to answer questions & get your feedback about Remote Config and A/B Testing.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557362700000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"403775a8-c849-4764-8468-bbaa8475ac60\",\"code\":\"\",\"title\":\"TensorFlow.js\",\"description\":\"Want to learn about machine learning in JavaScript? Want to see the power of TensorFlow.js for bringing machine learning into browser or using it server side with Node.js? Want to know how you can get started? Have cool ideas to share about your project with TensorFlow.js? Come and chat with the creators of TensorFlow.js.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557422100000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"4a85072d-7a00-49c9-9e07-bcc72e0adf43\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"f447b3ff-b5a2-4793-a9ea-bcc81b73b0c2\",\"code\":\"\",\"title\":\"G Suite Developer Office Hours\",\"description\":\"Meet with G Suite Developer experts and ask questions about Apps Script, App Maker, and APIs. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557431100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"4a7d19f8-0779-44f2-a648-bd1e558cc870\",\"code\":\"\",\"title\":\"Firebase Predictions, Dynamic Links and In-app Messaging office hours\",\"description\":\"The Firebase team will be available to answer questions, and to listen to your concerns and feedback about Firebase Predictions, Dynamic Links and In-app Messaging.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557263700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"c35d8b0d-b54e-4df1-84d9-bd1f820f6f86\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"d7efe874-a943-4acb-968c-bd3ac6bed14a\",\"code\":\"\",\"title\":\"French speaking community gathering\",\"description\":\"Meet other French speaking I/O attendees to know what is happening in the developer community, to mingle, and take a group picture.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557364200000,\"endTimestamp\":1557366000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"19fc8ef2-3cf7-4823-893f-bdc3bcf88fae\",\"code\":\"\",\"title\":\"Android Authentication & Autofill \",\"description\":\"Developers will be able to ask questions related to Android authentication and identity, app sign-in (Google Sign-in vs. SmartLock for passwords vs. Autofill), SMS OTP autofill using SMS Retriever and the new SMS User Consent APIs, and Autofill Framework/Autofill with Google. These Office Hours can provide insight into the different sign-in options available to developers, as well as best practices. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557269100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"8b053c6c-db2b-4135-97d5-bdf99867ff36\",\"code\":\"\",\"title\":\"Android Auto\",\"description\":\"Do you have questions about developing your app for the car? Come meet the team and learn more about how you can use tools such as Android Studio and the emulator to port your app to the car.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557353700000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"cb10c346-f03c-4b04-ae4e-be8fdb9ca3c2\",\"code\":\"\",\"title\":\"Android Runtime (ART) Office hours\",\"description\":\"Android Runtime (ART) employs high-performance compiler and garbage collection technology to provide the best runtime and memory usage experience for your Android applications. During this Office Hour, engineers will be available to discuss new developments in ART and help you understand and address performance and memory issues.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557359100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"5b170d93-0b72-4fce-8646-bebbfdcf9afe\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"68a832ef-1051-4641-8b6b-beeecc1ad95a\",\"code\":\"\",\"title\":\"Camera office hours\",\"description\":\"Spend 1:1 time with camera framework and CameraX engineers. Get camera support on your existing app or a new one that you are planning to launch.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557364500000,\"endTimestamp\":1557365400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"fee57c28-1a9c-4a25-97da-bef52a8a9005\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"4215e2f3-6961-4a68-8cbb-bf5dfac1c71f\",\"code\":\"\",\"title\":\"Cloud Data and ML Office Hours\",\"description\":\"Have questions about how the cloud can help infuse your apps with machiine learning?  Come chat with experts and hear about the various cloud AI options available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557333900000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"35f5d6b2-e107-47cf-84fa-bf8d73698e3c\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"0622cf45-7df8-4f35-a4cf-bfce8b0c5558\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557367200000,\"endTimestamp\":1557369000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"bdce6b9c-58df-44a2-9d06-bff39e46284a\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"af78d3fc-4b25-4824-b784-c0610280ca23\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"b40468bf-1f86-44d6-b965-c06a401e809d\",\"code\":\"\",\"title\":\"Android Security office hours\",\"description\":\"Do you have questions about Android Security? Come meet the team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557263700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"212e3292-a185-4983-ab29-c087f54c68ba\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"16844a4f-0fd9-4cab-b4fc-c0e2124e00de\",\"code\":\"\",\"title\":\"Google Cast Office Hours\",\"description\":\"Do you have a question about Google Cast?  Are you curious about coding for Google Home Hub and Smart Displays?  Do you have ideas you'd like to brainstorm with a member of the Google Cast Team?  Google Cast office hours are a great opportunity to meet 1on1 with members of the Google Cast team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557420300000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"83d8e1e5-a8d4-424d-bbea-c18a9922dc73\",\"code\":\"\",\"title\":\"Kotlin for Cloud Office Hours\",\"description\":\"Office hours to help developers learn more about using Kotlin for backend, running Kotlin backends in cloud, and also general help to better understand/utilize Google Cloud Platform.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557267300000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"d026b69c-8740-42f3-8a2b-c1936b8238b9\",\"code\":\"\",\"title\":\"Android Privacy\",\"description\":\"Office hours to answer questions about all Android Privacy related features. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557278100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"da49fcc2-825c-4c08-927f-c1cda17c3dc6\",\"code\":\"\",\"title\":\"E-commerce site clinic Office Hours\",\"description\":\"\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557342900000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"35b08964-88aa-4073-a1cb-c1d33c25665c\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557279000000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"6fe2efb2-0a9f-4f33-a7a8-c2261b199886\",\"code\":\"\",\"title\":\"Android Enterprise & Security Office Hours\",\"description\":\"Come learn how to build better apps for the enterprise. For ISVs, this is very important because your app could break if it's not handling all the nuance of the work profile.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557440100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"4ac25512-4833-4e00-88d1-c25107561636\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"e5fe15d1-8af8-422f-958b-c29cab752033\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"8898e376-e401-4e28-8ace-c2b13317c261\",\"code\":\"\",\"title\":\"Office Hours w/ the Google Maps Platform Team\",\"description\":\"The Google Maps Platform team will be on-hand to answer questions and chat about all your questions/concerns. Members of the developer relations, eng, and support teams from Maps, Routes, and Places will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_location/maps\",\"type_officehours\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557432900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"45ab2916-405e-4065-9d23-c2c3319fbf3f\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"e5da83c7-a702-4b22-902c-c36522ed08a1\",\"code\":\"\",\"title\":\"Local Execution for Smart Home Office Hours\",\"description\":\"Interested in chatting with the team about the new Local Execution for Smart Home SDK? Looking for advice to help you get started? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Local Execution for Smart Home Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557422100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"4558a7d6-b39b-4fa8-87ec-c366f1c4ca9e\",\"code\":\"\",\"title\":\"Local Execution for Smart Home Office Hours\",\"description\":\"Interested in chatting with the team about the new Local Execution for Smart Home SDK? Looking for advice to help you get started? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Local Execution for Smart Home Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557420300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"5aa1c598-0444-4065-b120-c3906228f413\",\"code\":\"\",\"title\":\"Google Cast Office Hours\",\"description\":\"Do you have a question about Google Cast?  Are you curious about coding for Google Home Hub and Smart Displays?  Do you have ideas you'd like to brainstorm with a member of the Google Cast Team?  Google Cast office hours are a great opportunity to meet 1on1 with members of the Google Cast team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557422100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"7d454f49-2877-4ef4-8c63-c4060eb9b6c0\",\"code\":\"\",\"title\":\"Chrome OS Enterprise/Education Office Hours\",\"description\":\"Get 1-1 time with Chrome OS Enterprise/Education specialists who can help you solve specific technical issues and answer any questions you may have. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557276300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"316f3262-67a8-4dfc-a737-c4419802de5e\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"8bc00a45-a8ca-4842-8c78-c4cf4bfa78ac\",\"code\":\"\",\"title\":\"Leads of meetup communities: working together and with Google\",\"description\":\"Meet the leaders of the Google community outreach initiatives to share your feedback about your needs as a community lead and discuss together how Google can help.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"a0f215a5-574a-4c6e-b538-c523c3fcdd5b\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"d5548d14-36c4-483b-bad7-c54193b29560\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"2271e2eb-d883-41c5-ad2f-c5a16b54eb3c\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"b30b09e9-832a-4430-968e-c6eefaedee97\",\"code\":\"\",\"title\":\"ARCore office hours\",\"description\":\"Ask the AR team everything you want to know about ARCore and AR viewer for web.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557344700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"9bd096c5-818a-4a01-9cbc-c6f7487f0ea8\",\"code\":\"\",\"title\":\"Design and research for NBU\",\"description\":\"Demos, app review, design critique and research tips for developers working with NBU markets.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"type_officehours\"],\"startTimestamp\":1557337500000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"5735b6c2-7acc-4b0b-83e1-c7034a92e186\",\"code\":\"\",\"title\":\"Google Programs for Higher Education\",\"description\":\"After talking to Googlers at the Higher Ed office hours, developers (faculty and students) will have a better idea how they can use Google products (especially Google Cloud) in their teaching and research.  They'll know how to apply for grants, prepare for careers in a cloud-first world, and have a good idea of the resources available.\\n\\nThose developers who already are using Google in Higher Ed will have an opportunity to ask specific questions and give feedback to the team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557350100000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"3d3fb0c6-42be-4e1b-a1ab-c7517b314994\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"1b80f545-faaa-4f09-90b4-c79350a40d02\",\"code\":\"\",\"title\":\"TensorFlow.js\",\"description\":\"Want to learn about machine learning in JavaScript? Want to see the power of TensorFlow.js for bringing machine learning into browser or using it server side with Node.js? Want to know how you can get started? Have cool ideas to share about your project with TensorFlow.js? Come and chat with the creators of TensorFlow.js.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557420300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"fe994327-a663-472a-a144-c7ddcbcc68e3\",\"code\":\"\",\"title\":\"Loading performance clinic\",\"description\":\"Come to talk about your loading performance issues, deep-dive into them and their causes and get a better understanding of current and future platform capabilities that will help them solve them.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557438300000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"3da6309e-5c5f-4913-bccb-c8063557b5cf\",\"code\":\"\",\"title\":\"Android Enterprise & Security Office Hours\",\"description\":\"Come learn how to build better apps for the enterprise. For ISVs, this is very important because your app could break if it's not handling all the nuance of the work profile.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557440100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"3e3a42ad-cb81-4fc3-8f33-c83b5f441ed9\",\"code\":\"\",\"title\":\"Web components\",\"description\":\"Building a design system for your org? Or reusing components across multiple web apps and frameworks? Talk to the Web Components team about how large enterprises and Google products like YouTube and Material Design are approaching these challenges.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557416700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"1427dc51-6002-4af4-ab12-c84f963fb8ed\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"5b168b3d-3cd0-459f-a58e-c89a773d70e2\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"28ac29c9-56c4-43f6-8cbe-c91aa80bef02\",\"code\":\"\",\"title\":\"TensorFlow 2.0\",\"description\":\"Curious about what new features are offered in TensorFlow 2.0? Interested in upgrading your models from TensorFlow 1.x to TF 2.0? Ideas about additional functionality for the API, or questions about how to get involved? You're in luck! We'll have a member of the TensorFlow engineering team on-site.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557348300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"0c700113-38aa-4870-b446-c98ef17a2809\",\"code\":\"\",\"title\":\"Understanding the role of voice in your app for emerging markets\",\"description\":\"As our apps grow their footprint globally, voice technology can be an enabler in bridging comprehension and literacy gaps. Learn how to effectively integrate voice into your product experience to better serve the needs of your users.\\nObjective: To enable developers to have stronger voice stories for their products.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557271800000,\"endTimestamp\":1557272700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"3d4d1934-d042-4087-a0fd-c9ac719a4edf\",\"code\":\"\",\"title\":\"Android Activities & Windows Office Hour \",\"description\":\"Have questions about Android WindowManager and ActivityManager? Want to get additional details on some of the features we are introducing in Q? Come chat with members of the Android Windows and Activity team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557269100000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"6c6fa577-231c-4913-beb9-c9ae558ed968\",\"code\":\"\",\"title\":\"Dynamic AMP emails\",\"description\":\"Come join us to talk about AMP for email, a new innovation that allows email senders to create emails that deliver real time information and allows consumers to take interactive actions. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557416700000,\"endTimestamp\":1557417600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"ab3a165d-62d5-4774-9c9a-c9ce5905d012\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557429300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"6e79c028-172c-441f-a72c-ca19657fac7b\",\"code\":\"\",\"title\":\"Smart Home Office Hours\",\"description\":\"Come talk to Smart Home experts about integrating your device with Google Assistant. If you have questions about how to best leverage Smart Home types and traits to describe your device and what it does, we'd love to talk to you. Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557274500000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"8b018091-880f-4b23-b413-ca22f8f8a8fe\",\"code\":\"\",\"title\":\"Progressive Web Apps Office Hours\",\"description\":\"Come join us to talk about Progressive Web Apps, a way to develop and deploy apps via the web for both desktop and mobile. Bring your hard questions, we'll have experts on hand to dive into anything you want to know.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557434700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"2ba5017f-3856-4429-9db7-ca36e6169901\",\"code\":\"\",\"title\":\"Cloud Data and ML Office Hours\",\"description\":\"Have questions about how the cloud can help infuse your apps with machiine learning?  Come chat with experts and hear about the various cloud AI options available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557335700000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"928f2739-b0ab-451c-8019-cad76fb0d3d8\",\"code\":\"\",\"title\":\"Google Programs for Higher Education\",\"description\":\"After talking to Googlers at the Higher Ed office hours, developers (faculty and students) will have a better idea how they can use Google products (especially Google Cloud) in their teaching and research.  They'll know how to apply for grants, prepare for careers in a cloud-first world, and have a good idea of the resources available.\\n\\nThose developers who already are using Google in Higher Ed will have an opportunity to ask specific questions and give feedback to the team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557436500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"a187a312-130c-4515-bdf1-caf2e950b420\",\"code\":\"\",\"title\":\"Google Assistant Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557272700000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"eff9a82d-81d2-4223-9a9f-cb3ad835f09d\",\"code\":\"\",\"title\":\"Updates to Storage in Android Q\",\"description\":\"Android offers many different ways to save, retrieve and share data. Android Q changes attempts to better structure file system interactions for the shared storage space to make applications more secure, maintainable and healthy. Come to learn how to make your application ready for Android Q Storage updates.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557434700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"b55a2e2f-56d1-4ee6-9976-cbd2544c549a\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"6689e43d-3f96-446c-8e66-cbefa3d11fa3\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"76c533fe-e699-471b-8f7f-cbfd4f9ccaba\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"65a843da-28d3-4d89-b573-ccd6e1918627\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"ee7c6597-426c-4840-959e-cd663a033b72\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"9b562edc-947d-46fb-a59d-cdb5185f9ad2\",\"code\":\"\",\"title\":\"Google Developer Experts\",\"description\":\"Meetup of Googlers, GDEs and developers interested in the program on to share mentoring, and workshop best practices, plus learning how to become a tech-mentor.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"c472e024-ef0a-48ba-9bd1-cdbde706430f\",\"code\":\"\",\"title\":\"Android Enterprise & Security Office Hours\",\"description\":\"Come learn how to build better apps for the enterprise. For ISVs, this is very important because your app could break if it's not handling all the nuance of the work profile.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557438300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"807b59b5-f861-4442-978c-cdd57c103233\",\"code\":\"\",\"title\":\"Firebase Authentication office hours\",\"description\":\"Meet the Firebase team to ask them your Firebase Authentication question, or to express your concerns about the product.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557344700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"fbd46843-d4be-4a0a-b7c1-ce0269306447\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"fa093dc9-9296-4f18-9d12-ce59f47a28e5\",\"code\":\"\",\"title\":\"TensorFlow Extended (TFX)\",\"description\":\"Want to know more about Tensorflow Extended, the scalable end-to-end ML platform that Google uses to train TensorFlow models ?  Join us to learn more about TFX and our plans to make more of it available to you.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557432900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"63e111a4-ad5b-4e3d-8f8d-cebb23576cae\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557351900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"4f0567cb-2c9e-4b50-9297-cf1cf0d2b196\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"b906d00e-ab14-4b1f-a403-cf369b67d535\",\"code\":\"\",\"title\":\"Location, Activity Recognition, and Awareness Office Hours\",\"description\":\"This team owns location services on Android and in Google Play Services, such as the FusedLocationProvider API. This team also owns the activity recognition APIs and Awareness APIs. Come with all your questions on the new location permission in Q, how to use these APIs, best practices, and how to optimize your apps! \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557416700000,\"endTimestamp\":1557417600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"d52d5f43-6ada-40d3-97c0-cf4063d49229\",\"code\":\"\",\"title\":\"Play Instant Apps Office Hours\",\"description\":\"Office hours to help developers 1:1 to build out their Instant Apps. This includes developers at all stages of development; from those who may have considered building an instant app and want to learn more, to those who already have an instant app in Play and would like to hear about next steps to make the experience even better.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557270900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"c5c77c18-3967-4ea0-8454-cf43a3661930\",\"code\":\"\",\"title\":\"Google Programs for Higher Education\",\"description\":\"After talking to Googlers at the Higher Ed office hours, developers (faculty and students) will have a better idea how they can use Google products (especially Google Cloud) in their teaching and research.  They'll know how to apply for grants, prepare for careers in a cloud-first world, and have a good idea of the resources available.\\n\\nThose developers who already are using Google in Higher Ed will have an opportunity to ask specific questions and give feedback to the team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557434700000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"99627ca4-8c75-40af-8bbc-cf55dfa1ee97\",\"code\":\"\",\"title\":\"Firebase Cloud Messaging office hours\",\"description\":\"The Firebase team will be on hand to answer your questions about Cloud Messaging, and to listen to your concerns.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557330300000,\"endTimestamp\":1557331200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"9697ada6-85b7-466e-978f-cfa011fa3d64\",\"code\":\"\",\"title\":\"Android Privacy\",\"description\":\"Office hours to answer questions about all Android Privacy related features. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557279900000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"d9ed3e69-d7e8-414c-ac62-cfda50484bd7\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"5f788497-5186-4c2d-b9b9-d073aeeb08c1\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"ac38a83d-2d4c-4e2b-a576-d0d77a5a8274\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"11ae773d-e18f-4b90-a374-d1242a5e3ea1\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"74af393b-4996-49a9-b20b-d14d1f6c482d\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"1630a2f3-95d8-4324-ae69-d1636e684d26\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"4e621b93-3a60-4ad1-942d-d16b0bbfb1d3\",\"code\":\"\",\"title\":\"Dynamic AMP emails\",\"description\":\"Come join us to talk about AMP for email, a new innovation that allows email senders to create emails that deliver real time information and allows consumers to take interactive actions. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557416700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"8ed4263d-a821-4ab8-baf9-d25bd6b6ed89\",\"code\":\"\",\"title\":\"Android Security office hours\",\"description\":\"Do you have questions about Android Security? Come meet the team!\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557337500000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"69f5788a-96aa-4d18-9a14-d2bb9032a652\",\"code\":\"\",\"title\":\"Android Studio Build\",\"description\":\"Come talk to engineers on the Android Studio Build System team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557429300000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"8735b40c-0403-4b6e-a371-d31f62b18555\",\"code\":\"\",\"title\":\"Design and research for NBU\",\"description\":\"Demos, app review, design critique and research tips for developers working with NBU markets.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"type_officehours\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557337500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"a4d167b6-2505-40e5-a55e-d32a852683b4\",\"code\":\"\",\"title\":\"Media Actions Office Hours\",\"description\":\"Bring your media to Search, Assistant, Android TV, and Play using Google Media Actions. Members of the engineering and product team will be available.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557332100000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"412d2575-ac8a-4cfb-93da-d34cc8475035\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"c5a7d291-ac6a-4ef6-b4a0-d367326fe8c7\",\"code\":\"\",\"title\":\"Google Analytics, Data Studio, Reporting & Visualization Office Hours\",\"description\":\"Office hours for Google Analytics and Data Studio\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557359100000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"6b56776e-78dd-4bd9-88e3-d3c2245777e7\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"94ffa053-f117-44e8-9a61-d3df610c4537\",\"code\":\"\",\"title\":\"TPUs\",\"description\":\"Come and ask your questions about Google's Tensor Processing Units (TPUs)\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557436500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"7988e36a-ca90-4612-914d-d3fbc9a8adaf\",\"code\":\"\",\"title\":\"Game development with Google Cloud\",\"description\":\"Meet the team behind the Google Cloud Gaming products such as Agones & OpenMatch and ask us anything.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557333900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"fc6dc302-8419-42e3-af3a-d41120b6ffaa\",\"code\":\"\",\"title\":\"Google Pay\",\"description\":\"Come join us to talk about Google Pay and how to leverage its APIs to improve the payment experience in sites, applications and other elements in the ecosystem such as tickets and passes, loyalty programs and discounts.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_payments\",\"type_officehours\"],\"startTimestamp\":1557265500000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"1af93ff3-c0db-4fdb-bc6c-d4528d5247bb\",\"code\":\"\",\"title\":\"Android Auto\",\"description\":\"Do you have questions about developing your app for the car? Come meet the team and learn more about how you can use tools such as Android Studio and the emulator to port your app to the car.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557429300000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"616efd22-f29f-4959-abef-d494a6e67e44\",\"code\":\"\",\"title\":\"SEO for JS-based websites\",\"description\":\"Modern sites can be awesome, but also tricky to make visible through Search. Chat with us about your struggles, get advice on how to efficiently improve your site.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557357300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"cd458323-389a-4596-9f01-d5424645eeeb\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"8e2051ec-63e9-453a-a4f7-d55c11c16e5f\",\"code\":\"\",\"title\":\"Firebase Test Lab, Performance Monitoring, and Crashlytics office hours\",\"description\":\"The Firebase team will be on hand to answer your questions about Test Lab, Performance Monitoring, and Crashlytics, and to listen to your concerns.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557359100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"35f946b3-c0e6-4f8f-a385-d590ce918722\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"71e0534d-cca8-47db-bbdc-d59f2f8c0637\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"c353bd50-0d74-489c-8688-d65f6dd68d76\",\"code\":\"\",\"title\":\"Android Graphics\",\"description\":\"Developers will be able to ask their questions about displays, colorspaces, 3D, UI rendering and more, and get answers directly from the graphics team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557360900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"eb720990-0cf7-41b6-9cff-d6ac708b0ea3\",\"code\":\"\",\"title\":\"Android Studio Build\",\"description\":\"Come talk to engineers on the Android Studio Build System team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557429300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"f9161378-88d4-423b-9ae8-d71512e949a8\",\"code\":\"\",\"title\":\"Local Execution for Smart Home Office Hours\",\"description\":\"Interested in chatting with the team about the new Local Execution for Smart Home SDK? Looking for advice to help you get started? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Local Execution for Smart Home Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557422100000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"c56f922c-27f7-48fa-b595-d7bde6b3aee3\",\"code\":\"\",\"title\":\"Location, Activity Recognition, and Awareness Office Hours\",\"description\":\"This team owns location services on Android and in Google Play Services, such as the FusedLocationProvider API. This team also owns the activity recognition APIs and Awareness APIs. Come with all your questions on the new location permission in Q, how to use these APIs, best practices, and how to optimize your apps! \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557416700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"f73b41a8-b8ef-42bf-8081-d7e39ae1aa8d\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557442800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"63713313-9ebc-4739-9256-d81cc9d26b54\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"2d25adbf-af66-4a8e-bb19-d92e158fd227\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"c5efbd6f-aa09-4f25-ba8b-d981cfac3a38\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557264600000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"4ca0c29b-0514-4c3a-9b09-d9c52abe1909\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"ea42979a-3e33-4983-9646-da537f183328\",\"code\":\"\",\"title\":\"Camera office hours\",\"description\":\"Spend 1:1 time with camera framework and CameraX engineers. Get camera support on your existing app or a new one that you are planning to launch.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557362700000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"ce964fe5-393c-44ea-99f1-daae5007ee10\",\"code\":\"\",\"title\":\"TensorFlow.js\",\"description\":\"Want to learn about machine learning in JavaScript? Want to see the power of TensorFlow.js for bringing machine learning into browser or using it server side with Node.js? Want to know how you can get started? Have cool ideas to share about your project with TensorFlow.js? Come and chat with the creators of TensorFlow.js.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557422100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"41963973-f5b8-4f0c-a6ba-daaf35d2416d\",\"code\":\"\",\"title\":\"Game development with Google Cloud\",\"description\":\"Meet the team behind the Google Cloud Gaming products such as Agones & OpenMatch and ask us anything.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557265500000,\"endTimestamp\":1557266400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"76416e5e-666f-4dc9-97d6-dad0b96e8ecd\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557267300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"19884494-56e5-41bc-a395-db753af8cb9a\",\"code\":\"\",\"title\":\"Android Activities & Windows Office Hour \",\"description\":\"Have questions about Android WindowManager and ActivityManager? Want to get additional details on some of the features we are introducing in Q? Come chat with members of the Android Windows and Activity team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557267300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"00b99297-b183-4b05-aa94-dbaff635b8e1\",\"code\":\"\",\"title\":\"Flutter and Dart Team Meets the Community\",\"description\":\"Gathering for Flutter and Dart GDEs, developers and meetup organizers to meet the Flutter/Dart team and ask questions\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557436200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"fa9bafe5-618a-4e9b-9ab3-dbd65fd197d3\",\"code\":\"\",\"title\":\"Website UX review\",\"description\":\"Get a UX review of your website from Google developers and UX experts and find opportunities for improvement.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557335700000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"58d95405-0f7b-4448-8285-dc648f497125\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557435600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"2bf284bc-d49b-429a-a234-dc87ea8bef0e\",\"code\":\"\",\"title\":\"Black Developers Meetup\",\"description\":\"Meetup for black developers attending the I/O - meeting Googlers, each other, and building a community.\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"73d6a5b3-b121-4ff4-8eb4-dc893dc8842f\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"5e18e690-19bd-4aed-b6c3-dcd1a131d4ed\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"6b47bf6b-fddc-411d-afa8-dcd30d642a31\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"727f367b-70d1-44ad-94dd-ddd4fc0edd36\",\"code\":\"\",\"title\":\"Camera office hours\",\"description\":\"Spend 1:1 time with camera framework and CameraX engineers. Get camera support on your existing app or a new one that you are planning to launch.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557362700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"3a4850ce-68c8-4686-81bd-de0f1b00263c\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557275400000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"e0d225d9-ad44-459e-adb5-de38ad7ff0a4\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"dd6a8983-621e-4595-abc4-def41352ec30\",\"code\":\"\",\"title\":\"Android Runtime (ART) Office hours\",\"description\":\"Android Runtime (ART) employs high-performance compiler and garbage collection technology to provide the best runtime and memory usage experience for your Android applications. During this Office Hour, engineers will be available to discuss new developments in ART and help you understand and address performance and memory issues.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557360900000,\"endTimestamp\":1557361800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"5c07f7cc-67cd-443c-84ac-df0c4ac4d755\",\"code\":\"\",\"title\":\"Go Developer Network Meetup\",\"description\":\"Google recently launched the Go Developer Network (GDN) in partnership with GoBridge. This will primarily be an opportunity for the Go developers at I/O to come together as a community and meet the Go team as well.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557436800000,\"endTimestamp\":1557438600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"92a4848f-490d-4f97-b960-df0ea0c35801\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"42223d7f-0a06-4606-943a-df3b5520f3e4\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"9701a27e-b3e6-4031-9a7e-df9ee93c4fa9\",\"code\":\"\",\"title\":\"ARCore office hours\",\"description\":\"Ask the AR team everything you want to know about ARCore and AR viewer for web.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557279900000,\"endTimestamp\":1557280800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"08fa5723-e6de-47be-bc63-dfe92ca9ea62\",\"code\":\"\",\"title\":\"SDK Program office hours\",\"description\":\"Office hours to answer questions from SDK developers introducing them to the program and how they can work with Google. Also, offering an opportunity to app developers so they can get consultation on issues regarding 3rd party libraries and SDK partners\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557346500000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"6d39a320-b272-42f3-8d89-dff985da4cde\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"b5258bd5-34b9-43c4-afac-e06d0a81c506\",\"code\":\"\",\"title\":\"Android Enterprise & Security Office Hours\",\"description\":\"Come learn how to build better apps for the enterprise. For ISVs, this is very important because your app could break if it's not handling all the nuance of the work profile.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557438300000,\"endTimestamp\":1557439200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"026aa7d3-01af-4ea3-82dc-e0ee6a699da4\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557342000000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"553d620c-cfa4-4ee0-9a41-e168a13a1efe\",\"code\":\"\",\"title\":\"App Bundle and Dynamic Delivery Q&A\",\"description\":\"Enable developers to ask questions about App Bundle and Dynamic Delivery in a more private setting\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557364500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"d536f0eb-1191-42d9-b62d-e21735f72f99\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"a801cc9d-a5f5-40dd-a1a3-e2e60104b787\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"f6b70fda-8915-4e69-ba9c-e2e7b6b5e0b6\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"2c957bb7-3cf7-454f-ad32-e2f07b133a5f\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557429300000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"075a2cf3-62a3-44b5-85a0-e33e90acd7e3\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"0ab69d36-e887-4870-8ef4-e3a9e8d0e0a6\",\"code\":\"\",\"title\":\"For everyone, everywhere: accessibility & the next billion users\",\"description\":\"Grow your user base and increase staying power of your product by starting early with accessibility. Experience firsthand how building for the 1+ billion people around the world with disabilities is not just the right thing to do, but also good for your business. Regardless of the size of your company, you  can achieve great accessibility standards by following simple rules & practices. Experts from the Next Billion Users team will help make your app more accessible for everyone, everywhere.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"type_officehours\"],\"startTimestamp\":1557342900000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"49d00158-7e4f-4849-b1a4-e3dd7b7fae75\",\"code\":\"\",\"title\":\"Dynamic AMP emails\",\"description\":\"Come join us to talk about AMP for email, a new innovation that allows email senders to create emails that deliver real time information and allows consumers to take interactive actions. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557278100000,\"endTimestamp\":1557279000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"67b1516c-d5b2-4ef4-b9f8-e3df8063eb08\",\"code\":\"\",\"title\":\"Making the right decisions for your serverless architecture Office Hours\",\"description\":\"In the right hands, Serverless can increase developer velocity and help your apps scale to new heights. During this session, we'll take a look at Google's Serverless platforms (including Cloud Run, our newest, container-based offering) and how you can build lightweight, scalable, and fault-tolerant Serverless apps on top of Google Cloud.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557440100000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"7aeffdab-2639-4ce5-95ec-e3f5b4afcd56\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"31a33d75-02fa-46a6-8e10-e4b1d16972cd\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557367200000,\"endTimestamp\":1557369000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"465f5cea-6ec5-44bb-b432-e4d5d6d451c9\",\"code\":\"\",\"title\":\"Progressive Wordpress Office Hours\",\"description\":\"Meet the team at Google that works on making WordPress the best platform to serve web content, and ask them questions about the Site Kit by Google, the official AMP plugin and PWA + Feature Policy plugins. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557429300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"b4c34698-b1e6-471b-87e4-e5295569b221\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557424800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"078710c3-a580-4712-97ca-e53f9cdca1ca\",\"code\":\"\",\"title\":\"E-commerce site clinic Office Hours\",\"description\":\"Get a review of your online store from Google e-commerce experts. Walk-ins are welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557341100000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"4c45d20f-9b06-46de-9a06-e55e2a1f6855\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"b9dfa58e-b860-4db5-a6fa-e56319cb9040\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"557d8a49-1348-4d85-aa34-e5d57fbb327c\",\"code\":\"\",\"title\":\"Chrome OS Enterprise/Education Office Hours\",\"description\":\"Get 1-1 time with Chrome OS Enterprise/Education specialists who can help you solve specific technical issues and answer any questions you may have. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557363600000,\"endTimestamp\":1557364500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"1471b35d-a011-4a78-9803-e5db31a3dbc7\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"9d6f2d48-77b8-4117-94cd-e60eb7ea7995\",\"code\":\"\",\"title\":\"Smart Home Office Hours\",\"description\":\"Come talk to Smart Home experts about integrating your device with Google Assistant. If you have questions about how to best leverage Smart Home types and traits to describe your device and what it does, we'd love to talk to you. Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557357300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"01e3f7f4-bf05-4597-99ae-e63dd0477e06\",\"code\":\"\",\"title\":\"Google Photos APIs Office Hours\",\"description\":\"The Google Photos partner program and Library API launched at I/O last year to connect with your users, and upload and share content. Come meet the team and learn more about how to integrate your apps and services with Google Photos.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557333900000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"bf92ccae-68dd-4577-bbb9-e644e400e57e\",\"code\":\"\",\"title\":\"What's changing in Android Q\",\"description\":\"So your app runs great on Android 9 Pi, what do you need to change to work on Android Q? Come along and talk to a developer about what changes Android Q requires.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557272700000,\"endTimestamp\":1557273600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"69b8b721-637f-4c42-ac3f-e69400d404e0\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"234c8f18-d251-48e0-b0bc-e6e1b4f2109b\",\"code\":\"\",\"title\":\"Google Cast Office Hours\",\"description\":\"Come talk to Google Cast Experts about your app.  If you have questions about how best to leverage the Google Cast SDK to build your app or have an innovate app you’d like to share we’d love to talk with you.  Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_iot\",\"type_officehours\"],\"startTimestamp\":1557355500000,\"endTimestamp\":1557356400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"897958ee-6ff5-407a-a0b1-e6f505761a7d\",\"code\":\"\",\"title\":\"Android Authentication & Autofill \",\"description\":\"Developers will be able to ask questions related to Android authentication and identity, app sign-in (Google Sign-in vs. SmartLock for passwords vs. Autofill), SMS OTP autofill using SMS Retriever and the new SMS User Consent APIs, and Autofill Framework/Autofill with Google. These Office Hours can provide insight into the different sign-in options available to developers, as well as best practices. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557269100000,\"endTimestamp\":1557270000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"4a4958bb-6d7a-40a0-8aae-e6f5ce5f3058\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"2aaecfa6-b24a-4849-8525-e74c60053581\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"70c2bf15-4448-4a9b-8540-e7618e2fbaf0\",\"code\":\"\",\"title\":\"What's changing in Android Q\",\"description\":\"So your app runs great on Android 9 Pi, what do you need to change to work on Android Q? Come along and talk to a developer about what changes Android Q requires.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557350100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"5db557ec-fdf1-4ac0-9e6e-e7910c6e8734\",\"code\":\"\",\"title\":\"Android TV App Reviews \",\"description\":\"Schedule time with engineers and PMs from the Android TV team to dive into your app. There will be experts from all aspects of Android TV: UX/Design, leanback library, Google Assistant on Android TV, surfacing your content on the home screen, profiling and performance, optimizing your player, and many more. We also have lovely Android TVs in the area for you to sideload and display your app so we can dive into details together. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557367200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"7\"},{\"id\":\"9868e0ce-1757-4d5e-89ca-e7a63e7c7383\",\"code\":\"\",\"title\":\"Website Audits\",\"description\":\"Learn how to use tools like PageSpeed Insights, CrUX, and Lighthouse to understand UX issues on your website in areas like performance, accessibility, mobile friendliness, and more.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557432900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"7b13f50f-f5f9-4be4-af1d-e87717c067c1\",\"code\":\"\",\"title\":\"Web & Search office hours\",\"description\":\"Similar to the Google Webmaster Office Hours it would be nice to do an in-person office hours session at I/O so people can\\nAsk follow-up questions for the sessions on technical SEO\\nGet feedback on general questions or issues\\nGet in touch with us to give us feedback on docs or challenges they face\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557416700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"e2391ecc-456c-4e48-adb9-e90745e3321c\",\"code\":\"\",\"title\":\"Chrome OS Enterprise/Education Office Hours\",\"description\":\"Get 1-1 time with Chrome OS Enterprise/Education specialists who can help you solve specific technical issues and answer any questions you may have. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557362700000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"0dfdb8ab-b4fb-4af9-81f1-e95750fdd06b\",\"code\":\"\",\"title\":\"For everyone, everywhere: accessibility & the next billion users\",\"description\":\"Grow your user base and increase staying power of your product by starting early with accessibility. Experience firsthand how building for the 1+ billion people around the world with disabilities is not just the right thing to do, but also good for your business. Regardless of the size of your company, you  can achieve great accessibility standards by following simple rules & practices. Experts from the Next Billion Users team will help make your app more accessible for everyone, everywhere.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"type_officehours\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557341100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"34854e9d-a4ae-44de-8889-ea063464a3fc\",\"code\":\"\",\"title\":\"Thermal design and consideration for Android app\",\"description\":\"Android Q has added a new thermal API which will allow developer to design apps cooperated better with thermal management\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557431100000,\"endTimestamp\":1557432000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"f74d99f6-0b2c-4337-ba37-ea1b8900560f\",\"code\":\"\",\"title\":\"Google Pay\",\"description\":\"Come join us to talk about Google Pay and how to leverage its APIs to improve the payment experience in sites, applications and other elements in the ecosystem such as tickets and passes, loyalty programs and discounts.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_payments\",\"type_officehours\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557418500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"eb549eac-e9ae-4b34-b7e0-ea30f751455f\",\"code\":\"\",\"title\":\"Accessibility Office Hours\",\"description\":\"Experts on engineering and UX will help you make your app more accessible to all users, including people with disabilities.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"type_officehours\"],\"startTimestamp\":1557341100000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"1123c2e7-3efa-4252-951e-ea3c0489e132\",\"code\":\"\",\"title\":\"Google Mobile Ads SDK office hours\",\"description\":\"Get your AdMob and Ad Manager app integration questions answered. Meet 1:1 with experts to learn more about these products, debug issues with your app code or ad configuration, discuss best practices, and provide product feedback.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ads\",\"type_officehours\"],\"startTimestamp\":1557357300000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"14df047a-51ed-476b-b5e6-eab7b8d08676\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"93477930-c73f-4a4b-bd4a-eb9fe5d318ed\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"dafb0f20-5376-4c92-83a7-eba1331eb177\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"633f5a69-8dfc-4b19-824a-ebd9f29ed24e\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"67c55d83-b662-40a6-b4b4-ed52085e8216\",\"code\":\"\",\"title\":\"Smart Home Office Hours\",\"description\":\"Come talk to Smart Home experts about integrating your device with Google Assistant. If you have questions about how to best leverage Smart Home types and traits to describe your device and what it does, we'd love to talk to you. Feature requests and feedback are also welcome.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557276300000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"6b60ce55-0d81-4159-86de-ed6ec7a44253\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"c2336b54-14cf-44c9-afaa-ed899cdf51fa\",\"code\":\"\",\"title\":\"Cloud Security\",\"description\":\"TBD\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557351900000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"a0565090-7c2e-4e51-8780-ed9ee2e164e6\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557360000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"5b6c2e94-b9df-4d7c-83cd-edf7fab359ac\",\"code\":\"\",\"title\":\"Google Assistant & Smart Home Office Hours\",\"description\":\"Need help building your Action for the Google Assistant? Or looking for design advice to help you get started? Want to learn about the Review process? Drop by our office hours for consultation on how to develop, design, deploy, or improve your Actions.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_assistant\",\"type_officehours\"],\"startTimestamp\":1557427500000,\"endTimestamp\":1557428400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"8e881a31-d2ea-4d77-bf9f-ee21e2c2b667\",\"code\":\"\",\"title\":\"For everyone, everywhere: accessibility & the next billion users\",\"description\":\"Grow your user base and increase staying power of your product by starting early with accessibility. Experience firsthand how building for the 1+ billion people around the world with disabilities is not just the right thing to do, but also good for your business. Regardless of the size of your company, you  can achieve great accessibility standards by following simple rules & practices. Experts from the Next Billion Users team will help make your app more accessible for everyone, everywhere.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"type_officehours\"],\"startTimestamp\":1557341100000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"9c5f4219-5f8b-4ff1-982d-ee251aa335fc\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557421200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"d100a998-7182-4d74-b715-ef0088d900da\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557432900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"3a4be798-b7cc-45c9-b88f-ef92bd9ac2e7\",\"code\":\"\",\"title\":\"Android Activities & Windows Office Hour \",\"description\":\"Have questions about Android WindowManager and ActivityManager? Want to get additional details on some of the features we are introducing in Q? Come chat with members of the Android Windows and Activity team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557268200000,\"endTimestamp\":1557269100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"ff5073d7-2ae4-4ccb-9f51-efd597da47b6\",\"code\":\"\",\"title\":\"SEO for JS-based websites\",\"description\":\"Modern sites can be awesome, but also tricky to make visible through Search. Chat with us about your struggles, get advice on how to efficiently improve your site.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_search\",\"type_officehours\"],\"startTimestamp\":1557357300000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"8f8c1d19-5346-490c-b33d-f064124b9a3e\",\"code\":\"\",\"title\":\"Material Design Components: Android Office Hours\",\"description\":\"Have questions about Material Design Components Android library? Want to learn how to take advantage of Material Theming? Come chat with members of the Material Design Components Android team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_design\",\"type_officehours\"],\"startTimestamp\":1557432900000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"955388e0-c7e5-4d0c-a583-f072366c2f34\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557268200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"b7816bbf-93a7-4f5b-a704-f09faacfced1\",\"code\":\"\",\"title\":\"Chrome OS Enterprise/Education Office Hours\",\"description\":\"Get 1-1 time with Chrome OS Enterprise/Education specialists who can help you solve specific technical issues and answer any questions you may have. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557274500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"b5fabccd-04df-4369-863a-f0ad11f19ec3\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"52c8a768-52bf-462d-a46d-f12d931b0070\",\"code\":\"\",\"title\":\"Google Programs for Higher Education\",\"description\":\"After talking to Googlers at the Higher Ed office hours, developers (faculty and students) will have a better idea how they can use Google products (especially Google Cloud) in their teaching and research.  They'll know how to apply for grants, prepare for careers in a cloud-first world, and have a good idea of the resources available.\\n\\nThose developers who already are using Google in Higher Ed will have an opportunity to ask specific questions and give feedback to the team.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557436500000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"e554d632-3d42-4f54-a495-f12eb0b2188c\",\"code\":\"\",\"title\":\"Office hours with the Android Bazel team\",\"description\":\"Bazel is an open source build system developed by Google. The Android Bazel team is responsible for all Bazel Android Rules. The team will be happy to answer any questions around Android integration with Bazel, migration strategies and best practices to build Android apps at scale with Bazel.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557276300000,\"endTimestamp\":1557277200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"bd70c308-2c5b-46fc-b7e6-f186179e5e82\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557334800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"b2a2b724-afc6-41c5-b74f-f1a8a6762233\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"fe27b00d-257c-452c-945e-f1e2dc3532b9\",\"code\":\"\",\"title\":\"GDG/GDE Italy Meetup\",\"description\":\"A get together for the leads of Italian Google Developer Groups and Google Developer Experts from Italy.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557417600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"4cea4e93-7b05-4813-99b2-f2277511b9fc\",\"code\":\"\",\"title\":\"Kotlin for Cloud Office Hours\",\"description\":\"Office hours to help developers learn more about using Kotlin for backend, running Kotlin backends in cloud, and also general help to better understand/utilize Google Cloud Platform.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_officehours\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557267300000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"4371c9d9-38c3-4a00-bd0b-f2403f2e186b\",\"code\":\"\",\"title\":\"Website Audits\",\"description\":\"Learn how to use tools like PageSpeed Insights, CrUX, and Lighthouse to understand UX issues on your website in areas like performance, accessibility, mobile friendliness, and more.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557431100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"764638fd-a35a-4896-8a1a-f28f72245633\",\"code\":\"\",\"title\":\"TPUs\",\"description\":\"Come and ask your questions about Google's Tensor Processing Units (TPUs)\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_officehours\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557332100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"a36b3cb1-1bf8-42e1-85cb-f47718da6ff2\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"774074a9-59b1-4bc5-8802-f4962e69a23a\",\"code\":\"\",\"title\":\"Gaming and graphics on Chrome OS Office Hours\",\"description\":\"Get time 1-1 with the Chrome OS games & graphics team to solve game technical & design issues\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557353700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"57a76c5e-dfda-43ba-8c80-f4ddd6dab7e5\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557331200000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"b84aff1c-9569-4b7a-8f20-f56e0a9cb607\",\"code\":\"\",\"title\":\"AMA: Metrics in Play Console\",\"description\":\"Play Console offers loads of metrics - from acquisition to churn, bugs to revenue, and with our latest releases more insights than ever before. But developers often have have highly specific questions and queries about these based on their own unique needs, businesses, and situations. This is an opportunity to ask the experts who built Play Console metrics anything about what you can access.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557436500000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"0ef8b542-a03f-44b8-b2eb-f5bf615dfc24\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"02391f8e-35d3-4c54-aa2a-f5e238f1da13\",\"code\":\"\",\"title\":\"Web App Reviews \",\"description\":\"If you're working on any type of web app—whether it's a new Progressive Web App using the latest web platform features, or a legacy app—there's always room for improvement. Schedule time at the Web App Review station and a SME from Google will be happy to do a deep dive about any of the following: service workers; speed, from loading to interactions; modern CSS and responsive design; authentication, payments, and identity; and anything else that web has to offer. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_web\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"12\"},{\"id\":\"237fa64a-3d3f-4cdc-aed4-f6e79f886f39\",\"code\":\"\",\"title\":\"Play Policy App Reviews \",\"description\":\"The world around us is constantly changing, and so are Play Policies. The Play Policy & Review Operations team wants to help you stay on top of our policies so you can provide an optimized experience to your users. Sign up for Policy App Reviews to ask questions on Permissions (SMS, Call Log, Location, etc.) and upcoming Families policy changes. You can also give feedback on our communications and get help on Play Console features! Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557334800000,\"endTimestamp\":1557336600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"11\"},{\"id\":\"f9af320d-7ba4-4064-889c-f71726e8da88\",\"code\":\"\",\"title\":\"Android App Reviews \",\"description\":\"Android is a moving target! Whether you’re working in a seasoned codebase or starting a shiny new project in Kotlin, there’s always room for growth and improvement. Schedule time to talk with an expert Android Googler about your app, concentrating on the following areas: Migrating to P & Q features, Jetpack & Architecture, Material Design Components & Theming, Testing on Android and Android Security. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"8\"},{\"id\":\"b170bbb0-4685-4994-8be7-f7520cb410a8\",\"code\":\"\",\"title\":\"Android Java Language Libraries\",\"description\":\"The Android Core Libraries team provides core libraries such as the ICU, Conscrypt, and java.*  libraries to Android developers who are using the Java or Kotlin programming languages. During this Office Hour, you'll have the opportunity to meet with the team and ask technical questions about core library performance, best practices, design patterns, and more. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557351900000,\"endTimestamp\":1557352800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"436b7c32-4813-40b1-a3a2-f7cb25573cf7\",\"code\":\"\",\"title\":\"Game Reviews\",\"description\":\"Game developers have a lot to keep up with, from development, through launch, and in live-ops. Here to help is Google's gaming team, ready to review and provide recommendations for your game, no matter what state it's in! Schedule time with these experts to review your game and ask for advice on tools,tips on developing, launching, protecting, optimizing, and monetizing your game. These game industry vets are happy to discuss all things related to game development. Walk-ins are welcome. \",\"type\":\"Game Reviews \",\"contentLevels\":[],\"tagNames\":[\"type_gamereviews\",\"topic_gaming\"],\"startTimestamp\":1557338400000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"e6591a2a-5580-4ff2-86e1-f8df88ef3ba6\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"ce53846d-7fc1-434b-82eb-f93ad85b191b\",\"code\":\"\",\"title\":\"Chrome OS Web Office Hours\",\"description\":\"Visit with the Chrome OS Web team to discuss Chrome OS Web app design and technical issues and learn how you can give your users the best experience possible on Chrome OS.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557350100000,\"endTimestamp\":1557351000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"a4c1240a-4675-4de9-9295-f9c755365fce\",\"code\":\"\",\"title\":\"Dynamic AMP emails\",\"description\":\"Come join us to talk about AMP for email, a new innovation that allows email senders to create emails that deliver real time information and allows consumers to take interactive actions. \",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557418500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"5b5d1dc4-e104-4007-a8ba-f9e0f2bbbc9a\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557352800000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"2e6e8cd6-8b3a-4ada-afdf-fa14d0cb7579\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"ad3dd6c5-30e2-4996-a2a6-fa50108ddad8\",\"code\":\"\",\"title\":\"Google Photos APIs Office Hours\",\"description\":\"The Google Photos partner program and Library API launched at I/O last year to connect with your users, and upload and share content. Come meet the team and learn more about how to integrate your apps and services with Google Photos.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_officehours\"],\"startTimestamp\":1557440100000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"e34d5ec7-fd76-48fe-8529-fa63a333fd01\",\"code\":\"\",\"title\":\"Play App Reviews\",\"description\":\"Now that your app is in the Google Play Store, it’s time to think about growing your business! Building and maintaining an app with excellent quality is important, but what else can you do to grow and optimize your business through Google Play? Sign up for an app review with Play experts. We can discuss launching your app in new countries, improving user experience, understanding Android vitals, optimizing in-app purchases, subscriptions and your Play store listing. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_android/play\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"10\"},{\"id\":\"5656b991-0167-4bfe-aea0-fa7a4a06188e\",\"code\":\"\",\"title\":\"Play Instant Games Office Hours\",\"description\":\"Office hours to help developers 1:1 to build out their Instant Games. This includes developers at all stages of development; from those who may have considered building an instant game and want to learn more, to those who already have an instant game in Play and would like to hear about next steps to make the experience even better.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557423900000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"2\"},{\"id\":\"e4aa17e7-0f05-43a0-9cb2-faca922eaac6\",\"code\":\"\",\"title\":\"Android Studio Profilers Office Hours\",\"description\":\"Meet with members of the Android Studio Profilers team to get help on profiling and optimizing your app.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557274500000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"42bddb33-9a3b-40d6-9b85-fbda5b082b56\",\"code\":\"\",\"title\":\"Office Hours with the AMP Story Team\",\"description\":\"Have questions about how to get started building fast, visually engaging AMP Stories? Wondering about the UX best practices for this new web format? Or need some tips on how to improve your Story's appearance in Google Search? Attend the AMP Story Office Hours to discuss these questions and more with the people who created the format.\\n\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557278100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"65a4b88d-148c-4432-b73f-fbdf1d6cafbb\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557367200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"e8150bc8-79a4-4900-82d3-fbe59e5c17c1\",\"code\":\"\",\"title\":\"Accessibility App reviews \",\"description\":\"When you improve your app's accessibility, you improve your product for everyone, including the billion people worldwide who live with a disability. Sign up for Accessibility App Reviews if you are working on an Android app and want to learn how to make it more accessible with experts from the Android team. We will walk you through UX and development best practices, how to test your app to find opportunities for improvements and how to implement improvements. Walk-ins are welcome.\",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_accessibility\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557264600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"13\"},{\"id\":\"d6729fc2-84f2-4ce6-a191-fc1e9ef737f5\",\"code\":\"\",\"title\":\"Play Instant Apps Office Hours\",\"description\":\"Office hours to help developers 1:1 to build out their Instant Apps. This includes developers at all stages of development; from those who may have considered building an instant app and want to learn more, to those who already have an instant app in Play and would like to hear about next steps to make the experience even better.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557270900000,\"endTimestamp\":1557271800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"74098154-d617-490e-b054-fc5acca4bc04\",\"code\":\"\",\"title\":\"Android Enterprise & Security Office Hours\",\"description\":\"Come learn how to build better apps for the enterprise. For ISVs, this is very important because your app could break if it's not handling all the nuance of the work profile.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557332100000,\"endTimestamp\":1557333000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"1\"},{\"id\":\"82496438-1170-49bb-a921-fc9299d690a0\",\"code\":\"\",\"title\":\"Success in the major developer hubs: Germany, UK & Russia experiences.\",\"description\":\"Developers from Germany, UK, Russia, and major dev hubs - share what can be learned from these culturally diverse tech about being successful in the developer ecosystem there.\\n\",\"type\":\"Meetups\",\"contentLevels\":[],\"tagNames\":[\"type_meetups\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557348000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"49c00366-3568-4bdb-b6a4-fcfd909547e7\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557275400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"25199dfe-1879-416c-ba80-fdc9b6c79d7a\",\"code\":\"\",\"title\":\"Chrome OS Web Office Hours\",\"description\":\"Visit with the Chrome OS Web team to discuss Chrome OS Web app design and technical issues and learn how you can give your users the best experience possible on Chrome OS.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557349200000,\"endTimestamp\":1557350100000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"3\"},{\"id\":\"e5b03052-7b2d-4d37-9bf5-fe16aa6f77c8\",\"code\":\"\",\"title\":\"Gaming and graphics on Chrome OS Office Hours\",\"description\":\"Get time 1-1 with the Chrome OS games & graphics team to solve game technical & design issues\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_web\",\"type_officehours\"],\"startTimestamp\":1557353700000,\"endTimestamp\":1557354600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"4\"},{\"id\":\"1e0fdfdf-ba8b-4c5f-a8d3-fe5250e84124\",\"code\":\"\",\"title\":\"Firebase Authentication office hours\",\"description\":\"Meet the Firebase team to ask them your Firebase Authentication question, or to express your concerns about the product.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557345600000,\"endTimestamp\":1557346500000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"82171d88-cb57-46eb-8f4f-fea3b69fe1cf\",\"code\":\"\",\"title\":\"Design App Reviews \",\"description\":\"Design can make or break your product. Get 1-on-1 feedback on your app and learn how to use Material’s open-source components to build even better and faster—all from expert members of Google’s Material Design team. Reserve a spot and swing by with your design-related questions, on topics like: UX principles, accessibility, color, navigation, typography, customizing Material Design, and more. Walk-ins are welcome. \",\"type\":\"App Reviews\",\"contentLevels\":[],\"tagNames\":[\"type_appreviews\",\"topic_design\"],\"startTimestamp\":1557428400000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"9\"},{\"id\":\"94bdba9d-bb31-4116-a771-fee19c915920\",\"code\":\"\",\"title\":\"Firebase Authentication office hours\",\"description\":\"Meet the Firebase team to ask them your Firebase Authentication question, or to express your concerns about the product.\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"type_officehours\"],\"startTimestamp\":1557346500000,\"endTimestamp\":1557347400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"5\"},{\"id\":\"0fb86eeb-d3e0-48d8-aa99-ff44c2904018\",\"code\":\"\",\"title\":\"SDK Program office hours\",\"description\":\"Office hours to answer questions from SDK developers introducing them to the program and how they can work with Google. Also, offering an opportunity to app developers so they can get consultation on issues regarding 3rd party libraries and SDK partners\",\"type\":\"Office Hours\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_officehours\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557344700000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"6\"},{\"id\":\"00662f82-3947-4b81-974c-cae386be201c\",\"code\":\"T00662\",\"title\":\"Reach the Next Billion Users with Your Actions for the Google Assistant\",\"description\":\"The Google Assistant supports an expansive list of countries, languages, and devices, including recently: KaiOS and Android Go phones. Come learn how users in emerging markets are interacting with the Google Assistant, what they expect from your Actions, and what opportunities you have to grow your services with them. Leave with technical and design considerations, as well as common mistakes to avoid when building for the next billion users.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_assistant\",\"type_sessions\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557347400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"22abdabf-1af3-4dbb-aa7a-d319e2ebebb1\",\"8ccad61e-cba1-47d1-b52f-e67d71e5d563\"],\"relatedSessions\":[\"601ad7a6-8c0c-46ce-bca8-239986ff6357\",\"925a3d9d-b424-4c05-b3c0-96531a96bd85\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150917\",\"section\":\"\"},{\"id\":\"01384c21-97f2-4231-8b24-d538172e48ef\",\"code\":\"T01384\",\"title\":\"Lightning Talk: Auto-magic Your Quarterly Reports with Our BigQuery Data Connector\",\"description\":\"Do you find that you end up making the same type of reports at the end of every quarter? Automation is your new best friend! Learn how to blend your data and reports with the magic of Apps Script. Watch a demo that shows how to use the new data connector to pull fresh sales data from BigQuery, into Sheets, and then populate the findings into a presentation-- all in less than two minutes! \",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_lightningtalks\"],\"startTimestamp\":1557356400000,\"endTimestamp\":1557358200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"b2063229-c343-47ce-822f-884f4fe651f4\",\"c187268e-9888-45ad-85af-fd5375e88549\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"02f52df5-dc7e-499d-8cf7-3d27829e6fa9\",\"code\":\"T02F52\",\"title\":\"TensorFlow Extended: Machine Learning Pipelines and Model Understanding\",\"description\":\"This talk will focus on creating a production machine learning pipeline using TFX. Using TFX developers can implement machine learning pipelines capable of processing large datasets for both modeling and inference. In addition to data wrangling and feature engineering over large datasets, TFX enables detailed model analysis and versioning. The talk will focus on implementing a TFX pipeline and a discussion of current topics in model understanding.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_opensource\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"f5329d37-e34a-484c-9089-7297387385a2\",\"5776b419-4321-4b6b-9adb-b5dfda9219fe\",\"93045557-9f6d-4a86-a805-bc83c9462818\"],\"relatedSessions\":[\"8acb1b91-ac5f-410a-a381-664f77e53b9a\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150901\",\"section\":\"\"},{\"id\":\"03d8425c-54ca-437b-bac7-ece76cca8347\",\"code\":\"T03D84\",\"title\":\"Beyond Mobile: Building Flutter Apps for iOS, Android, Chrome OS, and Web\",\"description\":\"Flutter is a great way to build mobile apps for iOS and Android from a single codebase. But did you know that Flutter is expanding beyond mobile to run on desktop and the web, too? In this talk, you'll see two developers live code a real-world app that runs on all of these platforms that highlights Flutter's latest features. You'll see two developers live code a real-world app that runs on all of these platforms and highlights Flutter's latest features.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_opensource\",\"topic_flutter\",\"topic_chromeos\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"bed13088-6614-4b4b-91cf-ee73d701284a\",\"f32caf76-cc8c-4df2-8ffe-cb1408ec3116\"],\"relatedSessions\":[\"664c8a66-50d8-41d5-933c-0983f878b377\",\"37261739-76c8-45fe-a8a8-5cd9b1a894c2\",\"1d9c02ed-bdc5-4a32-90bc-7316d6d1fb55\",\"0cedc311-b646-4b29-b952-d7c7a832bfbd\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150834\",\"section\":\"\"},{\"id\":\"05aaaf5f-3e46-496b-acb2-5b2a69b2fc9d\",\"code\":\"T05AAA\",\"title\":\"What's New in Android Development Tools\",\"description\":\"Get an overview of what's new in Android Studio for Android app developers, including demos, and a tour de force presentation of relevant features that will accelerate developers workflow on the latest Android APIs.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"cdd85e13-ae7a-450e-9826-d217079e690f\",\"8dc635d6-ca19-4fde-909e-2b8689e39d3e\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150921\",\"section\":\"\"},{\"id\":\"08837fc5-b49c-4ac5-b5d5-ff2bf3869a48\",\"code\":\"T08837\",\"title\":\"Lightning Talk: Fast Pair for Bluetooth Devices\",\"description\":\"Have Bluetooth accessories such as headsets and soundbars? Have pairing issues? Drop by the Fast Pair lightning talk to see how your devices can pair seamlessly to Android. The Fast Pair platform not only enables one-tap pairing and account-based device recognition, but also includes additional features like Find My Accessories and improved companion app management - chat with the team and existing partners to get started.\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"type_lightningtalks\"],\"startTimestamp\":1557360000000,\"endTimestamp\":1557363600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"d87c1003-716d-4204-8093-6655f5cee486\",\"cfbb0805-7f65-4979-a170-d4d95eb82d4b\",\"4ac3b73c-1dcd-410f-9194-485e9e768124\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"0a7b5873-5d19-46e5-806d-81a57e7bc701\",\"code\":\"T0A7B5\",\"title\":\"Art and Technology Experiments with Google Arts and Culture\",\"description\":\"See the latest culture and technology experiments with Google Arts and Culture Director Amit Sood, exploring recent creative collaborations between artists and engineers who are bringing together art, fashion and AI. Distinguished Google engineer Blaise Aguera y Arcas then joins Amit in conversation to discuss how Google Research is teaching us new ways of thinking about working with intelligent systems and collaborative research with artists.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557369000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"23db1e0d-0f53-4e09-88d5-a9dadb11ca4b\",\"483ff781-f785-4e59-896b-aaeb0e6e9330\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"0ba929fb-d420-462f-9f86-408d7a54273b\",\"code\":\"T0BA92\",\"title\":\"Developer Keynote\",\"description\":\"Learn about the latest updates to our developer products and platforms at Google from Google Developers.\\n\\n\",\"type\":\"Keynotes\",\"contentLevels\":[],\"tagNames\":[\"topic_keynote\",\"type_keynotes\"],\"startTimestamp\":1557258300000,\"endTimestamp\":1557261900000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"0c5ef47f-e67a-400e-b284-710c94d0013d\",\"code\":\"T0C5EF\",\"title\":\"Building Powerful Checkout Experiences with Google Pay\",\"description\":\"Online payment should be seamless for users, and simple to implement for developers. Google Pay can help improve your checkout experience and increase conversions in-app and on the web. Learn about the latest updates to Google Pay API, ease of implementation through direct use or eCommerce platform partners who have adopted Google Pay for checkout. This session will address the importance of great design, development best practices and insight into the simplicity of enabling Google Pay for all consumers, everywhere.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\",\"topic_payments\",\"topic_web\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557270000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"3c805154-3f73-47b8-a966-02553c40e550\",\"32f57f67-6842-4450-8eef-d271f23d2652\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151015\",\"section\":\"\"},{\"id\":\"0cedc311-b646-4b29-b952-d7c7a832bfbd\",\"code\":\"T0CEDC\",\"title\":\"Pragmatic State Management in Flutter\",\"description\":\"Declarative UI frameworks eliminate whole classes of bugs. But they can also be a puzzle until you figure out how to structure your app logic around them. Walk through Flutter's app with live data and see how to structure content in a simple yet scalable way. You'll come out understanding the main approaches of state management in declarative frameworks and have a concrete applicable solution.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_opensource\",\"topic_flutter\",\"type_sessions\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557426600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"5e37b0ef-859a-4760-a24f-3b2ba81a7d9f\",\"25f12554-5466-4f6b-a20e-f450c51d47fe\"],\"relatedSessions\":[\"664c8a66-50d8-41d5-933c-0983f878b377\",\"1d9c02ed-bdc5-4a32-90bc-7316d6d1fb55\",\"03d8425c-54ca-437b-bac7-ece76cca8347\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150938\",\"section\":\"\"},{\"id\":\"0d472b88-9ef5-4a1a-aa3d-29420301d540\",\"code\":\"T0D472\",\"title\":\"Fireside Chat with Hiroshi Lockheimer, Google Senior Vice President, Platforms and Ecosystems\",\"description\":\"Get unique insight into the world's most popular platforms in this candid conversation with the Senior Vice President of Android, Chrome, Chrome OS, and Google Play.\\n\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"topic_misc\",\"topic_keynote\",\"topic_chromeos\",\"type_sessions\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557433800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"6e528625-2765-4307-a7e8-773a23271628\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"0d862130-27a1-4dd5-b7e9-336dab07c5c5\",\"code\":\"T0D862\",\"title\":\"Overview of Privacy Changes in Android Q\",\"description\":\"This session will cover new privacy related changes coming in Android Q and how they may affect your apps. This includes changes to permissions including Location and Storage, new restrictions on background app launching, and new platform APIs available to you.\\n\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"type_sessions\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"47ff81a2-6d46-47ee-8b46-e5fe946f1d94\",\"3f304564-a58f-4578-9492-154964f82b2c\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101156815\",\"section\":\"\"},{\"id\":\"0da7b427-8fa3-4efd-8c0b-b234fc703a34\",\"code\":\"T0DA7B\",\"title\":\"Securing Web Apps with Modern Platform Features\",\"description\":\"Common vulnerabilities such as XSS, CSRF, and others have long plagued the web, accounting for most of the high-risk flaws reported under Google's Vulnerability Reward Program. Learn about the latest web platform security mechanisms to protect your apps from injections and isolate them from dangerous sites. You'll leave with a security checklist for defending your applications with new browser features based on Google Security Team's experience in protecting the web's most sensitive apps.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557444600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"b40f6a38-6be5-432b-a172-d60c21c0a68a\",\"ebaba1a1-0522-46c0-a7fe-1ed59a1e523e\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151025\",\"section\":\"\"},{\"id\":\"0e51e7b6-2b8c-4665-a98d-fbd70418aefe\",\"code\":\"T0E51E\",\"title\":\"Deep Learning to Solve Challenging Problems\",\"description\":\"This talk will highlight some of Google Brain’s research and computer systems with an eye toward how it can be used to solve challenging problems, and will relate them to the National Academy of Engineering's Grand Engineering Challenges for the 21st Century, including the use of machine learning for healthcare, robotics, and engineering the tools of scientific discovery.  He will also cover how machine learning is transforming many aspects of our computing hardware and software systems. \",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"7fde36c2-b3cb-46fc-b5d2-2c498aa6b1b9\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"0e6c7d8d-8110-4f61-8440-15950bf570cd\",\"code\":\"T0E6C7\",\"title\":\"Voice and Visual: How to Build Actions for Smart Displays and More Devices\",\"description\":\"How should your Action perform across different device types like mobile, Smart Displays, or speakers? How do you even get started with voice design? In this talk, we’ll walk you through design and developer considerations for building multimodal experiences across Google Assistant-enabled devices. Leave with optimization best practices critical to building a seamless and well-designed experience across devices.\\n\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_assistant\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"b4392e67-2b8f-43e2-9730-1f25c57f6a69\",\"522f3cb3-1dd1-491d-b448-716fa74c57ab\"],\"relatedSessions\":[\"24560bcc-5ad9-473f-80fb-31af62c2a460\",\"7539def1-1ee2-4786-890e-35a608abd98f\",\"925a3d9d-b424-4c05-b3c0-96531a96bd85\",\"ca674c3e-1411-4f4a-bfd3-c93076bd633e\",\"29766c96-aacc-4f76-a74b-e9ae03a700aa\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150916\",\"section\":\"\"},{\"id\":\"1165ac75-3bf4-4dbb-8fa2-e537c4a7d3d8\",\"code\":\"T1165A\",\"title\":\"Cloud Firestore Data Modeling\",\"description\":\"So, you're building your first app using Cloud Firestore, and these NoSQL databases are still new to you. How can you set up your data in Cloud Firestore so that you can a) Perform all the queries you want, while b) Keep everything running quickly, and c) Not spend too much money? Let's find out together by looking at some common use-cases and app types, and see how to implement these on Cloud Firestore.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_firebase\",\"type_sessions\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"46f34c6c-07a3-4d1a-8a86-643025abbd72\"],\"relatedSessions\":[\"98a3b392-7e3b-4b93-bc0e-6826ad439155\",\"ba278d33-cf65-43bc-bf61-6f99a3290445\",\"daf8cae3-ed7f-4485-afd0-786ebead5140\",\"8046ba76-9592-43e7-b63a-96ed9c1ce320\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150910\",\"section\":\"\"},{\"id\":\"124b9a71-47a5-41c9-bc24-817c4cbbd370\",\"code\":\"T124B9\",\"title\":\"What's New in Gaming at Google\",\"description\":\"In this session, you'll learn about how Google is providing solutions for game developers. Whether you're building for console/desktop platforms, publishing on Google Play, or looking to improve your development toolchain, we have solutions for you.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557266400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"1a39ff3e-9661-4fc5-8f62-019ae7fb48ef\",\"d0de27b1-2ec2-4369-889f-8a83dcaad39c\",\"a4e79ee1-d1a9-460e-9f29-f97084e0c5b3\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151095\",\"section\":\"\"},{\"id\":\"1486c434-74e3-46fc-83a1-676563ac402a\",\"code\":\"T1486C\",\"title\":\"Michio Kaku on The Future of Humanity\",\"description\":\"An enlightening conversation with the famed theoretical physicist, futurist, and co-founder of String Field Theory.  This fireside chat will cover a range of topics from quantum computing, how AI can improve our quality of life, to potential life on Mars and why he is determined to complete Einstein’s theory of everything. \",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"dbaa9d25-48f4-46a0-9fa0-477105289165\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"15555f1b-a138-4e8f-a89f-5bf0dcf8db7c\",\"code\":\"T15555\",\"title\":\"Making High Fidelity Android Games Possible with Vulkan\",\"description\":\"Bringing high quality and modern graphics to Android via Vulkan is a long journey, but there has been a lot of progress. The Vulkan ecosystem is healthier than ever. In this session, you'll learn how Vulkan is the path to high performance graphics as well as how you can adopt your games and engines.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"d41cb407-95e8-42e1-933d-22b518ae29d6\",\"3ab059c0-2af8-43b3-99fd-fbd7f66b2596\",\"f93f249a-a3f2-44e6-b504-b61bb5fbeec2\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151033\",\"section\":\"\"},{\"id\":\"15b34f05-e779-41f5-9d27-ccb9d89fb965\",\"code\":\"T15B34\",\"title\":\"Intro to the Google Assistant: Build Your First Action\",\"description\":\"The Google Assistant is here to change the way users get things done. This intro session will cover the fundamentals of the Google Assistant and what you can build for the assistive future. See which development journeys to take as a web developer, Android app developer, or as you're building an Action from scratch. Learn how to make your existing content easily available on the Assistant and how to create new immersive Assistant experiences. \",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_assistant\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557277200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"dc4445c5-ed6c-49af-a979-4d088ce6573e\",\"9970b6dd-4416-4302-808f-d8071cb4819f\",\"12be87e0-7727-42f7-84a8-dc0c88f208c5\"],\"relatedSessions\":[\"fc4a76a0-5907-4c6a-b1b1-074fc7649043\",\"40a400cf-aa8d-4510-8491-07d1e0248f06\",\"601ad7a6-8c0c-46ce-bca8-239986ff6357\",\"7539def1-1ee2-4786-890e-35a608abd98f\",\"f76a49c1-bdb3-4041-8616-565edce346a2\",\"ca674c3e-1411-4f4a-bfd3-c93076bd633e\",\"db8c26f5-2ac5-4b2b-922d-ca69765ff72c\",\"00662f82-3947-4b81-974c-cae386be201c\",\"e7b7baec-98a6-497f-be63-e174f4751c97\",\"38f647d5-cd0b-484e-ad07-e396b0308e68\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150940\",\"section\":\"\"},{\"id\":\"16c155fe-9201-4bce-9813-687ffec744ef\",\"code\":\"T16C15\",\"title\":\"Adapting Android Games Beyond the Phone\",\"description\":\"Android no longer lives on just mobile devices. It continues to grow and evolve on to new platforms like Chrome OS and Android TV. In addition, the specification of “mobile” is changing with the growing tablets and emerging foldable market. This technical talk will show game developers how to adapt their Android game in order to provide the best possible gaming experience across all these new platforms.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_chromeos\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557351000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"c14634fd-8be5-4e98-8fdb-46ba0cf99d2f\"],\"relatedSessions\":[\"f02cb268-4ab7-479d-a5af-b86f9ceb844b\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150961\",\"section\":\"\"},{\"id\":\"16cb2916-04ba-4474-a091-122dc1c2c025\",\"code\":\"T16CB2\",\"title\":\"Google Maps Platform: A Deep Dive on Building for Performance and Scale\",\"description\":\"Over the past 10+ years, the technologies that drive how we build (and how you use) the Google Maps Platform have changed dramatically. In this session, you'll be reintroduced to building with the Google Maps Platform by taking a deep look at implementations that exemplify best practices. You'll learn strategies for how to use the Maps APIs to work with large-scale data, and tips to implement our improvements to custom styling.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_location/maps\",\"type_sessions\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557273600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"5f29fc0f-5d01-4951-ae86-a4c9e3c514c3\"],\"relatedSessions\":[\"b3fc900a-6ecd-48a4-9021-769c548758af\",\"3dffdb72-e79a-4511-a65e-9656967beda9\",\"1a3d243c-7031-4c0f-b95c-fe71ca6a483b\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150905\",\"section\":\"\"},{\"id\":\"181b9b09-4591-4079-8c4c-33dfdbcad85f\",\"code\":\"T181B9\",\"title\":\"AMP for Email: Coming Soon to an Inbox Near You\",\"description\":\"Last year, we announced AMP for Email, a powerful way to create more engaging, interactive, and actionable email experiences. Learn about AMP for Email and what’s possible in email when up-to-date content, quick actions, and interactivity are added through live implementations and demos. \",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557433800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"27aedf58-82f3-480a-ab97-79dfa21e0125\",\"3f490e1d-4e62-4ca3-bd87-96edcc05f852\"],\"relatedSessions\":[\"5311d3a8-03b4-4ae7-ba22-a3990ef1913a\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151021\",\"section\":\"\"},{\"id\":\"1a3d243c-7031-4c0f-b95c-fe71ca6a483b\",\"code\":\"T1A3D2\",\"title\":\"Updating Your Apps for Location Permission Changes in Android Q\",\"description\":\"Android Q introduces several changes to the Location Permission. The session will cover these changes and the impacts they may have to your app, how to update your app for these changes, and best practices when asking users for location permission.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"cf031f5f-6471-4b45-9c34-e17689505f0a\",\"98864cbc-20f4-420f-9e5c-a48f25684050\",\"6710442f-dfb9-4d1c-b84d-a16b6cc0ade9\"],\"relatedSessions\":[\"16cb2916-04ba-4474-a091-122dc1c2c025\"],\"doryLink\":\"https://dory.withgoogle.com/series/101156744\",\"section\":\"\"},{\"id\":\"1acd6b82-41f2-40f2-9481-3be4abae49e6\",\"code\":\"T1ACD6\",\"title\":\"What's New with Android for Cars\",\"description\":\"Come hear about different in-car experiences powered by Android. In this session, you’ll learn about new design improvements and the latest cars that support Android Auto. You’ll also hear more about the new, Android-based infotainment systems that are built into cars and hear more directly from Thomas Ingenlath, CEO of Polestar. If you’re looking to reach even more drivers, the road ahead leads to exciting destinations.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557273600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"cc20e96a-b5ce-45f5-ab5b-fbd9587a9892\",\"e5b1b626-8e6f-41ee-8ab5-52b05d97ad84\",\"cb12f464-c1a5-4c32-a7ff-9c1d6da4530c\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150822\",\"section\":\"\"},{\"id\":\"1afc0faa-5f32-4234-bef3-3f615bc05d6a\",\"code\":\"T1AFC0\",\"title\":\"Music and Machine Learning\",\"description\":\"New technologies have fundamentally changed the way we make and experience music. In this session Claire Evans, artist, author and one half of the pop duo YACHT talks about deep learning as a tool in their creative process. Their new album explores Google AI’s research project, Magenta, an open-source music-making package using machine learning models.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557347400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"5e7b35f1-c7e7-49c7-9c35-3944ba3ccd0d\",\"caf8a0ef-2591-4798-9168-c0eb2a4c0f25\",\"e5de6f4a-97c5-46af-8b57-1e40b5f0cc70\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"1bbd42a2-3ba3-4b99-88da-48474fc3bb91\",\"code\":\"T1BBD4\",\"title\":\"Create App-like Experiences on Google Search and the Google Assistant\",\"description\":\"Learn how to create interactive, app-like experiences that engage users right on the Google Search results page and the Google Assistant. Also, learn more about the early adopters program and be one of the first to use this unique new functionality.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_search\",\"topic_assistant\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557270000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"1b2a3e8b-c377-47c7-8efd-cb68dbd6755e\"],\"relatedSessions\":[\"40a400cf-aa8d-4510-8491-07d1e0248f06\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151086\",\"section\":\"\"},{\"id\":\"1d9c02ed-bdc5-4a32-90bc-7316d6d1fb55\",\"code\":\"T1D9C0\",\"title\":\"Beyond Mobile: Material Design, Adaptable UIs, and Flutter\",\"description\":\"The Material Components library has grown since Flutter's launch. Learn what's new, how to use it with our iOS Design Language library Cupertino, and how to apply it across varying screen sizes, interaction models, and viewing distances.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_flutter\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557266400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"63d5cf0c-0118-411c-ad8f-b0f0efd57ac0\",\"fddfb656-f859-4de9-8a66-3ce4ea9fe347\"],\"relatedSessions\":[\"37261739-76c8-45fe-a8a8-5cd9b1a894c2\",\"e27b4b52-fc95-429b-9965-9c835d6156d3\",\"0cedc311-b646-4b29-b952-d7c7a832bfbd\",\"03d8425c-54ca-437b-bac7-ece76cca8347\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150937\",\"section\":\"\"},{\"id\":\"215637c7-6ffe-4a71-a0f7-df538f8e460a\",\"code\":\"T21563\",\"title\":\"Lightning Talk: Google Developer Story\",\"description\":\"Building TensorFlow into your Android app - a story of how an intelligent app was built to help farmers fight pests and disease in the fields of Uganda.\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"topic_ml/ai\",\"type_lightningtalks\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557338400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"dc5e2e21-79c6-41a5-b517-d0f84d998cce\",\"39429ef0-b2e2-4427-b875-0f6f69325024\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"24560bcc-5ad9-473f-80fb-31af62c2a460\",\"code\":\"T24560\",\"title\":\"What’s New in the Google Cast SDK\",\"description\":\"Each day, millions of users press the Cast button to launch entertainment on Cast enabled devices. Learn new capabilities and features for live and ad supported content to help you easily deliver a great experience for your users with the latest version of the SDK. This session will also cover an exciting new feature that helps your users discover and browse your content on Smart Displays.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_assistant\",\"topic_iot\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"74c3cb3b-95d2-4bf5-a608-218f8a9a6ca9\",\"cb9ab65b-e322-4e34-b16a-574d946d6110\"],\"relatedSessions\":[\"0e6c7d8d-8110-4f61-8440-15950bf570cd\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151084\",\"section\":\"\"},{\"id\":\"280ec615-7a63-420a-9e74-05428da072f9\",\"code\":\"T280EC\",\"title\":\"Google Search: State of the Union\\t\",\"description\":\"Learn about the latest Google Search features and how to take advantage of the new APIs and capabilities to help optimize your content (text, images, and video) to be discovered on the Search results pages.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557426600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"93ab5296-620d-4f47-aef3-2fddf27f5613\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151094\",\"section\":\"\"},{\"id\":\"28b73d33-c475-45e3-a298-ee6f3831ca5f\",\"code\":\"T28B73\",\"title\":\"Lightning Talk: Real-time Updates to 1000's of Clients with Cloud Firestore\",\"description\":\"In this lightning talk you will learn how Cloud Firestore enables you to keep your application data in sync across different devices for thousands of users. Watch a demo simulating tens of thousands of clients, syncing them in seconds, tracking data changes with help of Cloud Functions and BigQuery, and visualizing all this with DataStudio. No slides, just fun with source code, queries, and DataStudio.\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"topic_firebase\",\"topic_cloud\",\"type_lightningtalks\"],\"startTimestamp\":1557439200000,\"endTimestamp\":1557441000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"c661dcd4-c92d-4d1c-b52b-3d45869d4883\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"29485644-22a9-4138-a2d8-b2112a515a0d\",\"code\":\"T29485\",\"title\":\"Declarative UI Patterns\",\"description\":\"Explore how reactive and declarative paradigms can be applied to Android UI development, making it easier for developers to integrate these patterns into their Android apps with Kotlin.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"type_sessions\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"4b3b400c-d37d-4a0b-b957-c70cae8d2ee3\",\"662d1a69-3ec0-4565-9ba6-bcfc2ffb9f0e\",\"a4761ca1-33c5-48a9-a726-2b25a646ebcc\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101156630\",\"section\":\"\"},{\"id\":\"29766c96-aacc-4f76-a74b-e9ae03a700aa\",\"code\":\"T29766\",\"title\":\"Prototyping Voice Experiences: Design Sprints for the Google Assistant\",\"description\":\"Design Sprints are well understood for prototyping traditional digital experiences, but when it comes to running a Sprint for a conversational design experience the format must be adjusted to include not just voice prototyping, but also training and improvisation methods. In this talk, learn the technical aspects of structuring and running a Conversation Design Sprint, highlighting partner Google Assistant experiences created with this format.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_assistant\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557266400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"4cbfff94-349b-42bb-9d7b-2683479c0e25\",\"d17108a0-4797-4c24-b8a5-4e06e3c72b97\"],\"relatedSessions\":[\"0e6c7d8d-8110-4f61-8440-15950bf570cd\",\"7539def1-1ee2-4786-890e-35a608abd98f\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150946\",\"section\":\"\"},{\"id\":\"2bb62251-ae83-43d6-ab8f-d33f857c7473\",\"code\":\"T2BB62\",\"title\":\"Introducing Google Coral: Building On-Device AI\",\"description\":\"This session will introduce you to Google Coral, a new platform for on-device AI application development and showcase it's machine learning acceleration power with TensorFlow demos. Coral offers the tools to bring private, fast, and efficient neural network acceleration right onto your device and enables you to grow ideas of AI application from prototype to production. You will also learn the technical specs of Edge TPU hardware and software tools, as well as application development process. \",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_opensource\",\"topic_ml/ai\",\"topic_iot\",\"type_sessions\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"1a563952-7f4f-4d4b-9fee-2173627c7d09\"],\"relatedSessions\":[\"dc839134-9b71-4dea-a32d-2c89475f740c\",\"700b4961-56f8-43ed-a89a-80688ba179f7\",\"76fca151-5951-440c-b822-92f8394d9af1\",\"f6510f00-1f37-49ab-810c-c9d37a2cfa8a\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150933\",\"section\":\"\"},{\"id\":\"2bba93eb-22c2-403f-9086-b84d52b01e9a\",\"code\":\"T2BBA9\",\"title\":\"What's New in Architecture Components\",\"description\":\"Learn the latest changes in Architecture Components as well as new libraries for 2019.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"35155de0-bf0a-4c91-a017-4f05d21ab97e\",\"1c316f6e-ec29-4650-8556-3650f578812e\",\"eb9caeff-450e-451e-a1a4-d85c6bb7cb08\",\"d14366fe-1b3e-4496-b792-52d12a796ea8\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150924\",\"section\":\"\"},{\"id\":\"2d0cb491-325a-48fb-8eea-6a9452f3b33b\",\"code\":\"T2D0CB\",\"title\":\"Jetpack Navigation\",\"description\":\"Dive into what's new and learn the best practices for working with Navigation, given the changes in the Navigation Architecture Component since its first 1.0 alpha.        \",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557351000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"c1ee9879-b6fd-4d3b-a33e-8002612f8168\",\"eb9caeff-450e-451e-a1a4-d85c6bb7cb08\",\"7fb85938-994c-455e-b49b-ebcb7c240671\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150816\",\"section\":\"\"},{\"id\":\"2dff8754-7168-4895-a623-b6a842c64906\",\"code\":\"T2DFF8\",\"title\":\"Designing for Accessibility\",\"description\":\"In this session you will hear from two people who are working to make the world an easier place for those with disabilities to navigate.  First, Elise Roy will share her own personal story of how becoming deaf at the age of 10 became her greatest gift. A former human rights lawyer, she realized that design thinking can be used to help solve some of our world's biggest problems.  Next, Google's Michael Brenner will share how Project Euphonia is leveraging Google technologies to give people with speech impairments their voice back.\\n\\n\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_accessibility\",\"topic_ml/ai\",\"topic_keynote\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"f0129e5e-3df7-4317-a3da-ab24a39550e7\",\"27dedae4-a3a6-4eac-aa29-6e60f3455635\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"2e023466-e21b-48a4-ae9b-ef22bc3f451f\",\"code\":\"T2E023\",\"title\":\"Build Apps for Foldable, Multi-Display, and Large-Screen Devices\",\"description\":\"Learn about foldable displays, multi-display devices, and large screen device support on Android and how to get your apps ready for these environments.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557277200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"ae8ac67a-ef5e-40fb-a076-c03997e3f1cc\",\"61ceb7b6-5f2e-40b7-9d70-0bd89f44e6b1\",\"530b0d36-2d8c-43e6-a223-ade62bf0c7cd\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150884\",\"section\":\"\"},{\"id\":\"30216179-8855-4e01-89ba-9df2c21ca658\",\"code\":\"T30216\",\"title\":\"Lightning Talk: AI for Accessibility\",\"description\":\"During this talk, you will see the journey of utilizing decades of cutting edge machine learning research for social good. See how Live Transcribe, an Android Accessibility service, is an example of using speech recognition technology. purpose built for the deaf and hard of hearing.\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"topic_accessibility\",\"topic_ml/ai\",\"type_lightningtalks\"],\"startTimestamp\":1557417600000,\"endTimestamp\":1557419400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"149ebd98-7436-4082-a21c-0cbc44f1a44a\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"355db489-2c90-4d11-8b31-b27aba737545\",\"code\":\"T355DB\",\"title\":\"Large Scale Multiplayer Gaming with Open Source\",\"description\":\"Building matchmaking platforms and dedicated game server orchestration can be a lot of work. It can also be a distraction from building your actual game. In this talk, you'll learn how to use open source projects like Agones and Open Match together, for a comprehensive matchmaking and game server hosting solution. The session will cover advanced features such as auto scaling to ensure you can handle everything your game launch needs!\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_opensource\",\"topic_cloud\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"4f03c0a8-de0a-4d59-9be8-06c6ebbe6155\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150959\",\"section\":\"\"},{\"id\":\"37261739-76c8-45fe-a8a8-5cd9b1a894c2\",\"code\":\"T37261\",\"title\":\"Building for iOS with Flutter\",\"description\":\"In this talk, you'll learn how to put Flutter's Cupertino package to work building interfaces that iOS users will enjoy, plus some techniques for keeping as much of your code multi-platform as possible. You'll also get a deep dive into how to access iOS platform APIs like sensors and storage from within a Flutter app.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_flutter\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"3972b72e-c5c3-4892-8d77-bd052992d930\",\"78e04e9a-11b0-47d0-9a20-8350018f046d\"],\"relatedSessions\":[\"664c8a66-50d8-41d5-933c-0983f878b377\",\"1d9c02ed-bdc5-4a32-90bc-7316d6d1fb55\",\"03d8425c-54ca-437b-bac7-ece76cca8347\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150907\",\"section\":\"\"},{\"id\":\"37bd94a6-a666-4267-aa32-d51fcc18ec03\",\"code\":\"T37BD9\",\"title\":\"What’s New in Android Machine Learning\",\"description\":\"Come and find out the latest development of Android on-device machine learning including, Android platform, ML Kit, and TensorFlow Lite.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_firebase\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557280800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"efa26f46-4700-47b9-9adb-92cf698603ec\",\"7b341228-79f8-48b1-8898-8abed9a280f5\",\"dfd873e6-c403-40d3-affc-a26a29871a64\",\"52514b92-7e9b-495f-8b9c-94af5224826b\"],\"relatedSessions\":[\"6d370b14-09f2-4b3b-9ef0-19eaad044ee2\",\"be2fd9b7-168f-49c2-9e3a-947049990bf9\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150819\",\"section\":\"\"},{\"id\":\"38275873-cc16-4c6e-bb56-abff62febaf5\",\"code\":\"T38275\",\"title\":\"Making the Right Decisions for Your Serverless Architecture\",\"description\":\"There are many things to keep in mind when deciding which building blocks to work with for a serverless application. This session will discuss an end-to-end service built solely on serverless technologies, explain the thought process and methodology, and introduce the constraints of working in environments without persistence. From functions to containers this session will show off some exciting new technologies and dig into how Google has built them.\\n\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_opensource\",\"topic_cloud\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557369000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"6ca68646-7d53-4355-a3d7-11e2aa081dd3\",\"4df504e8-a24e-4ca9-9965-e11022e96b56\"],\"relatedSessions\":[\"9439ad0c-1061-4f03-8937-6e8f9e5beaf0\",\"bae3bd8b-33ef-403a-abf9-a884582131c0\",\"a0b42b3d-9e08-47fa-8136-e903c8fffa9d\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151013\",\"section\":\"\"},{\"id\":\"38f647d5-cd0b-484e-ad07-e396b0308e68\",\"code\":\"T38F64\",\"title\":\"Local Technologies for the Smart Home\",\"description\":\"Local, on-device technologies enhance the current smart home API by reducing latency, increasing reliability, and enabling new features like seamless setup of smart devices. This talk will dive deep into a new SDK that enables developers to locally communicate with and control their smart devices, along with providing a preview of what’s to come.\\n\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_assistant\",\"topic_iot\",\"type_sessions\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"5607a37f-7b70-4407-b0cb-9f5f1652d231\",\"a8b55f1a-4cc2-481f-9d6d-1e686b2e87f4\",\"8ad29b9b-bd00-4c32-a85a-66e540313aa1\"],\"relatedSessions\":[\"f76a49c1-bdb3-4041-8616-565edce346a2\",\"db8c26f5-2ac5-4b2b-922d-ca69765ff72c\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150915\",\"section\":\"\"},{\"id\":\"3d6b2b18-c206-41f9-98bc-69fd75136814\",\"code\":\"T3D6B2\",\"title\":\"AR as a Feature: How to Supercharge Products Using Augmented Reality\",\"description\":\"Augmented reality is a powerful technology that allows us to understand the real world context that surrounds our users. The ability to see and understand the world, combined with the ability to place spatially bound content inside of it, can unlock use cases that were previously unattainable. Learn product areas where AR significantly improves the user experience or unlocks an entirely new use-case for a product.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_augmentedreality\",\"type_sessions\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557426600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"f852d19c-f271-4653-b089-c9b3abd44683\",\"5147b370-a8d9-4291-a8b8-cd00409b2ba2\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151008\",\"section\":\"\"},{\"id\":\"3db321d1-5cf7-40e4-a2b5-e7604c1daddc\",\"code\":\"T3DB32\",\"title\":\"Lightning Talk: Introduction to the Perception Toolkit\",\"description\":\"Learn how the camera can help people use your website, letting them find things on your website by identifying bar codes, QR codes or 2D images. The Perception Toolkit makes it easy to add camera session creation, target identification, and user experience to your website, all hosted on your website and using the content you already have today.\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"type_lightningtalks\",\"topic_chromeos\",\"topic_web\"],\"startTimestamp\":1557421200000,\"endTimestamp\":1557423000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"dc9a17b8-ba6d-4b02-baf6-76849aaf586f\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"3dffdb72-e79a-4511-a65e-9656967beda9\",\"code\":\"T3DFFD\",\"title\":\"Developing the First AR Experience for Google Maps\",\"description\":\"A behind the scenes look at the development process and technology powering the upcoming AR experience in Google Maps. In this session we'll cover why this is such a big technical challenge, how we're approaching the UX design process, and advice for others looking to design world scale AR experiences.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_augmentedreality\",\"type_sessions\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"71ceb9b2-af3b-40c2-a2f9-075cc75fee76\",\"2a70e847-d0a7-49d1-92c6-ded3feb38411\",\"6179c26d-d4a5-4a43-b672-5734b4a54e49\"],\"relatedSessions\":[\"16cb2916-04ba-4474-a091-122dc1c2c025\",\"b3fc900a-6ecd-48a4-9021-769c548758af\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151078\",\"section\":\"\"},{\"id\":\"3ef4f014-d42c-49f5-8f89-c95968a4b61e\",\"code\":\"T3EF4F\",\"title\":\"From Systrace to Safetynet: Android Game Development Case Studies\",\"description\":\"In this talk, you will see case studies of popular games that have used Android best practices to improve their game development, launch, stability, and live operations. The session will include details on using Systrace to fix frame-rate issues, implementing SafetyNet and License Verification, fixing ANR bugs reported by Android Vitals, tracking Play Instant Games referrals, as well as designing client and server integration to support Smartlock sign-in.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"757de07c-fc43-4731-b74c-b4e45fe6b048\",\"883b10c8-89a6-4fa8-91cf-b7d8dde06171\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151034\",\"section\":\"\"},{\"id\":\"3f2deebd-83a8-4ca8-99f9-da465e50bbd5\",\"code\":\"T3F2DE\",\"title\":\"Managing IoT Storage with Google's Cloud Platform\",\"description\":\"We all know IoT is expanding quickly. 20 billion devices connected over the next 5 years. Estimates say IoT devices by 2025 will be generating 40 zettabytes of data per year. And where do you put all that data? In this session, learn some of the storage and data warehousing options Google Cloud Platform has to offer and how the data gets there. Demos will demonstrate performance capabilities and tradeoffs of each option.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"topic_iot\",\"topic_cloud\",\"type_sessions\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"59e36e08-01e4-4a3a-9e85-edafae429c0d\",\"9c7c8916-86e5-4a3f-bcde-1ce6e9b8947a\"],\"relatedSessions\":[\"472de680-6767-434d-b9c4-35e62a5ba109\",\"4e894789-e63b-4922-8379-ccbf968aa37d\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150949\",\"section\":\"\"},{\"id\":\"40a400cf-aa8d-4510-8491-07d1e0248f06\",\"code\":\"T40A40\",\"title\":\"Enhance Your Search and Assistant Presence with Structured Data\",\"description\":\"Learn how to surface your engaging content on Google Search and the Google Assistant. Come to this session to see how to mark up your web content with structured data so it can be readily available to more users, across more devices.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_search\",\"topic_assistant\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"2ecd1e65-4147-4a72-b68a-9e9fe2460cf3\",\"bc50a57d-47da-40a6-b8f7-b11c9274e7e8\"],\"relatedSessions\":[\"fc4a76a0-5907-4c6a-b1b1-074fc7649043\",\"1bbd42a2-3ba3-4b99-88da-48474fc3bb91\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150913\",\"section\":\"\"},{\"id\":\"4193407b-06c1-4f4c-bccc-d3baae74de67\",\"code\":\"T41934\",\"title\":\"Understand and Engage Your Top Users with Dynamic Audiences\",\"description\":\"Identifying key segments of your user base is critically important to providing your users with delightful app experiences. Using the latest tools in Google Analytics for Firebase, you can build audiences with unprecedented precision and engage users to personalize their experience in your app and to drive key outcomes.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_firebase\",\"type_sessions\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557369000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"05f8f393-cf0b-4fe5-b0ad-79968997cbbf\",\"f5793f26-1c05-433c-8ad1-b7d00a1d707f\",\"5d02faa0-5c57-4d4f-a545-1053df7beb60\"],\"relatedSessions\":[\"843aaa36-bd70-4c0d-bfb0-0bfba70035d0\",\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"6e9c5794-226b-4f04-bfe9-c346ba3ff62c\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151000\",\"section\":\"\"},{\"id\":\"440e536b-9181-4bb7-90e1-a9d98742d46f\",\"code\":\"T440E5\",\"title\":\"Machine Learning Magic for Your JavaScript Application\",\"description\":\"TensorFlow.js is a library for training and deploying machine learning models in the browser and in Node.js and offers unique opportunities for JavaScript developers. In this talk, you will learn about the TensorFlow.js ecosystem: how to bring an existing machine learning model into your JS app, re-train the model using your data and go beyond the browser to other JS platforms. Come see live demos of some of our favorite and unique applications!\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_opensource\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"9e49f28d-0205-483e-a88e-7d1f7e145a1e\",\"9f3124bb-33b4-4a81-9d29-3dd28470367a\"],\"relatedSessions\":[\"cdfe88b0-be81-417a-8c01-8b3ecbf824d6\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150900\",\"section\":\"\"},{\"id\":\"472de680-6767-434d-b9c4-35e62a5ba109\",\"code\":\"T472DE\",\"title\":\"Connect Thread Devices to the Cloud with IoT Core\",\"description\":\"Come see the future of IoT connectivity, hear about Thread, and learn how you can use IoT Core connect to directly to low power devices with no gateways in between. Thread works just like WiFi devices and is a short range, low power, mesh networking standard that Google helped pioneer. This session will cover enabling CoAP in Cloud IoT Core, building and deploying code to embedded devices running the OpenThread stack, and creating a simple application to view data and control the devices.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"topic_iot\",\"topic_cloud\",\"type_sessions\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"089bc350-c867-4320-b0e5-ec11cadf6a49\",\"9a69b11a-2530-4bef-b691-f0f456d16077\"],\"relatedSessions\":[\"4e894789-e63b-4922-8379-ccbf968aa37d\",\"3f2deebd-83a8-4ca8-99f9-da465e50bbd5\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151085\",\"section\":\"\"},{\"id\":\"4779aa42-742c-4173-a97f-75757272558c\",\"code\":\"T4779A\",\"title\":\"Modern Web Testing and Automation with Puppeteer\",\"description\":\"Puppeteer is a Node library developed by the Chrome DevTools team for testing and automating headless and full Chrome. In this talk, learn how to easily setup Puppeteer for modern testing in different browsers and highlight other interesting use cases of headless Chrome: e2e workflows, tooling integration, \\\"the browser as a service\\\", CI/CD, using Puppeteer for local development, and more.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"8a38ba29-5975-4a0a-82ea-bc4b3712f94e\",\"4622e4bb-fc0d-42ca-bb53-0f52265d8f2d\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151090\",\"section\":\"\"},{\"id\":\"48fd777b-5609-4328-bbab-ddf0a6ab453c\",\"code\":\"T48FD7\",\"title\":\"Performance in Android Q\",\"description\":\"Learn about changes to Android performance in Q.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"e7b7180d-511e-4176-830e-7926657cb22d\",\"36a8b4ce-0195-4be8-8ac9-b7c452ffbaad\",\"e49d5529-e67c-4c31-bd05-7c5e7f9b6ec2\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101156816\",\"section\":\"\"},{\"id\":\"49b9e43c-9241-4a2f-a7c6-6668e5efa020\",\"code\":\"T49B9E\",\"title\":\"Securing Your Apps and User Data with Google Cloud\",\"description\":\"You're a developer. You think security is overwhelming. Don't sweat it. In this session, learn about how GCP provides easy-to-use access control, keeps your software dependencies patched with the latest security updates, scans your libraries for vulnerabilities, and minimizes attack vectors.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_cloud\",\"type_sessions\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"1cccda14-996e-4809-a27b-fc20da34649e\",\"47185a15-d7cf-4597-9e0f-9e851b105e6d\"],\"relatedSessions\":[\"bae3bd8b-33ef-403a-abf9-a884582131c0\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150943\",\"section\":\"\"},{\"id\":\"4cdd18e0-d917-41ff-bb3b-433bae600c57\",\"code\":\"T4CDD1\",\"title\":\"Next-Generation 3D Graphics on the Web\",\"description\":\"This talk will cover the latest updates for adding 3D to your web site. You'll learn how to use <model-viewer> and new features for rendering, AR, and interactivity. You'll also see some phenomenal sites created with three.js. Then you'll get an overview of the WebGPU API that will provide modern features such as “GPU compute” as well as lower overhead access to GPU hardware and better, more predictable performance. Expect performance gains in Tensorflow.js up to 10x.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557444600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"77f8f9e4-f907-4205-acbd-2fde4785a539\",\"d1a465f0-5e1f-4a59-a7a8-2b1c74d6598b\"],\"relatedSessions\":[\"82aba302-8396-4068-b014-74e8592b3a06\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150954\",\"section\":\"\"},{\"id\":\"4e894789-e63b-4922-8379-ccbf968aa37d\",\"code\":\"T4E894\",\"title\":\"IoT with Sigfox and Google Cloud\",\"description\":\"Join this session to learn about the new Sigfox-Google Cloud integration. Understand the value of Sigfox global LPWAN radio connectivity together with Google Cloud services such as real-time data ingestion, processing, analytics, and machine learning. See how the integration works (stateless, event-driven, scale-out and low cost) and experience end-to-end live demonstrations using microcontrollers with Sigfox radios and Google Cloud serverless backends.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_iot\",\"topic_cloud\",\"type_sessions\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"a5ea4c43-eb1a-4af8-b546-56d81fdb3819\"],\"relatedSessions\":[\"472de680-6767-434d-b9c4-35e62a5ba109\",\"3f2deebd-83a8-4ca8-99f9-da465e50bbd5\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150948\",\"section\":\"\"},{\"id\":\"50bbf64a-1cc4-4169-b91b-1b124b769d07\",\"code\":\"T50BBF\",\"title\":\"Building Successful Websites: Case Studies for Mature and Emerging Markets\",\"description\":\"Investing in the web has led to broader reach, meaningful engagement, and business impact for companies around the world. Come hear directly from them on how they are building successful websites for users in different network conditions, on a wide range of device-types, platforms and operating systems.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557273600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"958f7550-6a00-485d-842b-a125ac609553\",\"2a819a33-88b1-4984-8dd6-55b9e7c7d531\",\"f9022309-8188-4e6e-a6f2-673f00cb517c\",\"09bdbbfb-557b-405c-9d62-488f164ea11b\",\"966e750a-43c9-47ce-958c-8d5187b89378\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150951\",\"section\":\"\"},{\"id\":\"51619260-4d01-4d74-a329-db9932b5fd7b\",\"code\":\"T51619\",\"title\":\"Build a Modular Android App Architecture\",\"description\":\"Finding the right architecture for the problem sets we face as Android developers still feels like a complicated task, even with all the libraries that promise to fix a lot of them. This talk covers best practices and patterns you can apply in different use cases to ensure you’re building a robust, solid, and extensible Android architecture.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557270000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"35155de0-bf0a-4c91-a017-4f05d21ab97e\",\"0066b1af-e2c8-4f63-9dee-b151b39d1c3f\"],\"relatedSessions\":[\"f4d904d5-28ab-4e9b-9f63-6984bc405272\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150929\",\"section\":\"\"},{\"id\":\"5311d3a8-03b4-4ae7-ba22-a3990ef1913a\",\"code\":\"T5311D\",\"title\":\"Rapidly Building Better Web Experiences with AMP\",\"description\":\"AMP set out with the vision to bring reliably fast performance to the web. We are now expanding the format to new mediums like email and stories while ensuring AMP has a positive return on investment for the millions of sites that use it. Come along for a whirlwind tour on everything new with AMP in 2019.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_search\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"0614227e-be40-41a7-9af9-e58a8bd3446f\",\"57676e95-f331-4b20-b66a-7ae99ce0da6b\"],\"relatedSessions\":[\"181b9b09-4591-4079-8c4c-33dfdbcad85f\",\"6650b5a8-1378-4951-9d76-4fe1b4f237aa\",\"5cf69605-40ca-41e5-b010-5766bb13984a\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151026\",\"section\":\"\"},{\"id\":\"5459b7ee-d067-4576-9e12-91546cd5bcd0\",\"code\":\"T5459B\",\"title\":\"Build Bigger, Better: Gradle for Large Projects\",\"description\":\"Codebases grow larger over time, and many developers struggle with how to structure their builds so that they're fast, correct, and easy to maintain. This session will explore how AndroidX libraries use Android Studio and Gradle, what things have worked well, and what you should avoid. The talk will include tips for using the Android Gradle Plugin and introduce you to new features that have been added to help users.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"22f8a7d4-1dc4-4d9d-8839-39f05c894665\",\"7177b14e-9679-4ca9-a050-4d2fae215fdf\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150893\",\"section\":\"\"},{\"id\":\"5a5e8a00-6c5b-4d28-b378-465fd9e48ed4\",\"code\":\"T5A5E8\",\"title\":\"Taking Chrome Full Screen with Trusted Web Activities\",\"description\":\"A Trusted Web Activity (TWA) displays a full screen Chrome browser inside of an Android app with no browser UI. Although Android apps routinely include web content using a Chrome Custom Tab (CCT) or WebView, a TWA offers unique advantages when you need Chrome’s performance and features in your app in full screen mode. This talk will cover how to get started using a Trusted Web Activity, case studies and quality criteria for inclusion in the Play store. \",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557433800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"03748bc4-8c99-4cf0-98ab-d5e7a6c29cdf\",\"8825f231-9859-48b7-85b3-89fbbee5891e\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151024\",\"section\":\"\"},{\"id\":\"5b2a3d11-20fd-4940-8956-a521e5085550\",\"code\":\"T5B2A3\",\"title\":\"Understanding Android Runtime (ART) for Faster Apps\",\"description\":\"Learn more about how Android Runtime, for Java or Kotlin programming languages, makes it easier to write a great Android app with improvements in debugging and profiling, install and launch times, and garbage collection.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"type_sessions\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"a879a947-ad10-4031-8822-b423dd4c124a\",\"b9adc138-fdcc-4a87-8f75-e481ddb00198\",\"4f440a3c-2c3b-471f-9968-5ed08a2000c1\",\"d30339f4-dc26-4c44-95da-0b9caf167563\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150889\",\"section\":\"\"},{\"id\":\"5cf69605-40ca-41e5-b010-5766bb13984a\",\"code\":\"T5CF69\",\"title\":\"AMP Story: Visual Stories for the Web\",\"description\":\"As people’s mobile consumption habits shift, more visual forms of storytelling are gaining popularity. However, the story format, while popular in some apps, is not widespread across the open web. In this talk, you’ll learn more about AMP stories, how to build them, and how Google is surfacing stories within its own experiences, including Search.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_opensource\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557423000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"0924a755-17a4-439e-a403-210e17e1e53d\",\"a6b0b170-02a1-4d44-afde-06057ba6d115\"],\"relatedSessions\":[\"5311d3a8-03b4-4ae7-ba22-a3990ef1913a\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151088\",\"section\":\"\"},{\"id\":\"5d8b65d2-5369-4f0e-ba3c-ea048fd80999\",\"code\":\"T5D8B6\",\"title\":\"Designing Human-Centered AI Products\",\"description\":\"Want to learn how Google develops human-centered AI products—and how to avoid common AI-design pitfalls? The People+AI Research (PAIR) team will share insights from the new People+AI Guidebook, which has steered design and development over the past year. Through recommendations, frameworks, and examples, you’ll learn how to assess whether a problem is a good fit for ML, collect representative training data, and help users understand how to interact with AI systems.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_ml/ai\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557351000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"a80a9e69-2d9f-4b0e-8ffd-18dbdda38be0\",\"b1e39fa5-3db3-4dc6-b89c-9cf3eca0ecfb\"],\"relatedSessions\":[\"8885b540-24f6-4f85-9c3c-278c225fde60\",\"c07cff11-3e52-4369-8434-607d99cac75d\",\"8acb1b91-ac5f-410a-a381-664f77e53b9a\",\"e27b4b52-fc95-429b-9965-9c835d6156d3\",\"9064cbcb-4d86-477a-9b28-d2a0e8b565ce\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150945\",\"section\":\"\"},{\"id\":\"5dbaabba-a753-4337-944c-b531d867369a\",\"code\":\"T5DBAA\",\"title\":\"The State of Unity on Android\",\"description\":\"Unity is meaningfully improving on Android by leveraging Vulkan and multithreading to both improve performance and productivity on Android. In this session, you will learn about the latest improvements and how they impact day to day game development on Android. \",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_android/play\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557280800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"d41cb407-95e8-42e1-933d-22b518ae29d6\",\"a02d201a-c8f4-46f7-8a2f-0576834b22b7\",\"c14634fd-8be5-4e98-8fdb-46ba0cf99d2f\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151100\",\"section\":\"\"},{\"id\":\"601ad7a6-8c0c-46ce-bca8-239986ff6357\",\"code\":\"T601AD\",\"title\":\"Data and Insights to Build for the Digital Assistant Era\",\"description\":\"Digital assistants are becoming an integral part of our everyday life. In this session, we’ll share research we’ve conducted with consumers and developers in the past two years on how this technological shift is changing user behavior, along with insights on how developers for the Google Assistant can best help their users in this space.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_assistant\",\"topic_misc\",\"type_sessions\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557433800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"12598363-14d1-443f-80bb-70edb3a31bba\",\"6e7c2c87-5b70-432f-8836-2de7e433ac17\"],\"relatedSessions\":[\"fc4a76a0-5907-4c6a-b1b1-074fc7649043\",\"f76a49c1-bdb3-4041-8616-565edce346a2\",\"00662f82-3947-4b81-974c-cae386be201c\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151005\",\"section\":\"\"},{\"id\":\"6025078c-dccb-4ffe-b250-610670182c71\",\"code\":\"T60250\",\"title\":\"What’s New in JavaScript\",\"description\":\"This presentation gives an overview of cutting-edge JavaScript development techniques to build modern web and Node.js apps. Discover which features to expect in Chrome and Node.js soon, how the V8 engine optimizes for them, and how to improve real-world performance and stability on the Web and in Node.js.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557347400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"8b45e38f-4225-4aa8-9317-cb74b6cc9364\",\"d71ae955-1452-42e9-8e40-62bade109e23\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151027\",\"section\":\"\"},{\"id\":\"62c1e8f8-537e-4344-87c1-003a53ebea96\",\"code\":\"T62C1E\",\"title\":\"Kotlin Under the Hood: Understand the Internals\",\"description\":\"Kotlin offers great, modern language features and a rich set of extensions. But it's not always obvious to the developer what's happening under the hood. This session will help you understand better what these features and extensions are doing internally. It will also show how you can use the tools that Android offers to find this kind of information on your own.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"4b3b400c-d37d-4a0b-b957-c70cae8d2ee3\",\"393bf114-7e4b-4224-8b3f-c1afab0d2dfd\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150899\",\"section\":\"\"},{\"id\":\"65db176c-4f22-4533-8703-7a59cc4783b1\",\"code\":\"T65DB1\",\"title\":\"App Growth Best Practices and Decision-Making with the Google Play Console\",\"description\":\"How do you stack up against the competition? Get a first look at new features and exclusive insights that will power your business decisions. Google's new benchmarks and audience data will help you identify new opportunities for growth. A must-attend session for anyone who’s ever wondered where they should focus their resources to gain a competitive edge.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"747ded15-8288-4649-82e4-59284415f405\",\"d8a35b94-281e-4a34-895c-30372e732836\",\"af23f052-3359-4d62-9c95-e23de7a45c94\",\"8fdfa5cc-8375-4410-9f1f-ed23540ac2e0\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150925\",\"section\":\"\"},{\"id\":\"664c8a66-50d8-41d5-933c-0983f878b377\",\"code\":\"T664C8\",\"title\":\"Dart: Multi-Platform, Productive, Fast — Pick 3\",\"description\":\"Dart is Flutter's secret sauce – enabling amazing application experiences without compromises. Learn how a carefully coordinated set of runtimes, compilers, libraries, and language features allows Dart to provide a delightful developer experience that produces fast, high-fidelity, production applications that run across multiple platforms.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"topic_opensource\",\"topic_flutter\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"3e8c3d43-a4ab-4976-847c-6e93dcd86d7d\",\"c0943332-b3f5-4eeb-b030-6ca8c13c1d86\"],\"relatedSessions\":[\"37261739-76c8-45fe-a8a8-5cd9b1a894c2\",\"0cedc311-b646-4b29-b952-d7c7a832bfbd\",\"03d8425c-54ca-437b-bac7-ece76cca8347\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150906\",\"section\":\"\"},{\"id\":\"6650b5a8-1378-4951-9d76-4fe1b4f237aa\",\"code\":\"T6650B\",\"title\":\"How to Build an E-Commerce Site with AMP\",\"description\":\"More and more, companies are using AMP to create e-commerce and other interactive sites. But any new framework introduces new challenges! Learn about our AMP e-commerce site to find the best ways to create a site that works well for users and for programmers. Come to this session to learn how to build an interactive AMP site of the future!\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557419400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"71fbd3af-06b6-49d6-b6e5-aa3380793101\",\"16e39c2e-882d-4455-8690-ad7dc09c48bf\"],\"relatedSessions\":[\"5311d3a8-03b4-4ae7-ba22-a3990ef1913a\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151020\",\"section\":\"\"},{\"id\":\"669d342d-4090-4783-b267-b5e45c616442\",\"code\":\"T669D3\",\"title\":\"Lightning Talk: Building Web Apps like Google with Angular, Bazel, and GCP\",\"description\":\"Modern enterprise-scale web applications involve a complicated build pipeline. In tandem, JavaScript tooling scales to a given level above which, the build and the round-trip times grow exponentially, crushing the development experience. In this session, see how to solve this problem with remote caching and massive build parallelization using remote build execution (RBE). Learn how to build with GCP and Bazel, and watch a demonstration of incremental deployment through Angular CLI.  \",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_lightningtalks\",\"topic_web\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557345600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"0a5fdbb8-2b99-45c4-a62a-79dc95e8888d\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"684af260-3e21-4c71-acf4-39775d5c0ea3\",\"code\":\"T684AF\",\"title\":\"What's New in the Android Studio Build System\",\"description\":\"Learn what's new in the build system used by app developers, including how to use new features and APIs.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"bf373fa3-5782-4cca-9f06-9ec06f558169\",\"22f8a7d4-1dc4-4d9d-8839-39f05c894665\",\"a92210fa-bdd3-4594-a431-cc9b9521e345\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150818\",\"section\":\"\"},{\"id\":\"6aeb379c-57d7-4828-8c0e-f259bfb2af8e\",\"code\":\"T6AEB3\",\"title\":\"Lightning Talk: Faster Web Navigation with Predictive Prefetching\",\"description\":\"In this talk, learn how Guess.js implements predictive prefetching for speeding up users' navigation experience! Using a report from Google Analytics and considering users’ connection speed, you'll see how to prefetch only the JavaScript which is likely to be needed in subsequent navigations, reducing the number of round trips and over fetching.\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"type_lightningtalks\",\"topic_chromeos\",\"topic_web\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557342000000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"84de63e7-8428-4c05-8bc3-d7491c350bea\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"6ccc06df-88ec-40fa-a227-71ec0482a85c\",\"code\":\"T6CCC0\",\"title\":\"New Tools to Optimize Your App's Size and Boost Installs on Google Play\",\"description\":\"Learn about the issues affecting the app install conversion funnel and how Google Play delivers your apps to users’ devices as reliable and as fast as possible, even under challenging conditions like limited free space or very slow networks. Take away new tools and best practices to optimize your app's size and boost conversion including the Android App Bundle.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557419400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"6f509185-e53a-4a2b-91ea-13a5e0939f15\",\"bb3e7093-7b24-47b8-b4eb-1624eab3b69a\",\"404059be-eed0-4f39-860e-7c1049d1c18a\",\"19d93e51-8de1-458e-8b3d-4e2c3ee4bea7\"],\"relatedSessions\":[\"f4d904d5-28ab-4e9b-9f63-6984bc405272\",\"b05736a8-4e3f-48e1-8240-7e47584bfd2f\",\"d4c4c260-6b77-4ee3-b323-9cf98580396f\",\"bd59f36f-198e-496a-8ea5-ac5108eb4108\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150821\",\"section\":\"\"},{\"id\":\"6d370b14-09f2-4b3b-9ef0-19eaad044ee2\",\"code\":\"T6D370\",\"title\":\"TensorFlow for Devices: The Options\",\"description\":\"Developers have an often confusing plethora of options available to them in using machine learning to enhance their mobile apps and edge devices. This session will demystify these options, showing you how TensorFlow can be used to train models and how you can use these models across a variety of devices with TensorFlow Lite.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_misc\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557270000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"dfd873e6-c403-40d3-affc-a26a29871a64\",\"80ed2da8-eb17-4599-a4d8-cc5c1fb16c85\"],\"relatedSessions\":[\"700b4961-56f8-43ed-a89a-80688ba179f7\",\"76fca151-5951-440c-b822-92f8394d9af1\",\"be2fd9b7-168f-49c2-9e3a-947049990bf9\",\"9064cbcb-4d86-477a-9b28-d2a0e8b565ce\",\"37bd94a6-a666-4267-aa32-d51fcc18ec03\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150831\",\"section\":\"\"},{\"id\":\"6e9c5794-226b-4f04-bfe9-c346ba3ff62c\",\"code\":\"T6E9C5\",\"title\":\"Turn Your App Data into Answers with Firebase and BigQuery\",\"description\":\"Turn your app data into answers with Firebase and BigQuery. When you link a BigQuery project to your Firebase app, you can export a range of data, query, and even join your own data sources to perform custom analysis. In this session, you’ll learn how to answer questions through hands-on tips for building queries. Want to take it further? Learn how to leverage Data Studio to build your own reports and dashboards on top of your Firebase BigQuery data.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_firebase\",\"type_sessions\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557419400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"95b55266-5856-43f0-af46-ae7430fca55f\",\"b8eb57f9-6a61-4609-aef8-8fce088448f9\"],\"relatedSessions\":[\"843aaa36-bd70-4c0d-bfb0-0bfba70035d0\",\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"4193407b-06c1-4f4c-bccc-d3baae74de67\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150836\",\"section\":\"\"},{\"id\":\"6ea4d66f-498a-4608-af18-beb490cd79b4\",\"code\":\"T6EA4D\",\"title\":\"What's New in Android Studio UI Design and Debugging Tools\",\"description\":\"In 2019, the Android team is refining the developer journey with a set of new tools for building modern interfaces. From building a layout to debugging views at runtime, this session will take you through a variety of steps that can help increase your productivity.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"51bad65f-7530-44c8-add4-75ceb95615e4\",\"986c1af0-c999-4edd-aed0-7071f1dcb4e4\",\"48791986-d718-4a97-bb1f-034d38bd1701\",\"fa8ce1d0-66e3-454c-b495-45dc34e7de90\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150927\",\"section\":\"\"},{\"id\":\"700b4961-56f8-43ed-a89a-80688ba179f7\",\"code\":\"T700B4\",\"title\":\"Machine Learning Zero to Hero\",\"description\":\"This is a talk for people who know code, but who don’t necessarily know machine learning. Learn the ‘new’ paradigm of machine learning, and how models are an alternative implementation for some logic scenarios, as opposed to writing if/then rules and other code. This session will guide you through understanding many of the new concepts in machine learning that you might not be familiar with including eager mode, training loops, optimizers, and loss functions.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_firebase\",\"topic_ml/ai\",\"topic_cloud\",\"type_sessions\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557426600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"b2a0ae05-69b2-4d36-9b0e-63312e02d07f\",\"dfd873e6-c403-40d3-affc-a26a29871a64\"],\"relatedSessions\":[\"82e1a3f6-2356-463a-9cf4-084740f66827\",\"6d370b14-09f2-4b3b-9ef0-19eaad044ee2\",\"81aafe87-a9ef-4daa-9f38-83112c2b0c58\",\"cdfe88b0-be81-417a-8c01-8b3ecbf824d6\",\"76fca151-5951-440c-b822-92f8394d9af1\",\"2bb62251-ae83-43d6-ab8f-d33f857c7473\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150931\",\"section\":\"\"},{\"id\":\"738a2b2e-7fa2-46a6-9802-eadf784655eb\",\"code\":\"T738A2\",\"title\":\"What's New in the Android OS User Interface\",\"description\":\"You’ve built a great app, and your users love opening it every day, but what if you could also help users when they’re not in your app? This year, Android is introducing new APIs to help you do this. The Bubbles API brings your app’s most important content to the user no matter what they’re doing on the device. Sharing Shortcuts provides new ways to share directly to your app’s contacts. This session will feature a technical deep-dive on getting started using these, and other, new APIs.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557423000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"da63ff58-4e6d-45b8-919c-8e7355a0799e\",\"b419f3a7-14b6-414f-a8b0-41e69e24a551\",\"cb32aa67-5f65-4aab-860c-90f0302f29e1\",\"efd58a22-830d-46db-b521-4b78422f69c0\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150926\",\"section\":\"\"},{\"id\":\"7539def1-1ee2-4786-890e-35a608abd98f\",\"code\":\"T7539D\",\"title\":\"Let’s Talk: Designing Quality Conversations for the Google Assistant\",\"description\":\"Heard about conversation design, but not sure how to apply it to your Action? A conversation designer and a developer will walk you through setting user expectations, handling unexpected user responses, and making improvements with user insights. Keep your Google Assistant users happy and coming back for more with these practical insights.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_assistant\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"5b557356-a66f-4c8d-b097-bf101212ba9c\",\"d04665be-37c3-4a3e-b6f9-347fc47c9fc7\"],\"relatedSessions\":[\"0e6c7d8d-8110-4f61-8440-15950bf570cd\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\",\"29766c96-aacc-4f76-a74b-e9ae03a700aa\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150914\",\"section\":\"\"},{\"id\":\"76fca151-5951-440c-b822-92f8394d9af1\",\"code\":\"T76FCA\",\"title\":\"AI for Mobile and IoT Devices: TensorFlow Lite\",\"description\":\"Imagine building an app that identifies products in real time with your camera or one that responds to voice commands instantly. In this session, you'll learn how to build AI into any device using TensorFlow Lite, and no ML experience is required. You’ll discover a library of pretrained models that are ready to use in your apps, or customize to your needs. You’ll see how quickly you can add ML to Android and iOS apps and learn about the future of on-device ML and our roadmap.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_opensource\",\"topic_ml/ai\",\"topic_iot\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"e5031116-f662-49f1-b9bf-60a55da72213\",\"6a99914f-1a60-4634-8068-b7c2f37af8ab\"],\"relatedSessions\":[\"6d370b14-09f2-4b3b-9ef0-19eaad044ee2\",\"dc839134-9b71-4dea-a32d-2c89475f740c\",\"700b4961-56f8-43ed-a89a-80688ba179f7\",\"2bb62251-ae83-43d6-ab8f-d33f857c7473\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150902\",\"section\":\"\"},{\"id\":\"774f9c24-3cba-48e1-baac-3e609ac087f0\",\"code\":\"T774F9\",\"title\":\"Best Practices for Using Sign-In for Android Apps\",\"description\":\"What’s the easiest way to get users signed up on your Android app? How about signed back in from the web or after getting a new phone? And what about making it difficult for bad actors to get in? This talk will cover the technologies on Android that help you make it simple to onboard new users, get them back in with zero friction, and keep abusive users out.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"6b7c8bb9-fa85-4ca9-a05f-b3458dae3491\",\"48b96c78-0f03-4a89-8d3b-a3349382e622\",\"b839623d-16af-4cd5-978d-d82fb2078240\",\"336b288a-2895-46cb-a1fc-1cdeffd61689\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150829\",\"section\":\"\"},{\"id\":\"7876546f-e154-4b8f-a53a-6d9a37a1bb8d\",\"code\":\"T78765\",\"title\":\"Unleash the Power of Play Store Discovery\",\"description\":\"In this talk, you'll see the breadth of the developer marketing tools and discovery opportunities on the store, and how to take advantage of them. The talk will cover new tools to customize and experiment with your store presence. You will also learn how Play can help you throughout the game lifecycle from the pre-launch phase to running your game as a service.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557277200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"4c22ef05-1a4a-4df5-ac9f-d0bf354e7fd1\",\"3aa60253-3cf6-4e30-bd81-b9955a5f10a2\",\"39a0a842-67f9-4115-b640-92e4c9000d38\",\"b6580512-871f-4564-92b2-554ae8791517\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151032\",\"section\":\"\"},{\"id\":\"7a48b0bd-8e46-4c5e-90fb-cb665fee0286\",\"code\":\"T7A48B\",\"title\":\"Work Less and Do More: Google Sheets for Node.js Developers\",\"description\":\"Say goodbye to the days of TPS. This session shows how to string together your emails, docs, and charts into one gorgeous report. Combine all your GitHub metrics, monitoring data, and surveys with this wide-ranging platform that involves \\\"human\\\" tools, such as a Calendar and Contacts. Thanks to a helpful multilingual client library, Node.js is the glue that you can use to code up all your business work, letting you get back to the business of coding. Non-Node.js developers welcome, too.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\",\"Advanced\"],\"tagNames\":[\"level_intermediate\",\"level_advanced\",\"topic_opensource\",\"topic_cloud\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557419400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"72e1f518-7c35-414c-98bb-9d5106856ab3\",\"b2063229-c343-47ce-822f-884f4fe651f4\"],\"relatedSessions\":[\"9439ad0c-1061-4f03-8937-6e8f9e5beaf0\",\"bae3bd8b-33ef-403a-abf9-a884582131c0\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150944\",\"section\":\"\"},{\"id\":\"7b0a410b-24a1-4304-885f-a03fbee5c643\",\"code\":\"T7B0A4\",\"title\":\"Protecting Users from Deception\",\"description\":\"In this talk, you’ll see how Chrome has advanced its protection against deceptive sites, building on a decade of protecting billions of users with Safe Browsing. To proactively offer strong protection against phishing for your users, and even avoid password authentication altogether, you’ll learn about the use cases for WebAuthn, a new web API. This includes using fingerprint and biometric sensors to authenticate users, and support enterprise-grade hardware multi-factor authentication.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"6f4e4f2d-1936-4081-95c1-c8ae3f16f83a\",\"9fbfb2ac-353b-4cb2-a50a-ea2d5c5e37bf\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151022\",\"section\":\"\"},{\"id\":\"7bd73b37-1bca-40b3-b8e9-6efe3a9ac234\",\"code\":\"T7BD73\",\"title\":\"Build Testable Apps for Android\",\"description\":\"Learn how to develop a complete testing strategy that mirrors real world scenarios using the latest AndroidX Test libraries and tools by building an Android application from the ground up using modern design patterns.        \",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"type_sessions\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"65eb5268-b6b6-4235-a09d-c06cc765379d\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150886\",\"section\":\"\"},{\"id\":\"7beb4f5a-71b5-4bd0-8659-e076634cb170\",\"code\":\"T7BEB4\",\"title\":\"Engaging Customers Beyond Payments: Tickets, Transit, and Boarding Passes\",\"description\":\"Come see how you can utilize the Google ecosystem to deliver value to your customers anytime, anywhere. From bringing boarding passes to new surfaces to implementing exciting new cross-platform integrations and features for transit, offers, rewards, and more, you’ll discover creative new ways to provide seamless experiences for your customers—at no additional cost to you.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_misc\",\"type_sessions\",\"topic_payments\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"21b5e9b7-6dc1-4a46-bb1d-1186cd301905\",\"fbfa97aa-31c9-4de9-82bd-16c776e19302\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151098\",\"section\":\"\"},{\"id\":\"7e6d87ac-fb80-4d81-9c49-a625f7f1c5b9\",\"code\":\"T7E6D8\",\"title\":\"Stadia Streaming Tech: A Deep Dive\",\"description\":\"The landscape of how games are played is changing and the Stadia playability team is leading the way. This session provides technical details for the streaming technology that powers Stadia, from maximizing visual quality to minimizing latency for the end user at 60 frames per second.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557270000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"f3817c13-89f0-47cd-9843-f6969cc054b6\",\"78720c1e-ca15-4bb9-9783-4e4ccfd939f8\",\"242e1108-e093-4a9f-908a-2197004dba77\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151031\",\"section\":\"\"},{\"id\":\"7e886111-34a3-4920-ae73-7e13e5bafc0f\",\"code\":\"T7E886\",\"title\":\"Unlocking New Capabilities for the Web\",\"description\":\"To close the capability gap between the web and native to provide a solid foundation for modern applications delivered on the web, the web needs open. Learn how some of these new capabilities work, what's on our road map, and how we're designing them to work in a way that respect user.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557369000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"7a40c099-6a14-4171-b183-535a844d1bdc\",\"2d81f1ab-0098-4d72-b171-9750288f0b3c\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151092\",\"section\":\"\"},{\"id\":\"7f641ca9-6621-4002-9190-224958e8ba54\",\"code\":\"T7F641\",\"title\":\"Designing AR Applications\",\"description\":\"AR is an entirely new medium with an entirely new set of design challenges and opportunities. This session will cover everything Google has learned so far about AR design and specific best practices, including volumetric interfaces, object placement, scene understanding, and designing for all users.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_augmentedreality\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"da4eafca-ae0e-4e7b-903c-25b8b5f70224\",\"a495f4ba-3d1e-4b23-bbb8-5daa18435734\",\"1463b718-97d0-4413-97d8-41569acab813\",\"b90ed23b-3600-41b3-9389-3a1e63936186\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151007\",\"section\":\"\"},{\"id\":\"7f6c5456-5f4c-470e-aa52-8d467304f1d4\",\"code\":\"T7F6C5\",\"title\":\"What's New with ConstraintLayout\",\"description\":\"Learn the capabilities of ConstraintLayout, a popular library for UI development on Android, which addresses common pitfalls of and solutions to UI patterns, performance aspects, integrating motion, and how to best take advantage of the library in your own application through a series of use cases and examples.        \",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"cccb071e-0f5d-46f4-a9d4-7324bc82d582\",\"815afd55-557f-4b89-b607-d9b6a013ee71\",\"4d2a991c-3423-40b4-8005-1819573ca536\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150888\",\"section\":\"\"},{\"id\":\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"code\":\"T8046B\",\"title\":\"What's New in Firebase\",\"description\":\"Firebase is Google's mobile development platform for Android, iOS, and the web. In this session, you'll learn recent changes to Firebase that are specifically targeted towards building large-scale applications with complex development teams. By the end of this session, you'll see how you can take advantage of the power of Firebase in your app right now.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"topic_firebase\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"f5ac1eaf-9e9b-49c5-9037-3a1505a4576b\",\"b6441524-301f-4f75-8ef3-8d174101f66d\",\"cbfd16d2-1987-497a-a5e0-fce86c123a75\",\"b72d9867-65cb-4105-b441-2010c1fce348\"],\"relatedSessions\":[\"843aaa36-bd70-4c0d-bfb0-0bfba70035d0\",\"98a3b392-7e3b-4b93-bc0e-6826ad439155\",\"ba278d33-cf65-43bc-bf61-6f99a3290445\",\"daf8cae3-ed7f-4485-afd0-786ebead5140\",\"be2fd9b7-168f-49c2-9e3a-947049990bf9\",\"b6a9b0e5-a995-4c45-b610-a05f29eb5a15\",\"f8ddbfd0-04c7-4a5e-af6c-b2f35b8d5a8e\",\"6e9c5794-226b-4f04-bfe9-c346ba3ff62c\",\"4193407b-06c1-4f4c-bccc-d3baae74de67\",\"1165ac75-3bf4-4dbb-8fa2-e537c4a7d3d8\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150835\",\"section\":\"\"},{\"id\":\"80e26456-3585-407a-b6ed-189e837b5d67\",\"code\":\"T80E26\",\"title\":\"Teaching a Car to Drive Itself by Imitation and Imagination\",\"description\":\"Training a neural net to drive by pure observation requires ensuring that good behavior is being learned from the right signals and that test results in simulation can be transferred to the real world. This talk will walk you through the evolution of a deep network to deal with these challenges by incorporating techniques like data perturbation, input and loss dropout, and domain-specific losses. You’ll learn how input ablation can help debug what the network has really learned.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_misc\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557266400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"f0ce0946-7e80-4757-810b-d65f30d33312\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151030\",\"section\":\"\"},{\"id\":\"81aafe87-a9ef-4daa-9f38-83112c2b0c58\",\"code\":\"T81AAF\",\"title\":\"Live Coding A Machine Learning Model from Scratch\",\"description\":\"Do you want to build a machine learning model, but not sure where to start? In this session, learn how to start with an empty Colab notebook, code a model using TensorFlow and Keras, train the model live, deploy it to Cloud AI Platform for serving, and use the deployed model to generate predictions from a web app.\\n\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_ml/ai\",\"topic_cloud\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557277200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"1cda2465-852d-4584-a3be-7c86ea075148\"],\"relatedSessions\":[\"82e1a3f6-2356-463a-9cf4-084740f66827\",\"700b4961-56f8-43ed-a89a-80688ba179f7\",\"cdfe88b0-be81-417a-8c01-8b3ecbf824d6\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151009\",\"section\":\"\"},{\"id\":\"82aba302-8396-4068-b014-74e8592b3a06\",\"code\":\"T82ABA\",\"title\":\"Modern Web Game Development\",\"description\":\"HTML5 has reached a point where game developers can create compelling experiences through technologies such as WebAssembly, WebGL, and Web Audio. This session will explore the state of modern web game development including the best practices for building, designing, monetizing, and improving the discoverability of games on the open web.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_gaming\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"682b16fd-f71b-4732-b553-9da0cbef8904\"],\"relatedSessions\":[\"4cdd18e0-d917-41ff-bb3b-433bae600c57\",\"faf395cf-4c2e-4b8e-8e43-b8eb5a16c103\",\"ad90afc2-bf1f-4318-abc0-d7e8df67bf07\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150955\",\"section\":\"\"},{\"id\":\"82e1a3f6-2356-463a-9cf4-084740f66827\",\"code\":\"T82E1A\",\"title\":\"Train Custom Machine Learning Models with No Data Science Expertise\",\"description\":\"Cloud AutoML is a suite of machine learning products that enables developers with limited machine learning expertise to train high-quality models specific to their needs, by leveraging Google’s state-of-the-art neural architecture search technology. Learn the power and ease-of-use of Cloud AutoML Tables, Video Intelligence, and Natural Language, and take a look at how Cloud AutoML would fare if it were to participate in data science competitions.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_ml/ai\",\"topic_cloud\",\"type_sessions\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557347400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"1d68ffac-e622-4330-ad07-ac485bcd2dae\",\"429936d4-84af-4245-b3d1-a26a948edce1\"],\"relatedSessions\":[\"9439ad0c-1061-4f03-8937-6e8f9e5beaf0\",\"700b4961-56f8-43ed-a89a-80688ba179f7\",\"81aafe87-a9ef-4daa-9f38-83112c2b0c58\",\"cdfe88b0-be81-417a-8c01-8b3ecbf824d6\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151010\",\"section\":\"\"},{\"id\":\"841ef153-53a4-4bb2-baef-f393f9316eaf\",\"code\":\"T841EF\\t\",\"title\":\"Lightning Talk: Functions as a Service\",\"description\":\"Google Cloud Functions makes it easy for developers to run and scale code in the cloud and build event-driven serverless applications. In this talk you'll learn about the latest updates with Google Cloud Functions along with a few demos of Functions working in action!\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"topic_cloud\",\"type_lightningtalks\"],\"startTimestamp\":1557432000000,\"endTimestamp\":1557433800000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"34b807ec-0c61-455b-a329-72ca7f8fd543\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"843aaa36-bd70-4c0d-bfb0-0bfba70035d0\",\"code\":\"T843AA\",\"title\":\"Engage and Keep Your Users in Your App with Firebase\",\"description\":\"Your users have dozens of apps, each vying for attention every day. One of the hardest parts of development is getting your users engaged, and keeping them that way. This session will cover some pitfalls and their solutions - learn how to enable selective messaging, contextual clues and triggers, and dynamically modify app behavior to cater to your users. Optimizing your app doesn’t have to be guesswork or require home-grown infrastructure. Come to this session to learn more. \",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_firebase\",\"type_sessions\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557444600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"648abfcc-42bd-4207-ae94-06a8dae80da2\",\"2b1ab2cf-5cc3-4ab0-8334-88970cdcdcc7\"],\"relatedSessions\":[\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"6e9c5794-226b-4f04-bfe9-c346ba3ff62c\",\"4193407b-06c1-4f4c-bccc-d3baae74de67\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150911\",\"section\":\"\"},{\"id\":\"84f9d41f-adcb-41cf-909f-407aabf63041\",\"code\":\"T84F9D\",\"title\":\"What's New in Kotlin on Android, 2 Years In\",\"description\":\"This session examines the progress made in Android support for Kotlin. This talk will cover Kotlin samples and reference docs, annotations, framework APIs, IDE support for low-level bytecode optimizations in the D8/R8 compiler, and work on the Kotlin Foundation.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557347400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"ae655de8-8306-4f9d-be62-e660525cc672\",\"f4137039-d547-46b8-a607-a85be830a57b\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150894\",\"section\":\"\"},{\"id\":\"87ef9cbb-aa74-4da2-bbe0-fa0cf3047040\",\"code\":\"T87EF9\",\"title\":\"Develop Games with Firebase\",\"description\":\"In this session, you'll learn about the ways that Firebase can help you build your games using Firebase's C++ and Unity SDKs, test your games with Firebase Test Lab, and fundamentally change the way you write and test games. Learn what's new for game developers and the latest in Firebase Authentication, Crashlytics, Realtime Database, Test Lab, and more.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_firebase\",\"topic_cloud\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"b191f280-ae02-4457-877b-191120cb6e38\",\"3298ea15-ffa1-49d8-9125-3eb52d9a9f2b\",\"3aed8a79-8c33-43e6-839a-9ed3d636fdd8\"],\"relatedSessions\":[\"b6a9b0e5-a995-4c45-b610-a05f29eb5a15\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151099\",\"section\":\"\"},{\"id\":\"8885b540-24f6-4f85-9c3c-278c225fde60\",\"code\":\"T8885B\",\"title\":\"Moving Away from the Light with Android Q\",\"description\":\"Learn Android Q's new customization and navigation features, understand how to make your apps work seamlessly with the system UI, and get familiar with new usability options.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557423000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"cccb071e-0f5d-46f4-a9d4-7324bc82d582\",\"622c536f-87b0-4562-a726-3c770097867b\",\"daf7c371-b75e-4f2f-b454-ba36100d21ec\"],\"relatedSessions\":[\"ee71d961-be51-41a3-bc67-3f7e46297880\",\"5d8b65d2-5369-4f0e-ba3c-ea048fd80999\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150887\",\"section\":\"\"},{\"id\":\"88dd5d2b-5e02-45b6-b603-dbb3bd673b66\",\"code\":\"T88DD5\",\"title\":\"Swift for TensorFlow\",\"description\":\"Swift for TensorFlow is a platform for the next generation of machine learning that leverages innovations like first-class differentiable programming to seamlessly integrate deep neural networks with traditional software development. In this session, learn how Swift for TensorFlow can make advanced machine learning research easier and why Jeremy Howard’s fast.ai has chosen it for the latest iteration of their deep learning course.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"topic_opensource\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"6995a278-fa9e-4de9-85af-9f1ee324d2b9\",\"9ea22c0f-7435-4124-adf5-18faf3a89629\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150903\",\"section\":\"\"},{\"id\":\"8acb1b91-ac5f-410a-a381-664f77e53b9a\",\"code\":\"T8ACB1\",\"title\":\"Machine Learning Fairness: Lessons Learned\",\"description\":\"ML fairness is a critical consideration in machine learning development. This session will present a few lessons Google has learned through our products and research and how developers can apply these learnings in their own efforts. Techniques and resources will be presented that enable evaluation and improvements to models, including open source datasets and tools such as TensorFlow Model Analysis. This session will enable developers to proactively think about fairness in product development.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_opensource\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557423000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"f5329d37-e34a-484c-9089-7297387385a2\",\"855be128-07fb-4869-8030-67b44f705352\"],\"relatedSessions\":[\"02f52df5-dc7e-499d-8cf7-3d27829e6fa9\",\"5d8b65d2-5369-4f0e-ba3c-ea048fd80999\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150934\",\"section\":\"\"},{\"id\":\"8b7daccb-dd96-44ec-a839-60565f40b8f1\",\"code\":\"T8B7DA\",\"title\":\"Best Practices in Using the Android Emulator\",\"description\":\"This session will cover what’s new in the Android Emulator. It will also explain how to take full advantage of the new features, how to validate apps with foldable Emulator, and best practices to boost productivity with multiple Emulator instances.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557270000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"7b341228-79f8-48b1-8898-8abed9a280f5\",\"c247a6e1-16d9-4af9-b835-96a3840e9fef\",\"d444651c-cb4d-4eb4-a489-ee530b440be6\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150828\",\"section\":\"\"},{\"id\":\"8d071906-e971-487d-98b1-33b089a4d462\",\"code\":\"T8D071\",\"title\":\"Demystifying Speed Tooling\",\"description\":\"This talk will provide strong guidance on how to effectively assess and optimize site performance. In collaboration with the Search Console Team, the session will showcase how to methodically diagnose, benchmark against both lab and field metrics, and monitor your site speed using Google's tools. A Chrome performance expert will demonstrate live when and how to use various tools at different stages of development, providing analysis and tips along the way.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"ec425175-cf82-43bd-9cc1-f3a7d07f2cd7\",\"6e6d2e48-bd2c-45e1-9c98-b5f0d16899e8\",\"e1045b58-b4f5-42d6-af2b-672427a82e2d\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151091\",\"section\":\"\"},{\"id\":\"8d400240-f31f-4ac2-bfab-f8347ef3ab3e\",\"code\":\"T8D400\",\"title\":\"Introduction to the CameraX Jetpack Library\",\"description\":\"Learn how to get started with the new CameraX support library in Jetpack, which provides the best support across a wide selection of Android Camera hardware with minimal effort to integrate machine learning.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"3aac697b-b275-47e3-ba09-288febcc8e30\",\"34b046db-a566-423c-a7b3-32ddaedee70e\",\"8e854cdc-dc11-4b40-a708-08ce63a0c0a6\",\"a8adda47-65a5-42ed-b8cc-416696cc06eb\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150923\",\"section\":\"\"},{\"id\":\"9064cbcb-4d86-477a-9b28-d2a0e8b565ce\",\"code\":\"T9064C\",\"title\":\"ML Kit x Material Design: Design Patterns for Mobile Machine Learning\",\"description\":\"Learn how to design user experiences for machine learning features in mobile apps using ML Kit and Material Design. This session will showcase design patterns for specific ML Kit API’s along with general considerations when designing for ML.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_ml/ai\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557433800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"f875d073-d4b5-44e6-86b0-dcae3f35384f\",\"aafd96a3-3685-46fd-8eb7-465654dd3422\",\"068d5419-8717-47e4-b332-36cf5c4adadb\"],\"relatedSessions\":[\"6d370b14-09f2-4b3b-9ef0-19eaad044ee2\",\"be2fd9b7-168f-49c2-9e3a-947049990bf9\",\"5d8b65d2-5369-4f0e-ba3c-ea048fd80999\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151083\",\"section\":\"\"},{\"id\":\"925a3d9d-b424-4c05-b3c0-96531a96bd85\",\"code\":\"T925A3\",\"title\":\"10 Best Practices for High Quality Actions\",\"description\":\"High quality Actions see high engagement with Google Assistant users. What makes them high quality? Drawing from real case studies, learn how to reduce development errors, enhance discovery of your Action, grow your user base, and avoid mistakes along the way when building quality and engaging Actions.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_assistant\",\"type_sessions\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"20b95c09-4cfe-41ea-8659-3c53442bba7a\",\"3a790adf-950c-4808-a662-e792a79ae3cc\",\"1e89dccf-d14b-4c42-ac4f-b0aefb4dd258\"],\"relatedSessions\":[\"0e6c7d8d-8110-4f61-8440-15950bf570cd\",\"ca674c3e-1411-4f4a-bfd3-c93076bd633e\",\"00662f82-3947-4b81-974c-cae386be201c\",\"e7b7baec-98a6-497f-be63-e174f4751c97\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150941\",\"section\":\"\"},{\"id\":\"9439ad0c-1061-4f03-8937-6e8f9e5beaf0\",\"code\":\"T9439A\",\"title\":\"Code, Build, Run, and Observe with Google Cloud\",\"description\":\"In this session, attendees will learn how Google Cloud is enabling developers to focus on their code by providing better tools and infrastructure for their backend services. Come learn about the investments made in the past year that make it easy to code, build, run, and observe your applications and services with Google Cloud.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_ml/ai\",\"topic_cloud\",\"topic_location/maps\",\"type_sessions\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557266400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"1d68ffac-e622-4330-ad07-ac485bcd2dae\",\"c985220f-61ca-40b6-a894-ad533b5b0b35\"],\"relatedSessions\":[\"82e1a3f6-2356-463a-9cf4-084740f66827\",\"bae3bd8b-33ef-403a-abf9-a884582131c0\",\"38275873-cc16-4c6e-bb56-abff62febaf5\",\"7a48b0bd-8e46-4c5e-90fb-cb665fee0286\",\"a0b42b3d-9e08-47fa-8136-e903c8fffa9d\"],\"doryLink\":\"https://dory.withgoogle.com/series/101156817\",\"section\":\"\"},{\"id\":\"95655086-5fb5-4472-badb-c967a7cc29b1\",\"code\":\"T95655\",\"title\":\"Chrome OS Accessibility for Android Developers\",\"description\":\"Developing for tablets and Chrome OS means designing for accessibility. This talk will highlight the accessibility features found in Chrome OS and Android and how users rely on them. This session will also deep dive into what Android developers need to know in order to make their apps work well with keyboards, screen readers, large screens, and external displays.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_accessibility\",\"topic_chromeos\",\"type_sessions\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557423000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"8051c8e6-4618-43bd-be9e-11414c8b4038\",\"939580a6-8fa2-4bf9-8eac-d9f34b151a98\",\"f7c047e5-fea0-480c-b27a-d5e5fb7ca0a3\"],\"relatedSessions\":[\"a4d001a3-5b1b-4d86-a8a8-393aea94dcaf\",\"f02cb268-4ab7-479d-a5af-b86f9ceb844b\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151096\",\"section\":\"\"},{\"id\":\"9614c057-5bdd-496e-b525-6b1938c04596\",\"code\":\"T9614C\",\"title\":\"Optimizing Android Games Performance\",\"description\":\"Learn solutions to the most common performance pitfalls affecting Android game development by exploring topics such as multi-threading, battery utilization, and thermal throttling. \",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557273600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"d41cb407-95e8-42e1-933d-22b518ae29d6\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150958\",\"section\":\"\"},{\"id\":\"97bccff6-ea91-4516-8f2a-7db75de64607\",\"code\":\"T97BCC\",\"title\":\"Google Keynote\",\"description\":\"Learn about the latest product and platform innovations at Google.\",\"type\":\"Keynotes\",\"contentLevels\":[],\"tagNames\":[\"topic_keynote\",\"type_keynotes\"],\"startTimestamp\":1557248400000,\"endTimestamp\":1557253800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"9888b5c4-33eb-42d7-97c8-4cef89f20b98\",\"code\":\"T9888B\",\"title\":\"Speed at Scale: Web Performance Tips and Tricks from the Trenches\",\"description\":\"Getting your site fast and keeping it fast can be a challenge at scale. Learn 15 tips and tricks that real, production sites use to get great scores on Lighthouse and improve core business metrics. Understand a spectrum of optimizations from latency optimization to JavaScript, preloading, prefetching, data-fetching, and more.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"f16418e7-be72-4f09-baa5-c8bb5770baed\",\"c3cc22c6-4b58-4b72-b47f-72ad07203170\"],\"relatedSessions\":[\"faf395cf-4c2e-4b8e-8e43-b8eb5a16c103\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150950\",\"section\":\"\"},{\"id\":\"98a3b392-7e3b-4b93-bc0e-6826ad439155\",\"code\":\"T98A3B\",\"title\":\"Zero to App: Live Coding a Cross-Platform App on Firebase\",\"description\":\"Firebase makes it easy to build a cross-platform app. How easy? Let's try it out together! In this session our team live-codes an app on stage for Android, iOS, and Web. Each platform will have the same functionality, built upon the same Firebase features. They will start with Firestore, Authentication, and Storage, and then show how to use Cloud Functions to integrate Google Cloud Platform's advanced APIs into the application.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_firebase\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557273600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"f40e301e-33d2-4c18-8905-a5dbaf63fef2\",\"edfd5dcd-f8c0-4163-939a-45ef6c276db1\",\"954deb80-e0ab-46e9-8d8a-32b47619bf16\",\"dd5ab107-ccd2-4bf6-9b60-539c4ae02dea\"],\"relatedSessions\":[\"daf8cae3-ed7f-4485-afd0-786ebead5140\",\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"1165ac75-3bf4-4dbb-8fa2-e537c4a7d3d8\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150909\",\"section\":\"\"},{\"id\":\"99770bfb-fcdb-4246-a613-5e84c04e2e58\",\"code\":\"T99770\",\"title\":\"Improving App Performance with Benchmarking\",\"description\":\"This session will provide tips on measuring and improving performance on Android. It will also introduce new benchmarking libraries made available in AndroidX.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557437400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"dbdf5baa-49a9-4f5e-9422-7d7f8541bbd4\",\"344243b0-8d23-4faa-83d4-1f47eb907407\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150895\",\"section\":\"\"},{\"id\":\"9dda952e-a901-4175-be58-18ce13ece758\",\"code\":\"T9DDA9\",\"title\":\"Lightning Talk: Web Components: The Secret Ingredient Helping Power The Web\",\"description\":\"As a web developer, you may or may not have tried Web Components – but as a web user, you almost certainly have. Adoption has quietly taken off. Millions of domains making up several percent of all page loads on the web use Web Components. This session will look at where Web Components can help you, like with interoperability, reuse and design systems. Learn how Salesforce uses Lightning Web Components to power their ecosystem of 5 million developers\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"type_lightningtalks\",\"topic_chromeos\",\"topic_web\"],\"startTimestamp\":1557424800000,\"endTimestamp\":1557426600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"1032eaec-d901-47b0-90dc-007ffa05a87b\",\"7ab88b1c-f0de-4eb0-91a5-314e6742a3c6\",\"0f16f46d-6058-4c76-b95a-50b2d12fd59c\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"9fe6737d-5286-4eec-acec-1bc9deef3e6f\",\"code\":\"T9FE67\",\"title\":\"On Creativity and Technology, with Legendary Animator Glen Keane\",\"description\":\"In this session, hear from Academy Award-winning director and animator Glen Keane, who was mentored by Disney’s fabled “nine old men” and created the beloved characters Ariel, The Beast, and Pocahontas. Glen will explain his creative process and talk about how new technologies, which have taken his career from analog to digital and beyond, are helping him explore his creativity. He will also treat us to a live demo of his craft.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_augmentedreality\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"60b663b9-6993-463c-99bd-0fda4837e133\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"a0b42b3d-9e08-47fa-8136-e903c8fffa9d\",\"code\":\"TA0B42\",\"title\":\"Mobile Backends with Kotlin and Google Cloud\",\"description\":\"Kotlin is a versatile language that can be used for both frontends and backends. This talk will show you how you can quickly create Kotlin backends that can serve RESTful endpoints using popular frameworks, and running backend in GCP's compute platform. Your backend service can automatically scale up the number of instances based on load, but can also scale down to zero instances when no one is using it.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_cloud\",\"type_sessions\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"ae655de8-8306-4f9d-be62-e660525cc672\",\"c99d396d-acb3-4cfe-8fbe-a1ce3a451001\"],\"relatedSessions\":[\"9439ad0c-1061-4f03-8937-6e8f9e5beaf0\",\"bae3bd8b-33ef-403a-abf9-a884582131c0\",\"38275873-cc16-4c6e-bb56-abff62febaf5\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151012\",\"section\":\"\"},{\"id\":\"a4d001a3-5b1b-4d86-a8a8-393aea94dcaf\",\"code\":\"TA4D00\",\"title\":\"Demystifying Android Accessibility Development\",\"description\":\"This talk is for developers who want to make their applications accessible for people with disabilities, but have found the prospect daunting. In this session, learn how accessibility APIs in Android Q and AndroidX make supporting these users much easier. You will also learn about Google's open-source accessibility testing tools and how teams can leverage them throughout the development process. Developers with experience with accessibility will also be interested to learn the new, simpler APIs.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"topic_accessibility\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"3b73bc26-d6fa-4b3f-ab01-4ebb554f317c\",\"18cd44e0-6996-482f-924b-dbf55f03cd69\"],\"relatedSessions\":[\"fcf0b9fe-67c5-4f56-8983-1380747211b8\",\"d40e1997-a9a4-4a95-b629-6fdd88b3e119\",\"95655086-5fb5-4472-badb-c967a7cc29b1\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150957\",\"section\":\"\"},{\"id\":\"a5697d45-9558-4569-8c6f-a885e91813b8\",\"code\":\"TA5697\",\"title\":\"Lightning Talk: Web as a Building Block for Emerging Technologies\",\"description\":\"Learn how the web provides the connective tissue for emerging technologies. Whether it's Assistant, Apps, VR, or even Gaming (ex: Stadia), the web evolves to support the next generation of tech. With the web's superpowers of universal reach, interoperability, ephermality, and increasing capabilities, it's never been more exciting to be a web developer. \",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"type_lightningtalks\",\"topic_chromeos\",\"topic_web\"],\"startTimestamp\":1557435600000,\"endTimestamp\":1557437400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"e7a6177e-2e88-43e9-b76f-8524b101939b\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"a73614c8-ffce-4399-ac77-953c33153123\",\"code\":\"TA7361\",\"title\":\"Android Emergency Location Service: Locating Emergency Calls in a Wireless World\",\"description\":\"Mobile technology has outpaced emergency services in the US and abroad. Today, over 80% of emergency calls come from mobile phones, but locating them can be an issue. Why can Google Maps locate you anywhere in the world, but first responders may need to search entire city blocks to find you? When lives are on the line, caller location is critical for first responders. This presentation will cover how Android Emergency Location Service is delivering more accurate location to emergency services.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"5fea480b-49e8-48ba-bf31-88f91808b28d\",\"4ac27b67-b18d-4c80-ba0f-fdc95116eba1\",\"12259151-d3e0-4fa5-8ffa-6105ec56b54d\",\"5c02aab1-b1f1-44ee-ab75-d947245defc3\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101162092\",\"section\":\"\"},{\"id\":\"a9d9571d-44de-4956-8173-f6599e518225\",\"code\":\"TA9D95\",\"title\":\"Best Practices for Using Text in Android\",\"description\":\"Android Q brings lots of updates to text aimed at different use cases for all developers: better control over fonts, better performance, and styling improvements, and others. Android also has integrated PrecomputedText with RecyclerView so that you can squeeze the last drop of performance out of your UI. This talk will cover these updates and give you some more tips and best practices for working with other text-related features such as fonts, editable text, and keyboard.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557369000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"0066b1af-e2c8-4f63-9dee-b151b39d1c3f\",\"0334b0be-ada4-4667-9a75-88f0e87eec22\",\"d1974742-cad2-40ef-a8ff-e9fb4c6dcd51\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150897\",\"section\":\"\"},{\"id\":\"abc74e67-387c-405b-bfef-e38a2ef1ce64\",\"code\":\"TABC74\",\"title\":\"What's New in Angular\",\"description\":\"Angular has evolved a lot in the last year. Hear about the changes that you can opt into to make your applications smaller, faster, and easier to use. Opt-in to new capabilities such as the new rendering engine from Project Ivy, scaled builds with Bazel. Hear about some new use cases the Angular team is taking on to deliver great performance for consumer facing applications and our ideas to implement best practices into your application by default.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"04300f51-04c6-4efb-8f0e-94988798a049\",\"c2f26c54-5fdf-4654-8a01-f03eeea54c89\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151087\",\"section\":\"\"},{\"id\":\"ace21661-5297-43d2-9bdd-f5b2ae198a2d\",\"code\":\"TACE21\",\"title\":\"An Unconventional Look at the Future of Technology with Baratunde Thurston\",\"description\":\"Blending humor with a creative spin, an amusing and comedic take on all things technology at I/O. \",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"ce522252-0924-40b2-8943-af4bc43965b2\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"ad90afc2-bf1f-4318-abc0-d7e8df67bf07\",\"code\":\"TAD90A\",\"title\":\"Sonic Boom! Audio Programming on Android and Chrome\",\"description\":\"Android and Chrome have a combined reach of over 3 billion users, and with new hardware and audio stacks there is enormous potential to create compelling audio experiences on both platforms. This talk explores ways of bringing audio code to Android and Chrome with minimal effort using Oboe, WebAssembly and AudioWorklet, and teaches you how to connect MIDI peripherals and tune your app for optimal performance/latency. \",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"6f16d338-6253-4322-a12c-bef1ffb12d0e\",\"ec237b6e-e701-464f-933e-a3a11324231d\",\"364a11ff-ba21-423c-9730-5aa9347c2c29\"],\"relatedSessions\":[\"af10c9ca-295a-44fd-a4b7-07084f8516b1\",\"82aba302-8396-4068-b014-74e8592b3a06\",\"faf395cf-4c2e-4b8e-8e43-b8eb5a16c103\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150824\",\"section\":\"\"},{\"id\":\"af10c9ca-295a-44fd-a4b7-07084f8516b1\",\"code\":\"TAF10C\",\"title\":\"Sound Design and Sonic Brand\",\"description\":\"Learn best practices for sound design, integrating sound design in products and experiences, and branding experiences with sound.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557280800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"48036143-fde1-40f6-a7ac-26306699c627\"],\"relatedSessions\":[\"ad90afc2-bf1f-4318-abc0-d7e8df67bf07\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151082\",\"section\":\"\"},{\"id\":\"b003a6f0-c143-412e-b8c3-9bae7bd61f58\",\"code\":\"TB003A\",\"title\":\"A Fireside Chat with X’s Captain of Moonshots, Astro Teller\",\"description\":\"One-on-one with the Captain of Moonshots at X, the birthplace of Waymo, Loon, Verily and more.  In this discussion with Julie Hanna,  find out why responsible innovation is a priority at X, and why not being afraid of failure is essential for moonshot taking. With a stated mission to have 10x impact on the world’s most intractable problems, dreaming big isn’t just something they do at X, it is essential. \",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557444600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"837a14b2-2354-40e9-9abb-11ba6d8c5f12\",\"14c11e06-1b29-42b6-ab12-046d41474643\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"b05736a8-4e3f-48e1-8240-7e47584bfd2f\",\"code\":\"TB0573\",\"title\":\"What's New in Google Play\",\"description\":\"Google Play helps developers around the world build successful businesses with their apps and games. Learn about the latest features that can help you reduce app size, increase install conversion, improve update rates, optimize your listing pages, and understand your app or game’s performance.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"654e3d51-d77f-4d5b-9331-ac4f225f8e27\",\"10abb09f-ca10-43c4-acf0-c9fbd7f8d80c\",\"25142cee-055b-42ec-b7a0-c33dbfe94996\",\"49bff16c-e880-4e0e-beff-7f4d7b774a99\"],\"relatedSessions\":[\"6ccc06df-88ec-40fa-a227-71ec0482a85c\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150885\",\"section\":\"\"},{\"id\":\"b0cd133d-42c1-4a7b-9ab8-d66eec364a6d\",\"code\":\"TB0CD1\",\"title\":\"Android Fireside Chat\",\"description\":\"Learn from a panel of experts from the Android platform engineering team where they will answer questions live from the community.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557441000000,\"endTimestamp\":1557444600000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"30ed51b5-8ecd-41a3-b964-1c2356e8a0f0\",\"35155de0-bf0a-4c91-a017-4f05d21ab97e\",\"f206875d-3c44-4135-b2a4-135efbf53f3a\",\"4b3b400c-d37d-4a0b-b957-c70cae8d2ee3\",\"393bf114-7e4b-4224-8b3f-c1afab0d2dfd\",\"bd9b7f47-3354-4510-8be9-02df842a59c9\",\"25142cee-055b-42ec-b7a0-c33dbfe94996\",\"8dc635d6-ca19-4fde-909e-2b8689e39d3e\",\"d2fefe36-a707-4d6c-8245-ab48a756fca9\",\"340709db-f0e8-404f-8345-b5413f1d25bc\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150922\",\"section\":\"\"},{\"id\":\"b15cf123-8048-492f-b108-45024581999a\",\"code\":\"TB15CF\",\"title\":\"What's New in Android\",\"description\":\"Get an overview of the latest developer features in Android.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557266400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"4b3b400c-d37d-4a0b-b957-c70cae8d2ee3\",\"393bf114-7e4b-4224-8b3f-c1afab0d2dfd\",\"340709db-f0e8-404f-8345-b5413f1d25bc\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150817\",\"section\":\"\"},{\"id\":\"b2066dbe-3073-4be2-a85f-02b843dcb08a\",\"code\":\"TB2066\",\"title\":\"Machine Learning for Game Developers\",\"description\":\"Machine learning is enabling game developers to solve challenges that have been difficult with traditional programming techniques. If you're new to machine learning and looking to consume APIs backed by Google-built ML models or wanting to train your own game AI with a custom model, in this session, you'll learn about the many options Google provides for game developers.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_ml/ai\",\"topic_cloud\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"f8a3d555-dd4a-4d7e-a974-df096012df15\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101156631\",\"section\":\"\"},{\"id\":\"b3be9b08-eb5b-4ce3-8320-b2fe63dbe2aa\",\"code\":\"TB3BE9\",\"title\":\"Best Practices for Developing on Android TV\",\"description\":\"Be successful building on Android TV with insight into integrations, streaming best practices, UHD support and key libraries to increase velocity, success metrics, and lessons learned along the way. Reach more people on a platform that has grown 2x year over year and has over 4,000 apps in its ecosystem. \",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557270000000,\"endTimestamp\":1557273600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"abd863b2-2a91-4ad3-85a6-f51221ae4dbb\",\"34429bcf-ea14-4caa-8752-4ce6c222cd98\",\"8c5c6f02-abeb-4fa2-a101-39ca30e9901d\",\"5c6fbe2d-ddfc-4654-b59e-aa6abb428ffc\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150823\",\"section\":\"\"},{\"id\":\"b3fc900a-6ecd-48a4-9021-769c548758af\",\"code\":\"TB3FC9\",\"title\":\"Seamless and Smooth Location Everywhere with the New FusedLocationProvider\",\"description\":\"This session will cover the latest improvements to the FusedLocationProvider (FLP) and why it is the right and future proof choice for most apps. Learn how to implement that redesigned algorithms behind FLP, including core sensor fusion, outlier rejection, and inertial sensor processing, to consistently provide smooth, accurate, and seamless location, outdoors or indoors, in car or on foot. This talk will also cover expected behavior, performance, and our roadmap for continual improvement.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"topic_location/maps\",\"type_sessions\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"cd414ff1-15a5-4528-b7b7-4bd4b2f6ed63\",\"46d34781-d48d-44c9-84ce-9b53e7e12a45\"],\"relatedSessions\":[\"16cb2916-04ba-4474-a091-122dc1c2c025\",\"3dffdb72-e79a-4511-a65e-9656967beda9\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150936\",\"section\":\"\"},{\"id\":\"b57b960c-a05b-4f65-b739-b85e2613a405\",\"code\":\"TB57B9\",\"title\":\"How to Build Android Apps for Cars\",\"description\":\"Want your apps to reach more drivers? With new Android-based infotainment systems that are built directly into cars, you'll have the ability to reach more users. This talk will focus primarily on how to build new apps or adapt existing Android Auto apps to the new Android-based infotainment systems. Developers interested in building experiences powered by Android can learn about new design changes and how to optimize their apps.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"b861cef5-06ef-42e9-bc5f-eaf5325985da\",\"b4343188-9c3f-4e7d-b6bd-bd3a967932ae\",\"2f1916e5-e07a-43b1-a693-e094a8364fb2\"],\"relatedSessions\":[\"b57b960c-a05b-4f65-b739-b85e2613a405\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150898\",\"section\":\"\"},{\"id\":\"b6a9b0e5-a995-4c45-b610-a05f29eb5a15\",\"code\":\"TB6A9B\",\"title\":\"Three New Ways to Secure Your App with Firebase Authentication\",\"description\":\"Whether you're an enterprise developer or building the next smash-hit mobile app, you've probably had to spend precious time on security so your company doesn't become headline news. Experience a demo-packed session featuring three new ways that Firebase Authentication is making identity management and authentication simple and secure, so that you can get back to building the features your users will love.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_firebase\",\"type_sessions\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"7f2c6096-740c-4b1d-b2e1-931bb7e98d0f\",\"81307398-085a-4500-8659-3cb756096cc8\"],\"relatedSessions\":[\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"87ef9cbb-aa74-4da2-bbe0-fa0cf3047040\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150999\",\"section\":\"\"},{\"id\":\"b705365a-d621-4c24-9312-3bf2fe3a850f\",\"code\":\"TB7053\",\"title\":\"Advancing Machine Intelligence for the Benefit of Humanity\",\"description\":\"In this session, learn from the head of the Google AI Center in Ghana why he is committed to giving  young Africans specialized training in machine learning and its applications. \",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"5ef5f951-ac6a-48ac-99ba-b1496e641548\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"b95d44ad-fb26-4118-b2c6-fe17a5c5c11d\",\"code\":\"TB95D4\",\"title\":\"GIFs and More: Integrating Expression Search in Your App\",\"description\":\"From stickers to GIFs, visual expression dominates personal communication today, and its usage continues to grow quickly. Learn from Tenor’s founder and a Tenor engineering lead on how to use the Tenor Expression Search API to deliver a powerful expression experience in your app and ultimately increase user engagement and retention. Topics include: how to optimize speed and relevance, example code, and deep-dives into search best practices, localization, and ranking.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_search\",\"type_sessions\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"31f9196b-818e-4a7b-a224-ed9e0d326a37\",\"f94a7db4-b8ea-4210-9224-d3eed8f6d2cb\",\"c09a2696-574b-4a16-8728-e1bc872b2ede\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151097\",\"section\":\"\"},{\"id\":\"ba278d33-cf65-43bc-bf61-6f99a3290445\",\"code\":\"TBA278\",\"title\":\"Architecting Mobile Web Apps\",\"description\":\"Building web apps that work on mobile can be hard work. But it doesn't have to be. In this session, learn how to build a web app from scratch that has everything a modern user expects: sign-in, work across devices, local and cloud persistence, notifications, and it will work offline and be blazing fast because it runs on Firebase.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_firebase\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557423000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"b709686a-d167-43ab-846d-4a770852383e\"],\"relatedSessions\":[\"daf8cae3-ed7f-4485-afd0-786ebead5140\",\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"f8ddbfd0-04c7-4a5e-af6c-b2f35b8d5a8e\",\"1165ac75-3bf4-4dbb-8fa2-e537c4a7d3d8\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150912\",\"section\":\"\"},{\"id\":\"ba2a9e2c-0455-473d-a0b5-fb2c7e6e9d65\",\"code\":\"TBA2A9\",\"title\":\"Going Big: PWAs Come to Desktop and Chrome OS\",\"description\":\"Progressive Web Apps aren't just for mobile any more, they make it possible to deliver high quality, capable apps on Windows, Mac, Linux and Chrome OS. We'll dive into the key things you need to know about how to build them, some of the unique features they offer, best practices you should be following, and how some of our favorite desktop PWAs were built.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_chromeos\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557426600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"3d42e5a2-5094-472a-9210-20747b7fab5a\",\"312fc749-6137-4e94-b2c7-df8901ff91b4\"],\"relatedSessions\":[\"f02cb268-4ab7-479d-a5af-b86f9ceb844b\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150953\",\"section\":\"\"},{\"id\":\"bae3bd8b-33ef-403a-abf9-a884582131c0\",\"code\":\"TBAE3B\",\"title\":\"Google Cloud Platform (GCP) Essentials\",\"description\":\"This session is your key to the Google Cloud Platform kingdom, covering compute options, storage and database solutions, container-driven runtimes, continuous integration tools, applied DevOps principles, fully-managed big data processing, and machine learning for all. You will leave this session with an understanding of the tools available to meet your needs and a clear path for getting started on GCP.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_cloud\",\"type_sessions\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"2c52f3ac-f843-4d25-b1e3-b88759bbf331\"],\"relatedSessions\":[\"49b9e43c-9241-4a2f-a7c6-6668e5efa020\",\"9439ad0c-1061-4f03-8937-6e8f9e5beaf0\",\"38275873-cc16-4c6e-bb56-abff62febaf5\",\"7a48b0bd-8e46-4c5e-90fb-cb665fee0286\",\"a0b42b3d-9e08-47fa-8136-e903c8fffa9d\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151011\",\"section\":\"\"},{\"id\":\"bd59f36f-198e-496a-8ea5-ac5108eb4108\",\"code\":\"TBD59F\",\"title\":\"Improve Your App and Game Quality with Android Vitals\",\"description\":\"Quality is a prerequisite for a successful app or game, whatever platform you’re on. Play continues to invest in tools to help you prioritize and troubleshoot existing issues more easily, speed up your testing, and predict new issues before they happen. This talk will cover: how to assess your app’s quality in Vitals with any peers of your choice, how to use pre-launch report (PLR) to debug production issues and how to ensure your app is compatible with future Android releases.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"type_sessions\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"d2db0817-dc4d-4758-8762-eb5a8c15cac3\",\"ce0cf90f-bbb8-4f43-a736-29e437b5cb0d\",\"36abf8e2-c7f4-46fc-8d90-59ba8079357f\",\"c7ebfc68-035b-4d82-b497-0b5f2ed1522e\"],\"relatedSessions\":[\"6ccc06df-88ec-40fa-a227-71ec0482a85c\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150891\",\"section\":\"\"},{\"id\":\"be2fd9b7-168f-49c2-9e3a-947049990bf9\",\"code\":\"TBE2FD\",\"title\":\"ML Kit: Machine Learning for Mobile with Firebase\",\"description\":\"ML Kit allows you to harness the power of machine learning in your iOS and Android apps without needing to be an expert in it. Leverage powerful, but simple-to-use on-device and cloud-based APIs for Vision and Natural Language Processing, or train and/or deploy your own models. Understand some big additions to ML Kit and how to use these to enable smarter, richer experiences to your users.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"topic_firebase\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557343800000,\"endTimestamp\":1557347400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"c563af6b-f653-4fec-a2b7-ce8aa5fab311\",\"d329b257-771c-4d38-8419-8fd74ef7861c\",\"ed1d5220-af7c-4e11-bb1f-2980d6d892e7\",\"de3aec82-9cbf-471a-87a6-cd2ec29ca4e2\"],\"relatedSessions\":[\"6d370b14-09f2-4b3b-9ef0-19eaad044ee2\",\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"9064cbcb-4d86-477a-9b28-d2a0e8b565ce\",\"37bd94a6-a666-4267-aa32-d51fcc18ec03\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150908\",\"section\":\"\"},{\"id\":\"c07cff11-3e52-4369-8434-607d99cac75d\",\"code\":\"TC07CF\",\"title\":\"How Material Design Can Be Adopted and Measured for Product Success\",\"description\":\"Why use a design system? In this talk, explore how design systems and tools add value to teams and get a toolkit for setting up your teams to create, identify, and measure that value. With examples from Material Design, you’ll learn actionable tactics for implementing and understanding your design system’s success.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"48b81524-6d86-411e-b027-20029f19cbc2\",\"bd1ffc1e-49dc-45d1-8741-37702dc62268\"],\"relatedSessions\":[\"ee71d961-be51-41a3-bc67-3f7e46297880\",\"e27b4b52-fc95-429b-9965-9c835d6156d3\",\"5d8b65d2-5369-4f0e-ba3c-ea048fd80999\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150947\",\"section\":\"\"},{\"id\":\"c3a01b86-369c-43d3-bf01-f91cf68872cf\",\"code\":\"TC3A01\",\"title\":\"Writing the Playbook for Fair and Ethical Artificial Intelligence and Machine Learning\",\"description\":\"Learn from Googlers who are working to ensure that a robust framework for ethical AI principles are in place, and that Google's products do not amplify or propagate unfair bias, stereotyping, or prejudice. Hear about the research they are doing to evolve artificial intelligence towards positive goals: from accountability in the ethical deployment of AI, to the tools needed to actually build them, and advocating for the inclusion of concepts such as race, gender, and justice to be considered as part of the process.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"f834530d-4b63-42d4-ab3f-370beb928bbd\",\"2916fc6c-c3c2-4fdd-a1f3-074ea4375933\",\"d2777f79-0daa-483e-b0db-eab68dab9550\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"c602283d-4249-4c20-8da4-a5107f620e69\",\"code\":\"TC6022\",\"title\":\"What's New with Chrome and the Web\",\"description\":\"Learn Google’s vision for the Web Platform. This session will cover the latest updates across Chrome, as well as the tools and services that we’re building, across our teams, to help developers build great experiences. Looking further into the future, you'll also learn the evolving role of the Web across an increasing number of platforms and devices and what that could mean for users and developers.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557266400000,\"endTimestamp\":1557270000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"d9a07acf-60a3-485d-af7a-ad8d6e387600\",\"bc0872db-cbf8-4c73-ac3a-85593327e125\"],\"relatedSessions\":[\"f8ddbfd0-04c7-4a5e-af6c-b2f35b8d5a8e\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151016\",\"section\":\"\"},{\"id\":\"ca0f3440-0319-429f-b49f-a5d6f943d209\",\"code\":\"TCA0F3\",\"title\":\"Lightning Talk: I/O Arts\",\"description\":\"New to I/O! A program featuring artworks across the festival. It’s often artists who provide insight into the relationship between culture and technology. I/O is proud to support the people and practices that explore the cultural impact of technologies like machine learning. Featured artists include Sougwen Chung, Anna Ridler, Jenna Sutela, and Onformative.\",\"type\":\"Lightning Talks\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"type_lightningtalks\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557349200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"speakers\":[\"ca4ebde9-3d15-4e77-a51e-99fd0bcf12fe\",\"da60fa7c-b765-4969-bf6c-9782a3ffa243\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"ca674c3e-1411-4f4a-bfd3-c93076bd633e\",\"code\":\"TCA674\",\"title\":\"Build Interactive Games for the Google Assistant\",\"description\":\"Learn how to design and develop immersive gaming experiences for the Google Assistant. We’ll share new features and best practices to help you create interactive Actions for different devices supported by the Google Assistant.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_assistant\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"dcecbbb1-87a9-4ed7-816d-73f89a39639a\",\"58f7f945-fab0-46ab-ab54-9b57661c2f15\"],\"relatedSessions\":[\"fc4a76a0-5907-4c6a-b1b1-074fc7649043\",\"0e6c7d8d-8110-4f61-8440-15950bf570cd\",\"925a3d9d-b424-4c05-b3c0-96531a96bd85\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\",\"e7b7baec-98a6-497f-be63-e174f4751c97\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151002\",\"section\":\"\"},{\"id\":\"cdfe88b0-be81-417a-8c01-8b3ecbf824d6\",\"code\":\"TCDFE8\",\"title\":\"Getting Started with TensorFlow 2.0\",\"description\":\"TensorFlow 2.0 is here! Understand new user-friendly APIs for beginners and experts through code examples to help you create different flavors of neural networks (Dense, Convolutional, and Recurrent) and understand when to use the Keras Sequential, Functional, and Subclassing APIs for your projects.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557280800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"57143961-b19e-4e9d-99f9-2b86ff387b7a\",\"96feb8c6-1106-47e6-a095-0a0b6fe133a1\"],\"relatedSessions\":[\"82e1a3f6-2356-463a-9cf4-084740f66827\",\"700b4961-56f8-43ed-a89a-80688ba179f7\",\"81aafe87-a9ef-4daa-9f38-83112c2b0c58\",\"440e536b-9181-4bb7-90e1-a9d98742d46f\",\"da482607-7f2e-42f2-a262-d173e2a9ec21\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150832\",\"section\":\"\"},{\"id\":\"ce2389d7-7f7b-45e1-a5d0-c93debb143c4\",\"code\":\"TCE238\",\"title\":\"What’s New in Shared Storage\",\"description\":\"Android Q introduces a new storage permission model which focuses on giving apps access to the media on device. This talk will explain how to use this new permission model and the impact of this change on common use cases such as sharing files between apps.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"type_sessions\"],\"startTimestamp\":1557347400000,\"endTimestamp\":1557351000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"fef20db9-5738-45cb-863b-66696d461c77\",\"a859c999-1c8c-4867-8ee4-8bcb5d4f4ccb\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101156814\",\"section\":\"\"},{\"id\":\"d23a5b66-deb9-46df-babc-180f6e49192d\",\"code\":\"TD23A5\",\"title\":\"Smart Strategies for Growing Your App Business with Ads\",\"description\":\"Developers are focused on creating the best app experience for their users, but they still need to meet their business goals. That’s why Google is invested in providing solutions that help developers work smarter to grow their app business. Learn how Google’s latest innovations can help streamline the processes to acquire the right users and increase revenue, making it easier for developers to focus on their product and user experience\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_ads\",\"type_sessions\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"9d7c5051-1159-42d2-82cd-4a95d89dd2a0\",\"0e33a61e-41a5-4bc5-8de8-3dd4cd5bc4fa\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150939\",\"section\":\"\"},{\"id\":\"d40e1997-a9a4-4a95-b629-6fdd88b3e119\",\"code\":\"TD40E1\",\"title\":\"What’s New in Android Accessibility\",\"description\":\"Learn about what’s new in Android Accessibility, including capabilities and features in Android Q. This session will focus on core accessibility products like Android Accessibility Suite, TalkBack and Switch Access as well as new products for the deaf and hard-of-hearing such as Live Transcribe. Lastly, you'll learn actual examples of how Google uses qualitative research methods to inform product development.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_accessibility\",\"type_sessions\"],\"startTimestamp\":1557262800000,\"endTimestamp\":1557266400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"c7cffb2d-ce3e-4d36-9954-7328a56ac099\",\"e1f6dfc0-47dd-4c47-91eb-921d7f24a8d3\",\"0152fae2-40ea-43df-9d7f-fb61bd79e555\",\"09ea06ba-ff4d-49de-aacc-9bf23e8c2508\"],\"relatedSessions\":[\"a4d001a3-5b1b-4d86-a8a8-393aea94dcaf\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150956\",\"section\":\"\"},{\"id\":\"d4c4c260-6b77-4ee3-b323-9cf98580396f\",\"code\":\"TD4C4C\",\"title\":\"Build Apps for the Next Billion Users\",\"description\":\"As developers, emerging Android markets, such as Africa and Asia, are big opportunities for you to grow your audience, but they also present challenges, such as i18n and network speed. Are you ready to face these challenges? This talk highlights best practices, and introduces Google SDKs and APIs that can help your app succeed in emerging, or next-billion-user (NBU) markets.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557437400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"09237444-de8c-4025-971f-f22199fcdad1\",\"5197a3af-924b-4d12-810d-f298cdba9f1c\",\"bf5263a2-2344-48be-9208-6b3b8354fd5a\"],\"relatedSessions\":[\"6ccc06df-88ec-40fa-a227-71ec0482a85c\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150892\",\"section\":\"\"},{\"id\":\"d69f6bcf-3596-40e4-8fb1-7d5614402bbf\",\"code\":\"TD69F6\",\"title\":\"Linux for Chromebooks: Secure Development\",\"description\":\"Learn how Linux for Chromebooks (Crostini) gives you a secure sandbox for development. Through a variety of demos, this talk will explain the architecture underlying Linux for Chromebooks and the design decisions that keep it easy to use.\\n\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_chromeos\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"792cb0a0-c395-40ee-8eab-8d41f2098e67\",\"3e710d8e-ac01-4f7d-a4e3-6630ef012e3b\",\"429180be-f34b-4270-a4b8-b5dd0e853f10\"],\"relatedSessions\":[\"f02cb268-4ab7-479d-a5af-b86f9ceb844b\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151018\",\"section\":\"\"},{\"id\":\"d9a2457f-e2a9-44a4-9665-5be782d0af6d\",\"code\":\"TD9A24\",\"title\":\"Augmenting Faces and Images\",\"description\":\"This session will enable developers to use the latest APIs from ARCore to create apps that can detect, perceive, and augment real faces and images with digital content.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_augmentedreality\",\"type_sessions\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"ba58e5da-fa63-4199-a00d-1b558b79aad2\",\"ccda2ab4-ff87-44dc-bd62-301c35d848a9\",\"85e48174-dc2a-46ad-acdc-be322fbbd7dc\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151079\",\"section\":\"\"},{\"id\":\"da482607-7f2e-42f2-a262-d173e2a9ec21\",\"code\":\"TDA482\",\"title\":\"Cutting Edge TensorFlow: New Techniques\",\"description\":\"There's lots of great new things available in TensorFlow since last year's IO. This session will take you through 4 of the hottest from Hyperparameter Tuning with Keras Tuner to Probabilistic Programming to being able to rank your data with learned ranking techniques and TF-Ranking. Finally, you will look at TF-Graphics that brings 3D functionalities to TensorFlow.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557430200000,\"endTimestamp\":1557433800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"c279625f-ca4b-47b3-af1f-8d8618efbc6c\",\"539870ac-1f7d-4697-b8c1-ac2f9ffed80d\",\"986a30af-ad8b-4b62-bcb5-f98209bca277\",\"9eafd2bf-ecaf-49ec-89a7-bef328b5936d\"],\"relatedSessions\":[\"dc839134-9b71-4dea-a32d-2c89475f740c\",\"cdfe88b0-be81-417a-8c01-8b3ecbf824d6\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150932\",\"section\":\"\"},{\"id\":\"da7ca544-1260-4940-88c6-e74dbf49a80a\",\"code\":\"TDA7CA\",\"title\":\"Google Search and JavaScript Sites\",\"description\":\"Learn how Googlebot crawls and renders your website so your content can be discovered via Google Search through an optimized user experience. This session will cover architectural best practices (e.g. how to implement lazy loading), framework-specific (React, Vue, Angular) techniques for building Search friendly apps, and review various tools and reports (e.g. Search Console, LightHouse) to bring this to life.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557437400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"e259b65b-d623-4ffa-9451-c43d951b367e\",\"e90cec21-02c8-4d7c-9044-73e1a90ac059\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151017\",\"section\":\"\"},{\"id\":\"daa69fee-869d-494b-9fcf-c5e2a6ce820e\",\"code\":\"TDAA69\",\"title\":\"A Fireside Chat with Geoffrey Hinton, Pioneer of Deep Learning\",\"description\":\"In this rare interview since (jointly) winning the 2018 Turing Award for his work on neural networks, hear about the conceptual and engineering breakthroughs that have made deep neural networks a critical element of computing. Their research has allowed artificial intelligence technologies to progress at a rate that was not possible in the past and has reinvented the way technology is built.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"be2f9474-33a5-4504-a099-7865b4138c3c\",\"0f0a2117-7e78-4b84-b92f-9fbaef7e7ef5\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"dae8e45c-416c-4435-b908-a577eece24e9\",\"code\":\"TDAE8E\",\"title\":\"Increasing AR Realism with Lighting and Depth\",\"description\":\"What happens when a ray of morning sunshine comes through your window - shouldn’t your virtual object reflect it? Learn about new ARCore technology that allows phones to understand the depth and lighting of the real world - capabilities exposed as new ARCore APIs to developers. You’ll come out understanding how and why to implement realistic lighting and have a behind the scenes look at how the algorithms work.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_augmentedreality\",\"type_sessions\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"0b02798b-ed16-4fff-90dd-0476d9440015\",\"8d58f23f-7a43-4c35-a164-e1d43b5416da\",\"27ef6b44-917a-4342-ad09-30755e6fb886\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151080\",\"section\":\"\"},{\"id\":\"daf8cae3-ed7f-4485-afd0-786ebead5140\",\"code\":\"TDAF8C\",\"title\":\"Add Serverless Functionality to Android Apps with Firebase\",\"description\":\"Using Firebase in your app is like cheating your way to productivity. Firebase takes care of security and scalability, while you focus on building the functionality that your users love. But how do you add functionality for which Firebase doesn't have a client-side SDK? With Cloud Functions you can use existing backend code to enhance your app. We'll take our existing app and add processing of payments and send notifications, both with minimal code, using some of the existing samples.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_firebase\",\"type_sessions\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"38c8cbfc-4821-490f-adc2-efd401e82ee1\",\"38068771-50cc-4f69-a2ba-f082a61d0f49\"],\"relatedSessions\":[\"98a3b392-7e3b-4b93-bc0e-6826ad439155\",\"ba278d33-cf65-43bc-bf61-6f99a3290445\",\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"1165ac75-3bf4-4dbb-8fa2-e537c4a7d3d8\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150837\",\"section\":\"\"},{\"id\":\"db8c26f5-2ac5-4b2b-922d-ca69765ff72c\",\"code\":\"TDB8C2\",\"title\":\"Tools for Building Better Smart Home Actions\",\"description\":\"This session will discuss tools to help developers build smart home Actions that make users’ lives easier. Deep dive into developer tools such as the report state tool, StackDriver, codelabs, and a new tool for certifying your Action. Also, learn about a new method of account linking that makes it easier for users to connect to your Actions.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_assistant\",\"topic_iot\",\"type_sessions\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557423000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"d7b950ea-cd76-4e57-ada4-03bc1ee45c4d\",\"a8b55f1a-4cc2-481f-9d6d-1e686b2e87f4\"],\"relatedSessions\":[\"f76a49c1-bdb3-4041-8616-565edce346a2\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\",\"38f647d5-cd0b-484e-ad07-e396b0308e68\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151004\",\"section\":\"\"},{\"id\":\"dc0952e8-a862-4b04-8116-0877c6f6ce1c\",\"code\":\"TDC095\",\"title\":\"What’s New in ARCore\",\"description\":\"This session is a technical deep-dive into the newest AR features, how they work in each environment, and what opportunities they unlock for your users.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_augmentedreality\",\"type_sessions\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557280800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"78c996c0-6005-4010-9b74-b6303eb99f2e\",\"7cde7037-72aa-4aea-8348-cac86f3b922a\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150942\",\"section\":\"\"},{\"id\":\"dc839134-9b71-4dea-a32d-2c89475f740c\",\"code\":\"TDC839\",\"title\":\"Federated Learning: Machine Learning on Decentralized Data\",\"description\":\"Meet federated learning: a technology for training and evaluating machine learning models across a fleet of devices (e.g. Android phones), orchestrated by a central server, without sensitive training data leaving any user's device. Learn how this privacy-preserving technology is deployed in production in Google products and how TensorFlow Federated can enable researchers and pioneers to simulate federated learning on their own datasets.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_opensource\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557365400000,\"endTimestamp\":1557369000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"7e0c940c-2c9f-4087-9b1d-f697838c36c3\",\"79f52ef6-5d34-4f07-adf3-680b666aa603\"],\"relatedSessions\":[\"76fca151-5951-440c-b822-92f8394d9af1\",\"da482607-7f2e-42f2-a262-d173e2a9ec21\",\"2bb62251-ae83-43d6-ab8f-d33f857c7473\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150935\",\"section\":\"\"},{\"id\":\"de18a06c-3342-499c-b8e7-00bf3c87eb16\",\"code\":\"TDE18A\",\"title\":\"Artificial Intelligence: From Social Good to Ambient Intelligence\",\"description\":\"Google’s scale and AI expertise uniquely positions us to use AI to positively impact society. In this talk, hear from our global leader of Google’s Crisis Response efforts on how to think about applying ML and AI to positively impact some of the world’s biggest humanitarian and environmental challenges. Through a pilot program in India, his team has been able to predict the path of a flood and can warn communities via public alerts.  He will also talk about how Conversational AI is helping us in an increasingly ambient way with our daily lives.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557358200000,\"endTimestamp\":1557361800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"ab229a5f-b921-4fe5-95b0-3364e53ed2db\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"debb8c6e-df05-4644-bdde-116155300abf\",\"code\":\"TDEBB8\",\"title\":\"Security on Android: What's Next\",\"description\":\"Attend this session to learn about security features in Android and how they affect your apps. This session will cover new APIs and best practices for protecting the integrity of your app and the privacy of your data.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557419400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"89522fd6-5342-4aeb-8d54-033a9699dc2c\",\"f455acc7-3a64-4437-a319-c402af3ea17a\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150930\",\"section\":\"\"},{\"id\":\"e27b4b52-fc95-429b-9965-9c835d6156d3\",\"code\":\"TE27B4\",\"title\":\"Material Theming: Build Expressively with Material Components\",\"description\":\"Discover how Google made Material Design more expressive and how teams can customize Material’s style to better reflect their product’s brand. In this talk, learn how you can build your own Material Theme using Material Components.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"4949f60c-f35f-47f1-858c-50f9471c1c4b\",\"7ea35afb-f85d-4635-bc0d-c54d511deb58\"],\"relatedSessions\":[\"ee71d961-be51-41a3-bc67-3f7e46297880\",\"c07cff11-3e52-4369-8434-607d99cac75d\",\"1d9c02ed-bdc5-4a32-90bc-7316d6d1fb55\",\"5d8b65d2-5369-4f0e-ba3c-ea048fd80999\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151014\",\"section\":\"\"},{\"id\":\"e29b9c38-62bd-4c50-973c-ccf2bb4e1a97\",\"code\":\"TE29B9\",\"title\":\"Android Studio: Tips and Tricks\",\"description\":\"Learn how to code like a pro with Android Studio! This session will teach you about some of the powerful features available in Android Studio, while sharing tips and tricks to help you get the most out of it. This talk will appeal to the new programmer, the seasoned developer, and everybody in between. No matter your level, you'll take away something to help you be more productive and effective with Android Studio.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557361800000,\"endTimestamp\":1557365400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"54c2d737-0fd2-4edb-ba40-0aeed1417ab1\",\"0bc5f1cd-3f5f-442b-b03d-6336ac5ca901\",\"9614f8e4-ec0f-4aaf-adb9-603a704ad32d\",\"3fc29769-b3a2-49cb-9b24-320fbea9978f\",\"fdb72d27-d4b6-4ab6-abc1-4298b6920e47\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150928\",\"section\":\"\"},{\"id\":\"e357ad70-278c-471c-86f9-8e611e9890ab\",\"code\":\"TE357A\",\"title\":\"What's New with Google Play Billing\",\"description\":\"Learn updates to the new Google Play Billing platform that will expand your sales of in-app items by opening up new selling surfaces and supporting new forms of payment. You'll discover how to improve purchase for new and repeat buyers, grow recurring revenue via subscriptions, and increase the trust and safety for users.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"6cd93fce-3ccc-419a-a1ac-1ca471b537b5\",\"e40b8a06-b365-4fab-96d2-da6490aa6100\",\"64be6d0f-7406-45f0-9f8b-2e3640a33681\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150890\",\"section\":\"\"},{\"id\":\"e4495605-a2f1-450a-9469-b5205682eb77\",\"code\":\"TE4495\",\"title\":\"Speechless Live\",\"description\":\"Get ready for the hilarious show that The Wall Street Journal called \\\"comedic gold.\\\" Back for its 6th I/O in a row, Speechless Live will put speakers from I/O sessions and keynotes to the test in the ultimate improvisational gauntlet--giving a presentation that they've never seen before. Speechless Live has been produced in multiple countries on 6 different continents and has been featured in The New York Times, The Wall Street Journal, Newsweek, San Francisco Chronicle, LA Weekly, and The Huffington Post. To learn more about Speechless, go to www.speechlessinc.com.\",\"type\":\"Keynotes\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_keynote\",\"type_keynotes\"],\"startTimestamp\":1557280800000,\"endTimestamp\":1557284400000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"e78b1469-2c61-4add-a119-8fa4a9935c38\",\"code\":\"TE78B1\",\"title\":\"What's New in Android C++ Development\",\"description\":\"This session will help Android C++ developers to understand improvements to the NDK, both recent and planned.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557277200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"521d7448-977a-4759-a6e5-082cab4281b1\",\"db13e286-22f4-4e9d-8a98-3e9d5d60f5e4\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150896\",\"section\":\"\"},{\"id\":\"e7b7baec-98a6-497f-be63-e174f4751c97\",\"code\":\"TE7B7B\",\"title\":\"How We Built the Google Assistant Sandbox Demos (And How You Can Too)\",\"description\":\"We had a lot of fun building the demos in the Google Assistant sandbox and want to share the assembly instructions with you! Leave inspired to build your own fun Actions and experiences, complete with code samples and tutorials. Power drill not included.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\",\"Intermediate\"],\"tagNames\":[\"level_beginner\",\"level_intermediate\",\"topic_assistant\",\"topic_misc\",\"type_sessions\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557426600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"15601a99-013d-4f99-b1a4-517ed4b6ddc1\",\"5d027c44-1111-4345-b350-ff1e653a2685\",\"e755b0a5-eb5d-4703-8c20-5999d9ef7cf2\"],\"relatedSessions\":[\"f76a49c1-bdb3-4041-8616-565edce346a2\",\"925a3d9d-b424-4c05-b3c0-96531a96bd85\",\"ca674c3e-1411-4f4a-bfd3-c93076bd633e\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\"],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"e9880e17-c788-4fd9-9d80-054244a25b3a\",\"code\":\"TE9880\",\"title\":\"Elevating the Web Platform with the JavaScript Framework Community\",\"description\":\"As developers, you interact with the Web Platform through tools and frameworks that make us more productive. In this talk, you'll learn some of the ways Chrome has been working with Open Source projects to help level up these important abstractions. Understand new partnerships and upcoming contributions we’ll be making to Open Source projects, including funding for projects at the heart of our ecosystem.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"9c47cc0f-a319-4597-843a-f4496895d05e\",\"584d157f-aa92-44ef-b13f-aeee8fd56257\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151089\",\"section\":\"\"},{\"id\":\"edd25f87-df45-4b17-84c8-2037ab1b6bae\",\"code\":\"TEDD25\",\"title\":\"Build Fast and Smooth Web Apps from Feature Phone to Desktop\",\"description\":\"Feature phones with tiny screen and no touch interface are coming \\\"back\\\" to the market. No matter how \\\"responsive design\\\" it is, most web applications are hard to use in those phones. Taking learnings from Japanese mobile web development in early 2000s, we are building web app that works fast and smooth on low powered feature phone which can also scale up to desktop application gracefully. Come see UX considerations and performance tips to turn your web app to the next level.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557419400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"2edfc648-2289-4071-bfc1-3866747226c8\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151023\",\"section\":\"\"},{\"id\":\"ee593179-d6b8-41c4-920b-2c895cf954c7\",\"code\":\"TEE593\",\"title\":\"Improve Digital Wellbeing: Google's Approach and Tips for Developers\",\"description\":\"Members of Google’s UX and product teams will present learnings about digital wellbeing and how to develop for it. You'll gain insights into tools Google has built to help kids, adults, and families manage their relationships with technology. You'll also gain insight into (1) how users feel about their technology use, (2) how Google is promoting digital wellbeing, and (3) how to embrace digital wellbeing values (awareness, control, value, trust) for better customer satisfaction.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"topic_android/play\",\"level_beginner\",\"type_sessions\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"e60af0ea-3703-4d78-a648-1c695ac02c72\",\"1f84b8f9-aa58-41ca-b4c9-759750181065\",\"2b157cb9-4b5d-4b07-8fe9-431214e9faaa\",\"41857501-5f30-44ed-b77e-b72eaab2647d\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150830\",\"section\":\"\"},{\"id\":\"ee71d961-be51-41a3-bc67-3f7e46297880\",\"code\":\"TEE71D\",\"title\":\"How to Design a Dark Theme Using Material\",\"description\":\"Learn best practices for creating a dark theme based on an existing material app.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557426600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"speakers\":[\"1635a5c6-ffbc-4f3b-864f-23760842ec37\"],\"relatedSessions\":[\"8885b540-24f6-4f85-9c3c-278c225fde60\",\"c07cff11-3e52-4369-8434-607d99cac75d\",\"e27b4b52-fc95-429b-9965-9c835d6156d3\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151081\",\"section\":\"\"},{\"id\":\"ef7d84a3-6c4c-4cdc-b9bd-aab46df88d1a\",\"code\":\"TEF7D8\",\"title\":\"The Power of Looking Up, with Astronaut Mae Jemison \",\"description\":\"In an inspirational talk, Astronaut Mae Jemison talks about the importance of “looking up” and how it can help us reconnect with the earth, the greater universe, and each other. Acknowledging that we are Earthlings, that we share the same origins and the same sky, can help us  regain a sense of self in a world that can feel isolating, and understand the importance of audacious goals for the health of humanity. How we survive, progress and thrive depends on how we embrace this reality.\\n\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_keynote\",\"type_sessions\"],\"startTimestamp\":1557336600000,\"endTimestamp\":1557340200000,\"livestream\":false,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"74eba712-7554-4133-b0a0-8dc56b8722a8\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"f02cb268-4ab7-479d-a5af-b86f9ceb844b\",\"code\":\"TF02CB\",\"title\":\"Building Apps for the Chrome OS Ecosystem\",\"description\":\"Learn why you should consider Chrome OS when developing Android apps and new features you can target. Dive deeper into best practices for input and large screens and see examples of the best of what developers have done.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"topic_chromeos\",\"type_sessions\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"939580a6-8fa2-4bf9-8eac-d9f34b151a98\",\"f7c047e5-fea0-480c-b27a-d5e5fb7ca0a3\",\"f2af1433-a7ce-4372-8fb2-91acd8288ae6\"],\"relatedSessions\":[\"16c155fe-9201-4bce-9813-687ffec744ef\",\"d69f6bcf-3596-40e4-8fb1-7d5614402bbf\",\"95655086-5fb5-4472-badb-c967a7cc29b1\",\"ba2a9e2c-0455-473d-a0b5-fb2c7e6e9d65\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150827\",\"section\":\"\"},{\"id\":\"f4d904d5-28ab-4e9b-9f63-6984bc405272\",\"code\":\"TF4D90\",\"title\":\"What's New with App Bundles: Custom App and Game Delivery\",\"description\":\"Learn how to customize delivery of your app features, game assets, and updates through modularization and app bundles. Learn about internal app sharing that lets you easily share and test App Bundles.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557433800000,\"endTimestamp\":1557437400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"4a07285f-2b43-4e71-87e5-b4793e386184\",\"b7b63215-b88f-4352-9ad7-8ff3d98a74b5\",\"6a3f88a8-d2ea-4f2f-88ef-a1b8f6d0c677\",\"7fb85938-994c-455e-b49b-ebcb7c240671\"],\"relatedSessions\":[\"6ccc06df-88ec-40fa-a227-71ec0482a85c\",\"51619260-4d01-4d74-a329-db9932b5fd7b\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150820\",\"section\":\"\"},{\"id\":\"f6510f00-1f37-49ab-810c-c9d37a2cfa8a\",\"code\":\"TF6510\",\"title\":\"Cloud TPU Pods: AI Supercomputing for Large Machine Learning Problems\",\"description\":\"Cloud Tensor Processing Unit (TPU) is an ASIC designed by Google for neural network processing. TPUs feature a domain specific architecture designed specifically for accelerating TensorFlow training and prediction workloads and provides performance benefits on machine learning production use. Learn the technical details of Cloud TPU and Cloud TPU Pod and new features of TensorFlow that enables a large scale model parallelism for deep learning training.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557415800000,\"endTimestamp\":1557419400000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"speakers\":[\"f40fc84d-2066-426a-ba82-76eed80d13ed\",\"c883dbbe-d6d0-4b05-9063-2af370cd8077\"],\"relatedSessions\":[\"2bb62251-ae83-43d6-ab8f-d33f857c7473\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150904\",\"section\":\"\"},{\"id\":\"f751446d-15b0-4856-bf1d-0a1781089eee\",\"code\":\"TF7514\",\"title\":\"Understand Kotlin Coroutines on Android\",\"description\":\"Coroutines are a feature of Kotlin that help convert callback-based code into sequential code, making code easier to read, write, and understand. This session will show you how to use coroutines on Android, and how the new androidx-concurrent library makes it easy to use them to get things off the main thread. You'll also learn how the new library helps coroutines work with Architecture Components. This session also covers coroutine patterns, best practices, and even how to test coroutines!\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557277200000,\"endTimestamp\":1557280800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"speakers\":[\"35155de0-bf0a-4c91-a017-4f05d21ab97e\",\"db4cb453-9804-49b9-918e-1277f97ef5fa\",\"d14366fe-1b3e-4496-b792-52d12a796ea8\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150826\",\"section\":\"\"},{\"id\":\"f76a49c1-bdb3-4041-8616-565edce346a2\",\"code\":\"TF76A4\",\"title\":\"Smart Home 101: How to Develop for the Connected Home\",\"description\":\"Come learn the fundamentals of building a thoughtful smart home. This session covers updates on the latest tools and capabilities of our smart home API, along with how developers and device makers alike can benefit from deeper integrations with the Google Assistant ecosystem.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_assistant\",\"topic_iot\",\"type_sessions\"],\"startTimestamp\":1557329400000,\"endTimestamp\":1557333000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"67b80999-fd61-42bb-b4f2-6a000fc64fdc\",\"53a5d957-4603-4b11-82eb-41c2a57dcd50\",\"03185fc8-d76d-4db4-801c-9e879e3d51ca\"],\"relatedSessions\":[\"601ad7a6-8c0c-46ce-bca8-239986ff6357\",\"db8c26f5-2ac5-4b2b-922d-ca69765ff72c\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\",\"e7b7baec-98a6-497f-be63-e174f4751c97\",\"38f647d5-cd0b-484e-ad07-e396b0308e68\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151003\",\"section\":\"\"},{\"id\":\"f849a6f6-f06e-40d8-b1f2-eb4fc35ecc60\",\"code\":\"TF849A\",\"title\":\"Motional Intelligence: Build Smarter Animations\",\"description\":\"Look at techniques for writing animations that work like state machines, that can be interrupted or retargeted while running.You'll learn ways to architect your animations to achieve this using libraries and classes.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"type_sessions\"],\"startTimestamp\":1557423000000,\"endTimestamp\":1557426600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"622c536f-87b0-4562-a726-3c770097867b\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150825\",\"section\":\"\"},{\"id\":\"f8ddbfd0-04c7-4a5e-af6c-b2f35b8d5a8e\",\"code\":\"TF8DDB\",\"title\":\"Make Your Website Fast\",\"description\":\"Learn how to improve page load times and responsiveness in your website and web app with Firebase with a focus on measuring performance and improving it by caching data or assets, using Service Workers to do background work, rendering server-side, performing background data loads, and seeding initial data.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"topic_firebase\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557340200000,\"endTimestamp\":1557343800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"speakers\":[\"fe03de0d-bca8-485d-a396-e72a1ed8dab2\",\"564b7964-2f8c-48b8-aa08-14d828e3eb63\"],\"relatedSessions\":[\"ba278d33-cf65-43bc-bf61-6f99a3290445\",\"8046ba76-9592-43e7-b63a-96ed9c1ce320\",\"c602283d-4249-4c20-8da4-a5107f620e69\"],\"doryLink\":\"https://dory.withgoogle.com/series/101150998\",\"section\":\"\"},{\"id\":\"fa7a86eb-3a05-42d6-afdc-30925a03a638\",\"code\":\"TFA7A8\",\"title\":\"TF-Agents: A Flexible Reinforcement Learning Library for TensorFlow\",\"description\":\"TF-Agents is a clean, modular, and well-tested open-source library for Deep Reinforcement Learning with TensorFlow. This session will cover recent advancements in Deep RL, and show how TF-Agents can help to jump start your project. You will also see how TF-Agent library components can be mixed, matched, and extended to implement new RL algorithms.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_opensource\",\"topic_ml/ai\",\"type_sessions\"],\"startTimestamp\":1557426600000,\"endTimestamp\":1557430200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"839a08c0-f3fd-4900-8f7c-47c7bc3f5566\",\"4a98189f-006e-41c3-8af5-2d0172a105a8\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150833\",\"section\":\"\"},{\"id\":\"faf395cf-4c2e-4b8e-8e43-b8eb5a16c103\",\"code\":\"TFAF39\",\"title\":\"WebAssembly for Web Developers\",\"description\":\"WebAssembly is often hailed as a performance tool for critical tasks or to bring existing C++ code bases to the web – such as games. But WebAssembly is so much more. You can use WebAssembly as a puzzle piece to give the web platform the few missing capability that you are missing or to surgically replace a JavaScript bottleneck.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"level_intermediate\",\"topic_gaming\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557351000000,\"endTimestamp\":1557354600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"a7591fe4-172a-4a79-a62c-c54622dadbea\",\"d85e8e66-bdb7-495d-aede-2b05a73d65a5\"],\"relatedSessions\":[\"9888b5c4-33eb-42d7-97c8-4cef89f20b98\",\"82aba302-8396-4068-b014-74e8592b3a06\",\"ad90afc2-bf1f-4318-abc0-d7e8df67bf07\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151093\",\"section\":\"\"},{\"id\":\"fc4a76a0-5907-4c6a-b1b1-074fc7649043\",\"code\":\"TFC4A7\",\"title\":\"Extend Your Android App to the Google Assistant\",\"description\":\"Want to make key features of your Android app easily available on the Google Assistant? Then join us in this session about App Actions and Slices to learn how to let your app users quickly get things done through the Google Assistant.\",\"type\":\"Sessions\",\"contentLevels\":[\"Intermediate\"],\"tagNames\":[\"topic_android/play\",\"level_intermediate\",\"topic_assistant\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"speakers\":[\"37c6fb5f-29cc-423c-a947-9cdcad0e1ac7\",\"308bbb2b-c238-416b-b342-428bff1b44ac\",\"2e849e51-5996-4793-9124-6f9966f6c8ee\"],\"relatedSessions\":[\"40a400cf-aa8d-4510-8491-07d1e0248f06\",\"601ad7a6-8c0c-46ce-bca8-239986ff6357\",\"ca674c3e-1411-4f4a-bfd3-c93076bd633e\",\"15b34f05-e779-41f5-9d27-ccb9d89fb965\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151001\",\"section\":\"\"},{\"id\":\"fcdddab0-8841-450c-9ccc-08f9efaf6c92\",\"code\":\"TFCDDD\",\"title\":\"Android Memory and Games\",\"description\":\"Memory management is a difficult problem for game developers on mobile devices. They want to use as much memory as possible, but have to contend with other apps and the system for resources. This talk will describe how games are currently dealing with memory, the tools available, and some of the improvements in Android Q.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"topic_android/play\",\"level_advanced\",\"topic_gaming\",\"type_sessions\"],\"startTimestamp\":1557354600000,\"endTimestamp\":1557358200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"speakers\":[\"5454b3b6-22ec-4f80-9535-a035dc56698b\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150960\",\"section\":\"\"},{\"id\":\"fcf0b9fe-67c5-4f56-8983-1380747211b8\",\"code\":\"TFCF0B\",\"title\":\"Accessible Audio: Android Hearing Aid Support and the Audio Framework\",\"description\":\"This talk is for media developers, audio hardware makers and hearing aid manufacturers interested in making audio on Android more accessible using built-in capabilities such as the dynamics processing effect (DPE) and Android Streaming Hearing Aid Support (ASHA). You'll see examples of audio equalization using DPE to adjust for hard-to-hear situations using a reference application and learn implementation steps for hearing aid developer-manufacturers who want to implement ASHA.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"topic_accessibility\",\"type_sessions\"],\"startTimestamp\":1557273600000,\"endTimestamp\":1557277200000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"speakers\":[\"5512e4b4-3c24-4d74-b8b8-df6bdd7fce23\",\"ce2c41af-ad23-49ff-b616-766c729b6e66\",\"0152fae2-40ea-43df-9d7f-fb61bd79e555\",\"dffb3f2f-35bc-42e0-8a46-9cc9d6f7559b\"],\"relatedSessions\":[\"a4d001a3-5b1b-4d86-a8a8-393aea94dcaf\"],\"doryLink\":\"https://dory.withgoogle.com/series/101151029\",\"section\":\"\"},{\"id\":\"fda729a8-37df-428f-a83e-0e71a122cb29\",\"code\":\"TFDA72\",\"title\":\"Making Art with Artificial Intelligence: Artists in Conversation\",\"description\":\"This session will explore new forms of visual art made possible by machine learning, from collaboration with robots to machine models of nature. Hear from some of the artists exhibiting their work on The Boardwalk at I/O as part of I/O Arts. This session is brought to you by Artists and Machine Intelligence, a program at Google Arts & Culture that invites artists to work with engineers and researchers together in the design of intelligent systems.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557333000000,\"endTimestamp\":1557336600000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"defbc8e7-1f90-4627-baa4-ff2d695126ec\",\"2551f1be-0c79-4316-b099-8ad365694122\",\"da60fa7c-b765-4969-bf6c-9782a3ffa243\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"fdc71283-0f2f-45db-8324-3db45cd80391\",\"code\":\"TFDC71\",\"title\":\"Film Screening: nimiia cétiï, an Art and Machine Learning Project By Artist Jenna Sutela\",\"description\":\"nimiia cétiï is a video installation by Google Arts and Culture artist-in-residence Jenna Sutela. She is a Visiting Artist at The MIT Center for Art, Science & Technology (CAST) in 2019-20. Created in collaboration with artist and creative technologist Memo Akten, and Damien Henry, Head of Innovation at the Google Arts and Culture Lab. Documenting the interactions between a neural network, audio recordings of channeled Martian language, and footage of the movements of extremophilic bacteria, the work uses machine learning to generate a new form of communication.\",\"type\":\"Sessions\",\"contentLevels\":[],\"tagNames\":[\"topic_misc\",\"topic_ml/ai\",\"topic_keynote\",\"topic_design\",\"type_sessions\"],\"startTimestamp\":1557369000000,\"endTimestamp\":1557370800000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"speakers\":[\"da60fa7c-b765-4969-bf6c-9782a3ffa243\"],\"relatedSessions\":[],\"doryLink\":\"\",\"section\":\"\"},{\"id\":\"fe0ddb19-f797-4004-8640-0fd1f294e675\",\"code\":\"TFE0DD\",\"title\":\"Rendering on the Web: Performance Implications of Application Architecture\",\"description\":\"One of the core values of the web is its accessibility: the same medium can be used to deliver content that adapts to different devices, capabilities and connection types. This variability needs to be factored into every architectural decision that is made. Luckily, frameworks are here to help.This talk will showcase upcoming framework features that reduce the impact of architectural constraints and potentially improve performance beyond what is possible today.\",\"type\":\"Sessions\",\"contentLevels\":[\"Advanced\"],\"tagNames\":[\"level_advanced\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557419400000,\"endTimestamp\":1557423000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"speakers\":[\"6985697f-b27e-49a6-a280-ec4a6f2af3c0\",\"4b2a5f0e-54f4-40bb-a07e-3eff6f61df40\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101150952\",\"section\":\"\"},{\"id\":\"ffd885b8-795b-46e3-a22e-5f45b647165a\",\"code\":\"TFFD88\",\"title\":\"Anatomy of a Web Media Experience\",\"description\":\"You'll learn about the insights that led to our redesigned native media controls in Chrome and what it took to convert these into a customizable UI library that now ships as part of Shaka player.\",\"type\":\"Sessions\",\"contentLevels\":[\"Beginner\"],\"tagNames\":[\"level_beginner\",\"type_sessions\",\"topic_web\"],\"startTimestamp\":1557437400000,\"endTimestamp\":1557441000000,\"livestream\":true,\"youtubeUrl\":\"\",\"youtubeVideoType\":\"\",\"isFeatured\":false,\"room\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"speakers\":[\"b5d6ebcc-d7dc-4902-afdd-c8aad8c6c267\",\"5b0f7104-7f76-414d-9416-86e3dbd47920\"],\"relatedSessions\":[],\"doryLink\":\"https://dory.withgoogle.com/series/101151019\",\"section\":\"\"}],\"tags\":[{\"id\":\"9cfeec24-c6b9-4b59-bad5-1dd0e75efa2f\",\"name\":\"Beginner\",\"order_in_category\":1,\"category\":\"level\",\"tag\":\"level_beginner\"},{\"id\":\"2c6a1835-2734-49d9-a3ba-37b16627fc84\",\"name\":\"Intermediate\",\"order_in_category\":2,\"category\":\"level\",\"tag\":\"level_intermediate\"},{\"id\":\"40f11fc0-9b4d-4b9f-883a-46cdd5475c08\",\"name\":\"Advanced\",\"order_in_category\":3,\"category\":\"level\",\"tag\":\"level_advanced\"},{\"id\":\"bff4d070-b773-4665-89b9-6910e57c14ea\",\"name\":\"Accessibility\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_accessibility\",\"color\":\"#4768FD\",\"fontColor\":\"#FFFFFF\"},{\"id\":\"1446ffe1-aa35-4a05-9fd6-742959fa80e0\",\"name\":\"Ads\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_ads\",\"color\":\"#574DDD\",\"fontColor\":\"#FFFFFF\"},{\"id\":\"97916c32-3052-43cd-92a5-18a2f2440647\",\"name\":\"Android / Play\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_android/play\",\"color\":\"#8DA0FC\",\"fontColor\":\"#202124\"},{\"id\":\"2b1df766-ae88-4f2e-b46b-602ff4541b2e\",\"name\":\"Assistant\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_assistant\",\"color\":\"#27E5FD\",\"fontColor\":\"#202124\"},{\"id\":\"890753b9-65f2-46ba-ac39-6c9133fce82b\",\"name\":\"Augmented Reality\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_augmentedreality\",\"color\":\"#94DD6B\",\"fontColor\":\"#202124\"},{\"id\":\"6537b5f7-589c-4cf7-8f68-d2aa9662e0c6\",\"name\":\"Chrome OS\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_chromeos\",\"color\":\"#FD9127\",\"fontColor\":\"#202124\"},{\"id\":\"472363af-160c-404c-a3d0-c757f6285cb2\",\"name\":\"Cloud\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_cloud\",\"color\":\"#1DB8D2\",\"fontColor\":\"#202124\"},{\"id\":\"a649c7d8-e47c-4a1b-809f-c06dc8268f55\",\"name\":\"Design\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_design\",\"color\":\"#069F86\",\"fontColor\":\"#202124\"},{\"id\":\"97030028-d22a-41c8-a610-7a8489e7aa2e\",\"name\":\"Firebase\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_firebase\",\"color\":\"#39C79D\",\"fontColor\":\"#202124\"},{\"id\":\"b08e5171-8743-4fa4-9055-856a36f63638\",\"name\":\"Flutter\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_flutter\",\"color\":\"#FF4081\",\"fontColor\":\"#202124\"},{\"id\":\"80844756-8605-4315-8c0a-d92cf4c7fe87\",\"name\":\"Gaming\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_gaming\",\"color\":\"#4768FD\",\"fontColor\":\"#FFFFFF\"},{\"id\":\"e57c7df8-f075-41bd-8647-a6e1860933c1\",\"name\":\"IoT\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_iot\",\"color\":\"#BBF5CB\",\"fontColor\":\"#202124\"},{\"id\":\"6967088b-0a2e-42f0-a8fc-bf0712c80368\",\"name\":\"Keynote\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_keynote\",\"color\":\"#31E7B6\",\"fontColor\":\"#202124\"},{\"id\":\"4a8001ea-0176-4d4f-8b89-c7b7733c14e9\",\"name\":\"Location / Maps\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_location/maps\",\"color\":\"#FEEBB6\",\"fontColor\":\"#202124\"},{\"id\":\"c7880ccc-ff69-412b-8c52-63f0f1702ef8\",\"name\":\"Misc\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_misc\",\"color\":\"#E8BC4F\",\"fontColor\":\"#202124\"},{\"id\":\"3d63c466-c78f-4a1b-b53c-a04dc803e884\",\"name\":\"ML / AI\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_ml/ai\",\"color\":\"#FCD230\",\"fontColor\":\"#202124\"},{\"id\":\"17444b10-76b5-43e6-9474-61ed9319d459\",\"name\":\"Open Source\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_opensource\",\"color\":\"#FF6C00\",\"fontColor\":\"#202124\"},{\"id\":\"bc92a9a0-2f56-4738-8a7a-f1a40f46bbb3\",\"name\":\"Payments\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_payments\",\"color\":\"#FF9E80\",\"fontColor\":\"#202124\"},{\"id\":\"b669982f-a2b6-4049-9f7b-568797f5d3bb\",\"name\":\"Search\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_search\",\"color\":\"#4768FD\",\"fontColor\":\"#FFFFFF\"},{\"id\":\"5528fdf2-bcb2-4e66-9cf3-f88270b306b5\",\"name\":\"Web\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_web\",\"color\":\"#FABFA9\",\"fontColor\":\"#202124\"},{\"id\":\"0a190249-993e-4020-bfda-0e894ca46616\",\"name\":\"Workshop\",\"order_in_category\":0,\"category\":\"topic\",\"tag\":\"topic_workshop\",\"color\":\"#4768FD\",\"fontColor\":\"#FFFFFF\"},{\"id\":\"a4e56330-aaf1-442b-9133-1b64adb22751\",\"name\":\"After Dark\",\"order_in_category\":0,\"category\":\"type\",\"tag\":\"type_afterdark\",\"color\":\"#999999\"},{\"id\":\"e0e19674-51c4-455c-8e9d-beef0431111c\",\"name\":\"Game Reviews \",\"order_in_category\":0,\"category\":\"type\",\"tag\":\"type_gamereviews\",\"color\":\"#999999\"},{\"id\":\"54881805-bed8-47f8-bf4b-f8c7d52763c4\",\"name\":\"Keynotes\",\"order_in_category\":0,\"category\":\"type\",\"tag\":\"type_keynotes\",\"color\":\"#999999\"},{\"id\":\"9c89e864-1863-4d3d-b957-c8e818aafecd\",\"name\":\"Lightning Talks\",\"order_in_category\":0,\"category\":\"type\",\"tag\":\"type_lightningtalks\",\"color\":\"#999999\"},{\"id\":\"e32f7427-122d-4930-b627-815d9ca1595b\",\"name\":\"Meetups\",\"order_in_category\":0,\"category\":\"type\",\"tag\":\"type_meetups\",\"color\":\"#999999\"},{\"id\":\"b06460af-fe05-49fe-a7d1-08cf162a294b\",\"name\":\"App Reviews\",\"order_in_category\":1,\"category\":\"type\",\"tag\":\"type_appreviews\",\"color\":\"#999999\"},{\"id\":\"912e8032-1b4c-4716-958b-b6350e53172d\",\"name\":\"Codelabs\",\"order_in_category\":2,\"category\":\"type\",\"tag\":\"type_codelabs\",\"color\":\"#999999\"},{\"id\":\"541ab9df-c9eb-47b7-8228-f8e75b059d40\",\"name\":\"Office Hours\",\"order_in_category\":3,\"category\":\"type\",\"tag\":\"type_officehours\",\"color\":\"#999999\"},{\"id\":\"b25313fb-9937-403e-b197-dee6a589190e\",\"name\":\"Sessions\",\"order_in_category\":5,\"category\":\"type\",\"tag\":\"type_sessions\",\"color\":\"#999999\"}],\"rooms\":[{\"id\":\"8e98d56a-a179-42b9-8d53-7784f4aeee6a\",\"capacity\":\"igggietu\",\"name\":\"Amphitheatre\",\"filter\":true},{\"id\":\"bb3d8fbf-6b3f-4316-816e-deae33bdf035\",\"capacity\":\"gst2e\",\"name\":\"Boardwalk\",\"filter\":false},{\"id\":\"5fc9ab36-28fb-4ca2-b172-48a7984d5844\",\"capacity\":\"gtf0s\",\"name\":\"Codelabs \",\"filter\":false},{\"id\":\"110e32b3-50b9-4661-873d-4ac68a691375\",\"capacity\":\"gtoef\",\"name\":\"Community Lounge\",\"filter\":false},{\"id\":\"e73736f7-39fd-4f9b-87bc-7abe7271271a\",\"capacity\":\"ii9si\",\"name\":\"Game Reviews\",\"filter\":false},{\"id\":\"6827a562-dca1-4dc4-adec-32c69559e32b\",\"capacity\":\"niuef\",\"name\":\"Office Hours / App Reviews \",\"filter\":false},{\"id\":\"359b19a7-b164-4468-a800-e79f465966bf\",\"capacity\":\"rqtisf2\",\"name\":\"Stage 1\",\"filter\":true},{\"id\":\"e9e80667-1a48-4d46-a3d7-d643f8aecd7d\",\"capacity\":\"hnng00st\",\"name\":\"Stage 2\",\"filter\":true},{\"id\":\"f14d05f1-0581-45c5-aff4-389bf36c3f75\",\"capacity\":\"nntte-u\",\"name\":\"Stage 3\",\"filter\":true},{\"id\":\"b312c1d6-1a40-4e3f-9b9d-a90109ca2145\",\"capacity\":\"nigeus2\",\"name\":\"Stage 4\",\"filter\":true},{\"id\":\"f44c348b-da68-41aa-a3e1-8fd3431dc7c3\",\"capacity\":\"nntvoss\",\"name\":\"Stage 5\",\"filter\":true},{\"id\":\"38d5eb0d-2088-4096-ad83-916fff0be562\",\"capacity\":\"nnts1fo\",\"name\":\"Stage 6\",\"filter\":true},{\"id\":\"b9b00678-787a-4297-a359-d72d636efd19\",\"capacity\":\"oigisst\",\"name\":\"Stage 7\",\"filter\":true},{\"id\":\"d676bb28-7508-4487-a8a8-c4c258c9219e\",\"capacity\":\"rig9912\",\"name\":\"Stage 8\",\"filter\":true},{\"id\":\"9f0b69a4-66a8-49e7-bc64-d79606b63f8e\",\"capacity\":\"hqg9itv\",\"name\":\"The Garage\",\"filter\":false},{\"id\":\"3e731738-43cf-485b-a464-cc88c205301a\",\"capacity\":\"iio-u\",\"name\":\"The Garage (Game Reviews)\",\"filter\":false},{\"id\":\"fcd1f71e-7180-409f-9541-926028742d26\",\"capacity\":\"ri0-v9\",\"name\":\"The Garage (Workshops)\",\"filter\":false}],\"speakers\":{\"453e8809-68a9-4cb5-bb67-35340355e89b\":{\"id\":\"453e8809-68a9-4cb5-bb67-35340355e89b\",\"name\":\"\",\"bio\":\"asdf\",\"company\":\"test\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/HF1s50SXpo5huei6wTEOPVAraiylybZ7XjnvMz1bGw5b4I5BpbklNX43V7RYgDE_4C-6zs77ldOYHo8g5jVmqgwF_w\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"5cfe455c-f9f7-4956-b465-920f49778255\":{\"id\":\"5cfe455c-f9f7-4956-b465-920f49778255\",\"name\":\"\",\"bio\":\"Testing Jordan's Bio 11:01am 3/18\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/XgJaKxEhsnMNDreMYehdqSIwIX_PuR2rsk3YWr9Vo9k9Pdcspjr_bSRUv7Zl5NKZv1i6f7J0QGGGPZY4kyWjRxo6\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"27aedf58-82f3-480a-ab97-79dfa21e0125\":{\"id\":\"27aedf58-82f3-480a-ab97-79dfa21e0125\",\"name\":\"Aakash Sahney\",\"bio\":\"Aakash is a Product Manager on the G Suite team, responsible for the developer platforms for Gmail and Hangouts Chat.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Pym1dYQtGIevwchNuN9txOjg6deAvCPXNBWLt0aaodxlCZIFKI0Yz5fIKzvR_6ro_EmgS7zxltk-pbOCZCEzDJzV\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/aakashsahney\",\"LinkedIn\":\"\"}},\"958f7550-6a00-485d-842b-a125ac609553\":{\"id\":\"958f7550-6a00-485d-842b-a125ac609553\",\"name\":\"Aanchal  Bahadur\",\"bio\":\"Aanchal is the global product partnerships lead for Chrome and Web Platform, responsible for adoption of new web technologies like Progressive Web Apps by strategic partners in key verticals and markets. Prior to Chrome, Aanchal led creator content partnership efforts for YouTube in India.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/fDwhy8CdN8tAfW8kIE3MpwCLTXYtYEkwAZm8BfH9-RP2CiIHa5g0hBYZmArQbxH8uLHIbnNbqGsvrwGeDG0ElssM\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/aanchalbahadur\",\"LinkedIn\":\"https://www.linkedin.com/in/aanchal-bahadur-4016b016/\"}},\"cb32aa67-5f65-4aab-860c-90f0302f29e1\":{\"id\":\"cb32aa67-5f65-4aab-860c-90f0302f29e1\",\"name\":\"Abodunrinwa Toki\",\"bio\":\"Toki is a software engineer at Google. In this role, he focuses on bringing artificial intelligence features and components to the Android platform. Previously, he was a software engineer on the Android UI Toolkit team. Prior to Google, he worked on ads infrastructure at Yahoo. Toki earned a master's degree in software engineering from University College London and a bachelor's in computer engineering from Obafemi Awolowo University.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MEfwJAdocjszBUdsaEZAhNSTrVn8mAgsXl8bvcLqLZDJCBmSv_o6JiklN1dIt_KgpJUb4sZi3eN7YEJ4KcxspLFF\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"747ded15-8288-4649-82e4-59284415f405\":{\"id\":\"747ded15-8288-4649-82e4-59284415f405\",\"name\":\"Adam Carpenter\",\"bio\":\"Adam heads the developer business growth team and leverages Play data to improve partners' performance.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/EGugY7KLlO7anS2r967YT9nK0blAeqarHHyFpLhJnu6QMpzot0p_rg69KOBVyHjfj8v1YPw5atJfWCGFIDjfHXK5\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/adamcarpenter/\"}},\"308bbb2b-c238-416b-b342-428bff1b44ac\":{\"id\":\"308bbb2b-c238-416b-b342-428bff1b44ac\",\"name\":\"Adam Coimbra\",\"bio\":\"Adam is a Product Manager working on Actions on Google, focused on the conversational APIs for the Google Assistant. He graduated from the University of Pittsburgh with bachelor's degrees in Computer Science and Business Administration.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"2e849e51-5996-4793-9124-6f9966f6c8ee\":{\"id\":\"2e849e51-5996-4793-9124-6f9966f6c8ee\",\"name\":\"Adam Koch\",\"bio\":\"Adam is a Developer Advocate based out of the Google Melbourne office working with developers across Australia, Southeast Asia and India to bring the best of Google technology to users via key developer integrations. Adam has a passion for Android and all things mobile and covers a broad range of technology from app design and UX, to evolving development best practices for emerging markets.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/SG-RIPDSJBAbnMSE36kqHF2Fa7I_Kxa3DbYSOCOpGvuhdJO_8DLboWldTJhMeAM-73EAmKg-a5l-QDYoC7wrq5Sjbw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/adamkoch\",\"LinkedIn\":\"\"}},\"662d1a69-3ec0-4565-9ba6-bcfc2ffb9f0e\":{\"id\":\"662d1a69-3ec0-4565-9ba6-bcfc2ffb9f0e\",\"name\":\"Adam Powell\",\"bio\":\"Adam is a staff software engineer and tech lead manager on the Android Toolkit team. Since 2009 he's worked on Android APIs ranging from ListView and RecyclerView to Activity and Fragment lifecycles and architecture components. He's interested in making app construction easy and fun.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/vl6QBqc6RjdBh7gpspAH5GrhkpT3tyOITWjffpE5hDSFwq2PZg8Ss8UMtQ3Y5jIgbgfw0Y-8p5NEDJ40KGv4Gz0oKA\",\"socialLinks\":{\"GitHub\":\"https://github.com/adamp\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/adamwp\",\"LinkedIn\":\"\"}},\"0614227e-be40-41a7-9af9-e58a8bd3446f\":{\"id\":\"0614227e-be40-41a7-9af9-e58a8bd3446f\",\"name\":\"Adam  Greenberg\",\"bio\":\"Adam Greenberg works on Global Product Partnerships for AMP, Search and the web.  He focuses on launching new platform capabilities, expanding early products into new markets and verticals, and helping developers build best-in-class web experiences.  Prior to Google, Adam worked in the startup world and as a consultant for the Spanish government.  He studied writing at the University of Iowa and is based in New York.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/VuXB1UHhMDxXHc1aqJ4HtwOhzBdgQFrPHN7XsAbeePG6T3ajZmrHtM_GitdjAqv9qW4uv624Pp9swPjifRl3hRiB\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"e5de6f4a-97c5-46af-8b57-1e40b5f0cc70\":{\"id\":\"e5de6f4a-97c5-46af-8b57-1e40b5f0cc70\",\"name\":\"Adam  Roberts\",\"bio\":\"Adam earned his PhD in Computer Science with a Designated Emphasis in Computational Genomics at UC Berkeley. After, in 2013, he joined Google and began to apply his work on DNA sequences to note sequences. Roberts became a founding member of Magenta, a Google Brain project, researching the generative applications of neural networks to enable new modes of creative exploration for musicians and artists.\\r\\n\",\"company\":\"Google AI\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/SvP5pE2E_zfZoMOnR2XUtiY9JXJd8Pi3o53fRa2IVGD5-hCoq39nSn8jmvea3hbvT1Fsze4mRbiRvHaaIRLhshLsXA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ada_rob\",\"LinkedIn\":\"https://www.linkedin.com/in/adam-roberts-4b04132a/\"}},\"c3cc22c6-4b58-4b72-b47f-72ad07203170\":{\"id\":\"c3cc22c6-4b58-4b72-b47f-72ad07203170\",\"name\":\"Addy Osmani\",\"bio\":\"Addy Osmani is an Engineering Manager working on Google Chrome. He leads up a Speed team focused on making the web fast. His team work on projects like Lighthouse and Workbox in addition to Google's guidance on how to keep sites loading quickly.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/0o-dotHxAP-RmyakCFWS665RzF-34Kq8cOxlmd4SBrgvC7dGzJGusaOVvgRBe8ehFhMYuztH_QJZSdvpdk_4mcG4\",\"socialLinks\":{\"GitHub\":\"https://github.com/addyosmani\",\"Website\":\"https://addyosmani.com\",\"Twitter\":\"https://twitter.com/addyosmani\",\"LinkedIn\":\"\"}},\"530b0d36-2d8c-43e6-a223-ade62bf0c7cd\":{\"id\":\"530b0d36-2d8c-43e6-a223-ade62bf0c7cd\",\"name\":\"Adrian Roos\",\"bio\":\"Adrian Roos is a Senior Software Engineer at Google where he is working on the Android Framework team. He is currently leading the effort to launch foldable devices on Android. Before joining Google, Adrian founded the startup Bitspin, and studied Computer Science at ETH Zürich.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/7h4idCCAwfhB8Xsg3AwXJkbGmcbS2rznRgPGbGnlXz0cjZ6BR_z1o5vaYG2avV0LdWHoPn90h5qrc889DfdC6TNl\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/adrian_roos\",\"LinkedIn\":\"https://www.linkedin.com/in/adrianroos\"}},\"71fbd3af-06b6-49d6-b6e5-aa3380793101\":{\"id\":\"71fbd3af-06b6-49d6-b6e5-aa3380793101\",\"name\":\"Alan Kent\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"da4eafca-ae0e-4e7b-903c-25b8b5f70224\":{\"id\":\"da4eafca-ae0e-4e7b-903c-25b8b5f70224\",\"name\":\"Alex Faaborg\",\"bio\":\"Alex Faaborg is the design lead for Google’s AR Platform team. He has led the design of Android Wear, Google Now, and the Android System UI for KitKat. Prior to joining Google, Alex served at Mozilla as the principal designer on Firefox for five years. Alex has a masters degree from the MIT Media Lab where he researched artificial intelligence, intelligent agents, and context aware computing. Alex’s interactive design work is based on fundamentals of human cognition and perception, from his background in Cognitive Science and Information Science at Cornell University.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"ca4ebde9-3d15-4e77-a51e-99fd0bcf12fe\":{\"id\":\"ca4ebde9-3d15-4e77-a51e-99fd0bcf12fe\",\"name\":\"Alex  Czetwertynski\",\"bio\":\"\",\"company\":\"\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"0a5fdbb8-2b99-45c4-a62a-79dc95e8888d\":{\"id\":\"0a5fdbb8-2b99-45c4-a62a-79dc95e8888d\",\"name\":\"Alex  Eagle\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"05073c49-b6ca-4eca-bd93-71d1460638f4\":{\"id\":\"05073c49-b6ca-4eca-bd93-71d1460638f4\",\"name\":\"Alexis Dean\",\"bio\":\"\",\"company\":\"fdsaf\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"2c52f3ac-f843-4d25-b1e3-b88759bbf331\":{\"id\":\"2c52f3ac-f843-4d25-b1e3-b88759bbf331\",\"name\":\"Alexis  Moussine-Pouchkine\",\"bio\":\"Alexis MP is a Cloud Developer Advocate at Google focusing on Serverless, Java, and the getting started experience.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/jh5hMh2LwP5EWkRsHmOv6JA4g28neIVUZtLVnU_ZQuwWQF5P9jXiYiijY-Gi-i2avMpeqqPZFcA2XyFSdJula3s\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://cloud.google.com\",\"Twitter\":\"https://twitter.com/alexismp\",\"LinkedIn\":\"\"}},\"c187268e-9888-45ad-85af-fd5375e88549\":{\"id\":\"c187268e-9888-45ad-85af-fd5375e88549\",\"name\":\"Alicia  Williams\",\"bio\":\"Alicia is a developer advocate for Google Cloud. Previously she spent six years as a program manager and through building, managing, and measuring programs and processes, she fell in love with data science. Known to hang out in spreadsheets surrounded by formulas, she also uses machine learning, SQL, and visualizations to help solve problems and tell stories.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/QF426Jr2Zep1yYuwaZCserUYeeXvYMpT1JwH7kSg6vl5bLxbwHDkp7MgG4otb8FHoUMFaM19elq885IFeW6mKFE\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://medium.com/@presactlyalicia\",\"Twitter\":\"https://twitter.com/presactlyalicia\",\"LinkedIn\":\"\"}},\"1b2a3e8b-c377-47c7-8efd-cb68dbd6755e\":{\"id\":\"1b2a3e8b-c377-47c7-8efd-cb68dbd6755e\",\"name\":\"Allen  Harvey\",\"bio\":\"Allen Harvey is a Product Manager working on new features for Google Search. Prior to Google, Allen spent ten years as a developer and product manager, most recently leading marketplace-focused products at several companies. Allen has a degree in Computer Science from Dartmouth College and an M.B.A. from the University of Virginia. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/yVCCzqgWC9029HBBshMRLCLyQdrwPZfAYwcgyNGEF7OLXQG8EwS3a7ghFVVykFtmEntUxRZ68_lMLd0BEL0yv-RD\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"ae8ac67a-ef5e-40fb-a076-c03997e3f1cc\":{\"id\":\"ae8ac67a-ef5e-40fb-a076-c03997e3f1cc\",\"name\":\"Alok  Chandel\",\"bio\":\"Alok is the Android user experience lead for the foldable phones. He has been at Google for more than 10 years and previously worked on Google Search, Google Glass, and Chromecast amongst other projects. \\r\\n\\r\\nAlok is a graduate of Institute of Design, Chicago and Indian Institute of Technology, Guwahati specializing in Product Design.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/RfYG0nXKKJ-HZ05DuAyQCABaRcqzpGsEAU0adzK0DBXra1V4OSKWagwasi5ZRqhfI819BVU6JUjSYzxgyW4Q6W5iiw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"5d02faa0-5c57-4d4f-a545-1053df7beb60\":{\"id\":\"5d02faa0-5c57-4d4f-a545-1053df7beb60\",\"name\":\"Alyssa Perez\",\"bio\":\"Alyssa is a product manager of Google Analytics for Firebase. Prior to joining Google, Alyssa specialized in mobile game monetization, user segmentation and in-game economies. She worked as a senior product manager at Zynga and as a business analytics manager at Playtika, the number one social casino game company. Before working in mobile gaming, she worked in real-money gaming at Caesars Entertainment. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/uvEW6u5MtZHH9PmbjYdD6eCFM8RraMh4RbJVdW_1BjuDgER5p7RwYzLMoC3D7Nd5DHUM0GbIr6iD14DyloJqTDLCBQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/alyssa-perez-5b8b1649/\"}},\"6e6d2e48-bd2c-45e1-9c98-b5f0d16899e8\":{\"id\":\"6e6d2e48-bd2c-45e1-9c98-b5f0d16899e8\",\"name\":\"Amir  Rachum\",\"bio\":\"Amir is a software engineer working on Google Search Console.\\r\\n\\r\\nAmir has a B.Sc in software engineering from the Technion Institute of Technology in Israel.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/RpgSztmzowDkI-3ZtkIu4Xq6vvzQEQSmM7vkRHHX439PGcVnLE-MP733UlVHPTVOqxQHuJhzrz-ApHQ2Pirc88zK\",\"socialLinks\":{\"GitHub\":\"https://github.com/Nurdok\",\"Website\":\"https://amir.rachum.com/\",\"Twitter\":\"https://twitter.com/amirrachum\",\"LinkedIn\":\"https://il.linkedin.com/in/amir-rachum-712a6837\"}},\"483ff781-f785-4e59-896b-aaeb0e6e9330\":{\"id\":\"483ff781-f785-4e59-896b-aaeb0e6e9330\",\"name\":\"Amit  Sood\",\"bio\":\"As the director of Google Arts and Culture, Amit Sood leads Google’s effort to make culture accessible to everyone. While working with Google’s Android team, Amit Sood’s passion for art led him to initiate a project to bring museums onto the web, which they introduced to the world in 2011. Today Amit’s team is an innovation partner for cultural institutions. They offer technologies that help preserve and share culture and allow curators to create engaging exhibitions online and inside museums. The Google Arts & Culture app puts over a thousand museums at people’s fingertips for free on the web, on iOS and Android. It allows everyone to explore art, history and wonders of the world from Van Gogh’s bedroom paintings in brushstroke-level detail to a virtual tour of Mandela’s prison cell. Recently Google Arts & Culture collaborated with over 180 renowned cultural institutions from New York, London, Paris, Tokyo, São Paulo and around the world and brought 3000 years of the world’s fashion together in the largest virtual exhibition of style. \\n\\nBefore joining Google, Amit Sood worked for Ericsson and DHL as well as in non-profit organizations in Europe and India. He holds an MBA from INSEAD and a graduate degree in commerce from Sydenham College in Mumbai.\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/myeaZLjTKT7r8DqKgW-qCwBaBl7otT5MS6WajxfbbWdJW-PXQwVwfkTjcPrGpNy99FE6oFZKOasMLT7_ja1rj9E4fQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/googlearts?lang=en\",\"LinkedIn\":\"https://www.linkedin.com/in/amitsood85/\"}},\"bf5263a2-2344-48be-9208-6b3b8354fd5a\":{\"id\":\"bf5263a2-2344-48be-9208-6b3b8354fd5a\",\"name\":\"Amrit Sanjeev\",\"bio\":\"Amrit Sanjeev works as a developer advocate in the partner developer relations team and works with partners in India. Previously he managed multiple programs like Google developer communities (GDG), Google developer expert (GDE) and developer agencies program. Prior to joining Google he worked for companies including Intuit, Philips and IBM. He was the first Android GDE from India and actively participates in developer communities in India.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/M_YjaRP31nvmsqrbVe_xAeiYmrmB05QpP65v0zIuedXJYjI206YFrj_IenV9xPKbPE_XVc5G_sa_2FkK9Ujsd0Gb\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/amsanjeev\",\"LinkedIn\":\"https://www.linkedin.com/in/amrit-sanjeev-a4984438/\"}},\"5b0f7104-7f76-414d-9416-86e3dbd47920\":{\"id\":\"5b0f7104-7f76-414d-9416-86e3dbd47920\",\"name\":\"Amy Roberts\",\"bio\":\"Amy leads UX for media experiences on Chrome. A turncoat, she previously worked at Apple where she helped design and launch e-commerce experiences for new products like Apple Watch. She graduated from Savannah College of Art and Design, and lives in Oakland with her fiancé and a dog named Sweet Potato.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/1SNms74qu-Lb7eo78mxJNDpfgIaA6bNIYQM6Hr4u63MQ9anUy6mWbcHw5AOGMVfTzQCI72nqf6gGgKfrBaK1cl6utw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/amy-roberts-b3756718/\"}},\"b7e84283-4d66-4eda-81e3-a781b87022d7\":{\"id\":\"b7e84283-4d66-4eda-81e3-a781b87022d7\",\"name\":\"Amy  Jang\",\"bio\":\"Amy is a software engineer, leading Android Things Console team in Android Things. With 4+ years of experience at Google, she previously worked on Play Books and Google Search UX. She earned bachelor's and master's degree in Computer Science from Stanford University.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"03748bc4-8c99-4cf0-98ab-d5e7a6c29cdf\":{\"id\":\"03748bc4-8c99-4cf0-98ab-d5e7a6c29cdf\",\"name\":\"Andre Bandarra\",\"bio\":\"Andre is a Developer Advocate at Google,  working close to top partners and helping them to integrate across Google's platforms. His recent work has been focused on the area between Web and Android, including the Android WebView,  Chrome Custom Tabs and Trusted Web Activity.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/YQJGHCPn8UY8iXEmPiIVu-knCFPWjvbHkMZC7IZPO6UWIN_z0Ko2l_5KlBdoSWI2mF7uLRTvyjD9Skd_0GzuLrlg\",\"socialLinks\":{\"GitHub\":\"https://github.com/andreban\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/andreban\",\"LinkedIn\":\"\"}},\"3972b72e-c5c3-4892-8d77-bd052992d930\":{\"id\":\"3972b72e-c5c3-4892-8d77-bd052992d930\",\"name\":\"Andrew Brogdon\",\"bio\":\"Andrew is a senior engineer on the developer relations team for Flutter and spends his days creating sample apps, tools, YouTube videos, and other resources for the Flutter community. Prior to joining Google, Andrew received a Master of Fine Arts degree in poetry from the Ohio State University and managed to get a few things published.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/nNTBoNomOzgDwgKcbFLNlv8ZcGzsed76pbEyqxx6eUBGDC6VzUzqGSQ1qJSpFUDXJZdRcK3Ie5LKAj01F7CWam_w\",\"socialLinks\":{\"GitHub\":\"https://github.com/RedBrogdon\",\"Website\":\"https://flutter.dev\",\"Twitter\":\"https://twitter.com/RedBrogdon\",\"LinkedIn\":\"https://www.linkedin.com/in/andrewbrogdon/\"}},\"39a0a842-67f9-4115-b640-92e4c9000d38\":{\"id\":\"39a0a842-67f9-4115-b640-92e4c9000d38\",\"name\":\"Andrew Giugliano\",\"bio\":\"Andrew is a developer advocate for Google Play Instant. He primarily focuses on helping partners build and launch high quality instant games. Before joining Google, he was an Android developer in the automotive space. Andrew holds a bachelor's degree in computer science from the University of Michigan.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/andrew-giugliano-23052370\"}},\"4622e4bb-fc0d-42ca-bb53-0f52265d8f2d\":{\"id\":\"4622e4bb-fc0d-42ca-bb53-0f52265d8f2d\",\"name\":\"Andrey Lushnikov\",\"bio\":\"Andrey is a Software Engineer working on Chrome DevTools and Chrome Puppeteer. Andrey has masters from St. Petersburg State University in Mathematics and Computer Science.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"https://github.com/aslushnikov\",\"Website\":\"https://aslushnikov.com\",\"Twitter\":\"https://twitter.com/aslushnikov\",\"LinkedIn\":\"https://www.linkedin.com/in/aslushnikov/\"}},\"61ceb7b6-5f2e-40b7-9d70-0bd89f44e6b1\":{\"id\":\"61ceb7b6-5f2e-40b7-9d70-0bd89f44e6b1\",\"name\":\"Andrii Kulian\",\"bio\":\"Andrii is a software engineer on Android framework team. He is currently leading the Multi-Display engineering efforts and works on activity lifecycle. Before joining Google Andrii studied applied mathematics at Taras Shevchenko National University of Kyiv.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/leATexQoDjBOv4LlsASAG92vf7N_kWZr7Glgm3MceeFyANMBAMnPvio8or3nu2UXw2H4FEuwGVT5djZSaOi2aeiy\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"64be6d0f-7406-45f0-9f8b-2e3640a33681\":{\"id\":\"64be6d0f-7406-45f0-9f8b-2e3640a33681\",\"name\":\"Angela Ying\",\"bio\":\"Angela Ying is a product manager for Google Play. Her areas of responsibility include building both the consumer and developer facing experiences for in-app subscriptions retention and management. Prior to Google, Angela was an algorithmic trader at Citibank where she developed quantitative strategies to trade foreign exchange. Angela has an MBA from the Wharton School of University of Pennsylvania and an AB in Applied Mathematics and Computer Science from Harvard University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/9uDBUuyhgNcllzDvgvZ-0P9EkDOgtrdQfYl0K69B8EKVNM2jRpLNU2x6WhBpEH3idedEut5HeMrFVBLwiJDfnZ_0\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/angela-ying-24846a3b/\"}},\"f8a3d555-dd4a-4d7e-a974-df096012df15\":{\"id\":\"f8a3d555-dd4a-4d7e-a974-df096012df15\",\"name\":\"Ankur Kotwal\",\"bio\":\"Ankur is a developer advocate on the Google Cloud developer relations team, where he champions the developer experience on the Google Cloud Platform. Previously, Ankur led the Google Maps developer relations team where he helped launch the Google Maps APIs gaming offering. Ankur has also been the product manager and software engineer for Google Santa Tracker on Android, an annual tradition focusing on bringing holiday joy through fun and games.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/nDce2Me-HY5XWpW9_nwsEQxPvoPeh6DIq0G4KfY9c3MmVdzdk39GzF-Md-L0c2zC71lSI9dW7LvbhlIZRJNmADAP\",\"socialLinks\":{\"GitHub\":\"https://github.com/ankurkotwal\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ankurkotwal\",\"LinkedIn\":\"https://www.linkedin.com/in/ankurkotwal/\"}},\"de3aec82-9cbf-471a-87a6-cd2ec29ca4e2\":{\"id\":\"de3aec82-9cbf-471a-87a6-cd2ec29ca4e2\",\"name\":\"Ann Zimmer\",\"bio\":\"In her current role, Ann is a Software Engineer doing backend development on Firebase's ML Kit. Previously, she worked on the Crash and Crashlytics Firebase projects. Before joining the Firebase team, Ann did Android app, web, and backend development in Google Fiber, and worked as a Software Reliability Engineer in Google Shopping. Ann earned her PhD (computer science; software engineering focus) and Masters (pure mathematics) from the University of Waterloo. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/xuGoFdOVOnlT2Y_RkIA6KkMxtEsdVFAoG96z5KEdSdfROFT9rWLdpvqX8hW5fpguuMHDhnE9tYaXehxOPD8MPJHE\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/ann-zimmer-25167535/\"}},\"ccda2ab4-ff87-44dc-bd62-301c35d848a9\":{\"id\":\"ccda2ab4-ff87-44dc-bd62-301c35d848a9\",\"name\":\"Anna  Miyajima\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"fddfb656-f859-4de9-8a66-3ce4ea9fe347\":{\"id\":\"fddfb656-f859-4de9-8a66-3ce4ea9fe347\",\"name\":\"Anthony Robledo\",\"bio\":\"Anthony is a Flutter engineer on the Material Design team. He has worked on other Google projects in infrastructure, cloud, and search for 6 years prior to joining Material. He holds degrees in physics and computer science from the University of Central Florida and Georgia Tech. His wife also works in software.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/YXceu2BspPl6HvR8rFK52ryOIhwcN3cHgspJaQQImAZqxX8x_F3T129TNC2e49wGOEBL6bGGKAc_EeRV_UDUqWmk\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"b2063229-c343-47ce-822f-884f4fe651f4\":{\"id\":\"b2063229-c343-47ce-822f-884f4fe651f4\",\"name\":\"Anu Srivastava\",\"bio\":\"Anu works in Developer Relations for G Suite in New York. She advocates for developers building on top of the G Suite platform to enhance their businesses, specifically focusing on the APIs for Docs, Sheets and Slides. She previously worked as a software engineer on Android and Cloud in the California Bay Area after completing her Computer Science degree from the University of Texas at Austin. In her free time she likes to perform with her dance group in Manhattan.\\r\\n\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/OXDR4-4IGyp2DvSuMGsUkBjCwV4L7y_tF5ccUFlT6XJhMn0609x4JA6SZaKZqlj23i31jR1H0k7aw2Wuke4ykrs\",\"socialLinks\":{\"GitHub\":\"https://github.com/asrivas\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/asrivas_dev\",\"LinkedIn\":\"https://www.linkedin.com/in/anupriyasrivastava/\"}},\"f206875d-3c44-4135-b2a4-135efbf53f3a\":{\"id\":\"f206875d-3c44-4135-b2a4-135efbf53f3a\",\"name\":\"Anwar  Ghuloum\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"8c5c6f02-abeb-4fa2-a101-39ca30e9901d\":{\"id\":\"8c5c6f02-abeb-4fa2-a101-39ca30e9901d\",\"name\":\"Anwar  Haneef \",\"bio\":\"Anwar is the product lead for the developer ecosystem and Google services (including Google Assistant) on Android TV. Prior to joining Android TV, Anwar led various leadership roles at Google, IBM Watson, PwC and Motorola where he built and scaled products and businesses in the areas of artificial intelligence, media & entertainment, analytics and mobile computing. Anwar has an MBA from the University of Chicago Booth School of Business, MS from the University of Massachusetts Amherst, and a BTech (Hons) from the Indian Institute of Technology Kharagpur.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/18zAc7p1wXx4Aj9hPQ7S1HMwma9hcnnF15UG_W81gO_1zDwBysSD9KYBg35eW8wRHWM3KhPjgHBUpYlBhUhXYCj8DQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"b40f6a38-6be5-432b-a172-d60c21c0a68a\":{\"id\":\"b40f6a38-6be5-432b-a172-d60c21c0a68a\",\"name\":\"Artur Janc\",\"bio\":\"Artur is a staff information security engineer on Google's security team. He focuses on designing and deploying mechanisms to protect web applications from common security and privacy flaws. Artur holds an M.Sc. in computer science from Worcester Polytechnic Institute where he also earned bachelor's degrees in computer science and electrical and computer engineering, and minored in Spanish.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/p6QWnQ_qC6JjMPKbCQghww-tpcbbsMK_91X9M8SrNLkEV7LfIachAIF0TqTiAyRtAgRFQgLv9yGBolUoXcGOd7uG\",\"socialLinks\":{\"GitHub\":\"https://github.com/arturjanc\",\"Website\":\"https://arturjanc.com\",\"Twitter\":\"https://twitter.com/arturjanc\",\"LinkedIn\":\"\"}},\"efd58a22-830d-46db-b521-4b78422f69c0\":{\"id\":\"efd58a22-830d-46db-b521-4b78422f69c0\",\"name\":\"Artur  Tsurkan\",\"bio\":\"Artur is a product manager on the Android System UI team. He drives product on a number of features including Slices, Always on Display, and At-A-Glance. As part of the Associate Product Manager program, he previously worked on the Google Image Search team on rich metadata and actionable experiences. Artur has a Bachelor of Business Administration degree from the Ivey Business School, Canada.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"85e48174-dc2a-46ad-acdc-be322fbbd7dc\":{\"id\":\"85e48174-dc2a-46ad-acdc-be322fbbd7dc\",\"name\":\"Ashish Shah\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"fa8ce1d0-66e3-454c-b495-45dc34e7de90\":{\"id\":\"fa8ce1d0-66e3-454c-b495-45dc34e7de90\",\"name\":\"Ashley Rose\",\"bio\":\"Ashley is a software engineer on the Android Framework team. She studied electrical and computer engineering at Olin College.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/qYZou2Wv4qeRDP8cM682CyB4kfEnZ1dBKjQYuXOytQa-X2RfJ758Sci8IB69KXH96PRodZ4QpuMcRma02ltdpuCu\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"14c11e06-1b29-42b6-ab12-046d41474643\":{\"id\":\"14c11e06-1b29-42b6-ab12-046d41474643\",\"name\":\"Astro  Teller\",\"bio\":\"Dr. Astro Teller currently oversees X, Alphabet's moonshot factory for building magical, audaciously impactful ideas that through science and technology can be brought to reality. Before joining Google / Alphabet, Astro was the co-founding CEO of Cerebellum Capital, Inc, an investment management firm whose investments are continuously designed, executed, and improved by a software system based on techniques from statistical machine learning. Astro was also the co-founding CEO of BodyMedia, Inc, a leading wearable body monitoring company. Prior to starting BodyMedia, Dr. Teller was co-founding CEO of SANDbOX AD, an advanced development technology incubator. Before his tenure as a business executive, Dr. Teller taught at Stanford University and was an engineer and researcher for Phoenix Laser Technologies, Stanford's Center for Integrated Systems, and The Carnegie Group Incorporated. Dr. Teller holds a Bachelor of Science in computer science from Stanford University, Masters of Science in symbolic and heuristic computation, also from Stanford University, and a Ph.D. in artificial intelligence from Carnegie Mellon University, where he was a recipient of the Hertz fellowship. Through his work as a scientist, an inventor, and as an entrepreneur, Teller holds many U.S. and international patents related to his work in hardware and software technology. Astro is also a successful novelist and screenwriter.\",\"company\":\"Google X\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/yRydmPOLD1IJzNdrt9iisTINeBIfn-BNzrDvoknrkpgjMTaS8KFWFgtrp928M1QG6PdwI-CIBQeOdxiP1Dw2lfgM\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/astroteller\",\"LinkedIn\":\"https://www.linkedin.com/in/astroteller/\"}},\"25142cee-055b-42ec-b7a0-c33dbfe94996\":{\"id\":\"25142cee-055b-42ec-b7a0-c33dbfe94996\",\"name\":\"Aurash Mahbod\",\"bio\":\"Aurash is the Director of Engineering responsible for the Play Store, and Games on Google Play. Prior to Google, Aurash was a software engineer at Microsoft. He earned a bachelor's degree in Computer Science from UC Santa Cruz.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/CWBviF1mqqYS3nHdo1lbeb3cBEUHK8hajt-91olYuATeRJFNRROU9WZfD_DcHEP_JkCwjIgQssHjzMeggqKLjai4\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/aurash-mahbod-a977a63\"}},\"7177b14e-9679-4ca9-a050-4d2fae215fdf\":{\"id\":\"7177b14e-9679-4ca9-a050-4d2fae215fdf\",\"name\":\"Aurimas Liutikas\",\"bio\":\"Aurimas is a software engineer on the Android team. In this role, he focuses on Jetpack (formerly known as Support) libraries. Aurimas has a bachelor's degree in Computer Science and Engineering from Bucknell University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/DT7x4n84_YYUhyl52U7O22oeFTlIEGA0idA-XTa_agDjCmCIVNzY8OTg271kCYLXZkDr86Vt04E7BDpo90fpMzba\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/liutikas/\"}},\"f852d19c-f271-4653-b089-c9b3abd44683\":{\"id\":\"f852d19c-f271-4653-b089-c9b3abd44683\",\"name\":\"Austin  McCasland\",\"bio\":\"Austin McCasland is a UX designer and prototyper at Google Daydream.  He has written and facilitated multiple college-level courses on AR/VR design and development (Udacity, Columbia College Chicago).  In 2017, Austin launched Paint Space AR,  an award-winning app that allows people to paint the world.  Austin has a BA degree in Visual Art from the University of San Diego, and a masters degree in Human-Computer Interaction from Carnegie Mellon University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/qyTpSA_W_v6VlvkPUMvcsiX2Y7lgzP7d2eqLjng6Tkll_uLybHDypQQEwMnPPK91RB-UzpCgZkTyvfMkn75lLodg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/austin-mccasland-214a414b/\"}},\"32f57f67-6842-4450-8eef-d271f23d2652\":{\"id\":\"32f57f67-6842-4450-8eef-d271f23d2652\",\"name\":\"Avnish  Miduthuri\",\"bio\":\"Avnish Miduthuri is a product manager on the Payments team at Google, focusing on mobile commerce and online payments. He is focused on improving online checkout for web and in-app developers, and has launched payment APIs for physical commerce integrated with key ecosystem partners including card issuers, payment networks, processors and e-commerce merchants. Avnish earned his bachelor’s degree from the Indian Institute of Technology, Madras and a masters degree in Computer Engineering from the University of Texas at Austin.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/LMPsjz-WknIKKCHtneruiMxkBf2-BnK3zFAtj_wmGRloFAfMolUJRHAz6tyK2pVdr7RElBNIClUDP3lKFakYRXENgQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"2ecd1e65-4147-4a72-b68a-9e9fe2460cf3\":{\"id\":\"2ecd1e65-4147-4a72-b68a-9e9fe2460cf3\",\"name\":\"Aylin Altiok\",\"bio\":\"Aylin is a Product Manager on the Actions on Google team and has worked at Google for 6 years. Prior to Google, she spent a few years in financial services as a software engineer. Aylin earned a Master's degree in Computer Science from Columbia University and a Bachelor's degree in Computer Engineering from Koc University, Turkey.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ZNnL2u4iWn1YEJzeSYbwtWHG-jWl5ZalmO79Tojn2Uy4N0qQIQU35-STZpB8qK0onm57ztWaFzmYcvsXrnbC3OclnQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/sssaylin\",\"LinkedIn\":\"https://www.linkedin.com/in/aylinaltiok/\"}},\"ce522252-0924-40b2-8943-af4bc43965b2\":{\"id\":\"ce522252-0924-40b2-8943-af4bc43965b2\",\"name\":\"Baratunde  Thurston\",\"bio\":\"Baratunde Thurston is an Emmy-nominated host who has worked for The Onion, produced for The Daily Show, advised the Obama White House, and cleaned bathrooms to pay for his Harvard education. He’s the host of the iHeartMedia podcast Spit, and wrote the New York Times bestseller How To Be Black. Baratunde is a highly sought-after public speaker whose CV includes being: co-founder of Cultivated Wit and the About Race podcast, a former columnist for Fast Company, closing speaker for TED, director’s fellow at the MIT Media Lab, and a board member for BUILD and the Brooklyn Public Library. \\n\",\"company\":\"Cultivated Wit\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/j4CdJNRQR0clIXVeSqKWLJt0kQQ2JLf15LxeS7sPxI0puFGYCyfp5Al0azYuJOCZms-Hwkdb8Km0xEsznA_iFYyl\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/baratunde\",\"LinkedIn\":\"https://www.linkedin.com/in/baratunde/\"}},\"0e33a61e-41a5-4bc5-8de8-3dd4cd5bc4fa\":{\"id\":\"0e33a61e-41a5-4bc5-8de8-3dd4cd5bc4fa\",\"name\":\"Belinda Langner\",\"bio\":\"Belinda Langner is a Product Manager at Google working on mobile app ads. She is currently focused on improving app install ads as the PM lead on Google's Universal App Campaigns. Previously at Google, Belinda played a key role in launching Search Ads on Play to help users discover apps within the Google Play Store. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/wSoE_HgGa0JUb1FtPHLS_TdvfdremnKiZUk3Lp4NSLuVXbAYnmBwHvXp9TSgLqA0uSRvF9z3unWHLDHGJg2Ini1fOg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"c14634fd-8be5-4e98-8fdb-46ba0cf99d2f\":{\"id\":\"c14634fd-8be5-4e98-8fdb-46ba0cf99d2f\",\"name\":\"Ben Gable\",\"bio\":\"Ben is a partner developer advocate at Google. Specializing in game development and engineering, he works with game developers to make great games for both Android and Chrome OS. Prior to Google, Ben co-founded an indie game studio and shipped a game worldwide on PC, Mac, Linux, PS4, Xbox One and Nintendo Switch. Ben also worked as a full-stack developer at Zynga on titles like CityVille and Farmville 2. \\r\\n\\r\\nBen graduated from DigiPen Institute of Technology in Redmond, WA with a bachelor's degree in computer science in real-time interactive simulation.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/OZDy0OZtYuxCLd0cm6NFOR9FH0Z9WOF75-09d5h5wyWoLhzVBfMSPJsgXYFR6mb3FA9ngMFMQy-LvK0M-95hept-pw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/bengable/\"}},\"bc0872db-cbf8-4c73-ac3a-85593327e125\":{\"id\":\"bc0872db-cbf8-4c73-ac3a-85593327e125\",\"name\":\"Ben Galbraith\",\"bio\":\"Ben Galbraith is the product director for the Web Platform at Google. His past roles have included heading Product and Design for Walmart Global eCommerce as well as leadership roles at HP / Palm, Mozilla, MediaOcean, and several startups. Ben has been writing code since he was six and starting businesses since he was ten; he's written books, given hundreds of presentations world-wide, produced several technical conferences, and sold three companies. He lives in Palo Alto with his wife and eight children.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"16e39c2e-882d-4455-8690-ad7dc09c48bf\":{\"id\":\"16e39c2e-882d-4455-8690-ad7dc09c48bf\",\"name\":\"Ben Morss\",\"bio\":\"Ben is a Developer Advocate at Google, where he’s working to help the Web be faster, more beautiful, and easier for users and developers alike.  Prior to Google, he worked at the New York Times and AOL, and before that he was a full-time musician. He earned a BA in Computer Science at Harvard and a PhD in Music at the University of California at Davis. He also played with bands like Cake and wrote two musicals based on the Angelina Ballerina television series. Rumor is that he still runs a band called Ancient Babies.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/B5HeY2QH8QgdDLYYG05Ke4zrl11CT5Q19wuUBDGGzYx5C-GuTLy_LFjYuPVp7To9O7qlLpeb4htyz89skEwbp891\",\"socialLinks\":{\"GitHub\":\"https://github.com/morsssss\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/benmorss\",\"LinkedIn\":\"https://www.linkedin.com/in/ben-morss-15bab15/\"}},\"7fb85938-994c-455e-b49b-ebcb7c240671\":{\"id\":\"7fb85938-994c-455e-b49b-ebcb7c240671\",\"name\":\"Ben Weiss\",\"bio\":\"Ben is an Engineer on the Android Developer Relations team based in London where he works to make developer lives easier. He is focused on modularized Android applications. Before that he has been delighting users through visible improvements using animations and transitions. Ben has been involved with Android development and the Android community for a long time before joining Google.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ftNBCisQuwfoobB5PaDjrUU97RSBnFoCpFjP9EH2RrTgihGyflON7-ac6BHTCX5RQb1omluVD4eROyiOJMzfnN1N\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"3aa60253-3cf6-4e30-bd81-b9955a5f10a2\":{\"id\":\"3aa60253-3cf6-4e30-bd81-b9955a5f10a2\",\"name\":\"Benjamin Frenkel\",\"bio\":\"Benjamin Frenkel is an Android product manager focused on Games. Prior to joining Google, Frenkel was a senior associate for McKinsey & Company. Frenkel holds an MBA from the MIT Sloan School of Management and bachelor’s in computer science frm the University of Arizona.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"abd863b2-2a91-4ad3-85a6-f51221ae4dbb\":{\"id\":\"abd863b2-2a91-4ad3-85a6-f51221ae4dbb\",\"name\":\"Benjamin  Baxter\",\"bio\":\"Benjamin is a software engineer on Android TV team. Previously, Benjamin was in  Developer Relations working with large media partners to help them integrate their apps with the TV launcher and the Google Assistant on Android TV. Before Google, Benjamin built web and Android apps for insurance, banking, and grocery industries. In his free time he loves tinkering with new technologies, playing board games, cooking, and eating bacon.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/-Z4UG9_8I1cwZmvfuyvOEbkrIe7P4jOwVmI7mZw6ufHlLRcymi__-4X8h4X_6kgKrqcyEVbBxLT3w1uWsxSUl5lo\",\"socialLinks\":{\"GitHub\":\"https://github.com/benbaxter/\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/benjamintravels\",\"LinkedIn\":\"\"}},\"78c996c0-6005-4010-9b74-b6303eb99f2e\":{\"id\":\"78c996c0-6005-4010-9b74-b6303eb99f2e\",\"name\":\"Benjamin  Schrom\",\"bio\":\"Benjamin Schrom is a product manager working on augmented reality and computer perception within Google's Daydream team. He was previously the creator of Google Expeditions - a VR application for teachers and students that has brought VR to over 3 million students worldwide.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/fqeqd_z-YULR1J9Lwc23kbrKfC0iktp3Hsq1TimcarZDngmnAdLaHmA9Hk1sgE5Ogpo2IhfpXr01m7W8Hg7jslCrNQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"5454b3b6-22ec-4f80-9535-a035dc56698b\":{\"id\":\"5454b3b6-22ec-4f80-9535-a035dc56698b\",\"name\":\"Bill Bilodeau\",\"bio\":\"Bill Bilodeau helps make mobile game companies successful by working as a Developer Advocate at Google. Prior to Google, he worked at AMD in graphics developer relations. Before that, Bill worked as a game developer at TKO Software and THQ’s Pacific Coast Power and Light studio. He has a bachelor’s degree in Computer Science from the University of California, Berkeley.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/vQR4iRQKhNu5V9jeyI4oqVsYyaXLzuq0E5Vwj6Gv4RLlG7aNbljwDQUGn8wjleqQTwcr2YcpGXbaIgNo4al26YQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"1a563952-7f4f-4d4b-9fee-2173627c7d09\":{\"id\":\"1a563952-7f4f-4d4b-9fee-2173627c7d09\",\"name\":\"Bill  Luan\",\"bio\":\"Bill is a senior program manager at the Google Coral team, responsible for managing developer outreach programs and business partnership management, promoting AI innovations using AIY and Coral products.  Prior to this role, Bill worked as a regional lead in the Developer Relations team at Google for 10 years. Bill has been working in the high-tech industry in the U.S. for 34 years, ranging from industry automation to consumer electronics to software product development. He has been an organizer and speaker for many technology conferences and trainings. Bill is a recipient of the Alumni Hall of Fame award from his alma mater Southern Illinois University at Edwardsville where he graduated with BSEE and MSEE degrees, and also serves on its technology advisory board. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/1DFOw1QYJbsAv7cSSF4eyL1DOjdouk8tsKEhnGrGaA0fx7cDx-Q18N9lgdudqX3eVXBRZplR1QCoy0pMct0EOowZVg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"9c7c8916-86e5-4a3f-bcde-1ce6e9b8947a\":{\"id\":\"9c7c8916-86e5-4a3f-bcde-1ce6e9b8947a\",\"name\":\"Billy  Jacobson\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/thd1nP6N8dsHe9MbE5pDalIDjnSQtsV-2Cta1PELfiQbhiZjN8Hw4N8ZcbuPpEZKWFPhTJ-qp2vpBcSu8BYqtMFm\",\"socialLinks\":{\"GitHub\":\"https://github.com/billyjacobson\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/billyjacobson/\"}},\"23db1e0d-0f53-4e09-88d5-a9dadb11ca4b\":{\"id\":\"23db1e0d-0f53-4e09-88d5-a9dadb11ca4b\",\"name\":\"Blaise  Aguera y Arcas\",\"bio\":\"Blaise leads a team at Google focusing on Machine Intelligence for mobile devices—including both basic research and new products. His group works extensively with deep neural nets for machine perception, distributed learning, and agents, as well as collaborating with academic institutions on connectomics research. Until 2014 he was a Distinguished Engineer at Microsoft, where he worked in a variety of roles, from inventor to strategist, and led teams with strengths in inter­ac­tion design, pro­to­typ­ing, computer vision and machine vision, augmented reality, wearable com­put­ing and graphics. Blaise has given TED talks on Sead­ragon and Pho­to­synth (2007, 2012) and Bing Maps (2010). In 2008, he was awarded MIT’s prestigious TR35 (“35 under 35”).\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/HdqFNJxmilOsRfx8M2p4Du7KE67ZqvXZs5v4WCWyNxgy8eSW0gonarDxBEoRao6lfAbYRVoVmmXI3Trvs1dIYKIN\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/blaiseaguera\",\"LinkedIn\":\"\"}},\"c0943332-b3f5-4eeb-b030-6ca8c13c1d86\":{\"id\":\"c0943332-b3f5-4eeb-b030-6ca8c13c1d86\",\"name\":\"Bob  Nystrom\",\"bio\":\"Bob is a software engineer on the Dart language team. He co-created Dart's package manager, automated code formatter, and a few other widely-used packages. He maintains \\\"Effective Dart\\\", the official style guide for the language. Today, he works directly on the language, designing and specifying new features.\\r\\n\\r\\nBefore Google, Bob dropped out of college and worked in the game industry. From that experience, he wrote the book \\\"Game Programming Patterns\\\" and is now toiling on a second, \\\"Crafting Interpreters\\\".\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/FhFeCie43gHxtaaT2RQ0AOYng6vfWYK5BxZMIdwLJP2y1FbymexT-Oz2U4qhwIkQ4K_R4Tcis2jTr0LPpCccNE4O\",\"socialLinks\":{\"GitHub\":\"https://github.com/munificent/\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/munificentbob\",\"LinkedIn\":\"\"}},\"dc4445c5-ed6c-49af-a979-4d088ce6573e\":{\"id\":\"dc4445c5-ed6c-49af-a979-4d088ce6573e\",\"name\":\"Brad Abrams\",\"bio\":\"Brad Abrams is Group Product Manager at Google on the Actions on Google team which is the platform for the Google Assistant where he is responsible for the developer experiences on the platform.  \\r\\nBrad has been at Google since 2010 and has led platform efforts in Google Cloud and Chrome and now on the Google Assistant team. Prior to Google, Brad led many developer efforts at Microsoft on products.  Brad published several books including the bestselling Framework Design Guidelines. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/jZbeohpCxQf4cZ6RWiMTeGgQj5Al3SAPamGknbD1twkun8yzojzc91c5jBrs9aEjUuJcda6HUkoaDmj4eSTrVWVZ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/brada\",\"LinkedIn\":\"https://www.linkedin.com/in/brabrams/\"}},\"78e04e9a-11b0-47d0-9a20-8350018f046d\":{\"id\":\"78e04e9a-11b0-47d0-9a20-8350018f046d\",\"name\":\"Brett  Morgan\",\"bio\":\"Brett build samples, codelabs, documentation and other fun things to encourage developers to use Flutter and Dart to the fullest. He hails from Sydney, Australia where he has worked across the entire range of companies from Australia’s largest bank to secretive startups. His interests include all things technical, from mastering Sous Vide cooking in the kitchen to Web Assembly in the browser.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MBxXCirRM5PN3c44eRlXZvqPGTPEWNav7boe_qxFdrbjpTul6mEHQUh8feuBs2W_kSUtToni9QKVZhx3pbPo4xYs-A\",\"socialLinks\":{\"GitHub\":\"https://github.com/domesticmouse/\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/DomesticMouse\",\"LinkedIn\":\"https://www.linkedin.com/in/brettmorgan/\"}},\"0152fae2-40ea-43df-9d7f-fb61bd79e555\":{\"id\":\"0152fae2-40ea-43df-9d7f-fb61bd79e555\",\"name\":\"Brian Kemler\",\"bio\":\"Brian leads product management for Android Accessibility.\\r\\nHe joined Google in 2007 as one of Google Enterprise’s first sales engineers. Brian started Waymo’s privacy product development program and bootstrapped Google’s expansion of Search and Gmail in Myanmar (Burma). He created Google News Next Billion launching 9 new editions in underserved markets and then went on advance meetings experiences on Chromebox for meetings. In 2017, Brian began working on helping apply in machine learning make Android more accessible and inclusive.\\r\\n\\r\\nBrian Kemler graduated from the George Washington University in Washington, DC with degrees in Economics and Political Science as well as a minor in Photography. Brian’s extracurricular activities include; international travel, photography, writing, yoga, meditation, snowboarding and mountain biking.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/oeNn9EhBkGbXlV61qfkKZ678PIQkCX_uYJEnE2_6z9zIJeqMCW5Y-tp0bNctPO06ue2d7A4OjnnVxcKpFacpG0yWkw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://www.briankemler.com\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/briankemler/\"}},\"089bc350-c867-4320-b0e5-ec11cadf6a49\":{\"id\":\"089bc350-c867-4320-b0e5-ec11cadf6a49\",\"name\":\"Calum  Barnes\",\"bio\":\"Calum Barnes is a product manager for Google Cloud IoT and one of Google's liaisons for the Thread Group. Calum wants to make it easy for Google Cloud customers get their products connected to the internet. He specifically focuses on low power devices and their unique requirements. Before working at Google Calum helped build two other IoT platforms and consulted with companies creating connected products. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Gtelw1a7cikjPhfwCPU83wuDcMzXW2hbkPpbM7h81vdW9ZpVttQVKzw9pdNDbWw9TgZAQFi_Idt0ypeXml0DiIdW\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/calumbarnes/\"}},\"1032eaec-d901-47b0-90dc-007ffa05a87b\":{\"id\":\"1032eaec-d901-47b0-90dc-007ffa05a87b\",\"name\":\"Caridy Patino\",\"bio\":\"Caridy is a computer scientist that has transitioned from academia to the industry and worked on the YUI Core Team at Yahoo!. He later transitioned to the enterprise to help revamp Salesforce UI by co-creating the Lightning Web Components Platform. Caridy has been a long time TC39 Committee Member where he has championed various proposals along the years and served as editor of Ecma 402.\\r\\n\",\"company\":\"Salesforce\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/hdpjXDUt8RDkq8v4-tLsrieHV69XVTKWLfcMEM-RiyHifoYtmfNEBMaZnVoPa_5XJv2rtdDpR218PuYdlyZb1aGC\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"8ad29b9b-bd00-4c32-a85a-66e540313aa1\":{\"id\":\"8ad29b9b-bd00-4c32-a85a-66e540313aa1\",\"name\":\"Carl  Vogel\",\"bio\":\"Carl is a product manager on Google’s Smart Home Ecosystem team where he leads the lighting vertical and various local smart home technologies. Prior to joining Google he graduated from Harvard Business School with his MBA and worked six years for General Dynamics, integrating next-generation technologies onto nuclear submarines. He has an undergraduate and masters degree in acoustical engineering.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/4jMkNGdfu_t_hSApaxseqF2d1waohs5az0T7IwLud7kQNS2QbRCoN4izW6VWqS1zezn62OVa2q8-BvpUvDzg1uXq\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"336b288a-2895-46cb-a1fc-1cdeffd61689\":{\"id\":\"336b288a-2895-46cb-a1fc-1cdeffd61689\",\"name\":\"Carlos Valdivia\",\"bio\":\"Engineering lead of the android authentication team focusing on helping apps authenticate users with Google and other account providers on all android phones, tablets, wearables, televisions and more. Prior to Google, wrote software to analyze energy markets, played with machine learning in Scotland, and studied philosophy at Michigan State University and Rutgers.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/t8bgHTExpBUcFzxZpdPhrHGfuNnRXJi_aUINwrg9IlxDsms4p7-7xLcnT4a8zysiTNoIZ_WslWFzSdpkhGUOkVWC\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/carlos-valdivia-4a7b547/\"}},\"36a8b4ce-0195-4be8-8ac9-b7c452ffbaad\":{\"id\":\"36a8b4ce-0195-4be8-8ac9-b7c452ffbaad\",\"name\":\"Carmen Jackson\",\"bio\":\"Carmen is an engineer on the Android Performance team and is the tech lead for the performance initiatives in Android Q. She also spends time working on Android Go and building on-device System Tracing. Prior to Google, Carmen was the Android tech lead at Yelp, and she also spent time at Scribd and VMware. She has a bachelor's degree in computer science and human-computer interaction from Carnegie Mellon University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/QTRTkXs4wpNFZcpbmohpjW6s-eDJA1Wiam1WdpFvyRn8IqbjpXebP_1DHsIFXraZI7UsGJ5ErNhPv6rqoFYHtDiQkg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"4ac3b73c-1dcd-410f-9194-485e9e768124\":{\"id\":\"4ac3b73c-1dcd-410f-9194-485e9e768124\",\"name\":\"Catherina  Xu\",\"bio\":\"Catherina is an Associate Product Manager on the Pixel Software team. She earned a bachelor's and master's degree in Computer Science from Stanford University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/lea56peLpshjHnob9eI-fv0s8NNi1NO3L0uYCnRDZjLBpaJmeHTbTiKf6A3cbRHyaCo33q6r9zb7_5HgB9Ponh8y\",\"socialLinks\":{\"GitHub\":\"https://github.com/catherinaxu\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/catherina_xu?lang=en\",\"LinkedIn\":\"https://www.linkedin.com/in/catherinaxu/\"}},\"d04665be-37c3-4a3e-b6f9-347fc47c9fc7\":{\"id\":\"d04665be-37c3-4a3e-b6f9-347fc47c9fc7\",\"name\":\"Cathy Pearl\",\"bio\":\"Cathy Pearl is head of conversation design outreach and author of the O'Reilly book, \\\"Designing Voice User Interfaces\\\". She's been creating voice user interfaces for 20 years and has worked on everything from programming NASA helicopter pilot simulators to a conversational app in which Esquire’s style columnist advises what to wear on a first date. She has an MS in Computer Science from Indiana University and a BS in Cognitive Science from UC San Diego. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/_4XvzouzvuwAfMrmm96UjSPEAVFRqI_PPbUEfyo_5rkXcq0QMx92OR0WKHe-LcHcz1qOo0-MEdLOOJaH9eGh2C0v\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://www.cathypearl.com/\",\"Twitter\":\"https://twitter.com/cpearl42\",\"LinkedIn\":\"https://www.linkedin.com/in/cpearl/\"}},\"2551f1be-0c79-4316-b099-8ad365694122\":{\"id\":\"2551f1be-0c79-4316-b099-8ad365694122\",\"name\":\"Cedric  Kiefer\",\"bio\":\"Guided by an emotional approach, Berlin based studio onformative constantly searches for new forms of creative expression. Through an experimental practice they create meaningful digital art works to challenge the boundaries between art, design and technology. Their outcomes and interpretations take on varying forms across media through self-initiated and commissioned works that range from interactive media installations, generative design and dynamic visuals to data-driven narratives. \\r\\n\\r\\nAs the co-founder and creative lead at onformative, Cedric develops and directs projects to define the creative vision of the studio. Cedric’s fascination with science, technology and art fuels the development of new projects at onformative. Parallel to his work at the studio, he regularly teaches and talks about digital art and design at international universities, conferences and festivals.\\r\\n\",\"company\":\"Onformative\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/rF8nItRLbplmwtfHU2zOYU0FxifGQlahQ0bFV19S6mTLSQjtj253OoFVOL5BUvHeJo5Z77N-xM3k90vO1LjP08CI\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/CedricKiefer\",\"LinkedIn\":\"https://www.linkedin.com/in/cedrickiefer/\"}},\"2a819a33-88b1-4984-8dd6-55b9e7c7d531\":{\"id\":\"2a819a33-88b1-4984-8dd6-55b9e7c7d531\",\"name\":\"Charlie  Croom\",\"bio\":\"Charlie has been at Twitter for 7 years and is a Staff Software Engineer. Currently, he is one of the Web Tech Leads on the client team and focuses on helping to bring Twitter's Progressive Web App to more app stores, devices, and users around the world.\",\"company\":\"Twitter\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/mzr9l497b27cBeQ37QxgTgyceHJLsIX1W6CzbsiVqypZROSCFBsI0o8tmIF9kmCJiwXJILUCnCk-ccRnZ1QMBnKW\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"47ff81a2-6d46-47ee-8b46-e5fe946f1d94\":{\"id\":\"47ff81a2-6d46-47ee-8b46-e5fe946f1d94\",\"name\":\"Charmaine D'Silva\",\"bio\":\"Charmaine leads the Android Privacy product team, overseeing Android's efforts to increase transparency and control for users. Prior to her current role, Charmaine has spent the last 14 years at Google in product management and strategy roles across Android platform, Google Play, artificial intelligence, and ads. Charmaine holds a degree in information technology from the University of Mumbai.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Bzw7ryaqYfEZqEeSgTFj98RWXBqTh1f3Kvp7n4GKoxUKjZ14EPp9ljDV30HKa7dNk7ZnBEaNLe4muZpeqUlPKNQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/charmainedsilva/\"}},\"393bf114-7e4b-4224-8b3f-c1afab0d2dfd\":{\"id\":\"393bf114-7e4b-4224-8b3f-c1afab0d2dfd\",\"name\":\"Chet Haase\",\"bio\":\"Chet is an advocate on the Android Developer Relations team. His son said that 'advocate' makes the job sound like The Lorax, which is about right. He speaks for the geeks.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/tlDJLIY2Xsd5G5eiun0ZXyYC7ENR_kWyw2EqyZ5FUYhs-Q9iAju2SVjoAroAR-JFLnuMGKt918Kp5Juv9LH3FSw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://medium.com/@chethaase\",\"Twitter\":\"https://twitter.com/chethaase\",\"LinkedIn\":\"\"}},\"dbdf5baa-49a9-4f5e-9422-7d7f8541bbd4\":{\"id\":\"dbdf5baa-49a9-4f5e-9422-7d7f8541bbd4\",\"name\":\"Chris Craik\",\"bio\":\"Chris Craik works on Architecture Components and performance in the Android Toolkit team.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/TXF_jdBuOR-LQ2U1LW4KDK-SD8gRhrgqxs4niyFRFqPwzv6PnP6AgWHhZWHiu0ZYLbBCS9PRoEj3hRw4bqV6twrPRA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/chris_craik\",\"LinkedIn\":\"\"}},\"757de07c-fc43-4731-b74c-b4e45fe6b048\":{\"id\":\"757de07c-fc43-4731-b74c-b4e45fe6b048\",\"name\":\"Chris Foley\",\"bio\":\"Chris is a developer advocate for games with Google developer relations. Chris was previously a game programmer at Sony, has founded multiple game studios and, prior to Google, worked in game developer relations at Amazon. Chris has a bachelor’s degree from Caltech, a master’s degree from Chalmers University (Sweden) and an MBA from the University of St. Gallen (Switzerland). \\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/eBwFgeRkR_rI7eMAuylpA4RyWgwGvPTHQ3Zz0aiYBhUinpTEY3rgcyyh_9PKegOOnMhndzfJyvBBtasoix7dImNH\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/foleyfoleyfoley/\"}},\"d30339f4-dc26-4c44-95da-0b9caf167563\":{\"id\":\"d30339f4-dc26-4c44-95da-0b9caf167563\",\"name\":\"Chris Wailes\",\"bio\":\"Chris is a Software Engineer on the Android Runtime Team. His area of focus is application startup performance, and the Zygote component of the Android operating system in particular.\\r\\n\\r\\nChris received his bachelor's degree from the University of Illinois Urbana-Champaign and his master's degree from the University of Colorado Boulder. Before joining Google Chris was researching runtime environments for parallel computing at Indiana University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/_4CMPDVTZGdDk5d0MaU2MSTX8IIyfbjbWOOJEFKgsZ2_n8zCvgY94j_Dvb8lWJDkR3XtyrSUHsHVb5_ybk0QGSMj\",\"socialLinks\":{\"GitHub\":\"https://github.com/chriswailes/\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"cccb071e-0f5d-46f4-a9d4-7324bc82d582\":{\"id\":\"cccb071e-0f5d-46f4-a9d4-7324bc82d582\",\"name\":\"Chris  Banes\",\"bio\":\"Chris is an engineer working in Android Developer Relations at Google. He previously worked on the AndroidX (Support) Libraries, most notably AppCompat, Design and Palette. He has worked on Android things for over 8 years, from open source libraries to media apps, social networks and most stuff in between.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/P5zd_awEglWkH96_nG8LUZbYfNzn9elELTDta4nCrCiWGLFrSYCJU5XIFksNBdFVKDkA_mRWyPWyUdrIdUnKQM2A\",\"socialLinks\":{\"GitHub\":\"https://github.com/chrisbanes\",\"Website\":\"https://chris.banes.dev\",\"Twitter\":\"https://twitter.com/chrisbanes\",\"LinkedIn\":\"\"}},\"6f4e4f2d-1936-4081-95c1-c8ae3f16f83a\":{\"id\":\"6f4e4f2d-1936-4081-95c1-c8ae3f16f83a\",\"name\":\"Christiaan Brand\",\"bio\":\"Christiaan Brand co-founded financial services security firm, Entersekt in 2009. He has since moved to Google where he's part of their security and identity teams. Christiaan is a frequent industry commentator on all areas involving cyber-crime and cyber security and co-chair of the FIDO2 technical working group inside the FIDO (Fast IDentity Online) alliance looking to standardize strong online security protocols.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Obhj5MLiNcbz0YdjPBA6yLq7FPgAL4odzZFqNuv7Jx9iWAc8Dm_JbTZcGE_lO35G_jNdt3EmbrbzUkdsEBnhG3Wr0g\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/christiaanbrand\",\"LinkedIn\":\"https://www.linkedin.com/in/christiaan-brand-57373a5/\"}},\"d329b257-771c-4d38-8419-8fd74ef7861c\":{\"id\":\"d329b257-771c-4d38-8419-8fd74ef7861c\",\"name\":\"Christiaan Prins\",\"bio\":\"Christiaan is product manager for ML Kit, responsible for on-device Machine Learning. At Google he previously worked on the Android Neural Networks API, Pixel, Android Backup, Auth/Identity and IoT. Before joining Google in 2013, he was product manager / system architect at Microsoft and Philips Semiconductors/NXP. Christiaan holds an MS in Electrical Engineering from the University of Twente in The Netherlands.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/P45Fh0yqODPdv_SLw1JnIxj0VaknZM_Lk620xadidBNAJ49sAJNcRJ0kLWaVEmHfxd8kk1feWx_SwNO-djRCnb3TNw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"8d58f23f-7a43-4c35-a164-e1d43b5416da\":{\"id\":\"8d58f23f-7a43-4c35-a164-e1d43b5416da\",\"name\":\"Christina  Tong\",\"bio\":\"Christina is a product manager on ARCore. In this role, she focuses on bringing emerging computer vision technologies to market. Previously, she was a product manager on Google My Business.\\n\\nChristina earned a bachelor's degree in computer science with a minor in politics from Pomona College, where she graduated with honors. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/opkgWuqmIXw5NwJxZTdQv13ke5IXuk6G4QjtaIXXY7d_7tiIAlzZky4t6OAu-qir7YcaeAack3jzUhUjaP2HrvgX\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/christinamtong\",\"LinkedIn\":\"https://www.linkedin.com/in/christinatong/\"}},\"caf8a0ef-2591-4798-9168-c0eb2a4c0f25\":{\"id\":\"caf8a0ef-2591-4798-9168-c0eb2a4c0f25\",\"name\":\"Claire  Evans\",\"bio\":\"Claire L. Evans is a writer and musician. She is the singer and co-author of the conceptual pop group YACHT, a founding editor of Terraform, VICE's science-fiction vertical, and the author of Broad Band: The Untold Story of the Women who Made the Internet (Penguin Random House, 2018). She is the former Futures Editor of Motherboard, and a sometime contributor to VICE, Rhizome, Quartz, The Guardian, WIRED, and Aeon. She is an advisor to graduate design students at Art Center College of Design in Pasadena, California, and has taught and lectured about science fiction, art, and technology around the world, at places like Walker Art Center, The New Museum of Contemporary Art, CalArts, Arizona State University, General Assembly San Francisco, La Gaité Lyrique, the Hirshhorn Museum, and the Riverside Museum of Art in Beijing, among many others. She lives in Los Angeles, where she runs the beloved LA-centric culture app 5 Every Day.\\r\\n\",\"company\":\"YACHT\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/YSf_Q-L4zT3PFONX8p9OBzuA8tO5OwaXJfQQhurf4-3cIstHe7UFG64jMf--GO7DSl35AmCer4JNbvqC_OqDNE36\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/YACHT\",\"LinkedIn\":\"\"}},\"bd1ffc1e-49dc-45d1-8741-37702dc62268\":{\"id\":\"bd1ffc1e-49dc-45d1-8741-37702dc62268\",\"name\":\"Clara Kliman-Silver\",\"bio\":\"Clara is a user experience researcher on the Material Design team, focusing on design tools. Prior to Google, Clara worked as a UX designer at several companies in the artificial intelligence and healthcare spaces. She is also the Director – Americas of Ladies That UX, a global organization for people interested in UX. Clara holds a bachelor’s degree in cognitive science from Brown University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/-cZcZBoKVjtzI18MJ3pmBAlAcR8bViSjLF3V6TeyweD5gB6z0kKjhhbYWQHHnyFDz_euKxoT3ah1ofXtKCaNA1n7nw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://www.claraklimansilver.com/\",\"Twitter\":\"https://twitter.com/cklimansilver\",\"LinkedIn\":\"https://www.linkedin.com/in/cklimansilver\"}},\"48036143-fde1-40f6-a7ac-26306699c627\":{\"id\":\"48036143-fde1-40f6-a7ac-26306699c627\",\"name\":\"Conor  O'Sullivan\",\"bio\":\"Conor O’Sullivan is the Head of Sound Design at Google, where he leads a cross-product initiative to bring cohesion and brand identity to Google’s product sounds. He’s an industry leader in the field of sound design, sensory & sonic branding for consumer products. He designs for the human first, to push technological boundaries, enhance the brand, and most importantly provide empathy and delight to the listener. Some of Conor’s best known work includes the Google ‘G sound’, Xbox brand & UX sounds, and Motorola’s HELLOMOTO ringtone. Conor has authored publications on sound and sensory design, and holds multiple patents and awards in the field. He earned a Bachelor of Arts in music and mathematics from University College Dublin, and a Master of Science in music technology from the University of Limerick. He is from Ireland and lives in the SF Bay area. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ixv2ZA1v7FNe0jj6OHBTsSZsPiAsZMQEWAd56AWpf3Gq5rmjfSORjCsKwA8flMK-tM2qk2pgx-7xAiJUC9Vkhv4t\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/conor\",\"LinkedIn\":\"\"}},\"d1a465f0-5e1f-4a59-a7a8-2b1c74d6598b\":{\"id\":\"d1a465f0-5e1f-4a59-a7a8-2b1c74d6598b\",\"name\":\"Corentin  Wallez\",\"bio\":\"Corentin is an engineer working on Chrome's GPU team in Google Paris. He leads development of the WebGPU API and chairs the \\\"GPU for the Web\\\" W3C group.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ClSmMH8qSKMoIf8FOcd0kC1bH8fczExtMLs62kSKxdrKlYKyWnoT12Mny7UbUUQPp9BI-1F3wgWeqQFpg4IuUdI\",\"socialLinks\":{\"GitHub\":\"https://github.com/Kangz\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/dakangz\",\"LinkedIn\":\"https://www.linkedin.com/in/corentin-wallez-18824b4a\"}},\"d8a35b94-281e-4a34-895c-30372e732836\":{\"id\":\"d8a35b94-281e-4a34-895c-30372e732836\",\"name\":\"Corina Grigoras\",\"bio\":\"Corina is a software engineer on Play Console, designing and building new features which bring actionable insights to developers. She has over 4 years of experience in Android and has previously worked on large scale data processing for Play Console and on Google Docs for Android. Corina holds a masters degree in Computing with first class honors from Imperial College London.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/nFkitPTRS2gBTd6d3uDR9JfV3Uvqtuxqz_aGl0501AqwzwPEQsXaBFipxzc63n08X6liJXS4S8c27JR7_D6o4hQBeA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"1d68ffac-e622-4330-ad07-ac485bcd2dae\":{\"id\":\"1d68ffac-e622-4330-ad07-ac485bcd2dae\",\"name\":\"Dale Markowitz\",\"bio\":\"Dale is a developer advocate for Google Cloud ML. Previously, she worked as a software engineer for google research and the online dating site OkCupid. She holds a degree in computer science from Princeton University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/sJL2uPl-WMN8QMmg_lVSlOE1Axi4Yr4ECGxAb6D1q-yXdgbeuYnL5grvICJiyCvv44pv5sY3r7p6_Tx7wbqEo68\",\"socialLinks\":{\"GitHub\":\"https://github.com/dalequark\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/dalequark\",\"LinkedIn\":\"https://www.linkedin.com/in/dale-markowitz-40a9a852/\"}},\"883b10c8-89a6-4fa8-91cf-b7d8dde06171\":{\"id\":\"883b10c8-89a6-4fa8-91cf-b7d8dde06171\",\"name\":\"Damien  Mabin\",\"bio\":\"Damien is game engine developer at Supercell. He likes crashes, bottlenecks, compatibility and latency issues, and other things that goes wrong. When things are calm he also likes minimalistic cross platform architecture, game monetization and size optimization. Outside work he also co-created and maintain http://www.opengl-tutorial.org/. \",\"company\":\"Supercell\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/fozo0z9Z3CuoQt9zHukf7qZXDGaA0rnUQiE7io_YH1gD1H5EsJ-jI5tejE3i1v6nGt2L7bVz9iyn5SRNOz4WQLsB\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"521d7448-977a-4759-a6e5-082cab4281b1\":{\"id\":\"521d7448-977a-4759-a6e5-082cab4281b1\",\"name\":\"Dan Albert\",\"bio\":\"Dan is the lead software engineer on the Android Native Development Kit (NDK)\\r\\nteam, which is responsible for the toolchains, libraries, and build systems of\\r\\nthe NDK.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/3DOx2Zmkm8hkqPFn6rxZfxZgu6OZBPnojvo51zvCW0FzCStOsmanlskpsben9TdJKe115jaypUlmlOoJHBfGbFKFTw\",\"socialLinks\":{\"GitHub\":\"https://github.com/DanAlbert\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/danalbert\",\"LinkedIn\":\"\"}},\"340709db-f0e8-404f-8345-b5413f1d25bc\":{\"id\":\"340709db-f0e8-404f-8345-b5413f1d25bc\",\"name\":\"Dan Sandler\",\"bio\":\"Dan helps lead the Android System UI engineering team, which is responsible for pretty much everything you see on the Android screen that isn't an app. Before Google he was a grad student researching distributed systems and security. And even before that, he worked at Palm and Be on the UI of their respective operating systems. (You can take the programmer out of the status bar, but you can't take the status bar out of the programmer.) Dan has a Ph.D. in computer science from Rice University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/pSWmjT5PbBry2FoQKl94XiKJ-0eKiSl5ZHlvkPtgnXHwRRpcKj9DVmyZexArnoSUzLS32wYCy17rwtqDS-DZmz49tA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"59e36e08-01e4-4a3a-9e85-edafae429c0d\":{\"id\":\"59e36e08-01e4-4a3a-9e85-edafae429c0d\",\"name\":\"Daniel Bergqvist\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"79f52ef6-5d34-4f07-adf3-680b666aa603\":{\"id\":\"79f52ef6-5d34-4f07-adf3-680b666aa603\",\"name\":\"Daniel Ramage\",\"bio\":\"Daniel leads Google's federated learning team, working toward safer and more private machine learning and data science without centralized data collection. Before joining Google, Daniel received his PhD at Stanford University (2011) in machine learning and natural language processing.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/j8h3-edb3qmpRvdPZskmhXUFxUcOcEKUFjdnsaqk9fkP11PHBn1jqX2fsUbBWFglc4gnDamNj6kteNUmldUpa9FE\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"eb9caeff-450e-451e-a1a4-d85c6bb7cb08\":{\"id\":\"eb9caeff-450e-451e-a1a4-d85c6bb7cb08\",\"name\":\"Daniel Santiago Rivera\",\"bio\":\"Daniel is a Puerto Rican native currently working on the Android Toolkit team at Google. He is passionate about developing open source libraries that increase developer happiness and productivity. Daniel is a software engineer graduate from the University of Puerto Rico. He also likes video games, like a lot.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/8IIOVjPeEIHBZoRAg5skCm31Jb9bFW5JwNBsjmEE3O_1c0P560NeMiYIIM9s5tIbGHwqMq6V71thiUzrocioRyc\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/danyaguacate\",\"LinkedIn\":\"\"}},\"80ed2da8-eb17-4599-a4d8-cc5c1fb16c85\":{\"id\":\"80ed2da8-eb17-4599-a4d8-cc5c1fb16c85\",\"name\":\"Daniel Situnayake\",\"bio\":\"Dan is a Developer Advocate for TensorFlow Lite. His passion is bringing machine learning and intelligence to tiny devices! He's spent time as the CEO of an agricultural technology startup, a software engineer in Silicon Valley and the financial industry, and a lecturer in data capture technologies at Birmingham City University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ypUKOg_RW5CJkgUMU_IvcF0n20_fvML5RTNAhsxxcO2xDE73xUnjb4zeQAL2TR4VqCHUnI9lGs985jMlyAWKd7j22w\",\"socialLinks\":{\"GitHub\":\"https://github.com/dansitu\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/dansitu\",\"LinkedIn\":\"https://www.linkedin.com/in/situnayake/\"}},\"12be87e0-7727-42f7-84a8-dc0c88f208c5\":{\"id\":\"12be87e0-7727-42f7-84a8-dc0c88f208c5\",\"name\":\"Daniel  Myers\",\"bio\":\"Daniel Myers is a Developer Advocate at Google on the Google Assistant and Actions on Google team. He's held roles in product development, engineering, product marketing, and business management from startups including LiveWire Hosting and PetroCloud to Fortune 500 companies like Google, Cisco, and Fujitsu. Daniel is an inventor of 3 patents and has a bachelor's degree in Computer Engineering plus an MBA from the University of Texas at Dallas. If you don’t find Daniel coding, you’ll probably find him talking about a new investment or business idea.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/J3Lw27QJ-0cQuW97dICUSCjw4mJZCOkK7MWL3hLfuFa_cPTcXtdzeyyTJ9OLLJrBEo2RPD-fBpFyYniJHk50XjRw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/jdanielmyers\",\"LinkedIn\":\"https://linkedin.com/in/jdanielmyers\"}},\"12598363-14d1-443f-80bb-70edb3a31bba\":{\"id\":\"12598363-14d1-443f-80bb-70edb3a31bba\",\"name\":\"Daniela  Cruz\",\"bio\":\"Daniela is a developer marketing manager for Actions on Google, the developer platform for the Google Assistant. Her areas of responsibility include leading core product marketing and managing developer and partner related event presence. Prior to the Google Assistant, Daniela worked at YouTube growing YouTube creators’ online presence. Daniela has a BS in Business Administration with a concentration in Technology, Entrepreneurship, and Design from Babson College. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/_DWttZ-w1Sosot55hYvzZVxSyfi2MeVGeIj3ncQQ5chjglPK-s5dTvZXcIvQdHlDi2g6xQXNsvyOu-1Ha1spe1tFqA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"522f3cb3-1dd1-491d-b448-716fa74c57ab\":{\"id\":\"522f3cb3-1dd1-491d-b448-716fa74c57ab\",\"name\":\"Darla Sharp\",\"bio\":\"Darla is a conversation designer on the Assistant, helping the Assistant look and sound her best on speakers, smart displays, and beyond.  Prior to Google, she worked at Amazon as a lead voice UX designer on the Echo, Echo Dot, and Echo Show.\\n\\nDarla earned a Masters in Applied Linguistics from San Diego State University, where she learned how to teach humans language, and now uses that knowledge to teach machines.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/45fzh2c94pXcRHDtozDegeMYmLzWVPGVjooxHwOxKAauzoX5UDaIIdJUsbAGPCy4DkIosUgL_U0oY28E_sJiwgM7\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/darlasharp/\"}},\"fe03de0d-bca8-485d-a396-e72a1ed8dab2\":{\"id\":\"fe03de0d-bca8-485d-a396-e72a1ed8dab2\",\"name\":\"David East\",\"bio\":\"David East is a developer advocate on the Firebase Team at Google. Previously he worked at Firebase the startup. If you couldn't tell, he really likes Firebase.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ETv0l9XP83QJPSZWz7Ns9UMCUTQtBe5wHzP4d2mqSIhIJDVjVQDSs9VRjlVfPGMZYEMtGbdCWmC_IPCGlo4BGBb_\",\"socialLinks\":{\"GitHub\":\"https://github.com/davideast\",\"Website\":\"https://davidea.st\",\"Twitter\":\"https://twitter.com/_davideast\",\"LinkedIn\":\"\"}},\"9614f8e4-ec0f-4aaf-adb9-603a704ad32d\":{\"id\":\"9614f8e4-ec0f-4aaf-adb9-603a704ad32d\",\"name\":\"David Herman\",\"bio\":\"David Herman is currently leading an effort to improve the Android Data Binding integration in Android Studio, although he previously worked with the Profiler Tools team for several years. Before Studio, he helped bring YouTube into the living room via the YouTube app on the Xbox 360. Prior to that, he worked in the game industry, writing in-house tools for a game title that spanned several PlayStation consoles. David studied Computer Science at Harvey Mudd College.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/W-HI-vWxpeLweens9I9Lc_SpfzyCupCgWi4x85yfZ7mJQnEy-yKBKMGo67h3U7-x5-2kiOAfC4qYcagpYAHmXUrE\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/adt_dherman\",\"LinkedIn\":\"\"}},\"8d00a3e4-df1f-450d-961c-8c8ecdae6e33\":{\"id\":\"8d00a3e4-df1f-450d-961c-8c8ecdae6e33\",\"name\":\"David Rim\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"67b80999-fd61-42bb-b4f2-6a000fc64fdc\":{\"id\":\"67b80999-fd61-42bb-b4f2-6a000fc64fdc\",\"name\":\"David Schairer\",\"bio\":\"David leads engineering for SmartHome/IoT in the Google Assistant. Before joining Google, David founded or advised multiple startups in the AI, NLU, and productivity spaces, including Trapit and Magneto. He began his career in the ISP and telco business, building Internet infrastructure at Concentric and XO. David has a BA in Latin, Greek, and Classical Archaeology from the University of Michigan, and collects obscure dead languages.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/igE73VsXtoo2xfuDYmBmR4q9WEXChkNWI3e7ttB7rtSxlDwSA8XDrN3d9USWO19wra_8cucSX6es5nmtlFWx2xE\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/dschairer/\"}},\"31f9196b-818e-4a7b-a224-ed9e0d326a37\":{\"id\":\"31f9196b-818e-4a7b-a224-ed9e0d326a37\",\"name\":\"David  McIntosh\",\"bio\":\"David McIntosh is the co-founder of Tenor which was acquired by Google in 2018. David was previously named a Forbes 30 under 30 entrepreneur, and grew Tenor into a leading expression search engine that hundreds of millions of people use to express themselves by finding and sharing the perfect GIF.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/8Xdwf44QEBNA2_oTP3NZSXyQL-O70fwMMbqFIC6XLS9aH5Vjd_c3LoJCyJx5L2H1j-cK-cN4BaOd20OUhe3RtazSTw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/dmcintosh\",\"LinkedIn\":\"https://www.linkedin.com/in/mcintoshdavid/\"}},\"a7591fe4-172a-4a79-a62c-c54622dadbea\":{\"id\":\"a7591fe4-172a-4a79-a62c-c54622dadbea\",\"name\":\"Deepti Gandluri\",\"bio\":\"Deepti is a Software Engineer at Google on the Chrome team. She works on implementing WebAssembly features in V8, Chrome's JavaScript engine. Deepti previously worked on Native Client, and x86 simulators. She also enjoys tiny electronics projects, and sewing circuits\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/hl1ubMMZdZEkDqt5O9OWfttMMYdutRcAx_u_ESHkCRbdrnLsXRdBY7Zz4If8mEv-8pMIxWUhnDS6LBzZWVCep282\",\"socialLinks\":{\"GitHub\":\"https://github.com/dtig\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/dptig?s=03\",\"LinkedIn\":\"\"}},\"b72d9867-65cb-4105-b441-2010c1fce348\":{\"id\":\"b72d9867-65cb-4105-b441-2010c1fce348\",\"name\":\"Derek  Phillips\",\"bio\":\"Derek is a graduate of the University of Waterloo and has been working for Google for over 13 years. As part of a team of two, he helped found the effort that would become Firebase at Google and has been deeply involved ever since. As an Engineering Director for Firebase, he's managed teams in every part of the Firebase product and teams around the world. Before Firebase, he was a developer and a manager for many teams in mobile including Gmail, Google Maps and Google Shopping. Outside of Firebase, he leads Google's efforts for STEM education in Canada. He also has 3 wonderful kids (aged 9, 6 and 4) who occupy all of his free time.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/vQLWOsQr6R4VmwUsXWBVQuf3IfimtR4LkozsVSvSb9x5MjgBKMZsAlhnQ_N5iQhzJo64-Mfsepud4oebyB8tzP4\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"e7a6177e-2e88-43e9-b76f-8524b101939b\":{\"id\":\"e7a6177e-2e88-43e9-b76f-8524b101939b\",\"name\":\"Dev  Gogate\",\"bio\":\"Dev is based in NY and is the head of mobile solutions consulting for the Americas region within the gTech Velocity org. In his role, Dev leads a team that provides high touch consultation services to Google’s top advertisers and publishers and helps guide them through their mobile web strategy. Prior to Google, Dev worked at Deloitte Consulting and led several consulting engagements as part of their Information Management practice in many industries such as pharma, finance and insurance. Dev holds a bachelor’s degree in computer engineering from Mumbai University and an MBA from Columbia Business School. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/lqZhgW4q3O-CeiBjFHD-EYO4Ly00E5ADZ1mx7NymL4ZqriK9GOxY3rIzFi0mfKTLDslUPaZDuPsI7kgxwqd5h5an\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"5147b370-a8d9-4291-a8b8-cd00409b2ba2\":{\"id\":\"5147b370-a8d9-4291-a8b8-cd00409b2ba2\",\"name\":\"Diane Wang\",\"bio\":\"Diane Wang is a lead user experience designer at Google Daydream, leading rapid prototyping efforts for mixed reality experiences. She is passionate about working across emerging mediums to create seamless, thoughtful, and desirable experiences. Previously, she was a user experience designer at Nest Labs, where she worked on experiences for the thoughtful home. Her work has received product design awards such as the iF Design Gold Award, Red Dot Design Award, and D&AD Award. Diane holds a Bachelor’s degree in Computer Science from the University of California, Berkeley.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dxKXidoFcNl0_MUStqJvNYKtyIVYvrGRYWV4YTncI27VTGBszmOchI8NmNRv649TrHFP3FX1Xt1p83clceyN_ug\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://diane.io\",\"Twitter\":\"https://twitter.com/dianedelion\",\"LinkedIn\":\"https://www.linkedin.com/in/dianecwang/\"}},\"bd9b7f47-3354-4510-8be9-02df842a59c9\":{\"id\":\"bd9b7f47-3354-4510-8be9-02df842a59c9\",\"name\":\"Dianne  Hackborn\",\"bio\":\"Dianne manages the Android Framework team, which is responsible for many of the core system services in Android: resources, packages, permissions, activities, windows, displays, users, accessibility, etc. She has worked on Android since joining Google in 2006.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"fdb72d27-d4b6-4ab6-abc1-4298b6920e47\":{\"id\":\"fdb72d27-d4b6-4ab6-abc1-4298b6920e47\",\"name\":\"Diego Perez\",\"bio\":\"Diego is a software engineer on the Android Studio team at Google, based in London, working on design tools. He's passionate about Android and developer experience, with more than 10 years experience in mobile development.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/7eJb2xhXon7uOugh8hiYzm1-KEDWfxIHxU6yYx7u9poYBa1uQoQBGsBu7PuI3vGaSu7j8JB5kxfBzX_tJiFEeO4\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"d9a07acf-60a3-485d-af7a-ad8d6e387600\":{\"id\":\"d9a07acf-60a3-485d-af7a-ad8d6e387600\",\"name\":\"Dion  Almaer\",\"bio\":\"Dion works on the Web Developer Ecosystem, where he is responsible for developer products such as Chrome DevTools, Lighthouse, and web.dev, as well as Developer Relations teams across Chrome and Search.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://blog.almaer.com/\",\"Twitter\":\"https://twitter.com/dalmaer\",\"LinkedIn\":\"\"}},\"bb3e7093-7b24-47b8-b4eb-1624eab3b69a\":{\"id\":\"bb3e7093-7b24-47b8-b4eb-1624eab3b69a\",\"name\":\"Dom Elliott\",\"bio\":\"Dom is a product manager working on app publishing and distribution, including the Android App Bundle which makes apps much smaller and allows customizable feature delivery. Dom has worked at Google for over 10 years, spending the last four helping developers grow their businesses on Google Play.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/F-x76-d52Cdvae8gFoa4sN5DGRKd0D1MqI3yDrAGQSF_pHhQcbw9ow3RCyyMv7gYNlrALuyptEYZJHxc-2LdAW_G\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/iamdom\",\"LinkedIn\":\"https://linkedin.com/in/domelliott/\"}},\"404059be-eed0-4f39-860e-7c1049d1c18a\":{\"id\":\"404059be-eed0-4f39-860e-7c1049d1c18a\",\"name\":\"Dominic Hamon\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"312fc749-6137-4e94-b2c7-df8901ff91b4\":{\"id\":\"312fc749-6137-4e94-b2c7-df8901ff91b4\",\"name\":\"Dominick  Ng\",\"bio\":\"Dominick is the tech lead for Progressive Web Apps and the Chrome OS Apps Foundation at Google. His focus is creating platforms for developing seamless, secure, and powerful app experiences that users love. Dominick is a Fulbright scholar, and earned a PhD and bachelor's degree with first class honours and the university medal from the University of Sydney.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/3q9ZXgMRDLgpP0-eOPcR0g7BbEOCJEldjlAsTiA4kuZjKdQlSKTFiugoxnuASUq3JWfMX7JVsVvShTC3SNOfGU8\",\"socialLinks\":{\"GitHub\":\"https://github.com/dominickng\",\"Website\":\"https://dominickng.com\",\"Twitter\":\"https://twitter.com/dominickng\",\"LinkedIn\":\"https://au.linkedin.com/in/dominickng\"}},\"364a11ff-ba21-423c-9730-5aa9347c2c29\":{\"id\":\"364a11ff-ba21-423c-9730-5aa9347c2c29\",\"name\":\"Don Turner\",\"bio\":\"Don is a Developer Advocate on the Android Developer Relations team. His main focus is on Android Audio. He helps developers solve challenges associated with creating high-performance, low latency apps and games, particularly those using the Android NDK. \\r\\n\\r\\nHe is the lead developer on Oboe - an open source library for building real-time audio apps on Android. \\r\\n\\r\\nIn his spare time Don enjoys building modular synthesizers and other electronic musical gadgets. He also has an unwavering love for Drum and Bass music and used to DJ in some of the worst clubs in Nottingham, UK. \\r\\n\\r\\nDon has an honours degree in Computer Science from the University of Nottingham, UK. \\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/I1mKgO13CEMirYEmyWopTqYdkFw5Zv1kEtXOvFWD3S7bEnxc0BkBgUYo6ZE9eLneAee-ei05FmQ_E0mgvXxaqXU\",\"socialLinks\":{\"GitHub\":\"https://github.com/dturner\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/donturner\",\"LinkedIn\":\"\"}},\"efa26f46-4700-47b9-9adb-92cf698603ec\":{\"id\":\"efa26f46-4700-47b9-9adb-92cf698603ec\",\"name\":\"Dong Chen\",\"bio\":\"Dong is a tech lead of ML Kit engineering team, responsible for architecting the product and leading the development. For the past 13 years he has been leading several engineering teams across Gmail, Google Maps, and On-Device Machine Learning. Most recently, he helped starting and launching ML Kit at 2018 Google I/O. Dong calls Silicon Valley home for the last 24 years and enjoys full-stack development. Originally from Beijing. He holds a BECS from Tsinghua and MSCS from Purdue.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Er0TkJCeMmGfXLvcESjR18d6ggpmpQvkJHnMxA8KyIBrAURJ9AIvL03ig353GzQ2MF4ECSTxPFGm-PadD1Dsybw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"dbaa9d25-48f4-46a0-9fa0-477105289165\":{\"id\":\"dbaa9d25-48f4-46a0-9fa0-477105289165\",\"name\":\"Dr. Michio  Kaku\",\"bio\":\"Dr. Michio Kaku is one of the most widely recognized figures in science in the world today. He is an internationally recognized authority in two key areas. The first is Einstein’s unified field theory, which Dr. Kaku is attempting to complete. The other is to predict trends affecting business, medicine, finance, and our way of life, based on the latest research in science. He has written four New York Times Bestsellers: The Future of Humanity, The Future of The Mind, Physics of The Future, and Physics of The Impossible. All achieved top spots on the New York Times, Amazon, and Barnes & Noble bestsellers Lists, and #1 hardcover, non-fiction book in the country for The Future of The Mind. Kaku has over 3 million fans on Facebook and well over half a million people follow his tweets on Twitter.\\r\\nDr. Kaku holds the Henry Semat Chair in Theoretical Physics at the City Univ. of New York. He graduated from Harvard University in 1968 (summa cum laude and 1st in his physics class). He received his Ph.D. in physics from UC Berkeley in 1972, and has been a professor at CUNY for almost 30 years; he has taught at Harvard and Princeton as well. His goal is to complete Einstein’s dream of a “theory of everything,” to derive an equation, perhaps no more than one inch long, which will summarize all the physical laws of the universe. He is the co-founder of string field theory, a major branch of string theory, which is the leading candidate today for the theory of everything. His Ph.D. level textbooks are required reading at many of the world’s leading physics laboratories.\\r\\n\",\"company\":\"Kaku Media\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/BOl05oVlRQExMSaADTnExTTDqigKlqGlt8lMyg0esoQ7uE0Csv2fugZyt36XW0fT08iMPoI4QRpfPza_HvlTI7os\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/michiokaku\",\"LinkedIn\":\"\"}},\"9d7c5051-1159-42d2-82cd-4a95d89dd2a0\":{\"id\":\"9d7c5051-1159-42d2-82cd-4a95d89dd2a0\",\"name\":\"Duke Dukelis\",\"bio\":\"Duke Dukellis is director of product management at Google for mobile app advertising products (AdMob and DoubleClick) for developers and publishers. Prior to Google, Duke led the Consumer Wallet and Consumer Financial Services teams at PayPal. Earlier he was CEO at StepNexus, a global chip security company ultimately acquired by Gemalto. He received his B.S. in Computer Science, B.S. in Management Science, and Masters in Computer Science from MIT. He holds an MBA from the Stanford Graduate School of Business and is a CFA charterholder.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"344243b0-8d23-4faa-83d4-1f47eb907407\":{\"id\":\"344243b0-8d23-4faa-83d4-1f47eb907407\",\"name\":\"Dustin  Lam\",\"bio\":\"Dustin is a software engineer on the Android Toolkit team working on Architecture Components.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/i3VDyF0PAdIpG7IuUhmhoG_uKUrykUZ9W18oOdh7ww6mRytCkrqm_NzJR543W60wUyZokcHXI43U6tatAmIRtWZkeA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"429180be-f34b-4270-a4b8-b5dd0e853f10\":{\"id\":\"429180be-f34b-4270-a4b8-b5dd0e853f10\",\"name\":\"Dylan Reid\",\"bio\":\"Dylan has worked on the Chrome OS software team for the past 8 years. He leads the guest operating system and audio teams.  Dylan is currently focused on making chromebooks a great environment for software developers and audio professionals.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/jtuArDWuGjQx4uIUwHK6MAfHJAnBXiygc-LKirrNefSPiNKfwxbwejAQEvJEMggbzvmUbIUewJhtP1eXZvRQgqkZ\",\"socialLinks\":{\"GitHub\":\"https://github.com/dgreid\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/dylan-reid-670a341/\"}},\"d7b950ea-cd76-4e57-ada4-03bc1ee45c4d\":{\"id\":\"d7b950ea-cd76-4e57-ada4-03bc1ee45c4d\",\"name\":\"E  John Feig\",\"bio\":\"John is a Technical Solutions Engineer at Google, leading a partner engineering team focused on smart home within Google Home & Nest. Prior to joining Google, John was a full stack developer, part of the core engineering team of a local startup, and was a Google Developer Expert for Wearables. He's a father, engineer, coffee roaster, sometimes public speaker, and he's really into coffee.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/iW71TpNB4bQc0_iQ3JngeGk8PTJkcDb1xlVdzMLYPxOPLRJ2an-RfN_ssxeYFOELy7jgjoV3m5JiCcmtoKVN90BG\",\"socialLinks\":{\"GitHub\":\"https://github.com/emil10001\",\"Website\":\"https://ejf.io\",\"Twitter\":\"https://twitter.com/ejf_io\",\"LinkedIn\":\"https://www.linkedin.com/in/ejohnfeig/\"}},\"986a30af-ad8b-4b62-bcb5-f98209bca277\":{\"id\":\"986a30af-ad8b-4b62-bcb5-f98209bca277\",\"name\":\"Elie Bursztein\",\"bio\":\"Elie Bursztein leads Google' security & anti-abuse research team. He has authored over fifty research papers in the field for which he was awarded 6 best papers awards and multiple industry distinctions including a Black Hat Pwnie award. Born in Paris, he received a Ph.D from ENS-Saclay in 2008 before working at Stanford University and ultimately joining Google in 2011.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/FHvr636DA8RnTZ36LY1Eq0yY7xdmQwtTjKrxhUHd0MxsvLKHSEsDhmNvODwErMZKXPuywt8bwHKUqVuS8qiK_XZs\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://elie.net\",\"Twitter\":\"https://twitter.com/elie\",\"LinkedIn\":\"https://www.linkedin.com/in/bursztein/\"}},\"27dedae4-a3a6-4eac-aa29-6e60f3455635\":{\"id\":\"27dedae4-a3a6-4eac-aa29-6e60f3455635\",\"name\":\"Elise Roy\",\"bio\":\"Elise Roy is a deaf, inclusive design strategist who helps companies analyze products and services from the vantage point of people with disabilities. She believes that the unique experiences of people with disabilities help us uncover hidden needs, wherein lie the most profound solutions for everyone. Roy draws on her 15+ years of working with the disability community, and her diverse career path as a lawyer who worked on the United Nations Disability Convention, a marketing manager who worked on the 2008 election campaign ads, and an industrial and user experience designer to shape solutions for her clients. An internationally recognized speaker, Roy has given talks all over the world including at Microsoft, SXSW, the United Nations, AIGA, NASA, and the Cooper Hewitt. Her TEDx talk, “When We Design for Disability, We All Benefit,” has over 1.2 million views. Her company, Elise Roy & Associates has attracted clients that include Fortune 500 Companies such as Marriott, Google, and Fannie Mae.\",\"company\":\"Elise Roy & Associates\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/EXkhGhhSstUaky0z3t__kFalD7p21jWSuho8Ul76t61tS7OOPNjD35zmDU_ZTpq1g8JoPiY39hhPR1Kj0sdEuzmh\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/EliseRoy\",\"LinkedIn\":\"https://www.linkedin.com/in/eliseroy/\"}},\"e1045b58-b4f5-42d6-af2b-672427a82e2d\":{\"id\":\"e1045b58-b4f5-42d6-af2b-672427a82e2d\",\"name\":\"Elizabeth Sweeny\",\"bio\":\"Elizabeth is a Product Manager on the Chrome Web Platform, working on Developer Insights products including Lighthouse, PageSpeed Insights, web.dev, and the Chrome User Experience Report.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/IN7FrfG-on8tyI1xThf5bRBRqopHHY0UnIA9Z4sT5-rqG7dmlFxhN-YR9Qs2pG0uC9ltKFTiGjb6zD9DNiw9PVxt\",\"socialLinks\":{\"GitHub\":\"https://github.com/kusler\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/egsweeny\",\"LinkedIn\":\"https://www.linkedin.com/in/egsweeny/\"}},\"db13e286-22f4-4e9d-8a98-3e9d5d60f5e4\":{\"id\":\"db13e286-22f4-4e9d-8a98-3e9d5d60f5e4\",\"name\":\"Elliott Hughes\",\"bio\":\"Elliott works on Android. He started on the core java.* libraries, followed by the then-new Android Runtime (ART). The need to get the core OS ready for 64-bit in Lollipop led him to switch from helping Java developers to helping C/C++ developers, first for the OS itself and more recently for apps via the Native Development Kit (NDK).\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/iiOZ19R0X8GSgzAYc70i2RHuoBNBEserNTw_TjtIin9Y8NW12j7LD5UDDbo8-P7OdJc9m85Avm5MPLpvnLxRTQKG\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f7c047e5-fea0-480c-b27a-d5e5fb7ca0a3\":{\"id\":\"f7c047e5-fea0-480c-b27a-d5e5fb7ca0a3\",\"name\":\"Emilie  Roberts\",\"bio\":\"Emilie is a developer advocate working on Chrome OS (Android apps, Linux, creativity), Android camera, and real-time audio. Prior to this role, she was a professional contemporary dancer, freelance programmer, and high-school teacher. She has an iron ring and is a top-level roller derby athlete. She thinks the developer voice is critical in guiding Google and the ecosystem to make sustainable, open decisions that support technical and non-technical communities and well-being. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/wHOAYMv3efmI7FxDFIWWWNnw59Y-zZ3axpKftxX6g-B63kq-wlrl5tR4BD7jDmutdrag5-N4TCRqOZC-L2u1P4dC1A\",\"socialLinks\":{\"GitHub\":\"https://github.com/emilieroberts\",\"Website\":\"https://medium.com/@emilieroberts\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"bed13088-6614-4b4b-91cf-ee73d701284a\":{\"id\":\"bed13088-6614-4b4b-91cf-ee73d701284a\",\"name\":\"Emily Fortuna\",\"bio\":\"Emily is a senior developer advocate on the Flutter team, educating others about the joy of using Flutter and how to best use it. She is an Anita Borg Scholar, has a Masters in Computer Science from the University of Washington and a Bachelors in both Computer Science and Linguistics from Rice University. When not hacking on computers she can be found acting on the stage or screen.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/BVS_4gDYHWJq1Gug2B0Y3Sg-u6UKtA2J5v_tVKk83pwID0ljtgau-TItFEg7rDGINTJoAxMsfFAypQFWd58gKQn0\",\"socialLinks\":{\"GitHub\":\"https://github.com/efortuna/\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/bouncingsheep\",\"LinkedIn\":\"\"}},\"7e0c940c-2c9f-4087-9b1d-f697838c36c3\":{\"id\":\"7e0c940c-2c9f-4087-9b1d-f697838c36c3\",\"name\":\"Emily Glanz\",\"bio\":\"Emily is a software engineer on Google's team that does federated learning and beyond. She studied Electrical Engineering at the University of Iowa prior coming to Google.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/uDW8WqeJ_px-zYAWvSW2Il8TgMNiuJRx0Ydyhg8ZdNEo_u2ryu03RhNXh-JBfeh-NTfR0jzM81mwAj-LNc-77WM\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"9fbfb2ac-353b-4cb2-a50a-ea2d5c5e37bf\":{\"id\":\"9fbfb2ac-353b-4cb2-a50a-ea2d5c5e37bf\",\"name\":\"Emily Schechter\",\"bio\":\"Emily is a product manager on the Chrome security team and leads long-term efforts to make the web more secure. Emily has previously worked on Google's Safe Browsing (anti-malware and anti-phishing) and AdWords anti-fraud teams to help protect Google and the internet at large from danger. Emily has degrees in computer engineering and economics from Dartmouth College.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/k8IoDhgcGOz0KdXKGDNWQhiYKnDQf_bS8qncjawr9E2_pzPPPGAQa9iQfi5p7BoeMhtuNpKHaF8F7OolSaiIkayT\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/emschec\",\"LinkedIn\":\"https://www.linkedin.com/in/emilyschechter/\"}},\"f32caf76-cc8c-4df2-8ffe-cb1408ec3116\":{\"id\":\"f32caf76-cc8c-4df2-8ffe-cb1408ec3116\",\"name\":\"Emily Shack\",\"bio\":\"Emily has been a software engineer at Google for close to four years. She is an expert on the Flutter framework, and is passionate about exploring the intersection between machine learning and user interface design. She received her bachelor's degree in computer science from Carleton College in Northfield, Minnesota.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/5pBGYxL8zIZ726wiY_QFVaFZbbiF5ecom4pDZqouBx9gUs5UBPx1JgaQx-SVXZCv1jGVz51j4Zovvqr1o6I8pABd\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/AlchemySki\",\"LinkedIn\":\"https://www.linkedin.com/in/emily-shack-a1769aaa/\"}},\"20b95c09-4cfe-41ea-8659-3c53442bba7a\":{\"id\":\"20b95c09-4cfe-41ea-8659-3c53442bba7a\",\"name\":\"Erica Cei\",\"bio\":\"Erica designs voice user interfaces for Google Assistant experiences. She also partners with and educates developers to help them build better Actions on Google. Previously, Erica worked as a contractor with Google’s Text-to-Speech team, where she was the project manager for the first US English Google Assistant voice.\\r\\n\\r\\nErica earned a bachelor’s degree in linguistics and Spanish with a minor in French from the University of California Los Angeles.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/QCPtzfZdt0HieVXA1CJ7NhxBq82BvQJvKFfw_maOEkk-GMIisRT1lFd6K3SIyXIGUfq8MqNZCythJwvbdkKqu022NA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"38068771-50cc-4f69-a2ba-f082a61d0f49\":{\"id\":\"38068771-50cc-4f69-a2ba-f082a61d0f49\",\"name\":\"Erik  Haddad\",\"bio\":\"Erik Haddad is a UX Engineer at Google on the Firebase team in San Francisco. Prior to joining Google, Erik was an Advanced Development Engineer at ESPN and Disney. Erik attended the Rochester Institute of Technology for both Computer Science (BS) and Technology Management (MBA) degrees.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/cOMOtK4_96-fIUZnwl13FEBFOuvlue_cIiT7jkzyINcBgn5p-bQvC1N9bGptkmwfY38zcy8jUYkw4j8Atgr8P5E\",\"socialLinks\":{\"GitHub\":\"https://github.com/erikhaddad\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/erikhaddad\",\"LinkedIn\":\"https://www.linkedin.com/in/erikhaddad\"}},\"839a08c0-f3fd-4900-8f7c-47c7bc3f5566\":{\"id\":\"839a08c0-f3fd-4900-8f7c-47c7bc3f5566\",\"name\":\"Eugene Brevdo\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/JasJCqfO_mu-SsYwOTKZ9HFQ8VKiPdnBtc1HkGf0bVDut65fmENhV6i9BCH-XX1QIypgSc3HgWL6d0lYIbxVIhA\",\"socialLinks\":{\"GitHub\":\"https://github.com/ebrevdo\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/yablak\",\"LinkedIn\":\"\"}},\"1463b718-97d0-4413-97d8-41569acab813\":{\"id\":\"1463b718-97d0-4413-97d8-41569acab813\",\"name\":\"Eugene  Meng\",\"bio\":\"Eugene Meng\\r\\nInteraction Designer, AR Platform, Daydream \\r\\n\\r\\nEugene is an interaction designer on AR Platform, with focus on AR design patterns and principles. \\r\\n\\r\\nPrior to Google, she has interned at a couple design agencies, and published as a journalist intern at the New York Times.\\r\\n\\r\\nShe held masters’ degrees in Human Computer Interaction(HCI) and East Asian Studies from University of Washington and Yale University. Before gravitating towards HCI, she earned a bachelor's degree in English Literature from Nanjing University, where she graduated with honors.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/IyppSZSF-L9FiSZh92actmfbC0ojMVnKKvRAjKFVuhR38YtUXLQFbPmKvoiGRGrcMpZ-KI5Mte4dB5Y_VbFDpcx8\",\"socialLinks\":{\"GitHub\":\"https://github.com/eugenemeng\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kankanmeng\",\"LinkedIn\":\"https://www.linkedin.com/in/eugenemeng/\"}},\"d2db0817-dc4d-4758-8762-eb5a8c15cac3\":{\"id\":\"d2db0817-dc4d-4758-8762-eb5a8c15cac3\",\"name\":\"Federico Colla\",\"bio\":\"Federico leads the Play Game Developer team, focused on providing game developers with tools and insights to help them maximize their success on Play.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/OcwZ11mJfZgl73Tsi-8N9VFChrii9_wB9-9GnLUsEZPbYjJ5ME8YXVB2JwY4LR3EZXvizgBmHvVBInx7i5Xm_mE\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"8fdfa5cc-8375-4410-9f1f-ed23540ac2e0\":{\"id\":\"8fdfa5cc-8375-4410-9f1f-ed23540ac2e0\",\"name\":\"Fergus Hurley\",\"bio\":\"Fergus is a product manager at Google responsible for providing tools to developers such as Android Vitals and benchmarks to help them improve the experience of Android users around the world. Previously he worked in Google Research on the Assistant and Waze Carpool. Prior to Google he founded & sold a mobile app startup in Silicon Valley. He has a Masters from MIT and a BE from UCC, Ireland.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/NjTo6CXUYkTnLIO5thzQ06bXgjh0Uf-mDqA4ZNBKbzINzwWYn9nQmDdvZrizhJ7c9Ur93RcWYvU80ZRiE60XWcI7\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/fergushurley\",\"LinkedIn\":\"https://www.linkedin.com/in/fergushurley/\"}},\"5e37b0ef-859a-4760-a24f-3b2ba81a7d9f\":{\"id\":\"5e37b0ef-859a-4760-a24f-3b2ba81a7d9f\",\"name\":\"Filip Hracek\",\"bio\":\"Filip lectures about Flutter, writes articles and builds sample code. He's focused on state management approaches in declarative frameworks. Previously, he trained developers on Dart, and before that he lead Google's developer relations in Eastern Europe. Prior to Google, Filip was an independent IT instructor. He earned his master's degree in journalism from Masaryk University, Brno, Czech Republic.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/JuiAkBbK4FQou3nwf9dCT4eN3j_w7Av7Qg5XY1T6eWd1Z19lQwiP-kyp67t4FrjmQy5FOY13232FfR-hYoiDSI0\",\"socialLinks\":{\"GitHub\":\"https://github.com/filiph\",\"Website\":\"https://filiph.net/\",\"Twitter\":\"https://twitter.com/filiphracek\",\"LinkedIn\":\"https://www.linkedin.com/in/visible\"}},\"3f490e1d-4e62-4ca3-bd87-96edcc05f852\":{\"id\":\"3f490e1d-4e62-4ca3-bd87-96edcc05f852\",\"name\":\"Filip Stanis\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"4ac27b67-b18d-4c80-ba0f-fdc95116eba1\":{\"id\":\"4ac27b67-b18d-4c80-ba0f-fdc95116eba1\",\"name\":\"Fiona  Lee\",\"bio\":\"Fiona manages partnerships and business operations for Android ELS. Previously, she worked on initiatives to provide connectivity, affordable hardware, and health information to emerging markets. In a former life, Fiona did strategic planning for Apple, Intuit, AT&T Wireless and several startups.\\r\\n \\r\\nFiona has master's degrees from UC Berkeley and Harvard University, and a bachelor’s degree from Wellesley College.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/FvMpvLox-1Tcqxh9omUcH3XygdPj8Uq2FBWv7SiI-0gZbOxsYAZoFwrLqGQUpq3yGRZlGeu_tBqQjPsytQmLaDRY\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/fiona-lee-91649a/\"}},\"0066b1af-e2c8-4f63-9dee-b151b39d1c3f\":{\"id\":\"0066b1af-e2c8-4f63-9dee-b151b39d1c3f\",\"name\":\"Florina Muntenescu\",\"bio\":\"Florina is working as an Android Developer Advocate at Google, helping developers build beautiful, clean and testable apps. She has been working with Android for 8 years, previous work covering news at upday, payment solutions at payleven and navigation services at Garmin.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/y7dQNgOEo3ZYGerr9CEV7FuzJoi06CzFWkGhQwQpcaQnVryq_csRrigYNv2wlw3SgDp-r1QfW8Ty0WNNwK--ECvl\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://medium.com/@florina.muntenescu\",\"Twitter\":\"https://twitter.com/fmuntenescu\",\"LinkedIn\":\"\"}},\"d41cb407-95e8-42e1-933d-22b518ae29d6\":{\"id\":\"d41cb407-95e8-42e1-933d-22b518ae29d6\",\"name\":\"Francesco Carucci\",\"bio\":\"Francesco moved from Italy to England to make videogames and realized his childhood dream when he joined Peter Molyneux’ Lionhead Studios in 2003. Specializing in 3D real-time rendering and GPU Performance optimizations, Francesco worked on the graphics engines of titles such as Black&White 2 and Fable 2 before moving to Germany to work on Crysis 2 in Crytek: the number “2” being somehow of a constant in his career. After temporarily leaving the Game Industry to work on GPU Performance tools in Apple, Francesco joined Google and is now passing his extensive experience in the trenches down to the future generations of mobile game developers.\\r\\n\\r\\nIn his spare time, Francesco takes systraces in exchange of food.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/qrTrpRoKltule24E3W_YSMWYPO0eTo-RU22wvkJAw_jA53snT76udWvE8ouAX5pMb3iYkVBKEfVTNUi5QJwNpe_n\",\"socialLinks\":{\"GitHub\":\"https://github.com/fcarucci\",\"Website\":\"https://carucci.us\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/fcarucci/\"}},\"b6441524-301f-4f75-8ef3-8d174101f66d\":{\"id\":\"b6441524-301f-4f75-8ef3-8d174101f66d\",\"name\":\"Francis Ma\",\"bio\":\"Francis Ma is a group product manager at Google and leads the Firebase product management and design teams. Prior to his current role, he was a PM lead on Android focusing on building the Android developer ecosystem. Before joining Google in 2011, Francis was an entrepreneur and tech startup co-founder. Prior to that, he was a professional software developer. Outside of building Firebase, Francis loves playing ice hockey, spending time with his family and aspires to be a chef someday!\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Adosq_Q7pdjurm791AV0CtxawZKgXW_Qx60tfA4rv7DOG0UP8cWighfh_TG0GSZdx6OqOvsMO1BWgXBTBsTA8gIPXQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"dd5ab107-ccd2-4bf6-9b60-539c4ae02dea\":{\"id\":\"dd5ab107-ccd2-4bf6-9b60-539c4ae02dea\",\"name\":\"Frank van Puffelen\",\"bio\":\"Frank (or puf) is an engineer for Firebase at Google. He helps developers build extraordinary apps that use Firebase as their back-end. If you've ever asked a Firebase question on StackOverflow, you've probably met Frank already.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Y_-SKYUWQW3posCStz6GAp603e4J2jIyYHqKSLfkJ0IRne_zpegyczoBn0jEj9NY-xm_96OcLcFvRI7qQVsBfnml\",\"socialLinks\":{\"GitHub\":\"https://github.com/puf\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/puf\",\"LinkedIn\":\"\"}},\"f94a7db4-b8ea-4210-9224-d3eed8f6d2cb\":{\"id\":\"f94a7db4-b8ea-4210-9224-d3eed8f6d2cb\",\"name\":\"Frank  Nawabi\",\"bio\":\"Frank Nawabi is the co-founder and Head of Business Development of Tenor, a leading expression search engine that hundreds of millions of people use to express themselves by finding and sharing the perfect GIF. Tenor was acquired by Google in 2018.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/hK4cjzDaO7z7ukqBN8uqjylmT8rxBjkwxf4psAYPcotGErhGmtLQRbZb_hYqp-ONKVwa6O4job7OuURNoFLhx_Uy\",\"socialLinks\":{\"GitHub\":\"https://github.com/Tenor-Inc\",\"Website\":\"https://tenor.com/gifapi\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/franknawabi/\"}},\"a8adda47-65a5-42ed-b8cc-416696cc06eb\":{\"id\":\"a8adda47-65a5-42ed-b8cc-416696cc06eb\",\"name\":\"Franklin Wu\",\"bio\":\"Franklin is a software engineer on CameraX where he is responsible for core architecture. Previously he has worked as a software engineer at companies including Lytro, DAQRI, and General Atomics Aeronautical Systems.\\r\\n\\r\\nFranklin earned a master's in computer science and bachelor's in mathematics and computer science from the University of California, San Diego.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/rEtJCNStyjMluhO408CKW71E1tK4mkp_GKzqKqHD5Nv2vP4CKWNo9AwuJWE11zrFKxhN9TSHQrEBjEjOALKyr-Sl\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"72e1f518-7c35-414c-98bb-9d5106856ab3\":{\"id\":\"72e1f518-7c35-414c-98bb-9d5106856ab3\",\"name\":\"Franziska  Hinkelmann\",\"bio\":\"Franziska has a Ph.D. in mathematics and is a senior engineer at Google working on the Cloud Platform team in New York City. She’s a member of the Node.js Technical Steering Committee and an expert on JavaScript performance. When she's not working hard on making Node.js better on the Cloud Platform, she's probably out riding horses.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/CWuTVzdYYM-goY3SKGX80_D-wnCeRft5-MrrMoZIFoY3LflId_4qVnSymABq7wIqfWxSx7hmb7THFkBpLQ1Ci_Zy\",\"socialLinks\":{\"GitHub\":\"https://github.com/fhinkel\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/fhinkel\",\"LinkedIn\":\"https://www.linkedin.com/in/fhinkel/\"}},\"a8b55f1a-4cc2-481f-9d6d-1e686b2e87f4\":{\"id\":\"a8b55f1a-4cc2-481f-9d6d-1e686b2e87f4\",\"name\":\"Gaurav Nolkha\",\"bio\":\"Gaurav is a technical solutions engineer on the Google Home & Nest partner engineering team. In this role, he focuses on Smart home vertical enabling partners get the best out of Google Assistant integration. Prior to Google, he built and managed several IoT cloud services for Intel’s first wearable device and optimized power profile of Intel’s first tablet. Gaurav has a Masters degree in Computer Engineering from The University of Texas at Austin.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MSl3QqCqptUP5j1GnA5XfjpVyGNSsU1_MnsnB9CTKJNvY0rD3H34_7nNyKhHcXcf-HRFdqS3-qwUxTOoCHs_95BY\",\"socialLinks\":{\"GitHub\":\"https://github.com/vibgy\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/gnolkha\",\"LinkedIn\":\"https://www.linkedin.com/in/gaurav-nolkha-16416650/\"}},\"be2f9474-33a5-4504-a099-7865b4138c3c\":{\"id\":\"be2f9474-33a5-4504-a099-7865b4138c3c\",\"name\":\"Geoffrey  Hinton\",\"bio\":\"Geoffrey Hinton received his BA in Experimental Psychology from Cambridge in 1970 and his PhD in Artificial Intelligence from Edinburgh in 1978.  He did postdoctoral work at Sussex University and the University of California San Diego and spent five years as a faculty member in the Computer Science Department at Carnegie-Mellon University. He then became a fellow of the Canadian Institute for Advanced Research and moved to the Department of Computer Science at the University of Toronto. He spent three years from 1998 until 2001 setting up the Gatsby Computational Neuroscience Unit at University College London and then returned to the University of Toronto where he is now an Emeritus University Professor.  Since 2013, he has been working half-time in the Google Brain Team where he is now a VP and Engineering Fellow. He is also the Chief Scientific Adviser of the Vector Institute.\\r\\n\\r\\nGeoffrey Hinton was one of the researchers who introduced the backpropagation algorithm and the first to use backpropagation for learning word embeddings. His other contributions to neural network research include Boltzmann machines, distributed representations, time-delay neural nets, mixtures of experts, variational Bayes and deep learning.  His research group in Toronto made major breakthroughs in deep learning that revolutionized speech recognition and object classification.\\r\\n\\r\\nGeoffrey Hinton is a fellow of the UK Royal Society and a foreign member of both the US National Academy of Engineering and the American Academy of Arts and Sciences. His awards include the David E. Rumelhart prize, the IJCAI award for research excellence, the Killam prize for Engineering, the IEEE Frank Rosenblatt medal, the IEEE James Clerk Maxwell Gold medal, the NEC C&C award, the BBVA award, and the NSERC Herzberg Gold Medal which is Canada's top award in Science and Engineering. He recently won the 2018 Turing award with Yann LeCun and Yoshua Bengio.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/wjAHQJvcncBd1mrQ_AF4h8TW2zJ3vNGxwC6U-25E8LGyI3haFz_IkS0_Eh4_ZzQacOXGs5DAT13-Ofc2zMQzhXG5vg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/geoffreyhinton?lang=en\",\"LinkedIn\":\"\"}},\"b90ed23b-3600-41b3-9389-3a1e63936186\":{\"id\":\"b90ed23b-3600-41b3-9389-3a1e63936186\",\"name\":\"Germain Ruffle\",\"bio\":\"Germain is the UX designer in charge of the Augmented Reality design guidelines.\\r\\nHe has been working on creating design recommendations and tools (ARCore SDKs) for developers to build Android AR experiences.\\r\\nGermain previously worked on Daydream VR, Tango and finally ARCore.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/jgu5ufDh-Xqy1lVSi9zrbEzhHUkk9TlnZ8m0eqOhhTN3gWBsTRDGJbrmd7w2l46Nyp_fH9GyBEMnwLZsddwLrwhP7g\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/GermainRuffle\",\"LinkedIn\":\"https://www.linkedin.com/in/germainr\"}},\"60b663b9-6993-463c-99bd-0fda4837e133\":{\"id\":\"60b663b9-6993-463c-99bd-0fda4837e133\",\"name\":\"Glen  Keane\",\"bio\":\"Glen Keane is an Academy-Award Winning Director and Animator. A 38-year veteran of Walt Disney Feature Animation, Keane is most noted for animating iconic Disney characters such as Ariel from The Little Mermaid, Aladdin from Aladdin, Pocahontas from Pocahontas, The Beast from Beauty and the Beast, and Tarzan from Tarzan. Keane received the 2008 Windsor McCay Award for Lifetime Achievement in Animation, the 2012 Tex Avery Award, and in 2013, he was named a Disney Legend Award honoree for his contribution to Animation.\\r\\nKeane started his career in animation In 1972, when he applied to study at the California Institute of the Arts as a Fine Art major. His application was accidentally sent and accepted at the School of Film Graphics (Animation). Although unintended, he decided to enroll in the program, and immediately fell in love with the medium that would stay with him for the rest of his career. He joined Disney in 1974, where he trained under three of Walt Disney’s “Nine Old Men”, Ollie Johnston, Frank Thomas and Eric Larson. Keane began his career animating scenes on The Rescuers before being promoted to directing animator on The Fox and the Hound. During his tenure at Disney, Keane also served as Supervising Animator and Executive Producer on Disney’s 2010 box office hit, Tangled.\\r\\nIn the spring of 2012, Keane decided to leave Disney in pursuit of further artistic exploration, and formed his own production company, Glen Keane Productions. He has since gone on to collaborate on projects with Google, the Paris Ballet, Riot Games, and Green Egg Media. Most recently, Keane directed and animated the Academy Award winning short film Dear Basketball, a collaboration with Kobe Bryant and composer John Williams. At Glen Keane Productions, Keane and his executive producer Gennie Rim, are committed to developing and producing projects that inspire audiences to believe in the impossible.\\r\\n\\r\\nKeane is currently directing Pearl Studio and Netflix’s first animated musical adventure “Over The Moon”, produced by Rim, written by Audrey Wells (Shall We Dance, Under The Tuscan Sun) and executive produced by Janet Yang (Joy Luck Club, People VS. Larry Flynt).\\r\\n\",\"company\":\"Glen Keane Productions\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/7nTkQ46S-cm-4jIoddw8iB64tRYxBAL82-TPqBDGL23M5kRAgQtesk_ckoc3-f7go31y0WkhXGbqgYadHj03Vp6B\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/GlenKeanePrd\",\"LinkedIn\":\"\"}},\"34b807ec-0c61-455b-a329-72ca7f8fd543\":{\"id\":\"34b807ec-0c61-455b-a329-72ca7f8fd543\",\"name\":\"Grant Timmerman\",\"bio\":\"Grant is a developer platform engineer at Google where he works on Google Cloud Platform. Previously he led open source for G Suite APIs. He loves Node, GitHub, and plays the alto saxophone in his spare time.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/24GnI1Z0glRegfsw8uSWKxmYT-gy33idm8I4qxqtw48juMi-Ow-6FpH8io6-Qt9Zo07pGKgnRLbvCdQf2NuGLgTQsg\",\"socialLinks\":{\"GitHub\":\"https://github.com/grant\",\"Website\":\"https://grant.cm/\",\"Twitter\":\"https://twitter.com/granttimmerman\",\"LinkedIn\":\"\"}},\"242e1108-e093-4a9f-908a-2197004dba77\":{\"id\":\"242e1108-e093-4a9f-908a-2197004dba77\",\"name\":\"Guru Somadder Somadder\",\"bio\":\"Guru Somadder is one of the eng. leads on Stadia, responsible for all aspects of game playability. He has over 2 decades of industry experience, including 15+ years building carrier grade networking products as well as 8+ years on cloud gaming.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/BESEM6v_eaSBPMwHVO0xiF62V3QBTPoh4WndTduIfSL4hY0sKTyMFqmatoZejPUu4aP066zbD0hqrW3CDZjkjNFd\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/guru-somadder-4622041\"}},\"ae655de8-8306-4f9d-be62-e660525cc672\":{\"id\":\"ae655de8-8306-4f9d-be62-e660525cc672\",\"name\":\"Hadi Hariri\",\"bio\":\"Developer and creator of many things OSS, he has been programming in one way, shape or form since the age of 12. Author of various publications and courses, Hadi has been speaking at industry events for nearly two decades. Host to Talking Kotlin, he works at JetBrains leading the Developer Advocacy team, and spends as much time as he can writing code.\",\"company\":\"JetBrains\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/KMCAJy1Nmj1WBp1N0-JYh4adK10jxCfULeyJXm5bCMZan0GgEKvOdVGyzwymYv9Vpc5UR6mr9a1GgPBfFgeka1rPVw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"2f1916e5-e07a-43b1-a693-e094a8364fb2\":{\"id\":\"2f1916e5-e07a-43b1-a693-e094a8364fb2\",\"name\":\"Heather Seal\",\"bio\":\"Heather is an interaction designer on the Android Automotive team. In this role she focuses on user experience for the platform as well as tools to support OEMs and application developers. Prior to joining Google, she worked at Apple as an Associate Creative Director helping to redefine the shopping experience for digital and physical spaces. She attended graduate school at the University of Colorado where she received her degree in Human-Centered Design. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/DDD3mLtwbhla9FNuVuyRtJa2ak25UlgLAIU2Ck1s4-UDwhb6z22oZxQojwIzT34FJbCOgQlNStpJaSNIwccoSyc\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/heatherseal/\"}},\"48b96c78-0f03-4a89-8d3b-a3349382e622\":{\"id\":\"48b96c78-0f03-4a89-8d3b-a3349382e622\",\"name\":\"Hideaki  Oshima\",\"bio\":\"Hideaki is a Product Manager on the Android Authentication team. In this role, he is focused on getting users signed into their devices and apps, both securely and effortlessly. Prior to Google, he worked in various product management and engineering roles focused on imaging and computer vision applications at Microsoft and a number of startup companies. \\n\\nHideaki has an MBA and a bachelor's degree in Electrical Engineering and Computer Science from U.C. Berkeley. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/zG4uTGCz2o1gRKuisCZWFmsHbf_BDZobp16qh6x6OuZJhzDa3NOcGus-LvqkLbRXh92UwoJR5WKO4ioHS8HY7wiW\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"6e528625-2765-4307-a7e8-773a23271628\":{\"id\":\"6e528625-2765-4307-a7e8-773a23271628\",\"name\":\"Hiroshi  Lockheimer\",\"bio\":\"Hiroshi Lockheimer leads Platforms & Ecosystems at Google, a group of products and services including Android, Google Play, Chrome browser and the web platform, Chrome OS, Photos, and Google’s personal connectivity portfolio consisting of Duo, Messages, and Google Fi. He joined Google in 2006 to work on engineering and product development for the Android platform. Through the years, he’s played a critical role in making Android the most popular operating system in the world, building out the Android, Play, and Chrome ecosystems, and advancing the mobile and web platform. He now manages thousands of industry partnerships and oversees three of Google’s seven products that each serve more than a billion users.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/DFkt9TenLUgrLeFzMTDmaq6e9mHPRLBlcvqffuHRZy4HMcncZackoLpI69-lCCKsNT-wy9qA4wuXsyTXe6d4vsA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/lockheimer\",\"LinkedIn\":\"https://www.linkedin.com/in/hiroshi-lockheimer-941/\"}},\"7b341228-79f8-48b1-8898-8abed9a280f5\":{\"id\":\"7b341228-79f8-48b1-8898-8abed9a280f5\",\"name\":\"Hoi Lam\",\"bio\":\"Hoi is the Head of Developer Relations for Android Machine Learning and also a sector executive for the Institution of Engineering and Technology (IET). He was part of the launch team for Wear OS by Google (previously Android Wear), Chromecast, Google Glass Enterprise Edition, and the Google Beacon Platform. Prior to Google, he founded Exahive to disrupt the mobile commerce market place. Hoi was an Equity Research VP at Deutsche Bank and Citigroup covering technology companies. Before banking, he was a product manager / application architect at Accenture. Hoi holds a Master and Bachelor degree in Space Engineering from the University of Cambridge.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/BTT306TaL5aCQgBaA_p5XOdjizRxQGgKSf9dK9kMvcFAAEhS4jIqaa0VtH0ZAvaF66RHzCxtYzN-YpkmzBkbwmB5\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/hoitab\",\"LinkedIn\":\"\"}},\"ec237b6e-e701-464f-933e-a3a11324231d\":{\"id\":\"ec237b6e-e701-464f-933e-a3a11324231d\",\"name\":\"Hongchan  Choi\",\"bio\":\"Hongchan is a software engineer leading the effort on web music technology in Google Chrome. He also currently serves as a spec editor of Web Audio API. Prior to Google, Hongchan received his PhD from Center for Computer Research in Music and Acoustics (CCRMA) at Stanford University. Before his career in US, Hongchan was a computer musician, music technologist and educator in South Korea.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/PhooXcsp1DJJXBovgv7wte59vucBUlPTK_qz1OoK07U-UEVPxhFdUTeHLam5D3ylPRK13qIGKwK7i05NnrIygv7Z\",\"socialLinks\":{\"GitHub\":\"https://github.com/hoch\",\"Website\":\"https://hoch.io/\",\"Twitter\":\"https://twitter.com/hochsays\",\"LinkedIn\":\"https://www.linkedin.com/in/hongchanchoi\"}},\"6985697f-b27e-49a6-a280-ec4a6f2af3c0\":{\"id\":\"6985697f-b27e-49a6-a280-ec4a6f2af3c0\",\"name\":\"Houssein Djirdeh\",\"bio\":\"Houssein works and advocates for web performance at Google. He is passionate about progressive enhancement and building for the mobile web.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dOHw5egeTyUAA1-_pveNKKRH6yP1e0DWB9Z19FLtFpISAomFJKVOVKgk9XvtIix5evjp2PpVN2F4j55Dh57CbdjU\",\"socialLinks\":{\"GitHub\":\"https://github.com/housseindjirdeh\",\"Website\":\"https://houssein.me/\",\"Twitter\":\"https://twitter.com/hdjirdeh\",\"LinkedIn\":\"https://www.linkedin.com/in/housseindjirdeh/\"}},\"c1ee9879-b6fd-4d3b-a33e-8002612f8168\":{\"id\":\"c1ee9879-b6fd-4d3b-a33e-8002612f8168\",\"name\":\"Ian Lake\",\"bio\":\"Ian is a software engineer on the Android Toolkit team, working on Architecture Components and Fragments. Previously, Ian worked in Android Developer Relations at Google and, before that, built Android apps at Facebook and Phunware. Ian has a MS in Computer Science from University of Southern California and a BS in Computer Science and Physics from Montana State University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Jg1jpfqBeH5zGvPachSsSV58ErIcpAqWoCjBz_15A4B7S5Ewtbia8h7Exx3s47yfOHfCEoaX8GjLQopKbviTnyH5Uw\",\"socialLinks\":{\"GitHub\":\"https://github.com/ianhanniballake\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ianhlake\",\"LinkedIn\":\"https://www.linkedin.com/in/ian-lake-41090711/\"}},\"cc20e96a-b5ce-45f5-ab5b-fbd9587a9892\":{\"id\":\"cc20e96a-b5ce-45f5-ab5b-fbd9587a9892\",\"name\":\"Ian  Barlow\",\"bio\":\"Ian is a UX design manager on Android Auto. Before joining the automotive space, he worked on Google Fiber where he led the design of TV, phone and IoT services. Prior to Google, Ian worked on Firefox for Android at Mozilla, and a cross-platform suite of eReading software at Kobo. He studied Graphic Design at Georgian College in Ontario, Canada. \",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"b4343188-9c3f-4e7d-b6bd-bd3a967932ae\":{\"id\":\"b4343188-9c3f-4e7d-b6bd-bd3a967932ae\",\"name\":\"Igor Razumeiko\",\"bio\":\"Igor is a tech lead working on enabling applications on Android Automotive platforms. Previously led engineering efforts on Google Play Music and YouTube Music applications. Pre-Google experience includes Twitter, Motorola Mobility, Good Technology and Corel. Graduated from Novosibirsk State University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/eVEypyjXQIrhM6HnsEfRj5L6GJAFj0bH6_QHyqGzqPOPm3iTGDO-8UrkAg4WxGy1Y_HVVoT_-0xFxDKGLZvKSjxG\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ygrek\",\"LinkedIn\":\"https://www.linkedin.com/in/razumeiko/\"}},\"3b73bc26-d6fa-4b3f-ab01-4ebb554f317c\":{\"id\":\"3b73bc26-d6fa-4b3f-ab01-4ebb554f317c\",\"name\":\"Isha  Bobra\",\"bio\":\"Isha is a software engineer working on Android accessibility. She has contributed to several accessibility services like Talkback, Accessibility Menu and a few others.\\nIsha earned a master's degree in computer science from North Carolina State University and a bachelor's degree in computer science from the University of Mumbai, India.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dftF-tgeDBzRaDyrY9DhhIyCNy81_A2gbUIx8bGwImZdR_tK7YQfj9h1wMQ3YJy1JuLxYWTirSWe7hf-G-FhLrp4\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"0bc5f1cd-3f5f-442b-b03d-6336ac5ca901\":{\"id\":\"0bc5f1cd-3f5f-442b-b03d-6336ac5ca901\",\"name\":\"Ivan  Gavrilovic\",\"bio\":\"Ivan is a software engineer on the Android Studio team, where he is working on the Android Gradle plugin and Kotlin toolchain. He focuses on improving Android developers' productivity by making their builds faster and more reliable.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/9nFr5dp0Y7W3NT_ssyZhkN2zCuxAN3TIItsQqPuIct1Xq8XNObXbE0AY8rh9PzPgS-dyuHNHoaH7m4IjTg7t9F5J\",\"socialLinks\":{\"GitHub\":\"https://github.com/gavra0\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/gavra0\",\"LinkedIn\":\"\"}},\"855be128-07fb-4869-8030-67b44f705352\":{\"id\":\"855be128-07fb-4869-8030-67b44f705352\",\"name\":\"Jacqueline Pan\",\"bio\":\"Jackie is the program lead for ML Fairness. In this role she leads a team focused on making progress on machine learning fairness challenges and operationalizing these efforts across the company; from developing tools and datasets, to education initiatives and other resources. Jackie also leads the AI Residency Program which seeks to make AI research more accessible to a broad group of aspiring researchers from a wide range of disciplines, and provides them with mentorship and experience working on real-world machine learning problems and applications. Previously, she managed Google’s technical intern program in North America. Jackie earned a bachelor’s degree in Religion from Boston University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Fr0xWduy_JiGfydAQuVlQHCe68rs5J7DZ2VJSXQE36RFERv1o_iTQukp-VRKr17PoSjeQ9y4xMSb64Aq7yT5FVpO\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"cfbb0805-7f65-4979-a170-d4d95eb82d4b\":{\"id\":\"cfbb0805-7f65-4979-a170-d4d95eb82d4b\",\"name\":\"Jake  Klinker\",\"bio\":\"Jake is the software engineering lead for Fast Pair and has spent the last 2 years making Android's Bluetooth pairing easier. Previous to working at Google, he created popular Android apps from his own company, Klinker Apps. Jake earned a bachelor's degree in Computer Engineering with an emphasis on software from the University of Iowa.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/cNZ4DBRWniREOTw2WUAHGdOQ-wpcJrOS_lJnX35DUSevmHpcqHZIm8fJEsdv9gFUMhXdWsDD6SOU0c-5gjkd_aGO\",\"socialLinks\":{\"GitHub\":\"https://github.com/klinker41\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/klinker41\",\"LinkedIn\":\"\"}},\"cdd85e13-ae7a-450e-9826-d217079e690f\":{\"id\":\"cdd85e13-ae7a-450e-9826-d217079e690f\",\"name\":\"Jamal Eason\",\"bio\":\"Jamal Eason is a product manager for Android developer tools & products at Google. He is responsible for setting the product roadmap and features that help Android developers make great apps.  Prior to Google, he worked on developer tools at Intel, worked as a product manager at a mobile app startup, and was a telecommunications officer in the US Army. Jamal earned a bachelor's degree in computer science from the US Military Academy (West Point), a master’s degree from UMUC, and a MBA from Harvard Business School. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/4LXA51_b6IS1VQkJgwjRWpluCjrz2zUa-4mf0EHblAZXNbnWpkyoS1EowBwGiX2_AATeuuiTDph-OE5AJgSs1XIA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/jamaleason/\"}},\"6995a278-fa9e-4de9-85af-9f1ee324d2b9\":{\"id\":\"6995a278-fa9e-4de9-85af-9f1ee324d2b9\",\"name\":\"James Bradbury\",\"bio\":\"James Bradbury is a research software engineer on the Swift for TensorFlow team, where he helps guide the stack towards maturity by implementing deep learning models and working with researchers. James joined Google in 2018 from Salesforce Research, where he conducted research on efficient methods for deep NLP and contributed to the PyTorch ecosystem. He is a 2016 graduate of Stanford University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/_Zlk8hkCvbIYclJnjPaL56BzRlx8WEUSGmz_oAZNekh6YRsmABAkKseH7kCBQ_SZxwZ_jhA8qIQAIf6Gvk-8caB_VQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"3aac697b-b275-47e3-ba09-288febcc8e30\":{\"id\":\"3aac697b-b275-47e3-ba09-288febcc8e30\",\"name\":\"James Fung\",\"bio\":\"James Fung is a Software Engineer at Google with the Android Camera team.  He previously worked on projects such as AR at Google and GPU accelerated computer vision at NVIDIA where he co-authored the OpenCL Programming Guide.  He received his PhD at the University of Toronto.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/bD748VjnV18C919hCjLaYlphbNdq2wi0eWU23hwwJT6mADnjcrB7nSOs_h1UEdnRqs49E3NCHDCy70qCXQKz4Jol\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/fungja/\"}},\"ce0cf90f-bbb8-4f43-a736-29e437b5cb0d\":{\"id\":\"ce0cf90f-bbb8-4f43-a736-29e437b5cb0d\",\"name\":\"James Heather\",\"bio\":\"James is the engineering manager responsible for App/Games Health, helping developers to make sure that their apps and games on the Play Store are as high quality as they can be. After studying for a PhD in Computer Security at Royal Holloway, University of London, James was for many years an academic, working on mathematical modelling of security protocols, and in particular end-to-end voting systems. Over time, he has come to accept that he will never open the batting for the England cricket team.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dq0PSaqFNLw90gJB9QgyU1utwVy6R6i3_SMPptszVIwa1zRRYL-KWxpru-CnuVTX3YMdCjdLd-D6UKs1RNT1h5w\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/james-heather-94180983/\"}},\"d2777f79-0daa-483e-b0db-eab68dab9550\":{\"id\":\"d2777f79-0daa-483e-b0db-eab68dab9550\",\"name\":\"Jamila  Smith-Loud\",\"bio\":\"Jamila Smith-Loud is a User Researcher on Google’s Trust and Safety team. She uses research to advocate for diverse needs and perspectives. Her work helps shape how Google puts our AI Principles for fairness and inclusion into action.  Prior to joining Google, Jamila was the Manager of Strategic Initiatives at a Los Angeles-based civil rights nonprofit, Advancement Project, where she supported the development of racial equity initiatives through research, analysis, and advocacy. Jamila also participated in the Political and Legal Anthropology Review Fellowship Program, where her research focused on the intersections of law, power, identity, and cultural change. Jamila was born and raised in Los Angeles, and is a graduate of UC Berkeley and Howard University School of Law.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/zrzFrr1ZUGdHy5aKPDt3Xc4jvlfw0A90E4Dw1TaNuE0IJkJjXpzmFQOyDZMPRSRb6IKOztEaaQ6oi7IKAVGvQUdLjw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/jam_loud?lang=en\",\"LinkedIn\":\"\"}},\"4b2a5f0e-54f4-40bb-a07e-3eff6f61df40\":{\"id\":\"4b2a5f0e-54f4-40bb-a07e-3eff6f61df40\",\"name\":\"Jason  Miller\",\"bio\":\"Jason is a web devrel on the Chrome team, focusing on speed & loading. He's exploring new ways to improve performance on the web through frameworks and platform primitives. Prior to joining Google, Jason created Preact and maintains a number of popular microlibraries.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/aNkN9uxgg6HHbnRAPC2gJNHBjA91HcnVVSfzKezZx8ju14tYK0CzfIGEBjg0ED3JBjwTnUCradsfZ1uvwkUACOqH\",\"socialLinks\":{\"GitHub\":\"https://github.com/developit\",\"Website\":\"https://jasonformat.com\",\"Twitter\":\"https://twitter.com/_developit\",\"LinkedIn\":\"https://linkedin.com/in/developit/\"}},\"1635a5c6-ffbc-4f3b-864f-23760842ec37\":{\"id\":\"1635a5c6-ffbc-4f3b-864f-23760842ec37\",\"name\":\"Javier Lopez\",\"bio\":\"Javier is a Designer working on the Material Design team creating visual and interaction systems for beautiful, usable multi-platform applications. His work is centered on the intuitive application of color and educating teams on how to use the Material Design system.\\r\\n\\r\\nJavier received an MFA in Graphic Design from the Maryland Institute College of Art, and BFA in Visual Communication from the School of the Art Institute of Chicago. \\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/javierlopez8/\"}},\"6b7c8bb9-fa85-4ca9-a05f-b3458dae3491\":{\"id\":\"6b7c8bb9-fa85-4ca9-a05f-b3458dae3491\",\"name\":\"Jay Civelli\",\"bio\":\"Jay is a software engineer on the Autofill with Google team. \\r\\nHe was an early member of the Chrome and Chrome for Android teams and also worked on Android Auth. Prior to Google, Jay worked at Borland focusing on the development of Java performance tools.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/vJJAtBwJIfOMrMcuHuy07LdMLQ0ttUDkyBx3m3A2miA4eA5AWUIJirSjFTpHRCaslztPJrAAtBo8GJMyoTuMJl0\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"a02d201a-c8f4-46f7-8a2f-0576834b22b7\":{\"id\":\"a02d201a-c8f4-46f7-8a2f-0576834b22b7\",\"name\":\"JC  Cimetiere\",\"bio\":\"\",\"company\":\"Unity\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"7fde36c2-b3cb-46fc-b5d2-2c498aa6b1b9\":{\"id\":\"7fde36c2-b3cb-46fc-b5d2-2c498aa6b1b9\",\"name\":\"Jeff Dean\",\"bio\":\"Jeff Dean (ai.google/research/people/jeff) joined Google in 1999 and is currently a Google Senior Fellow and SVP for Google AI and related research efforts.  His teams are working on systems for speech recognition, computer vision, language understanding, and various other machine learning tasks. He has co-designed/implemented many generations of Google's crawling, indexing, and query serving systems, and co-designed/implemented major pieces of Google's initial advertising and AdSense for Content systems. He is also a co-designer and co-implementor of Google's distributed computing infrastructure, including the MapReduce, BigTable and Spanner systems, protocol buffers, the open-source TensorFlow system for machine learning, and a variety of internal and external libraries and developer tools.  \\r\\nJeff received a Ph.D. in Computer Science from the University of Washington in 1996, working with Craig Chambers on whole-program optimization techniques for object-oriented languages.  He received a B.S. in computer science & economics from the University of Minnesota in 1990.  He is a member of the National Academy of Engineering, and of the American Academy of Arts and Sciences, a Fellow of the Association for Computing Machinery (ACM), a Fellow of the American Association for the Advancement of Sciences (AAAS), and a winner of the ACM Prize in Computing.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/H5sYNwNheBGW30LNZAHtF8vt9Hu8-aEfoWa7zzBguYmadnxe5ljrs-XWSpp_FsyaCUn9hNcR4-QXAjbHPgHKCkkaEA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/JeffDean\",\"LinkedIn\":\"https://www.linkedin.com/in/jeff-dean-8b212555/\"}},\"a859c999-1c8c-4867-8ee4-8bcb5d4f4ccb\":{\"id\":\"a859c999-1c8c-4867-8ee4-8bcb5d4f4ccb\",\"name\":\"Jeff  Sharkey\",\"bio\":\"Jeff Sharkey is a Software Engineer on the Android Framework team, where he's worked on storage and networking.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/G9hP8JCODFcsYV1QMIV2NddKkWK_k7lL5v6-HE0Ioqhr-DgoGpvwhYr6IdMAu2-Rn0B1nXGcBECmWLkPBdZMrp4o\",\"socialLinks\":{\"GitHub\":\"https://github.com/jsharkey/\",\"Website\":\"https://jsharkey.org/\",\"Twitter\":\"https://twitter.com/jsharkey\",\"LinkedIn\":\"\"}},\"c09a2696-574b-4a16-8728-e1bc872b2ede\":{\"id\":\"c09a2696-574b-4a16-8728-e1bc872b2ede\",\"name\":\"Jeffrey  Sinckler\",\"bio\":\"Jeff is currently a Senior Software Engineer, leading client development for Tenor within Image Search. In the past, Jeff spent 7 years as an iOS developer and has built a number of apps and mobile games, including GIF Keyboard, Tenor's flagship product.\\n\\nJeff earned a bachelor's degree in computer science from Columbia University in the City of New York.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/jA4P-BSnY8i6D-ZWpNUL37OLoIPnAC3Oy0Aq6KlYqNWnHA1OTHCpawDRd7na-7zBPdeR7-aPnXCG7Emylar45fLo\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f4137039-d547-46b8-a607-a85be830a57b\":{\"id\":\"f4137039-d547-46b8-a607-a85be830a57b\",\"name\":\"Jeffrey  van Gogh\",\"bio\":\"Jeffrey is the tech lead manager for the Compiler & Programming Languages team within Android Studio. He has over 16 year of industry experience building developer tools with a focus on compilers and static analysis. Jeffrey is the Google representative on the Kotlin Language Committee, ensuring the language ages well. Jeffrey studied Computer Science at the University of Utrecht in the Netherlands.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Cs7iulSZk9XhSWmTdghzQ2Mk2s9S8RebY_XsaR3kI6vLRrgDkRQDYx6VrifxVcYDBQ4Q6AHVBIwAl8EfpxqDxJAM\",\"socialLinks\":{\"GitHub\":\"https://github.com/jvgogh\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/jvgogh\",\"LinkedIn\":\"https://www.linkedin.com/in/jeffrey-van-gogh-145673/\"}},\"cf031f5f-6471-4b45-9c34-e17689505f0a\":{\"id\":\"cf031f5f-6471-4b45-9c34-e17689505f0a\",\"name\":\"Jen Chai\",\"bio\":\"Jen Chai is a senior product manager in Android and leads the Location and Context, Authentication, Runtime, Libraries, and Languages product team. Prior to joining Google, she worked at Amazon and BAE Systems. Jen has a Master’s degree from the University of California, Los Angeles and a bachelor’s degree from the University of California, San Diego. In her free time, she enjoys spending time with family, friends, and her two big dogs. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/w9zvscqn4hVNv6cC_bK_gFFxFupK8vYKzLCxfb6RPD0xEmAstnT8qfgA7_g7Wh58uYkAMKZwWeZ9Hk7mo0jVyEk\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"954deb80-e0ab-46e9-8d8a-32b47619bf16\":{\"id\":\"954deb80-e0ab-46e9-8d8a-32b47619bf16\",\"name\":\"Jen Person\",\"bio\":\"Jen is a developer advocate for Firebase at Google. She is a training expert, loves building iOS apps, and recently has been teaching developers how to integrate Cloud Functions into their Firebase apps. Jen graduated Magna Cum Laude with a Bachelor's Degree in Mathematics from Central Connecticut State University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/kWEEjBLgEkTsg8k-K_XV3DGRSJf6AGSdL8L95iY5Na9BNRZYfJrHR-Ifdr5q2dTFMeKTrzLrPZNeML1kCZ1KOLl8gQ\",\"socialLinks\":{\"GitHub\":\"https://www.github.com/jenperson\",\"Website\":\"\",\"Twitter\":\"https://www.twitter.com/thatjenperson\",\"LinkedIn\":\"\"}},\"47185a15-d7cf-4597-9e0f-9e851b105e6d\":{\"id\":\"47185a15-d7cf-4597-9e0f-9e851b105e6d\",\"name\":\"Jen Tong\",\"bio\":\"Jen is a security advocate on google cloud platform. In this role she helps developers stay out of trouble while getting the most out of cloud computing. If she’s away from her laptop, she’s probably playing ice hockey, or hanging from aerial silk.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/DesnKx-VTGa4LqWdaI7ToXS9am4PhsHyaaN0JhWHqVnRUj5sPGgI0ICixXHWXmvb4aYCWZnk4jw8ie1mzbky9Q0R2Q\",\"socialLinks\":{\"GitHub\":\"https://github.com/mimming\",\"Website\":\"https://mimming.com\",\"Twitter\":\"https://twitter.com/MimmingCodes\",\"LinkedIn\":\"\"}},\"f834530d-4b63-42d4-ab3f-370beb928bbd\":{\"id\":\"f834530d-4b63-42d4-ab3f-370beb928bbd\",\"name\":\"Jen  Gennai\",\"bio\":\"Jen Gennai leads the Responsible Innovation team in Google which is responsible for operationalizing Google’s AI Principles specifically ensuring that Google’s products have fair and ethical outcomes on Google’s users and the world. Her team works with product, engineering and leverages a multidisciplinary group of experts in ethics, human rights, user research, behavioural analysis, racial justice and gender equity to validate that products and outputs align with our AI Principles’ obligations around fairness, privacy, safety, societal benefit and more. Before she co-authored the AI Principles and founded the Responsible Innovation team, Jen had been working on machine learning fairness in Google for almost four years, focusing on user impact and adversarial testing.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/CfOi4n840pe7tIGOs5sIlYxg5Rz8GZkGQE1tBL6VSB_LFOi4zT2uWac42G0lciIwDETwrPblbGNHQjiczsQfOMSuww\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/gennai_jen\",\"LinkedIn\":\"https://www.linkedin.com/in/jen-gennai-b333933/\"}},\"3c805154-3f73-47b8-a966-02553c40e550\":{\"id\":\"3c805154-3f73-47b8-a966-02553c40e550\",\"name\":\"Jenny Gove\",\"bio\":\"Jenny Gove is a user experience research lead at Google, where she conducts research on device use. Jenny's current area of focus is online Payments. Previously Jenny managed the Apps, Social, and Ads Design Research teams at Google. Prior affiliations includes Sun Microsystems, Zadu, and the Open University, UK. She received her Ph.D. from the University of Southampton in the UK.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/sL2Oq9C6ktukANOu-XDVRIvMCK7PTYfqO1Pa_hwMTIh8QRDzjRVWbZIrtpY09YYNEJttpjIfZGAMPaj34RO-cW3CgA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/jennylg\",\"LinkedIn\":\"https://www.linkedin.com/in/jennylg/\"}},\"6179c26d-d4a5-4a43-b672-5734b4a54e49\":{\"id\":\"6179c26d-d4a5-4a43-b672-5734b4a54e49\",\"name\":\"Jeremy Pack\",\"bio\":\"Jeremy leads the effort to precisely determine the location and orientation of the device for Google Maps' augmented reality features. He has worked for many years on Google Street View and related projects. He studied Computer Science and Computational Mathematics at Utah State University, then received a Master's Degree in Computational and Mathematical Engineering from Stanford University. He specializes in statistical algorithms, signal processing, machine learning, parallel algorithms and distributed algorithms.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Bol-HcAESU6Bcl_0DMxXF2fl6tDt2mMlgqjByghoQp1lvj4HV7TxCJ2LNUMwM6cbCsucDcsQu1z2gR_EOPU2QZlDLQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/jeremypackgoogle/\"}},\"bf373fa3-5782-4cca-9f06-9ec06f558169\":{\"id\":\"bf373fa3-5782-4cca-9f06-9ec06f558169\",\"name\":\"Jerome Dochez\",\"bio\":\"Jerome Dochez\\r\\nSoftware Engineer, Android Studio \\r\\n\\r\\nJerome is the TechLead for the Android Gradle Plugin. In his current role, he focuses on the stability and next features of the Gradle based build system for Android. \\r\\n\\r\\nPrior to Google, Jerome worked at Sun Microsystems in the Java SE and Java EE teams. Jerome holds an Engineering degree from Polytech Sophia Antipolis in France.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"48791986-d718-4a97-bb1f-034d38bd1701\":{\"id\":\"48791986-d718-4a97-bb1f-034d38bd1701\",\"name\":\"Jerome Gaillard\",\"bio\":\"Jerome is a software engineer on the Android Studio team where he focuses on Design Tools. Prior to joining Google in 2015, he was a research in theoretical high-energy physics at the University of Wisconsin-Madison. Jerome received his PhD from Swansea University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/B5nsbr7PF1G6IdPYnRH8xVyJ0uxleKXQ7mIFkzJ2LerOUnmIoJBS-ZHI7-demmYRoLiwyzg0uS6InPYHsHNT29LHNw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://uk.linkedin.com/in/j%C3%A9r%C3%B4me-gaillard-37a0558a\"}},\"966e750a-43c9-47ce-958c-8d5187b89378\":{\"id\":\"966e750a-43c9-47ce-958c-8d5187b89378\",\"name\":\"Jesar Shah\",\"bio\":\"Jesar has been at Twitter for three years and is the product manager for the web team. During her time at Twitter she has focused on making Twitter more accessible across the globe through the distribution and development of the Progressive Web App and previously the Twitter for Android app. She is passionate about learning about and developing for customers who are data, device and network constrained\",\"company\":\"Twitter\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Nq4aztC4TSpBJ9EoATzvkiFtIkU63Axi5aHRdUoJkUFPmVAys_UJsSa9dZvKb8-ZkMURW-Qptg0PRtDatzKa8jLM\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"b1e39fa5-3db3-4dc6-b89c-9cf3eca0ecfb\":{\"id\":\"b1e39fa5-3db3-4dc6-b89c-9cf3eca0ecfb\",\"name\":\"Jess Holbrook\",\"bio\":\"Jess Holbrook is a UX Researcher and UX Manager at Google, based in Seattle. He is one of the founders and leads of Google’s People + AI Research (PAIR) group. Prior to joining Google, Jess was a UX Researcher at Amazon and Microsoft. He received his Ph.D in Psychology at the University of Oregon and his undergraduate degree in Psychology at the University of Washington.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/LoXSF8Kssb_1h64gMi2jG1k8egCv0J8vsdWMv0wNWdpZcBZg92Jvgu7A19FP-oBuuvE9eTZhGlp-mkgS6dC7ucGF\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/jessscon\",\"LinkedIn\":\"https://www.linkedin.com/in/jessholbrook/\"}},\"5e7b35f1-c7e7-49c7-9c35-3944ba3ccd0d\":{\"id\":\"5e7b35f1-c7e7-49c7-9c35-3944ba3ccd0d\",\"name\":\"Jesse Engel\",\"bio\":\"Jess has a UC Berkeley degree, researching physics, nanoelectronics, and brain-inspired computing in his bachelors, doctorate, and postdoc work respectively. Afterward, he worked with Andrew Ng to help found the Baidu Silicon Valley AI Lab. He joined Google Brain in 2016, where he is the lead researcher on the Magenta project, pursuing research into new generative models for audio and working to close the gap between new research and musical applications. Outside of work, he is also a professional-level jazz guitarist and music producer, once  played an opening set for the Dalai Lama at the Greek Theatre.\\r\\n\",\"company\":\"Google AI\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/o9OZv2cKWfhM9gjyU_9f5xcAT_S1_3edjLTbnhM7I-1T0APj1nWETpZhMWh77LKOdzrrWAgWTsdtFPyJoeoMO3MZAw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/jesseengel\",\"LinkedIn\":\"https://www.linkedin.com/in/jesse-engel-ba4169b/\"}},\"5b557356-a66f-4c8d-b097-bf101212ba9c\":{\"id\":\"5b557356-a66f-4c8d-b097-bf101212ba9c\",\"name\":\"Jessica Earley-Cha\",\"bio\":\"Jessica Dene Earley-Cha is a Developer Advocate for Google Assistant. She loves to connect with developers and local tech communities. Jessica enjoys sharing her passion and knowledge about VUI (Voice User Interface) and building on the Actions on Google platform.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/JA0qYlWaYRprUWZSOttWRbGygXkUgS_jJ4yB4ftNPvu9Tj08NUq5-5WkhS_dKEL_JSGcKgQXuaA90M4ugmck9hJl\",\"socialLinks\":{\"GitHub\":\"https://github.com/chatasweetie\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/chatasweetie\",\"LinkedIn\":\"https://www.linkedin.com/in/jessicaearley/\"}},\"d87c1003-716d-4204-8093-6655f5cee486\":{\"id\":\"d87c1003-716d-4204-8093-6655f5cee486\",\"name\":\"Jian  Deng\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"a4761ca1-33c5-48a9-a726-2b25a646ebcc\":{\"id\":\"a4761ca1-33c5-48a9-a726-2b25a646ebcc\",\"name\":\"Jim Sproch\",\"bio\":\"Jim Sproch is a senior software engineer on the Android Toolkit team at Google.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/COZjZTIl_53SpAAjSxJr0PWa7nCGr5nKU4SBA2pf9GklBapkA0OssnGUMbpGYasGSzXAl609JVNwcOezxtaDM0Kb\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"2a70e847-d0a7-49d1-92c6-ded3feb38411\":{\"id\":\"2a70e847-d0a7-49d1-92c6-ded3feb38411\",\"name\":\"Joanna Kim\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/n5ZdfPz2Y1I6F2Ir46FZFs-I7Qu_Cndd3cPY1ecEK89i0-pTvm7PVrLeWp370og5Wfl7-nwEOByPA-MpQxeuE35zfQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/joanna-kim-39071916/\"}},\"51bad65f-7530-44c8-add4-75ceb95615e4\":{\"id\":\"51bad65f-7530-44c8-add4-75ceb95615e4\",\"name\":\"Joe  Baker-Malone\",\"bio\":\"Joe has been a software engineer at Google for six years, the last four of which have been on the Android Studio team. Recently he has been focused on design tools, leading the Navigation Editor effort from inception to launch. Joe received a master's degree from Stanford University and a bachelor's degree from Harvey Mudd College, both in computer science.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/UhXwe1vsbmDu6HKJ-WQzYHfS_1V8GXxTGo-Ktfvt6T251-65S3ZP8KwpyKui886wCVmzqIxTojASGD0gf1KlCh0\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/joeb6/\"}},\"8a38ba29-5975-4a0a-82ea-bc4b3712f94e\":{\"id\":\"8a38ba29-5975-4a0a-82ea-bc4b3712f94e\",\"name\":\"Joel Einbinder\",\"bio\":\"Joel works on Chrome and Puppeteer. In Chrome, Joel leads work on the Chrome DevTools UI. In Puppeteer, he focuses on Accessibility and input devices.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"https://github.com/joeleinbinder\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/joeleinbinder\",\"LinkedIn\":\"\"}},\"c7ebfc68-035b-4d82-b497-0b5f2ed1522e\":{\"id\":\"c7ebfc68-035b-4d82-b497-0b5f2ed1522e\",\"name\":\"Joel Newman\",\"bio\":\"Joel is a product specialist on the Google Play business development team, where he focuses on the Google Play Console. He helps Google Play business development managers to understand the Console and evangelize its use to their developers. He has worked in a number of roles at Google, all focused on helping mobile app developers succeed. Prior to Google, Joel worked at Zedge, Smithsonian Media and Mercedes-Benz USA. He holds a bachelor's degree in political science and German studies from the University of Pennsylvania, where he graduated summa cum laude.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/IichfVH-1oeDd2hMHwm4hllf6D5E0p6EiZHLDshevaxvGCckF82IWggeMHt1UuT-jTPKMvzzXgmmJbWokp88KUo\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/joeltnewman\",\"LinkedIn\":\"https://www.linkedin.com/in/joeltnewman/\"}},\"3a3152e1-25b5-49bf-85c3-3bcbbf0aeedb\":{\"id\":\"3a3152e1-25b5-49bf-85c3-3bcbbf0aeedb\",\"name\":\"joe-test joe-test-gschedule2019\",\"bio\":\"\",\"company\":\"\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"815afd55-557f-4b89-b607-d9b6a013ee71\":{\"id\":\"815afd55-557f-4b89-b607-d9b6a013ee71\",\"name\":\"John Hoford\",\"bio\":\"John is a developer on Android. He has worked on Android Studio, AndroidStudio, ConstraintLayout, RenderScript, Vector Drawables, computed shadows and photo editor filters. Prior to joining Google, John was a principal engineer at GE Healthcare working on image processing applications frameworks.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/igCdXohKBU0NQumENTXU_Ty47NYUHJn9sFBpGIvqzQ4eTuFOB4fX8Hp7EbUNUtxFfh0gfytA_BGUnh2NR76-cP0\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/johnhoford\",\"LinkedIn\":\"\"}},\"dcecbbb1-87a9-4ed7-816d-73f89a39639a\":{\"id\":\"dcecbbb1-87a9-4ed7-816d-73f89a39639a\",\"name\":\"John Hsu\",\"bio\":\"John is the Product Manager for games on Google Assistant. In this role, he focuses on delivering the best platform for partners to create delightful entertainment experiences.\\r\\n\\r\\nPrior to joining Google, John spent over 10 years making games on emerging platforms, from web games to social games to mobile games.  \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/kKGIYzgstzd4dV3oNGI0PFZmGX6FcYyPD6A1v1IJ0Ys7YaE9YQNF7OAFbPuj0X_oXFeMTp-wl3myp1v7LFs0xGCo\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/john-hsu-68348a3/\"}},\"93ab5296-620d-4f47-aef3-2fddf27f5613\":{\"id\":\"93ab5296-620d-4f47-aef3-2fddf27f5613\",\"name\":\"John Muller\",\"bio\":\"John coordinates Google Search webmaster & developer outreach efforts as a staff developer advocate. He and his team connect the Google-internal world of Search engineering, to those who create and optimize public websites. Together, they help to bring an understanding of the external web ecosystem to internal teams, and help external publishers make awesome websites that work well for users and search engines. John joined Google in 2007 and works in Zürich, Switzerland. \\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/rb-8Yi2RvLAmGEglKqwOTjfQPWj37LHdESc_V3ocB1GQLy-SeECYLiVhXFU3viy2GhTpjUfWP-6B85dvLAr4qks\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://www.google.com/+johnmueller\",\"Twitter\":\"https://twitter.com/johnmu\",\"LinkedIn\":\"\"}},\"1a39ff3e-9661-4fc5-8f62-019ae7fb48ef\":{\"id\":\"1a39ff3e-9661-4fc5-8f62-019ae7fb48ef\",\"name\":\"John  Justice\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"3aed8a79-8c33-43e6-839a-9ed3d636fdd8\":{\"id\":\"3aed8a79-8c33-43e6-839a-9ed3d636fdd8\",\"name\":\"Jon Skrip\",\"bio\":\"Jon is a software engineer within Google’s Firebase organization, working specifically on the Firebase Growth platform. His career has been focused on backend and systems engineering, with an emphasis on cloud computing and distributed architecture. Prior to Google, Jon worked to design, develop, and support a variety of first tier infrastructure services within the enterprise and private cloud spaces.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/RFMTaqsaf5X-OMwprPegAIxhzDtAbK6xEanFy_VPNf_ysUMfzPERqdBHiSHFE79VH96DGAluhIN_VuZUhjLdptjZ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"4c22ef05-1a4a-4df5-ac9f-d0bf354e7fd1\":{\"id\":\"4c22ef05-1a4a-4df5-ac9f-d0bf354e7fd1\",\"name\":\"Jonathan Cheung\",\"bio\":\"Jonathan is a tech lead on the Play Console team based in London. He focuses specifically on go-to-market tools which help developers de-risk their launches for maximum success on the Play Store. Jonathan has a master's degree in computer engineering from Imperial College London where he graduated with first class honours.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/HCzCgUT1pw8QHUJrZ4ZAN-CHKwTyX3r3j-0zuUQZuI_P6i7VTegxyEt9RzIAtTN16cxXZISvSGjlca1-sByz-QRU\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"65eb5268-b6b6-4235-a09d-c06cc765379d\":{\"id\":\"65eb5268-b6b6-4235-a09d-c06cc765379d\",\"name\":\"Jonathan Gerrish\",\"bio\":\"Jonathan designs and builds tools to make developers more productive with a focus on testing on the Android platform. Before that he worked on several Android applications such as Google Maps and Google Pay. He has a Masters degree in Computer Science.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/9cRo4RK9sZkPhsR3QDo692-lOkK_4Cvf2HEG6hJLrmm89dFGLyQ3acHdBuAnCHbDmwAyvQgzKnY0warVAQdGNJ6C\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"9a69b11a-2530-4bef-b691-f0f456d16077\":{\"id\":\"9a69b11a-2530-4bef-b691-f0f456d16077\",\"name\":\"Jonathan Hui\",\"bio\":\"Jonathan Hui is a principal software engineer at Google, VP of technology of the Thread Group, and maintainer of OpenThread. Prior to Google, he worked at Cisco and built some of the world's largest IPv6 mesh networks. He delivered the world's first 6LoWPAN networks at Arch Rock before its acquisition by Cisco. Jonathan has also been deeply involved in standards bodies (IETF, IEEE, Thread Group, and Wi-Sun) and coauthored foundational specifications related to IPv6 in low-power wireless networks. He is also a co-inventor on 190+ USPTO issued patents. Jonathan has a BS in electrical and computer engineering from Carnegie Mellon University, and an MS and a PhD in computer science from the University of California, Berkeley.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/9OoHafXnEvrFjlkLQyhdsZoPeEqIRNokpBzsNiq2sENCVit8K2nO2k813BJ-Gm5KXZJDDocWfc7jUx6utwSheX8\",\"socialLinks\":{\"GitHub\":\"https://github.com/jwhui\",\"Website\":\"https://openthread.io/\",\"Twitter\":\"https://twitter.com/jhui\",\"LinkedIn\":\"https://www.linkedin.com/in/jonathanhui/\"}},\"ce2c41af-ad23-49ff-b616-766c729b6e66\":{\"id\":\"ce2c41af-ad23-49ff-b616-766c729b6e66\",\"name\":\"Jonathan Hurwitz\",\"bio\":\"Jon is the android bluetooth product manager. Prior to Google, he worked at Apple designing circuits for apple watch and macbooks, and at Tesla designing DC-DC circuits for chargers. He has a BS in electrical engineering & computer science from UCLA, and an MS in computer science also from UCLA.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Bl_tJrxBOHISO96Zs0hgXya1U6C8UCV4eD3BBTBmqJhI1WskbGGx0j-ua7KL1d2UldkxDHbU84MvZZ8E3n0F9f6o\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"fbfa97aa-31c9-4de9-82bd-16c776e19302\":{\"id\":\"fbfa97aa-31c9-4de9-82bd-16c776e19302\",\"name\":\"Jose Ugia\",\"bio\":\"Jose is a developer programs engineer on the Google Pay team, currently focusing on facilitating integrations across payment APIs. Previously, he worked as a software engineering manager and technical trainer on projects such as Wunderlist and ROI Training, and co-authored a title on Google Cloud Platform.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Cjo8HzAfkwSeWQ-Gr8iIhMLHdpyranYmp6QuXtZcrFaQGhLAKs87jpDB2wBa-M5l_UYHrpTycOnJnIuGjNgLiMjH\",\"socialLinks\":{\"GitHub\":\"https://github.com/JlUgia\",\"Website\":\"https://medium.com/@joseluisugia\",\"Twitter\":\"https://twitter.com/Jl_Ugia\",\"LinkedIn\":\"https://www.linkedin.com/in/joseluisugia/\"}},\"9eafd2bf-ecaf-49ec-89a7-bef328b5936d\":{\"id\":\"9eafd2bf-ecaf-49ec-89a7-bef328b5936d\",\"name\":\"Josh Dillon\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"96feb8c6-1106-47e6-a095-0a0b6fe133a1\":{\"id\":\"96feb8c6-1106-47e6-a095-0a0b6fe133a1\",\"name\":\"Josh Gordon\",\"bio\":\"Josh Gordon is a Developer Advocate for TensorFlow, and teaches Applied Deep Learning at Columbia University, and Machine Learning at Pace University. He has over fifteen years of machine learning experience to share.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/oSlZqvlZdj5aaBwooCqOwgISlCdDrqVkhIqzUzPer2A1UbbEZAXueZS7UaaBw2YEMRBwg7tHE7zFN0h7O_chMXDF\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/random_forests\",\"LinkedIn\":\"\"}},\"837a14b2-2354-40e9-9abb-11ba6d8c5f12\":{\"id\":\"837a14b2-2354-40e9-9abb-11ba6d8c5f12\",\"name\":\"Julie  Hanna\",\"bio\":\"Julie Hanna is a longtime Silicon Valley technology pioneer and entrepreneur. Today, she is an investor, advisor and board director working with purpose-driven companies to solve some of humanity’s most pressing challenges. She is a board member at Mozilla Corporation, venture partner at Obvious Ventures, a venture fund which backs world positive technology companies, and an early investor in numerous high growth companies, including Lyft and Lending Club. She’s currently a special advisor to X, the moonshot factory.\\n\\nPreviously, Hanna has been founder/CEO, or founding executive of five venture-backed companies from startup to scaleup. She and her teams introduced numerous innovations that are internet mainstays today, including VoIP, AJAX, mobile email, secure messaging and intranet portals. Companies include Healtheon (now WebMD), onebox.com (acquired by phone.com, now Unwired Planet) and Portola (acquired by Netscape).  \\n\\nShe is the founding Executive Chairwoman of Kiva, inventor of the crowdfunding model and the world’s largest lending marketplace for underserved entrepreneurs with a mission to democratize access to capital for the world’s 1.7B unbanked adults. In 2015, President Obama appointed her Presidential Ambassador for Global Entrepreneurship to help develop the next generation of entrepreneurs in the U.S. and abroad. Escaping Black September war in Jordan in 1970, she immigrated to America and studied computer science at the University of Alabama. Hanna’s work on the power of purpose-driven profit and the democratizing potential of technology to create a more just and abundant world is internationally acclaimed.\\n\",\"company\":\"Kiva, Obvious Ventures\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ujtGqzT9ApGm6DNe6oMPOuBH8VWgwSbgSXczthvDF-KoLU8ABfVUn7y4c1JBpKIIqCBYalHFcMDizorXYLFb3GCp\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/JulesHanna\",\"LinkedIn\":\"https://www.linkedin.com/in/juliehanna/\"}},\"3ab059c0-2af8-43b3-99fd-fbd7f66b2596\":{\"id\":\"3ab059c0-2af8-43b3-99fd-fbd7f66b2596\",\"name\":\"Jung-Woo  Kim\",\"bio\":\"\",\"company\":\"Samsung\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"cb9ab65b-e322-4e34-b16a-574d946d6110\":{\"id\":\"cb9ab65b-e322-4e34-b16a-574d946d6110\",\"name\":\"Jung-Yu (Gina) Yeh\",\"bio\":\"Gina is the Team lead for the Google Cast Technical Solutions Engineering team. Prior to her current work, she was immersed in web technology, driving web API design and implementation at Mozilla and streamlining data processing for search engine at Yahoo. Gina earned her master's degree in Computer Science from National Taiwan University and a bachelor's degree from National Chiao-Tung University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/mKNoT1cpHg3BcsiJm9wA9Oa2AZ9Ekg3qkTd6FhH5GXVz5XgU1wEN7QMGnTy7ZIg3mzYmS-SlFWPSndCOk3Kaa0Hj\",\"socialLinks\":{\"GitHub\":\"https://github.com/ginayeh\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/jung-yu-gina-yeh-5676584b/\"}},\"b191f280-ae02-4457-877b-191120cb6e38\":{\"id\":\"b191f280-ae02-4457-877b-191120cb6e38\",\"name\":\"Justin Broughton\",\"bio\":\"Justin Broughton has worked at Google for five years on building tools and infrastructure for developers. He is the tech lead and manager for Firebase Test Lab - one of the suite of tools under the Firebase umbrella. Prior to this he was VP Engineering at a number of large and small companies, working on building software in diverse areas such as Contact Centers and Health-Gaming. He has previously spoken at Google I/O (2015, 2016, 2017, 2018), Firebase Dev Summit (2016, 2017), VMWorld (2012), Interactions (2006, 2008) and many other internal and external conferences.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/FmP1-ySFW6zudvG7NK562vs1Y4Kj23gWD1rLO_G2W7-fuFfj_RTbdaA44LQykNk2mAKQbmBeMz8OvjYGhhOU9nHG\",\"socialLinks\":{\"GitHub\":\"https://github.com/justinbroughton\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/justbroughton\",\"LinkedIn\":\"https://www.linkedin.com/in/jubroughton/\"}},\"54c2d737-0fd2-4edb-ba40-0aeed1417ab1\":{\"id\":\"54c2d737-0fd2-4edb-ba40-0aeed1417ab1\",\"name\":\"Justin Clareburt\",\"bio\":\"Justin Clareburt is Product Manager for Android Studio. Previously a Program Manager for Visual Studio at Microsoft, Justin has over 20 years software development experience (including Amazon, Microsoft and Symantec). Majoring in compilers and IDE development in his B.InfTech (Hons) degree from University of Queensland, his passion for the developer productivity and IDE tooling continues to drive him today.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/uYKU3vH_sbCNQ6tXVGApVWa2sYa38Fz6WsSA9YwQZUzPEPPzl715yEzpXGg32v7rfXlNvccsONBQjkrr-TvR6gL9\",\"socialLinks\":{\"GitHub\":\"https://github.com/justcla\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/justcla78\",\"LinkedIn\":\"https://www.linkedin.com/in/justin-clareburt-6a57003/\"}},\"d17108a0-4797-4c24-b8a5-4e06e3c72b97\":{\"id\":\"d17108a0-4797-4c24-b8a5-4e06e3c72b97\",\"name\":\"Kai Haley\",\"bio\":\"Kai Haley is a UX designer leading the Design Relations team at Google, which supports design excellence for designers and developers building on Google's platforms. She is one of the founders and leads of the Sprint Master Academy, and has trained over 800 Sprint Masters to drive innovation across Google’s diverse product areas. She is passionate about design thinking and inspiring the UX community to effectively utilize Design Sprints for speed and innovation. Prior to starting the Design Relations team, she applied her UX expertise to create monetization opportunities in Google search for the Search Ads Team. She earned a Masters Degree in Design from CCA, where she focused sustainable design practices and creating positive impact in the world.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Ox__PMHvSTKUEpjQN5JE7UKB9Jrjm6mTqrMH91ZGWfDTMEXNXY8Kw_K2HHKNe-m39q9s9ydGdazu0bjF-wLP89Mq5w\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/kaihaley/\"}},\"3fc29769-b3a2-49cb-9b24-320fbea9978f\":{\"id\":\"3fc29769-b3a2-49cb-9b24-320fbea9978f\",\"name\":\"Karen  Ng\",\"bio\":\"Karen is a Group Product Manager at Google and leads the product team for Android Studio and Android Jetpack to make high-quality mobile development easier and faster than ever before. Prior to Google, Karen led product teams at Microsoft on DevOps  tooling and cloud services, .NET programming languages (C#, VB, F#), and IDE tooling in Visual Studio. She has a masters degree from the Massachusetts Institute of Technology.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/SGX6oOJDt94YDgF_cPs70gre5qt44BPayPxEMWtVeQ7gISGvCmH1CIzsAXh0jDs2eJjGzZv_ySAXwdQ6g_E0XCeleQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/karenkayliu\",\"LinkedIn\":\"https://linkedin.com/in/karenng2\"}},\"b2a0ae05-69b2-4d36-9b0e-63312e02d07f\":{\"id\":\"b2a0ae05-69b2-4d36-9b0e-63312e02d07f\",\"name\":\"Karmel  Allison\",\"bio\":\"Karmel Allison leads a team of engineers working to make TensorFlow high-level APIs easy to use and flawless to scale. She received her PhD in Bioinformatics from the University of California, San Diego, and has over ten years of experience in software development and machine learning. Previously led engineering teams building a DNA sequencer at Genia and serving real-time recommendations at Quora.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/karmel\"}},\"f40e301e-33d2-4c18-8905-a5dbaf63fef2\":{\"id\":\"f40e301e-33d2-4c18-8905-a5dbaf63fef2\",\"name\":\"Kat Fang\",\"bio\":\"Kat is a software engineer for Firebase focused on the intersection with Google Cloud, previously working on Cloud Storage for Firebase and the Realtime Database. Kat graduated from MIT with a bachelor's and master's degree in Electrical Engineering and Computer Science. When she's unplugged, she spends her time dancing, figure skating, and puzzling.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f16418e7-be72-4f09-baa5-c8bb5770baed\":{\"id\":\"f16418e7-be72-4f09-baa5-c8bb5770baed\",\"name\":\"Katie  Hempenius\",\"bio\":\"Katie is an engineer on the Chrome team where she works on making the web faster. Previously, she was a software engineer on Google Ad Manager. Prior to Google, Katie was a senior software engineer at Fitbit. She earned a bachelor’s degree in systems engineering from the University of Virginia, where she graduated with honors.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"https://github.com/khempenius\",\"Website\":\"https://katiehempenius.com/\",\"Twitter\":\"https://twitter.com/katiehempenius\",\"LinkedIn\":\"\"}},\"c883dbbe-d6d0-4b05-9063-2af370cd8077\":{\"id\":\"c883dbbe-d6d0-4b05-9063-2af370cd8077\",\"name\":\"Kaz Sato\",\"bio\":\"Kaz Sato is staff developer advocate at Google Cloud. For machine learning (ML) and data analytics products, such as TensorFlow, Cloud ML, and BigQuery, Kaz has been invited as a speaker at major events including Google Cloud Next, Google I/O, Strata NYC, NVIDIA GTC and etc. Also, authoring many Google Cloud Platform (GCP) blog posts, supporting developer communities for Google Cloud for over 8 years. He's also interested in hardwares and IoT, and has been hosting FPGA meetups since 2013.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ZDABl1aD3FBUwkwNH5RO9WVe1a_WU1gt6zTUdPDE1MHu3zYr2MDeHD3oxWMvb8-f7vWWqsT8trb3Jhi8PIwfIG3v\",\"socialLinks\":{\"GitHub\":\"https://github.com/kazunori279\",\"Website\":\"https://github.com/kazunori279/my-sessions-and-bio\",\"Twitter\":\"https://twitter.com/kazunori_279\",\"LinkedIn\":\"https://www.linkedin.com/in/kazunori279/\"}},\"e1f6dfc0-47dd-4c47-91eb-921d7f24a8d3\":{\"id\":\"e1f6dfc0-47dd-4c47-91eb-921d7f24a8d3\",\"name\":\"Kelly  Chen\",\"bio\":\"Kelly Chen has over a decade of experience in quality assurance, product and program management at Compal, LITE-ON, and HTC.  Today, Kelly is leading accessibility programs at Google, focused on developing services for the visually impaired, the hard of hearing, and people with dexterity issues to make things accessible to everyone.\\nKelly earned a bachelor’s degree in Industrial Management from National Taiwan University of Science and Technology.  \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/6TCQWehtIoif0H2kRblmoJv6spaHrfCYtDL03gcFtj9zfZSehMiqmF-6bOd2XvyXIOcC9AHievY8EtI-Yh9qs6Otvw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"da60fa7c-b765-4969-bf6c-9782a3ffa243\":{\"id\":\"da60fa7c-b765-4969-bf6c-9782a3ffa243\",\"name\":\"Kenric  McDowell\",\"bio\":\"Kenric McDowell has worked at the intersection of culture and technology for over twenty years. Kenric co-leads the Artist + Machine Intelligence program at Google Arts & Culture, where he facilitates collaboration between artificial intelligence researchers, artists, and cultural institutions. Kenric is a regular conference speaker and consultant to think tanks and arts organizations, helping groups connect artistic practice and technology production with larger traditions of human understanding.\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/I85avCjgMySljxbFGVtZfW7jgm9f1jEH-ROXOtespeBn6wPNd2-PuKI3yKme6r_fMgnEItrUlV2fFllKgRu7xq2wDA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kenricmcdowell?lang=en\",\"LinkedIn\":\"https://www.linkedin.com/in/kenric-mcdowell-716719116/\"}},\"5776b419-4321-4b6b-9adb-b5dfda9219fe\":{\"id\":\"5776b419-4321-4b6b-9adb-b5dfda9219fe\",\"name\":\"Kevin Hass\",\"bio\":\"Kevin Haas is a senior engineering manager at Google Research, driving the open source adoption of Tensorflow Extended (TFX), one of Google's production ML platforms.  Prior to TFX, Kevin worked on the Google Assistant infrastructure team.  Kevin received his MS from Stanford University in Computer Science.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://tensorflow.org/tfx\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/kevinhaas/\"}},\"3e8c3d43-a4ab-4976-847c-6e93dcd86d7d\":{\"id\":\"3e8c3d43-a4ab-4976-847c-6e93dcd86d7d\",\"name\":\"Kevin Moore\",\"bio\":\"Kevin is a product manager on the Dart team, where he works on compilers, build tools, and libraries to support the web. Kevin would rather be coding. He's helped create some core and obscure Dart packages, including shelf, source_gen, json_serializable, build_cli, and peanut. Prior to Google, Kevin owned a software consulting firm. Before that, he was a program manager at Microsoft. He earned a bachelor's degree in computer engineering from Iowa State University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dfF9IzlZ7lDEFLJ5_dDjwvh2csBCrc82qmh85IfohcVUgDZZz_uDyD2M-wcqrBptmAwMmZAeO_uFZOd6kNxpYdzoyQ\",\"socialLinks\":{\"GitHub\":\"https://github.com/kevmoo\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kevmoo\",\"LinkedIn\":\"\"}},\"74c3cb3b-95d2-4bf5-a608-218f8a9a6ca9\":{\"id\":\"74c3cb3b-95d2-4bf5-a608-218f8a9a6ca9\",\"name\":\"Kevin Nilson\",\"bio\":\"Kevin is the Head of Google Home and Nest Technical Solutions Engineering.  Kevin is a Java Champion and four time JavaOne Rock Star.  Kevin has spoken at conferences such as JavaOne, Devoxx, O’Reilly Fluent, NFJS SpringOne, JAX, Silicon Valley Code Camp, HTML5DevConf, On Android and AjaxWorld. Kevin is the co-author of Web 2.0 Fundamentals. In the past Kevin was an adjunct professor at the College of San Mateo. Kevin holds a MS and BS in Computer Science from Southern Illinois University. Kevin is the leader of the Silicon Valley Java User Group, Silicon Valley Google Developer Group, Silicon Valley JavaScript Meetup and Devoxx4Kids Bay Area.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/XE5AD_DOhrWDb38zZve2WnlUtocKhnv_yJy6sllqVNDUuNrKuRgbRw9ANXarIJ5RpM0NYjh4tLu_-S4DWUAdl04nzw\",\"socialLinks\":{\"GitHub\":\"https://github.com/kevinnilson\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/javaclimber\",\"LinkedIn\":\"https://www.linkedin.com/in/kevinnilson/\"}},\"7ab88b1c-f0de-4eb0-91a5-314e6742a3c6\":{\"id\":\"7ab88b1c-f0de-4eb0-91a5-314e6742a3c6\",\"name\":\"Kevin Schaaf\",\"bio\":\"Kevin is a software engineer and tech lead on the Polymer Project. Kevin got his start in web development at a Tokyo startup back in the Netscape/IE5 days, and then took a long hiatus from the web while working in embedded electronics. Kevin returned back to the web in full force in 2011 after joining Palm to work on the webOS SDK and later leading the development of LG’s smart TV UI framework before joining the Chrome organization at Google.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Hu6A-G6z5U4dJ85e9gAgoqbSoXOMhy1kkW2NU8gP-tbLcHDsoq5bMBi02wrgSSZWE5N8hfOITVStgU6WjNGHrjM\",\"socialLinks\":{\"GitHub\":\"https://github.com/kevinpschaaf\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kevinpschaaf\",\"LinkedIn\":\"https://www.linkedin.com/in/kevinpschaaf/\"}},\"0f16f46d-6058-4c76-b95a-50b2d12fd59c\":{\"id\":\"0f16f46d-6058-4c76-b95a-50b2d12fd59c\",\"name\":\"Kevin  Venkiteswaran\",\"bio\":\"Kevin is a principal architect at Salesforce. He started his career working in Canadian finance where he developed the first platform to purchase regulated investments online. During his tenure at Salesforce Kevin has been a leader in their UI framework and hybrid mobile applications. Most recently he co-created Lightning Web Components and is modernizing Salesforce's UI Platform.\",\"company\":\"Salesforce\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/hu5Kb0L22qT5U8-wqq3WK3mYT07MogzcydeXB-qQ6ME34dhpzl_brOeGkuUoeW0AtV-VPRBiif-MLeL3g6Tzk64L\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kevinv11n\",\"LinkedIn\":\"https://www.linkedin.com/in/kevinv11n/\"}},\"f3817c13-89f0-47cd-9843-f6969cc054b6\":{\"id\":\"f3817c13-89f0-47cd-9843-f6969cc054b6\",\"name\":\"Khaled  Abdel Rahman\",\"bio\":\"Khaled Abdel Rahman is a Product Manager on Google’s cloud gaming platform, focused on gameplay experience. He’s been working in the games industry for the past 5 years as a Product Manager and a game development lecturer at USC.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Rb7rSMoTWtRFtXr5_YJJ9Z7lBK8Zzv_dx7cBloQWSkE2FMVTngQDFBVab9ulU5Z2NMcXcR5UhWd671hBQyO3jt3h\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/playwiz\",\"LinkedIn\":\"https://www.linkedin.com/in/khaled-abdel-rahman-b25aa377\"}},\"a495f4ba-3d1e-4b23-bbb8-5daa18435734\":{\"id\":\"a495f4ba-3d1e-4b23-bbb8-5daa18435734\",\"name\":\"Khushboo  Hasija\",\"bio\":\"Khushboo Hasija is a UX researcher at Google Daydream. She is leading research for AR Core and has authored Google's design guidelines for Augmented Reality. Prior to Google, she led research for Artificial Intelligence and Enterprise productivity tools at Microsoft. In the last 10 years, she has worked with various organizations like Gates Foundation, BBC, UNICEF, IBM and GE. Khushboo holds a Master's degree in Design Research and Strategy and Bachelor's degree in Fine Arts. \\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/lwVY2qag7GXOhMsDB3Jhfha3SNqwh_xqXMwGHjiDUnVlsjhAYtjSe7grBwAlcpRDDv7JrEgKpEA9oAED4y45KAU\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/khushboohasija\",\"LinkedIn\":\"\"}},\"654e3d51-d77f-4d5b-9331-ac4f225f8e27\":{\"id\":\"654e3d51-d77f-4d5b-9331-ac4f225f8e27\",\"name\":\"Kobi Glick\",\"bio\":\"Kobi is a product manager leading the Google Play Developer team. Kobi is focused on helping developers build high quality apps and games and build successful businesses on Google Play. Kobi has B.Sc.in Computer Science from the Hebrew University of Jerusalem.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/P0uZeqjeu7BeS6Yc_dCWG3GilCfuscmksixW1WWFAwW3YhdZ9YlEGy4o7qWAWkPRTXl508CJu-AwLis5rAcYnrg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kobi_gg\",\"LinkedIn\":\"https://www.linkedin.com/in/kobi-glick-5484095b/\"}},\"27ef6b44-917a-4342-ad09-30755e6fb886\":{\"id\":\"27ef6b44-917a-4342-ad09-30755e6fb886\",\"name\":\"Konstantine Tsotsos\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"93045557-9f6d-4a86-a805-bc83c9462818\":{\"id\":\"93045557-9f6d-4a86-a805-bc83c9462818\",\"name\":\"Konstantinos  Katsiapis\",\"bio\":\"Konstantinos (Gus) is the über tech lead of TensorFlow Extended (TFX), an end-to-end machine learning platform based on TensorFlow (tensorflow.org/tfx). Before that he worked on Sibyl, a massive scale machine learning system (precursor to TensorFlow) widely used at Google. Prior to being a builder of machine learning infrastructure he was an avid user of it, while leading the Mobile Display Ads Quality team at Google.\\r\\n\\r\\nPrior to Google, Gus gathered knowledge and experience at Amazon, Calian, Ontario Ministry of Finance, Independent Electricity System Operator, and Computron.\\r\\n\\r\\nGus earned a master's degree in computer science with a specialization in artificial intelligence from Stanford University and before that a bachelor's degree in mathematics, majoring in computer science and minoring in economics, from the University of Waterloo.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/0vk67xGo5qOrfrePoOsbdRO9srP1R9dK6R6Xit-4oTVBSz01JH8-9-fmhaZYWypPK_a0WzwenbQFdklOeJD1MHBa4Q\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f5ac1eaf-9e9b-49c5-9037-3a1505a4576b\":{\"id\":\"f5ac1eaf-9e9b-49c5-9037-3a1505a4576b\",\"name\":\"Kristen Johnson\",\"bio\":\"Kristen is a PM Lead on the Firebase team focused on app stability. Before joining Google via an acquisition, Kristen worked on Fabric at Twitter. During her time there, she helped evolve Crashlytics into a platform that helps developers build their apps, understand their users, and grow their businesses. She is excited to continue that mission as part of the Firebase team.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kris10rht\",\"LinkedIn\":\"\"}},\"a80a9e69-2d9f-4b0e-8ffd-18dbdda38be0\":{\"id\":\"a80a9e69-2d9f-4b0e-8ffd-18dbdda38be0\",\"name\":\"Kristie  Fisher\",\"bio\":\"Kristie J. Fisher is a staff user experience researcher on Google Ads and an author of the People + AI Guidebook. Previously at Google she’s worked on Stadia and on AI-driven productivity tools in G Suite. Kristie was a researcher at Xbox prior to joining Google. She has a PhD in cognitive psychology from the University of Washington and a BS in applied psychology from Georgia Tech.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/YUJDyb48fr2OcKcdlRY_78ubVxVH6aAV022V_nBR5GKNWxT2Oh41dXC0fXAkfPO1xUgAbmTxRTbsv2I8bU_dKCA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kristiefisher\",\"LinkedIn\":\"https://www.linkedin.com/in/kristie-fisher-2216a764/\"}},\"068d5419-8717-47e4-b332-36cf5c4adadb\":{\"id\":\"068d5419-8717-47e4-b332-36cf5c4adadb\",\"name\":\"Kunal  Patel\",\"bio\":\"Kunal is a Senior Interaction Designer on the Material Design team, creating design patterns and guidelines for beautiful, usable cross-platform applications. He focuses on accessible design practices, emergent technologies, and design outreach.\\r\\n\\r\\nKunal holds an MFA in Design & Technology from Parsons The New School for Design and a Bachelor's of Architecture from Carnegie Mellon University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/0_O66KDct1GJa5b739Tp4fg3XH5AVK1keGydutggR3XmU9RMEdXv460sglK2ec5nPXrregAG5HVMulPdyIQciYE1\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"e40b8a06-b365-4fab-96d2-da6490aa6100\":{\"id\":\"e40b8a06-b365-4fab-96d2-da6490aa6100\",\"name\":\"Larry  Yang\",\"bio\":\"Larry Yang is a senior product manager for the Play Commerce seller platform, responsible for helping developers monetize on Google Play. Previously Larry had product responsibilities on Project Tango, Google Fiber and GoogleTV. Larry has been creating innovative consumer products and services for over 20 years, including leading product management for video conferencing at Cisco and General Manager of the Xbox 360 console group at Microsoft. Larry has Electrical Engineering degrees from Stanford University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/mWAHaURTQf-3W4mEFiYBHcpzSMsNM-oksMoU0AQTwA40By6vjTC40ObkdEk2_wybVdH5oxjjAk14uRn8lhzxvbv_ag\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/lryang/\"}},\"36abf8e2-c7f4-46fc-8d90-59ba8079357f\":{\"id\":\"36abf8e2-c7f4-46fc-8d90-59ba8079357f\",\"name\":\"Lauren Mytton\",\"bio\":\"Lauren joined the Play Game Developer team as Product Manager in late 2018. Previously she worked on the commercial side of Play, running Business Operations for EMEA. Her experience prior to Google includes a stint on the trading floor at JPMorgan, for which she developed a trading tool; and roles at Amazon and Hutchison 3G, where her focus was on driving business improvement and internal tools/processes. She has a degree in Mathematics with Physics from Trinity College, Cambridge.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/sul2TU-EwnPBIiBvBiygsPrbTPFOtBRUE7uOEy7XJcGajcvqin5Mxk3edJ-RtN3S3IZIdFkuSWgf9YYmeL5Db6BZQA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/laurenmyttongreen/\"}},\"09ea06ba-ff4d-49de-aacc-9bf23e8c2508\":{\"id\":\"09ea06ba-ff4d-49de-aacc-9bf23e8c2508\",\"name\":\"Lauren Winston\",\"bio\":\"Lauren is a software engineer on the Central Accessibility team. She primarily works on Switch Access for Android. She graduated from Georgia Tech in 2017 with a master’s degree in computer science with a specialization in human-computer interaction. She also received a bachelor’s degree in computer science from Georgia Tech in 2015.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/5LdZDFiv8fomIGfu8eyG1IOTaP9XslHUamjbPopYwTuyCgh-i_L3I3o_fG68vpkdO3kSJSgJH0feAN6xE85i117Z\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"dfd873e6-c403-40d3-affc-a26a29871a64\":{\"id\":\"dfd873e6-c403-40d3-affc-a26a29871a64\",\"name\":\"Laurence  Moroney\",\"bio\":\"Laurence is a developer advocate at Google working on machine learning and artificial intelligence. He's the author of dozens of programming books, and hundreds of articles. When not Googling, he's author of a best-selling Science Fiction book series, and a produced screenwriter.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/q1I_vGJgCDu5YAbOEX_inDVih6zx81E_1z6H-d9zljG6C7HQ8teY5enF7KhI51n9AL2Ll5nQGrATWxNrBkdlWBXe\",\"socialLinks\":{\"GitHub\":\"https://github.com/lmoroney\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/lmoroney\",\"LinkedIn\":\"https://www.linkedin.com/in/laurence-moroney/\"}},\"a92210fa-bdd3-4594-a431-cc9b9521e345\":{\"id\":\"a92210fa-bdd3-4594-a431-cc9b9521e345\",\"name\":\"Leo Sei\",\"bio\":\"Leo is a product manager on the Android Studio team. In this role, he focuses on the build, compilation and testing tools as well as the developer experience for some of the new Android features. Leo holds an Msc in Machine learning and Network security.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/leo_sei\",\"LinkedIn\":\"\"}},\"58f7f945-fab0-46ab-ab54-9b57661c2f15\":{\"id\":\"58f7f945-fab0-46ab-ab54-9b57661c2f15\",\"name\":\"Leon  Nicholls\",\"bio\":\"Leon is an engineer in Developer Relations at Google. He has worked on various products such as Chromecast, Android TV, Android Auto and more recently the Google Assistant. His team is responsible for client libraries, documentation, samples and resources to help developers be successful with Actions.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/HqOY571iE0z88MSUPiPi_kvd-XfC80CAjirmYNB9drZdDnrMNAIndWWQO9lpoqyOreHZaP7R7mhN4rYm6ICjXWCb\",\"socialLinks\":{\"GitHub\":\"https://github.com/entertailion\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/TheLeonNicholls\",\"LinkedIn\":\"\"}},\"7cde7037-72aa-4aea-8348-cac86f3b922a\":{\"id\":\"7cde7037-72aa-4aea-8348-cac86f3b922a\",\"name\":\"Leon  Wong\",\"bio\":\"Leon is an engineering manager on Google's Augmented Reality Platform team. His group develops motion tracking and scene perception algorithms for ARCore. Prior to Google, Leon worked as an engineering manager at Microsoft, Facebook, and Pinterest. He holds B.S. and M.S. degrees in Computer Science from the Massachusetts Institute of Technology.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/h0oh9D-b9uPZ1vRVRhKzZ7rdKTVBkHsaPsVZnbHiEkSTLKLfvgXmV4TwI9D8hccJYCvi3ikAjpfmV7TPFQ6lqmVx\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"5c6fbe2d-ddfc-4654-b59e-aa6abb428ffc\":{\"id\":\"5c6fbe2d-ddfc-4654-b59e-aa6abb428ffc\",\"name\":\"Lilian Katic\",\"bio\":\"Lilian has spent his professional career at CANAL+ since the end of 1999. He began in the security department to fight against piracy. In 2008 he joined the innovation team and began to develop services around connected devices and the CANAL+ set top boxes. It was the beginning of his journey in the Android world and his hard work lead to the creation of the Android development team at CANAL+.\",\"company\":\"CANAL+\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/B3ZFxDKClVE-waQPWIOuj4MBTrgnbQBx6CXSPe6kWvxrwqiB18CTEsSFeb9Ys4kJ3_DGVviZjVTBw0vD1K7mpFU\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/katiclilian\",\"LinkedIn\":\"https://www.linkedin.com/in/lilian-katic-2b69a2a4/\"}},\"d444651c-cb4d-4eb4-a489-ee530b440be6\":{\"id\":\"d444651c-cb4d-4eb4-a489-ee530b440be6\",\"name\":\"Lingfeng  Yang\",\"bio\":\"Lingfeng (Frank) Yang is a technical lead on Google's Android Emulator. Frank works on core virtualization features such as snapshots and graphics acceleration. He has a background in programming languages /  computer graphics, with a Ph. D in computer science from Stanford.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/nMagBatS_4blhXHeoI09XC4-r2ws9fyddiBZvu7wIm25ynwv2UzFhQ1h6IKamMiXYcyeVJ-_wlatyO6MShUN6bQI\",\"socialLinks\":{\"GitHub\":\"https://github.com/741g\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"b9adc138-fdcc-4a87-8f75-e481ddb00198\":{\"id\":\"b9adc138-fdcc-4a87-8f75-e481ddb00198\",\"name\":\"Lokesh  Gidra\",\"bio\":\"Lokesh is a senior software engineer in the Android Runtime (ART) team. In this role, he focuses on ART's garbage collector. Prior to joining Google, Lokesh worked as senior research engineer at Hewlett Packard Enterprise, where he invented a multi-process garbage collector for C++ programs. Lokesh has a PhD in garbage collection from Université Pierre et Marie Curie (UPMC), France.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/oIr4vj2LZNE193FR2_Q6dtm4NFnlWNcnSJG-Q9-s-T8lYSvpBFGbss4jbDLePxq__ciflXeC-9EVBkz_BbeQPzaj\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"ebaba1a1-0522-46c0-a7fe-1ed59a1e523e\":{\"id\":\"ebaba1a1-0522-46c0-a7fe-1ed59a1e523e\",\"name\":\"Lukas  Weichselbaum\",\"bio\":\"Lukas is a staff information security engineer at Google with 10+ years of industry experience who frequently speaks at international infosec and developer conferences.\\r\\nHe's passionate about securing web applications from common web vulnerabilities and leads the Google-wide Content Security Policy (CSP) adoption effort. Lukas also co-authored the CSP3 W3C specification and is the creator of the CSP Evaluator, a tool for developers and security experts to check if a Content Security Policy serves as a strong mitigation against XSS attacks. \\r\\nBefore joining Google, Lukas worked as a Security Consultant and graduated (M.Sc.) from Vienna University of Technology in Austria where he researched dynamic analysis of Android malware and founded Andrubis - one of the very first large scale malware analysis platforms for Android applications. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/__ZB9-hBuVTXBM93n9t2ltI_SNitjDRIG3HtdoAe4DJuxXTqGPFw5fIlcOPe84dkQ8jDy8NRW0s-m2IuSln7hdk\",\"socialLinks\":{\"GitHub\":\"https://github.com/lweichselbaum\",\"Website\":\"https://webappsec.dev\",\"Twitter\":\"https://twitter.com/we1x\",\"LinkedIn\":\"https://www.linkedin.com/in/lweichselbaum\"}},\"e7b7180d-511e-4176-830e-7926657cb22d\":{\"id\":\"e7b7180d-511e-4176-830e-7926657cb22d\",\"name\":\"Lydia Fitzpatrick\",\"bio\":\"Lydia is the lead Technical Program Manager for the Android Health & Velocity team. Her team is focused on making every change to Android fast, painless, and safe. She also runs the Quality Award program to reward contributions to product excellence across Android, Chrome, and Play. Prior to joining Google, Lydia ran teams at Amazon and several startups. She has a B.S. in engineering from Northern Kentucky University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/NquqSYMtPNQOa2VqH6nuPjDg8swdpDofnAmRe5DvpbrWE5lo_VGxS0ECj3eBi5sKLoIT82x2icYK2WXVOaOQNc-m\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"38c8cbfc-4821-490f-adc2-efd401e82ee1\":{\"id\":\"38c8cbfc-4821-490f-adc2-efd401e82ee1\",\"name\":\"Lyla  Fujiwara \",\"bio\":\"Lyla is an Android Developer Advocate at Google working on Android Jetpack and developer training. Prior to joining Google, she worked at Udacity, where she had the privilege of teaching developers from across the globe how to write Android app and work with Firebase. She's a returned Peace Corps volunteer and has worked and lived on three continents.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/mYqoA0hYDbHJY2bWHhbErqm_vn9daHXvuEccGoyvzAWDAAU0RpFqkAJYpKuZVWqWbDnoJGKS85ihLM0erm7RuIC3aQ\",\"socialLinks\":{\"GitHub\":\"https://github.com/ceruleanotter\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ceruleanotter\",\"LinkedIn\":\"https://www.linkedin.com/in/lylafujiwara/\"}},\"b419f3a7-14b6-414f-a8b0-41e69e24a551\":{\"id\":\"b419f3a7-14b6-414f-a8b0-41e69e24a551\",\"name\":\"Mady  Mellor\",\"bio\":\"Mady is an engineer on the Android System UI Team. Mady joined the Android team in 2014 and has worked on text selection, notifications, and now bubbles. Prior to joining Google Mady earned a bachelor's degree in computer science from the University of Waterloo in Canada.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Sni_PLWG-UkU_4OKfIQk8lLSsDgmHiKGwsPKcSH3zYsuvCwnQi83haVOCMPcUcvTF6dqmJwTOEXsykl3b1KvHLQC4A\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"74eba712-7554-4133-b0a0-8dc56b8722a8\":{\"id\":\"74eba712-7554-4133-b0a0-8dc56b8722a8\",\"name\":\"Mae  Jemison\",\"bio\":\"Dr. Mae C. Jemison leads 100 Year Starship (100YSS), a bold, far reaching nonprofit initiative to assure the capabilities exist for human travel beyond our solar system to another star within the next 100 years.  The 100YSS Way Research Institute seeks to generate the radical leaps that accelerate knowledge, technology, design, and thinking not just for space travel, but to enhance life on Earth.  Jemison, the first woman of color in the world to go into space, served six years as a NASA astronaut.  Aboard the Space Shuttle Endeavour, STS-47 Spacelab J mission in September 1992, she performed experiments in material science, life sciences and human adaptation to weightlessness. \\r\\n\\r\\nJemison started The Jemison Group, Inc. (JG) a technology consulting firm integrating critical socio-cultural issues into the design of engineering and science projects, such as satellite technology for health care delivery and solar dish Stirling engine electricity in developing countries. \\r\\n\\r\\nJemison is one of the series hosts for National Geographic's “One Strange Rock” and space operations advisor for its global miniseries MARS. Jemison is an inductee of the National Women's Hall of Fame, the National Medical Association Hall of Fame and Texas Science Hall of Fame, International Space Hall of Fame as well as a recipient of the National Organization for Women's Intrepid Award, The Kilby Science Award and National Association of Corporate Directors' Directorship 100 most influential people in the boardroom in 2014, Honorary member of Alpha Kappa Alpha Sorority and the New York Academy of Sciences, among many honors. \\r\\n\\r\\nJemison is also an  author including Find Where the Wind Goes: Moments from My Life True Books series on space exploration.  She was the first real astronaut to appear on Star Trek TV series and is a LEGO figurine in the LEGO Women of NASA kit.B.S., Chemical Engineering; Fulfilled requirements A.B., African and Afro-American Studies-Stanford University M.D., Cornell University.\\r\\n\",\"company\":\"100 Year Starship\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/6DMlN3-gNRCo-GCQ8ZOGUmoE5UeNAzzOUMWk7KFI9-vtJ6EdtFOquxVXA9_mG2cweS-1XdGt1tQQgHkzBoPsS9T3\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/maejemison\",\"LinkedIn\":\"\"}},\"41857501-5f30-44ed-b77e-b72eaab2647d\":{\"id\":\"41857501-5f30-44ed-b77e-b72eaab2647d\",\"name\":\"Maggie Stanphill\",\"bio\":\"Maggie leads Google’s Digital Wellbeing initiative, supporting people’s intentional relationship with tech. She applies a humanities approach to designing technology experiences. Since joining in 2011, she has developed Google guidelines that shape experiences on Android, Google Assistant, Google Maps, Google Search, and more. Previously, she held leadership roles at Expedia, Razorfish, and Nike.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/RO7HXgBs-iDNO09ZwRh2H4nIrHXlgc_eXB61bdRgp0FLkdc0brpZcLB1a1hyGIF7LAFLUJz9eDP5sQW18OBN0f8Vlw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/maggie-stanphill-3017032/\"}},\"6f16d338-6253-4322-a12c-bef1ffb12d0e\":{\"id\":\"6f16d338-6253-4322-a12c-bef1ffb12d0e\",\"name\":\"Magnus  Berger \",\"bio\":\"Magnus Berger is the CTO of Propellerhead Software, creators of the music-making software Reason. Prior to working on audio applications for a decade, he developed embedded Linux systems and map software Before That Was A Thing in companies spanning from startups to thousands of employees. He received his M.S. in Engineering Physics from Chalmers University of Technology in Sweden.\",\"company\":\"Propellerhead Software\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/jZnODupKiuiYFwnIKfW_2pe2hVQMx707mJPr0lgL2FTj3nzWrNFr0fbmb5d3EOqpKAEk6sl5yxQVXLk54NKypXw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"21b5e9b7-6dc1-4a46-bb1d-1186cd301905\":{\"id\":\"21b5e9b7-6dc1-4a46-bb1d-1186cd301905\",\"name\":\"Mailys Robin\",\"bio\":\"Mailys Robin is a Google Pay product manager focused on Passes (boarding passes, transit and event tickets, loyalty cards...). Before this, she worked with Issuers to launch Google Pay in more than 11 countries across EMEA and APAC.\\r\\nPrior to joining Google, she was working as a research engineer in a research lab. for Orange (ex. France Telecom) in Tokyo on Smart Office related projects.\\r\\nMailys holds a master degree in signal processing and telecommunications from the Grenoble Institute of Technology.\\r\\n\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/xgwZNHbXk4N7MAMPH9GFHopFB-3FSTJPaHdJzNiiWCa3KCMnp6wSDpQA1aFNsdS11_7HtZkW-Chkr1qxoP-S-YrV9g\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/mailys-r-b6188838\"}},\"b4392e67-2b8f-43e2-9730-1f25c57f6a69\":{\"id\":\"b4392e67-2b8f-43e2-9730-1f25c57f6a69\",\"name\":\"Mandy  Chan\",\"bio\":\"Mandy Chan is a developer advocate for the Actions On Google team, where she is passionate about improving the developer experience by creating practical tools and content. At I/O 2018, Mandy, together with the team, published two codelabs to guide developers on how to build Actions. Since then, the codelabs have trained many new developers from around the world. Mandy was recently invited as a guest on the Google Cloud Platform Podcast. You can hear more about her work on bit.ly/gcp-mandy.\\n\\nPrior to Google, she was an Alexa Champion and made many early contributions to the voice community. One of her most frequently downloaded open source projects is called SSML Builder, which creates well-formed Speech Synthesis Markup Language without worrying about string concatenation.\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/_Tv0Vm4EHaKaqWlLREAYLKAa0at6Pfl_NUvER-rWOp4J0zZsaMcpUqu0SNxlrwy1QV4NwVrQZ84NhGp1pVLGeuIYcg\",\"socialLinks\":{\"GitHub\":\"https://github.com/mandnyc\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/MandyChanNYC?lang=en\",\"LinkedIn\":\"\"}},\"5607a37f-7b70-4407-b0cb-9f5f1652d231\":{\"id\":\"5607a37f-7b70-4407-b0cb-9f5f1652d231\",\"name\":\"Manit  Limlamai\",\"bio\":\"Manit is the engineering lead for local technologies for the smart home. He is responsible for solving some of the biggest problems in home automation around improving integration quality and user experience. Prior to Google, he was a software engineer at Skybox Imaging and Lockheed Martin, helping to launch and control satellites in space. What some of those satellites do/did, he cannot say.\\r\\n\\r\\nManit earned a master's degree in optical sciences from the University of Arizona, and a bachelor's degree in applied physics and electrical engineering from Rensselaer Polytechnic Institute.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ae6LX-tBpqq6CuFHDs6ZEDb71JpV0panOeyZJCoL4_RO7gnhMgX6I32SWr89oE6uixjaesZ3NNcESrNaZQFYxm_2\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/limlam/\"}},\"81307398-085a-4500-8659-3cb756096cc8\":{\"id\":\"81307398-085a-4500-8659-3cb756096cc8\",\"name\":\"Marc  Jordan\",\"bio\":\"Marc is a Product Manager in Google Cloud, leading product for Firebase Authentication and Identity Platform (formerly CICP). For more than a decade, Marc has been working with identity at companies like Google, Okta and Microsoft.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/rt2Ztxce-V-TSFtD6ihEEKt-npHnN7ULzkWFRHYv_adHaO_0VmmxuZfC_m1IKHoU1KX0__GyEMjvQUWNM4HCwxug\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/marcskij/\"}},\"2916fc6c-c3c2-4fdd-a1f3-074ea4375933\":{\"id\":\"2916fc6c-c3c2-4fdd-a1f3-074ea4375933\",\"name\":\"Margaret  Mitchell\",\"bio\":\"Margaret Mitchell is a Senior Research Scientist in Google’s Research & Machine Intelligence group, where she founded and co-leads a team focused on evolving AI ethically. Her work combines computer vision, natural language processing, social media, statistical methods, and insights from cognitive science, and has been published across top-tier conferences for Natural Language Processing, Computer Vision, and Cognitive Science. Margaret introduced some of the first data-driven methods for generating visual descriptions of images and for modelling human biases during generation, and her work on generating descriptions for people who are blind, SeeingAI, has won the prestigious Hellen Keller award. She co-founded several workshops focused on ethics, diversity, and inclusion, such as Widening NLP, Ethics in NLP, and FATE-CV, and she is one of the organizers of FAT*, the conference on fairness, accountability, and transparency in developing AI systems.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/b1aY2bxb8Ap6kZMnu-3Hb89U2EBQX55Y6fRDJUKYJ1lWlD2uG0N6t0iMwVK1FHVia6rgYE_fJu8V8f34MTKycE9J\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/mmitchell_ai\",\"LinkedIn\":\"\"}},\"5fea480b-49e8-48ba-bf31-88f91808b28d\":{\"id\":\"5fea480b-49e8-48ba-bf31-88f91808b28d\",\"name\":\"Maria  Garcia Puyol\",\"bio\":\"Maria is a senior software engineer on the Android Location & Context team. She works on estimating a user's current floor on Android devices. \\r\\nMaria co-founded the Android Emergency Location Service, which sends accurate emergency location to first responders. For this work, she was selected as one of the Europe 35 innovators under 35 by MIT Technology Review in 2018. She has a PhD in electrical engineering from the Technical University of Munich.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dkrbmkcARFSr6D7oquX7F9aRzj8hlKkLQzaAuzEam7LwR7MpA5aWgzeshE-lfMrAjUVVr8rPq4LX8f-JXwHQF6s\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/mariagpuyol?lang=en\",\"LinkedIn\":\"https://www.linkedin.com/in/maria-garcia-puyol-4045a744/\"}},\"2edfc648-2289-4071-bfc1-3866747226c8\":{\"id\":\"2edfc648-2289-4071-bfc1-3866747226c8\",\"name\":\"Mariko  Kosaka\",\"bio\":\"Mariko is a drawsplainer and a web developer working in the Web Developer Ecosystem team inside of Google Chrome. \\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/v4Ad0tW3NDdMBsz1I20W7yBArNbUQiRJ-136y0-PvRL0_iM4XFgONeEU7HtoEKm1TljH9naKdsa-PnLlX4JiS0A\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/kosamari\",\"LinkedIn\":\"\"}},\"4f03c0a8-de0a-4d59-9be8-06c6ebbe6155\":{\"id\":\"4f03c0a8-de0a-4d59-9be8-06c6ebbe6155\",\"name\":\"Mark  Mandel\",\"bio\":\"Mark Mandel is a Developer Advocate for Games for Google Cloud Platform, founder of the open source, multiplayer dedicated game server scaling project Agones, and one part of the Google Cloud Platform Podcast. Hailing from Australia, Mark built his career developing backend systems for over 15 years, writing open source software and building infrastructure in the cloud.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/D2F7L-d8E6TuxdowtkvaFCJtej9vpAOBwElPslQamOMOQdKzhcj8MOMqG1OJvzgtFOGJd6H1aAnLmcMifI9ceRE-\",\"socialLinks\":{\"GitHub\":\"https://github.com/markmandel\",\"Website\":\"https://www.compoundtheory.com/\",\"Twitter\":\"https://twitter.com/neurotic\",\"LinkedIn\":\"https://www.linkedin.com/in/marksmandel/\"}},\"a5ea4c43-eb1a-4af8-b546-56d81fdb3819\":{\"id\":\"a5ea4c43-eb1a-4af8-b546-56d81fdb3819\",\"name\":\"Markku  Lepisto\",\"bio\":\"Markku is a Cloud Solutions Architect at Google. He has worked in cloud computing for the past 10 years. Before joining Google, Markku led the cloud architecture of Nokia Siemens Networks’ global business units, and covered APAC as a technology evangelist at Amazon Web Services. He works out of Singapore, and helps developers and customers across APAC and Japan understand how to best use and architect solutions for Google Cloud. Markku is the IoT solutions lead for APAC for Google Cloud.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/bKP1j1cEbdMZhIBMEtdTXkd8rpd8LKld5sDh-caBNRKs3Y9W2vZNfcc0_CnVeNlVe-xVBONstLVZRPTkyeFw_w8\",\"socialLinks\":{\"GitHub\":\"https://github.com/lepistom\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/markkulepisto\",\"LinkedIn\":\"https://www.linkedin.com/in/markku-lepistö-470179a/\"}},\"6a3f88a8-d2ea-4f2f-88ef-a1b8f6d0c677\":{\"id\":\"6a3f88a8-d2ea-4f2f-88ef-a1b8f6d0c677\",\"name\":\"Martin Churchill\",\"bio\":\"Martin is a software engineer on Google Play. He is part of the team that brought you the Android App Bundle and Play Dynamic Delivery last year, with some exciting extensions coming this year too. Before Google, Martin did academic research on programming language modularization and semantics.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/WYSieKqs3Iim9CbE7jnnu12_MtvfuqDs85WEl2fhg__xWWMHaQCgyXuAVI7y8g_264ImrFhNoI7zuSCJUEbT62Y5gg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f40fc84d-2066-426a-ba82-76eed80d13ed\":{\"id\":\"f40fc84d-2066-426a-ba82-76eed80d13ed\",\"name\":\"Martin Gorner\",\"bio\":\"Martin is passionate about science, technology, coding, algorithms and everything in between. He graduated from Mines Paris Tech, enjoyed his first engineering years in the computer architecture group of ST Microlectronics and then spent the next 11 years shaping the nascent eBook market, starting with the Mobipocket startup, which later became the software part of the Amazon Kindle and its mobile variants. He joined Google Developer Relations in 2011 and now focuses on parallel processing and machine learning. He is also the author of the “Tensorflow without a PhD” series.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/i6nusVeqOHQdE0V6KWevl84BxTQwOcu9wnplQmu6etHMpbQFh4ztkMQaYZM6cMBMkpnAUR_l9BDWQlyxh4rraAA\",\"socialLinks\":{\"GitHub\":\"https://github.com/GoogleCloudPlatform/tensorflow-without-a-phd/\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/martin_gorner?lang=en\",\"LinkedIn\":\"\"}},\"46d34781-d48d-44c9-84ce-9b53e7e12a45\":{\"id\":\"46d34781-d48d-44c9-84ce-9b53e7e12a45\",\"name\":\"Martin  Frassl\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"e90cec21-02c8-4d7c-9044-73e1a90ac059\":{\"id\":\"e90cec21-02c8-4d7c-9044-73e1a90ac059\",\"name\":\"Martin  Splitt\",\"bio\":\"Martin is a developer advocate on the Webmaster Trends Analyst team at Google Switzerland. \\nIn this role, he helps developers and content creators to build great content on the web.\\nHe is involved with the W3C as well as the global web and JavaScript developer community, working to keep the web open.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/LfqrY3PHA_kgTSKVl7sU3MW8ygOmxkbsGXJ0DrppvjZlc_b5Kcor4zIIDL_N1wtztun_bKcgeSfQx6hhXi6vIFk\",\"socialLinks\":{\"GitHub\":\"https://github.com/avgp\",\"Website\":\"https://50linesofco.de\",\"Twitter\":\"https://twitter.com/g33konaut\",\"LinkedIn\":\"\"}},\"15601a99-013d-4f99-b1a4-517ed4b6ddc1\":{\"id\":\"15601a99-013d-4f99-b1a4-517ed4b6ddc1\",\"name\":\"Mary  Chen\",\"bio\":\"Mary is the strategy lead of developer outreach for Actions on Google. Prior to inspiring developers to build for the Google Assistant, Mary led marketing for Dialogflow, strategized go-to-market for Google Fiber, and evangelized SEO, web, and mobile best practices for Google Search. Mary concentrated in Technology and Entrepreneurship at the Haas School of Business, UC Berkeley. She enjoys hiking, rock climbing and blogging at https://marychendesign.com.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/yRbyWDaP3dwOqphU5IY1csQKsDsk0bvqGAkR3JSQeJOp4A6_AwEUxV2YDJj-VEhKFX28fhLF5FJDIwvqnom2bMYr\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://marychendesign.com\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"52514b92-7e9b-495f-8b9c-94af5224826b\":{\"id\":\"52514b92-7e9b-495f-8b9c-94af5224826b\",\"name\":\"Matej Pfajfar‎\",\"bio\":\"Matej joined Google in 2018 to lead our engineering efforts in the area of Machine Intelligence for mobile, working to help our ecosystem operate AI-first. Before Google, Matej had a successful career in the enterprise software space, particularly in the domains of risk management and insurance. In his previous position at Adacta, Matej led the development of one of the top rated core systems for the insurance industry, transforming the business from a local provider to a recognized international brand. In addition to his 15 years of experience in software engineering, Matej has a solid background in quantitative finance and actuarial sciences. Matej grew up in Slovenia and studied Computer Science at the University of Cambridge. He is a keen sailor, scuba diver and climber. In addition to his role at Google, Matej also serves as a Lego builder to two boys. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/75KkGhZgZ_is3OiGvTHkhy0kBHt_JdYm9ZTaMfk6NIe5A-lYiQS39LieBeVUWKOSjvg214MRY7zl_xI6ZgofyaM\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/mpfajfar/\"}},\"8b45e38f-4225-4aa8-9317-cb74b6cc9364\":{\"id\":\"8b45e38f-4225-4aa8-9317-cb74b6cc9364\",\"name\":\"Mathias  Bynens\",\"bio\":\"Mathias is a JavaScript whisperer on the V8 team. He focuses on evolving the ECMAScript language through TC39 and on making V8 run modern JavaScript features in an efficient manner.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/kH6hAR7ECLr1gFa8B0SdBdQRD3hxRFXquaN9tnAX9bl30G1nOEobum6RbSZrgOUAy2ZW0DXFZEsIW6bfHw9pt4c\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://mathiasbynens.be/\",\"Twitter\":\"https://twitter.com/mathias\",\"LinkedIn\":\"\"}},\"a879a947-ad10-4031-8822-b423dd4c124a\":{\"id\":\"a879a947-ad10-4031-8822-b423dd4c124a\",\"name\":\"Mathieu Chartier\",\"bio\":\"Mathieu is a software engineer working on the ART team. His specialties are startup optimization, Garbage Collection, and intermediate format optimization.\\r\\n\\r\\nBefore joining Google, Mathieu completed a degree in computer science from the University of Waterloo.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/sYBx48z4BqzO_Wg-g8JQ6w_iUQ2N0tecm5OtKm_klJs4xnL-IN_nHQ3q391ULlc1aQ24REtOQIusTegMdYnL9N6V\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"25f12554-5466-4f6b-a20e-f450c51d47fe\":{\"id\":\"25f12554-5466-4f6b-a20e-f450c51d47fe\",\"name\":\"Matt Sullivan\",\"bio\":\"Matt leads developer relations for Flutter from Google’s Mountain View campus, and has previously worked on Android and Wear OS. He’s a bit of a language geek, and has recently enjoyed picking up Dart and a little bit of Kotlin along the way. When he’s not hacking on Flutter, you’ll probably find him in the gym wearing far too many fitness sensors.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/rPz5mhqkEaVwzx0qJkwa_jKTJoqu3qAHLv4bOajxHQc9HqL1ciW_ZLXT19uQzBI8svqdiU4pyjs3uuigNgWnYpw\",\"socialLinks\":{\"GitHub\":\"https://github.com/mjohnsullivan\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/mjohnsullivan\",\"LinkedIn\":\"https://www.linkedin.com/in/mjohnsullivan/\"}},\"f9022309-8188-4e6e-a6f2-673f00cb517c\":{\"id\":\"f9022309-8188-4e6e-a6f2-673f00cb517c\",\"name\":\"Matt  Doyle\",\"bio\":\"Matt Doyle is a Principal Product Manager at Hulu where he is responsible for the streaming service’s subscriber web experience. Hulu is the leading premium streaming service offering live and on-demand TV and movies with more than 25 million subscribers in the U.S. Prior to joining  Hulu, Doyle was a Product Manager at Apple, where he worked on the Apple Store app, and international expansion projects.\",\"company\":\"Hulu\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/DwyBHAYqgG6OMiqlhF99jm2kRT3QVAms0-zAxH-P3jg0MVEe0QejDqBFDOLMvgfbbv2U-04d8HAJK59hI9IxGlk\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"5d027c44-1111-4345-b350-ff1e653a2685\":{\"id\":\"5d027c44-1111-4345-b350-ff1e653a2685\",\"name\":\"Matthew  Pegula\",\"bio\":\"Matthew is the VP of Creative Technology at Deeplocal where he leads a varied team of engineers and designers. He has had the opportunity to partner with Google on a wide variety of projects from experimental Android apps to a \\\"shoe selfie\\\" machine to the CES \\\"ride of your life.\\\"  Matthew has a BS in computer science from Allegheny College and has previously worked at Handspring and Vivisimo (now IBM).\\r\\n\",\"company\":\"Deeplocal\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/R_x1HtzgIrb39QqofKI76nfLMT0xm-SMx01j4aTxDKhWycaatgLUtMCkCLyJHC0JFAjwQ_oPizDO_wzLJHoIWLIEAg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"1cccda14-996e-4809-a27b-fc20da34649e\":{\"id\":\"1cccda14-996e-4809-a27b-fc20da34649e\",\"name\":\"Max Saltonstall\",\"bio\":\"As a Developer Advocate, Max Saltonstall tells stories about Google Cloud, how we use cloud tools inside Google, and what solutions Cloud’s many customers have created. At Google he’s worked within DoubleClick, Corporate Engineering, Staffing and the Cloud CTO Office. Max loves to juggle, eat new foods and play games of all types. He studied Computer Science and Psychology at Yale, and now lives in New York City with his partner and two children.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/euV_RipBpJQKGcqk8He3QKBJ7tjhatv2UVns65_JNxJ9sy2kM5bD_DYi3nPzvrUEu3faPRcmLdGryQP-1lgEKk4\",\"socialLinks\":{\"GitHub\":\"https://github.com/maxsaltonstall\",\"Website\":\"https://cloud.google.com/beyondcorp\",\"Twitter\":\"https://twitter.com/maxsaltonstall\",\"LinkedIn\":\"https://www.linkedin.com/in/maxsaltonstall/\"}},\"f0ce0946-7e80-4757-810b-d65f30d33312\":{\"id\":\"f0ce0946-7e80-4757-810b-d65f30d33312\",\"name\":\"Mayank  Bansal\",\"bio\":\"Mayank Bansal is a research scientist at Waymo where he leads research efforts on deep-learning for planning and prediction. Before joining Waymo in 2015, he was a principal research scientist at the Center for Vision Technologies, SRI International where he spent 11 years leading computer vision and robotics R&D programs. Mayank has a PhD in Computer & Information Sciences from the University of Pennsylvania.\",\"company\":\"Waymo\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/4veib3VGVZ1TqouP5BQ4YU1XkRWvG3v2whdFd6ulXmkS0ExkUHvFkPXjyEhhjQA3VR1L3x8lOv8ZTikTvJ7k24HS\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://mayban.firebaseapp.com/\",\"Twitter\":\"https://twitter.com/mayban\",\"LinkedIn\":\"https://www.linkedin.com/in/mayban/\"}},\"648abfcc-42bd-4207-ae94-06a8dae80da2\":{\"id\":\"648abfcc-42bd-4207-ae94-06a8dae80da2\",\"name\":\"Megha Bangalore\",\"bio\":\"Megha is the engineering lead for Firebase’s In-App Messaging and A/B Testing. \\nWith many years of experience in distributed systems infrastructure and mobile technologies, Megha has built everything from SIEM platforms to messaging systems.\\nShe focuses on helping Firebase users engage and delight their end-users. A Bay Area native, Megha received her Master of Arts in CS from Oxford University. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/huwPHvNzRSn0RA3pGFhdvZVTLFjgKNwfn8h403XueMpC4Nmp2FyavsLBXCMAQmK-Chj2G40DU0JeD7KLErAFGaw\",\"socialLinks\":{\"GitHub\":\"https://github.com/MeghaB\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/megha\",\"LinkedIn\":\"https://www.linkedin.com/in/megha-bangalore-37489922/\"}},\"6e7c2c87-5b70-432f-8836-2de7e433ac17\":{\"id\":\"6e7c2c87-5b70-432f-8836-2de7e433ac17\",\"name\":\"Mei Lu\",\"bio\":\"Mei leads UX Research with developers and consumers for Actions on Google, the developer platform for Google Assistant. Previously,  she worked at Intel and Samsung as UX or UX Research lead. Mei received PhD in Communication Studies and MS in Human Computer Interaction from University of Michigan,  and a BS in Electronic Engineering from Tsinghua University. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/kWqk8YEhT4YRihV2HBcDf-PpGoxO_xYF7JF1b9XRDV2zglcakjvmx_xOrkUOlOuvADG1pxQIk48-inrBkUKE-nw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/mei-lu-4103842/\"}},\"c7cffb2d-ce3e-4d36-9954-7328a56ac099\":{\"id\":\"c7cffb2d-ce3e-4d36-9954-7328a56ac099\",\"name\":\"Melissa Barnhart\",\"bio\":\"Melissa is a User Experience Researcher on Android, with a focus on Accessibility. Prior to Google, she worked at a London-based start-up called State.com. Melissa earned a Bachelor of Arts in Political Science from UC San Diego and a Master of Science in Urbanization and Development from the London School of Economics.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/klc9Ysz_8gUy7U_aVIGpJ_wh-Gl9iX8ohHzu23fKGnoL6m7A-HI9KLE_8bQG-KlVTs2YXKYjFvVd9abfdfg8Q5qBxg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"cd414ff1-15a5-4528-b7b7-4bd4b2f6ed63\":{\"id\":\"cd414ff1-15a5-4528-b7b7-4bd4b2f6ed63\",\"name\":\"Michael Angermann\",\"bio\":\"Michael is a technical lead and manager in Android. His team focuses on high quality location for Android users. \\r\\nMichael earned a Diplom-Ingenieur degree from the Technische Universitaet Muenchen, Germany and a Doktor-Ingenieur degree from the University of Ulm, Germany. \\r\\nPrior to Google, he was a research scientist at the Institute of Communications and Navigation at German Aerospace Center (DLR).\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MR-_VTDRV0gh7NIXDCXw2TnmqJbZSjook6IjxbA0il7kFJLj2SzEH772AMJ0CuYchbdkHVWUXlXe7b0ZVZaGd7g\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/michaelangermann/\"}},\"b709686a-d167-43ab-846d-4a770852383e\":{\"id\":\"b709686a-d167-43ab-846d-4a770852383e\",\"name\":\"Michael Bleigh\",\"bio\":\"Michael leads Firebase engineering teams including Firebase Hosting and Cloud Functions for Firebase. Michael is passionate about the web platform has been building open source and developer tools since 2008. He has presented at events including Google I/O, the Chrome Developers Summit, OSCON, and RailsConf.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ulkqve7ZsrNhvO3HNktN4YndZJXnRoKhrYzbO7spmSJwD0wyN9dUOwOz0X1ijiMgqBJloHxVU8L_JRdG91sW40WV\",\"socialLinks\":{\"GitHub\":\"https://github.com/mbleigh\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/mbleigh\",\"LinkedIn\":\"\"}},\"48b81524-6d86-411e-b027-20029f19cbc2\":{\"id\":\"48b81524-6d86-411e-b027-20029f19cbc2\",\"name\":\"Michael Gilbert\",\"bio\":\"Michael is a research lead for the Material Design system, heading up the charge to make sure all components are usable and useful to the users who would interact with them. Prior to the research world, he helped build games at Sony Online Entertainment & Monolith Productions.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/xlhWMymIun1kiae4p8GBVf94C3hXig3dGrVXoRxlBLhBC4h7jIMkf_5w89p4gHjpPMBDNnWhhUKqpuiH1YipVvs\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f0129e5e-3df7-4317-a3da-ab24a39550e7\":{\"id\":\"f0129e5e-3df7-4317-a3da-ab24a39550e7\",\"name\":\"Michael  Brenner\",\"bio\":\"Michael Brenner is a Research Scientist on the Google Accelerated Science team and is also the Michael T. Cronin Professor of Applied Mathematics and Professor of Physics at Harvard University.  His research uses mathematics to examine a wide variety of problems in science and engineering, ranging from understanding fluid turbulence to understanding the principles for designing materials that assemble themselves to understanding the shapes of bird beaks. In a previous life, he developed the popular Harvard class on Science and cooking, together with chef Ferran Adria. At Google, in addition to Euphonia, his focus is on using recent developments in machine learning to catalyze scientific discovery.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ovcjLCE7CiL9gxZdoL5wACyPumsrxvK142GY8MgztxhsygJgdNayrvh6mYLAHyE7dSQRwEdm5hlj5_pLd0W5Ir4lVA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"53a5d957-4603-4b11-82eb-41c2a57dcd50\":{\"id\":\"53a5d957-4603-4b11-82eb-41c2a57dcd50\",\"name\":\"Michele Turner\",\"bio\":\"Michele has over 20 years of experience in high-tech product development. She currently leads Smart Home Ecosystem Product Management for Google Assistant and Google Home. Prior to this, she was the General Manager of the Nest Home Security Product line, and also ran Software Product Management. Before going to Nest, Michele was CEO of Dictionary.com, a top 100 web property that serves over 70 million unique users monthly, where she grew users and revenue 20% in less than 2 years. Michele was chief product officer at mBlox, the leading brand-to-consumer mobile engagement platform. She joined Adobe in 2006 as vice president of the Platform Business Unit, where she was responsible for product management and developer relations for the Adobe Flash Platform. Additionally she served as vice president of product management and Design at Netflix, and senior vice president of product management at AOL, where she helped drive product strategy, definition and delivery of AOL's Advanced Communications, Personalization, Mobile and Netscape product lines. She was also senior vice president of product at Excite@Home. Michele holds an M.B.A in Marketing and Finance from Santa Clara University’s Leavey School of Business.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/bWBC6hvWeIk4tEyPHv-Ff0yrJI8_FHI0CeFzFl5TspxN_zJA9pPAbROplbVirzD6qYMUXtfENwe53jvI6I9Alj6Iqg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/micheleturner/\"}},\"4949f60c-f35f-47f1-858c-50f9471c1c4b\":{\"id\":\"4949f60c-f35f-47f1-858c-50f9471c1c4b\",\"name\":\"Michelle Alvarez\",\"bio\":\"Michelle Alvarez is a senior designer at Google, primarily focused on Material Design layout and typography. Over the past few years they have been working on Material Theming, a capability that allows teams to systematically express brand across products. Prior to Google they studied Graphic Design at the School of Visual Arts.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ui91oFUvPVqJbL1-FhG81jeG6BEVp2ooneD0nR6DZov1qdi3sFZn3f5zEl2Bsw5PsKnyY9VWxLoeckHb79-wqEBUsg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/michalva/\"}},\"cb12f464-c1a5-4c32-a7ff-9c1d6da4530c\":{\"id\":\"cb12f464-c1a5-4c32-a7ff-9c1d6da4530c\",\"name\":\"Mickey  Kataria\",\"bio\":\"Mickey Kataria is the Director of Product Management for Android Auto.  He joined Google in 2002 and has been leading several automotive and mapping initiatives for 10+ years.  He's based in Mountain View and has also worked for Google in Zurich, Switzerland and Sydney, Australia.  Prior to Google, he worked at Inktomi and Hewlett-Packard.  He graduated from Yale University with degrees in Computer Science and Economics.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/GHcKg_zq2tYuG9aD3kIYaXSVBr-agNAe_o8dk6nY1QnRIR3YmYEYxGm_S4AzPcMIMVkX1iaxpmuND1RvS5c7emQC\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/mickey\"}},\"da63ff58-4e6d-45b8-919c-8e7355a0799e\":{\"id\":\"da63ff58-4e6d-45b8-919c-8e7355a0799e\",\"name\":\"Mike Digman\",\"bio\":\"Mike is a Senior UX Engineer that kickstarts, designs, prototypes and builds projects across the Android OS. At Google, Mike has been the lead UX Engineer on share sheet in Android Q, changes to rotation and volume in Android P, Fast Pair and Android Auto. Before Google, he worked at Samsung Research on prototyping novel UX through software and hardware. Mike has an MS from Stanford University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/V4nX7ZhzoduowCk8CIOUIY3VKpiqLUKe2DDLDSuYRyC8ozC4nfeTETYehn5WhPlhOte3m4rYHyXIlJJkQpGvihhkMg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://mdigman.com/\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/mdigman\"}},\"edfd5dcd-f8c0-4163-939a-45ef6c276db1\":{\"id\":\"edfd5dcd-f8c0-4163-939a-45ef6c276db1\",\"name\":\"Mike McDonald\",\"bio\":\"Mike helps developers build better mobile and web apps as a product manager on the Firebase team. Mike has been working on Firebase for four years, and has worked developing iOS apps at the Omni Group and building microprocessors at Texas Instruments. In his free time, he enjoys spending time in the outdoors, cooking, and hacking on embedded hardware.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/54SOFv4y-iWNGDpol0dtyTIiJ3Me0ui4WRTYmDOM7PtDr9YSOagvx6ZgN385OEHm1-J2WwmS0QbxrcsbLEslIJFe\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"c279625f-ca4b-47b3-af1f-8d8618efbc6c\":{\"id\":\"c279625f-ca4b-47b3-af1f-8d8618efbc6c\",\"name\":\"Mike  Bendersky\",\"bio\":\"Michael Bendersky is a Senior Staff Software Engineer at Google AI. He is currently managing a research group focusing on applying machine learning to content search and discovery, including ranking and query and document understanding. Michael holds a Ph.D. from the University of Massachusetts Amherst, and a B.Sc. and M.Sc. from the Technion, Israel Institute of Technology. Michael published over 30 papers at SIGIR, WSDM, WWW, KDD, ACL, CIKM, and other academic conferences. He is the co-author of the book, \\\"Information Retrieval with Verbose Queries\\\" in the \\\"Foundations and Trends in Information Retrieval\\\" series, and the co-organizer of the SIGIR 2015 tutorial on this topic.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/S_5LvSVJpMJDy-7nPyBF_FXhW3EO3OG-5KmtCuPO2ERX5pacdr5qyrxtOxSKOf-quEaVF3ncbXmT3AIXWASUGxCX\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/bemikelive\",\"LinkedIn\":\"https://www.linkedin.com/in/bemike/\"}},\"49bff16c-e880-4e0e-beff-7f4d7b774a99\":{\"id\":\"49bff16c-e880-4e0e-beff-7f4d7b774a99\",\"name\":\"Milena Nikolic\",\"bio\":\"Milena is an Engineering Director leading Play Console and app distribution efforts. She's based in London, and has been at Google for 10 years working on a number of different products. Milena enjoys building happy and productive engineering organizations, and exciting products for app developers and users.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/7LXQCl_lXEG6IhuQklJaMZfFXek6Jq2D3wO6M_tnN-xZeJaPoq68tZ6BaeBeorK0CNL-9vnJCUnmvnLYuf8gfnKENg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/nikolicmilena\",\"LinkedIn\":\"https://www.linkedin.com/in/milena-nikolic-015748117/\"}},\"1f84b8f9-aa58-41ca-b4c9-759750181065\":{\"id\":\"1f84b8f9-aa58-41ca-b4c9-759750181065\",\"name\":\"Mindy Brooks\",\"bio\":\"Mindy is the User Experience Lead for Google Play and Google’s kids and family initiative. Her kids and family team focuses on designing technology that meets the needs of families around the world, and helps other teams understand developmental principles for families that help drive product design and vision. Mindy spent more than six years at Sesame Street, most recently as Director of Content and Innovation Research. She also was the first consumer insights researcher at Netflix to focus on kids and family. Mindy has a BA in Psychology and a MA in Applied Developmental and Educational psychology from New York University. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Z-SiJKXb67V7epLVS1LtW36uEqimXsOfPw-0St56hUKniJoCXbu5NdD5rqfkHG0riOFVeq3pHjqDqHa4ZTR8GsDP\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"84de63e7-8428-4c05-8bc3-d7491c350bea\":{\"id\":\"84de63e7-8428-4c05-8bc3-d7491c350bea\",\"name\":\"Minko  Gechev\",\"bio\":\"Minko is an engineer in the Angular team at Google. He is working on compilers, tools for static code analysis, and machine learning. Some of his projects are the Guess.js, codelyzer, the official Angular style guide, the Go linter revive, and many others. Minko received awards from the President of Bulgaria for his impactful open source projects.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/KscJVQ7h43BOf7QPptWSuuDu2seOhJzoiDaEUgRaqPpWx2n3uVsarSmUQeAN7TzTvnJKDoPJpV7SOdm7_tNpzzc1yQ\",\"socialLinks\":{\"GitHub\":\"https://github.com/mgechev\",\"Website\":\"https://blog.mgechev.com\",\"Twitter\":\"https://twitter.com/mgechev\",\"LinkedIn\":\"https://www.linkedin.com/in/mgechev\"}},\"5ef5f951-ac6a-48ac-99ba-b1496e641548\":{\"id\":\"5ef5f951-ac6a-48ac-99ba-b1496e641548\",\"name\":\"Moustaphe  Cisse\",\"bio\":\"Moustapha Cisse is a research scientist at Google where he leads the AI center in Accra, Ghana. He works on foundational aspects of machine learning to build a fair, transparent and reliable machine intelligence for the benefit of humanity. Moustapha is also a professor of machine learning at the African Institute of Mathematical Sciences where he founded the AMMI master program bringing the best of AI education in Africa. Previously, he was a research scientist at Facebook AI research. He completed his Ph.D. at University Pierre et Marie Curie in Paris, France. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/jN2DOy3LX57VgDG5qkF0w0XuDytcQaMAZuowT1pzG54a0jyzjQj7xxSiMaAbFyuhKvHtSfKfZdekCrrQ31GdnBFp\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/Moustapha_6C\",\"LinkedIn\":\"https://www.linkedin.com/in/moustapha-cisse/\"}},\"6ca68646-7d53-4355-a3d7-11e2aa081dd3\":{\"id\":\"6ca68646-7d53-4355-a3d7-11e2aa081dd3\",\"name\":\"Myles Borins\",\"bio\":\"Myles Borins is a developer, musician, artist, and maker. He works for Google as a developer advocate serving the Node.js ecosystem. Myles cares about the open web and healthy communities.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/QrUzg4H_N6dXJxtnUo3_dXNbE8Q6TTg-HdrY06z0r_uqlVVcrsowIhw0Efgl2C0rO7Be5Ksj4RWa_iNSEbAE_-k\",\"socialLinks\":{\"GitHub\":\"https://github.com/mylesborins\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/MylesBorins\",\"LinkedIn\":\"\"}},\"57676e95-f331-4b20-b66a-7ae99ce0da6b\":{\"id\":\"57676e95-f331-4b20-b66a-7ae99ce0da6b\",\"name\":\"Naina Raisinghani\",\"bio\":\"Naina Raisinghani is a Product Manager on the AMP Project. She focuses on helping AMP engineers build great components that are delightful and easy to use. She previously spent 2 years as a Software Engineer on the Chrome team working on making the rendering engine pixel perfect. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/-f5JEv84j8MJ5ZaX-AsOzjvs0uxXtNN7V7Lo_ucWS9GZxdg3wtaH_n_yrvCJ0J1T3OaBn1pyMq2IkFz075zBinU\",\"socialLinks\":{\"GitHub\":\"https://github.com/nainar\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/nainar92\",\"LinkedIn\":\"\"}},\"9970b6dd-4416-4302-808f-d8071cb4819f\":{\"id\":\"9970b6dd-4416-4302-808f-d8071cb4819f\",\"name\":\"Naomi Makofsky\",\"bio\":\"Naomi Makofsky works on Global Product Partnerships for the Google Assistant. Her focus is on launching new platform capabilities, helping developers with discovery and reengagement, and delivering great user experiences. Naomi studied Organizational Studies and Psychology at the University of Michigan. She currently resides in NYC.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/v3nMly_vYiQ1bITLelNBusiq3UEghCf1hk-K3gR_HvGjvt-3a1cfV-3ufy_5FLUmp65ff921KaawExifi0TA-hg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/naomak\",\"LinkedIn\":\"https://www.linkedin.com/in/naomimakofsky/\"}},\"4df504e8-a24e-4ca9-9965-e11022e96b56\":{\"id\":\"4df504e8-a24e-4ca9-9965-e11022e96b56\",\"name\":\"Naomi Seyfer\",\"bio\":\"Naomi spends her time making it easy to develop for the cloud and run code there. She is the tech lead for serverless command-line developer experience at Google, and the co-lead of the Knative client working group. Previously, she has worked at Dropbox, Meteor, and StreamBase Systems. Naomi holds SB and MEng degrees from the Massachusetts Institute of Technology.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"39429ef0-b2e2-4427-b875-0f6f69325024\":{\"id\":\"39429ef0-b2e2-4427-b875-0f6f69325024\",\"name\":\"Nazirini  Siraji\",\"bio\":\"\",\"company\":\"\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"0f0a2117-7e78-4b84-b92f-9fbaef7e7ef5\":{\"id\":\"0f0a2117-7e78-4b84-b92f-9fbaef7e7ef5\",\"name\":\"Nicholas  Thompson\",\"bio\":\"Nicholas Thompson is the editor-in-chief of WIRED, a position he has held since January 2017. Under his leadership, WIRED has broken massive, and much-lauded, stories about Facebook, cyber-warfare, the Robert Mueller investigation, and numerous other topics. It has launched a successful paywall and been named one of Ad Age's A- List digital publishers. It has also won a National Magazine Award for design and photography, a Shorty award, and a variety of awards from the Society of Publication Designers. Thompson is a contributor for CBS News and regularly appears on CBS This Morning and CBSN. He is a cofounder of The Atavist, a National Magazine Award– winning digital publication. Prior to joining WIRED, Thompson served as editor of NewYorker.com from 2012 to 2017. Before The New Yorker, Thompson was a senior editor at WIRED, where he assigned and edited the feature story “The Great Escape,” which was the basis for the Oscar-winning film Argo. In 2009, his book “The Hawk and the Dove: Paul Nitze, George Kennan, and the History of the Cold War” was published to critical acclaim. Thompson is a member of the Council on Foreign Relations and a former fellow in the American Strategy Program at the New America Foundation. He was a United States Truman Scholar and graduated from Stanford University. \",\"company\":\"Wired\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MELA5jXnUwp9Gesrdu_VKLmiMag-z0rOg8kZzg7wdISkwdMu1l2-0WyzBF63IF8DZD5R_naXV02tTtghsDYygmfVPw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/nxthompson\",\"LinkedIn\":\"https://www.linkedin.com/in/nicholasxthompson/\"}},\"622c536f-87b0-4562-a726-3c770097867b\":{\"id\":\"622c536f-87b0-4562-a726-3c770097867b\",\"name\":\"Nick Butcher\",\"bio\":\"Nick is an Android designer & developer who helps other designers and developers to understand and create beautiful material design apps.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/pTmJ3noCEz7MpoN6ME1yT5ovt4XurhfZdqWfpGnfPWGB-M6D-Oax4oe13AJaFOI7jD-6TBVR4goqB8FU_NoOUlk\",\"socialLinks\":{\"GitHub\":\"https://github.com/nickbutcher/\",\"Website\":\"https://medium.com/@crafty\",\"Twitter\":\"https://twitter.com/crafty\",\"LinkedIn\":\"\"}},\"4d2a991c-3423-40b4-8005-1819573ca536\":{\"id\":\"4d2a991c-3423-40b4-8005-1819573ca536\",\"name\":\"Nicolas Roard\",\"bio\":\"Nicolas is the technical lead for the Android Studio Design Tools and the ConstraintLayout library. Previously, he worked on Robots at Google, the Android photo editor, and the Android browser.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"584d157f-aa92-44ef-b13f-aeee8fd56257\":{\"id\":\"584d157f-aa92-44ef-b13f-aeee8fd56257\",\"name\":\"Nicole Sullivan\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"dc5e2e21-79c6-41a5-b517-d0f84d998cce\":{\"id\":\"dc5e2e21-79c6-41a5-b517-d0f84d998cce\",\"name\":\"Nsubuga  Hassan\",\"bio\":\"\",\"company\":\"\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"e755b0a5-eb5d-4703-8c20-5999d9ef7cf2\":{\"id\":\"e755b0a5-eb5d-4703-8c20-5999d9ef7cf2\",\"name\":\"Oscar  Prom\",\"bio\":\"Oscar is an innovative, highly accomplished software engineer who leads the team of developers at Deeplocal. He has worked on award-winning projects such as Google Home Mini Golf, Assistant SDK Mocktails Mixer, and Google Home Mini Donut Shop. Previously, Oscar did work for BMW Manufacturing and the University of Pittsburgh, his alma mater where he received a degree in Computer Engineering.\",\"company\":\"Deeplocal\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/TNC-zExiG4VBbS6_BEH4vJJIrfPO4SUDiYV1u0vZQUkgCyz8mmZmf-PNVjNmftdTryeFvsdR77rwUh8LMrM1N6GA4g\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"3a790adf-950c-4808-a662-e792a79ae3cc\":{\"id\":\"3a790adf-950c-4808-a662-e792a79ae3cc\",\"name\":\"Owen Lin\",\"bio\":\"Owen is a product manager for Actions on Google. In this role, he focuses on Actions Quality and Triggering. Owen has a bachelor's degree and master's degree from MIT and an MBA from Harvard Business School. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/91QaN4AsFO3uf8YBPKu8NNTAyku3Vmd-PnXxmUxdnnps0XL692Cl5ZLCmqJaXCBzWN1n-jQVW7Tgu_wcIkAIXsr-5g\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"57143961-b19e-4e9d-99f9-2b86ff387b7a\":{\"id\":\"57143961-b19e-4e9d-99f9-2b86ff387b7a\",\"name\":\"Paige  Bailey\",\"bio\":\"Paige Bailey is a TensorFlow Developer Advocate at Google.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/7A9pITIS5KH-1mg_e9UCqe4m61TVeJ666PT7mIkjMjR6WhUrdjI6Ha3vlmSe8VeZGw8TUTxZaCIadBek_bY6eNuIow\",\"socialLinks\":{\"GitHub\":\"https://www.github.com/dynamicwebpaige\",\"Website\":\"https://paigevie.ws\",\"Twitter\":\"https://www.twitter.com/dynamicwebpaige\",\"LinkedIn\":\"https://www.linkedin.com/in/dynamicwebpaige\"}},\"3298ea15-ffa1-49d8-9125-3eb52d9a9f2b\":{\"id\":\"3298ea15-ffa1-49d8-9125-3eb52d9a9f2b\",\"name\":\"Patrick Martin\",\"bio\":\"Patrick a Developer Advocate on Google's Firebase with a focus on game development using Firebase. Prior to joining Google, he worked in mobile games and connected smart toys. He's credited on games such as Monopoly for the iPad, Ninjatown: Climber, and Space Miner: Space Ore Bust. Toys he's worked on include Sphero, Star Wars BB-8, and Sphero's RVR. Patrick has a bachelor's degree in Real Time Interactive Simulations from the DigiPen Institute of Technology.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/i35gEnLoijq6jI4Es3yIhsti67RXQxiGXrjJCshXB4xuWoy0wpu6AEp1IynQKRfX4CF7V0YerFZ6XHlwB94Ja74\",\"socialLinks\":{\"GitHub\":\"https://github.com/patm1987\",\"Website\":\"https://www.pux0r3.com/\",\"Twitter\":\"https://twitter.com/pux0r3\",\"LinkedIn\":\"https://www.linkedin.com/in/patrick-martin-268a85a/\"}},\"3d42e5a2-5094-472a-9210-20747b7fab5a\":{\"id\":\"3d42e5a2-5094-472a-9210-20747b7fab5a\",\"name\":\"Paul Covell\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"ec425175-cf82-43bd-9cc1-f3a7d07f2cd7\":{\"id\":\"ec425175-cf82-43bd-9cc1-f3a7d07f2cd7\",\"name\":\"Paul Irish\",\"bio\":\"Paul wants to make it clear and easy for developers to improve their web performance.\",\"company\":\"\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/hlNL53FHLS-U-dV2iPSQyKzv2Al2A_uODgXqUqXjoVKTCKbWeKTLJDcHOaFF1-jB3xJ5Trm9S6MNgJKoJ_-tjMPM2w\",\"socialLinks\":{\"GitHub\":\"https://github.com/paulirish\",\"Website\":\"https://paul.irish\",\"Twitter\":\"https://twitter.com/paul_irish\",\"LinkedIn\":\"\"}},\"dc9a17b8-ba6d-4b02-baf6-76849aaf586f\":{\"id\":\"dc9a17b8-ba6d-4b02-baf6-76849aaf586f\",\"name\":\"Paul \",\"bio\":\"Paul is a software engineer on the Chrome team. He works on front end code, and has a particular focus on creating performant PWAs with high-end UI & UX.\",\"company\":\"\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/K1pEeewVwFCebbeVYVInHvtk0b9K4Izl4dy2MIMln9B6jy3XMpIVZUD72-p1fJNXQQI80Khm04Vm0YQ-7mfmQirs\",\"socialLinks\":{\"GitHub\":\"https://github.com/paullewis\",\"Website\":\"https://aerotwist.com\",\"Twitter\":\"https://twitter.com/aerotwist\",\"LinkedIn\":\"\"}},\"30ed51b5-8ecd-41a3-b964-1c2356e8a0f0\":{\"id\":\"30ed51b5-8ecd-41a3-b964-1c2356e8a0f0\",\"name\":\"Paul  Bankhead \",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"7a40c099-6a14-4171-b183-535a844d1bdc\":{\"id\":\"7a40c099-6a14-4171-b183-535a844d1bdc\",\"name\":\"Pete LePage\",\"bio\":\"Pete is a developer advocate on the Web team at Google, helping web developers build the next generation of Web Apps. He likes taking the sharp edges off bleeding edge technologies and making it easy for developers to use them.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MmCP7O17_ZjeXvYaew2ycKJ-aGKbMpxybgI4JALXvTwdXXUI_sojjFtnH-iNMDqrPAmrfCiOj5glbBLemYMQexc\",\"socialLinks\":{\"GitHub\":\"https://github.com/petele\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/petele\",\"LinkedIn\":\"\"}},\"8825f231-9859-48b7-85b3-89fbbee5891e\":{\"id\":\"8825f231-9859-48b7-85b3-89fbbee5891e\",\"name\":\"Peter McLachlan\",\"bio\":\"Peter is a product manager on the Chrome team. In this role, he focuses on mobile progressive web apps and web platform strategy for mobile.  \\r\\n\\r\\nPrior to Google, Peter was the Chief Product Officer and co-founder of Mobify, a front-end as a service platform for enterprise commerce. \\r\\n\\r\\nPeter holds a BA honours degree in philosophy & computer science from Queen's University and a MSc in computer science from the University of British Columbia. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/CIRP117DzNO-8xaIMShMqic81WoZDbXzRZhvBO74sJbuzpbit0wStM7V46DjM-kBHgQC5yR-Feyx3EzNMWTRjO0H\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/b1tr0t\",\"LinkedIn\":\"https://www.linkedin.com/in/petermclachlan/\"}},\"18cd44e0-6996-482f-924b-dbf55f03cd69\":{\"id\":\"18cd44e0-6996-482f-924b-dbf55f03cd69\",\"name\":\"Phil Weaver\",\"bio\":\"Phil leads engineering for Android accessibility. He has worked on several releases of the Android framework, and created the Switch Access accessibility service. Phil received his MS from the University of California at Berkeley.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/WH6Bn1azwWUenNZGaR-6fFJKW9zLsrtWPAQCpbZBhkfjxKA8DkgjvyX2_j1AO1EXcEiCW89gL1aTqq3vR4xsN78q\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/phil-weaver-4407784\"}},\"564b7964-2f8c-48b8-aa08-14d828e3eb63\":{\"id\":\"564b7964-2f8c-48b8-aa08-14d828e3eb63\",\"name\":\"Philip Walton\",\"bio\":\"Philip Walton is an engineer on the Chrome team focusing on web performance. He's a member of the W3C WebPerf Working Group and the performance metrics team at Google that works to identify and define user-centric performance metrics for the web.\\r\\n\\r\\nPhilip has been doing web development professionally for almost 15 years, on both large and small teams. He likes to write and speak about new web technologies, and he's authored and contributed to numerous open source libraries and tools that help developers use the best parts of the web today.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/vtREKRqQZCtikkOFluSlznUpVQJMGSaqjz95xiUb3Og7fbTqOKjWaz6TFprk7leKmeQfYm2YfDtDR6OhGyAvCSKP\",\"socialLinks\":{\"GitHub\":\"https://github.com/philipwalton\",\"Website\":\"https://philipwalton.com\",\"Twitter\":\"https://twitter.com/philwalton\",\"LinkedIn\":\"\"}},\"aafd96a3-3685-46fd-8eb7-465654dd3422\":{\"id\":\"aafd96a3-3685-46fd-8eb7-465654dd3422\",\"name\":\"Philippe Cao\",\"bio\":\"Philippe Cao is a senior visual designer for Material Design. He studied Graphic Design at the Rhode Island School of Design.  \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/1fMXf7nisaFqddLGOv4O9-o4PzXdlPbSWu0Xq8FswFozkArt15vRKnulHZ8MzMirygWjasDAGOhN7Og0KiBp-6xo\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"19d93e51-8de1-458e-8b3d-4e2c3ee4bea7\":{\"id\":\"19d93e51-8de1-458e-8b3d-4e2c3ee4bea7\",\"name\":\"Pierre Lecesne\",\"bio\":\"Pierre has worked at Google for 8 years, including 4 years on the Google Play Console. His recent projects include work on App Signing by Google Play and the Android App Bundle. Pierre has earned a double degree in Computer Science from Telecom ParisTech (Paris, France) and the Pontifícia Universidade Católica (Rio de Janeiro, Brazil).\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/gSDiG-Am7WXPWg0WtV2oComWTlcOmf680Pg78OZ_55JIfepBUUMLlOzIK03w_TAuu6I3N2D56CgHkn8W-4qBTSBnhQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"98864cbc-20f4-420f-9e5c-a48f25684050\":{\"id\":\"98864cbc-20f4-420f-9e5c-a48f25684050\",\"name\":\"Praveen Chandran\",\"bio\":\"Praveen is the product manager for Android Location services.  Prior to joining Android, he had worked at PayPal, McAfee and SurveyMonkey.  Praveen received a Master’s degree in business administration from the Haas School of Business, University of California Berkeley and a bachelor’s degree in engineering from Mepco Schlenk, Madurai Kamaraj University in India.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/hdthmFMW2pYowwPbGhA-3PuF-kHrU6Sjv7p9FOTUKcS9jP7bOAQczVjpREtDTmvUzPqQ-wh4Lj2zjIV8CaR91oV2-A\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/chandranpraveen\"}},\"10abb09f-ca10-43c4-acf0-c9fbd7f8d80c\":{\"id\":\"10abb09f-ca10-43c4-acf0-c9fbd7f8d80c\",\"name\":\"Purnima Kochikar\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f875d073-d4b5-44e6-86b0-dcae3f35384f\":{\"id\":\"f875d073-d4b5-44e6-86b0-dcae3f35384f\",\"name\":\"Rachel Been\",\"bio\":\"Rachel is the Creative Director for the Material Design team at Google where she oversees the evolution of the design system for both Google and the greater developer/designer community. Additionally, Rachel has launched the first product imagery system for Google, served as the first creative director of Emojis, and was the first Art Director on Google Play, introducing editorial design and original imagery to the store. Prior to Google, Rachel was the Creative Director of Billboard.com where she redefined the iconic music publication through original photography, art direction, and design.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/99bvJMgT-sMlfMjLXOAxvVjTEc9nTemGeEGbl_Q6e1H_iHg_UQop6lqs2Rmx3qRPb5WN9FdFdZQyMXeqR3ft075DaQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/rachel-been-a9000a3/\"}},\"71ceb9b2-af3b-40c2-a2f9-075cc75fee76\":{\"id\":\"71ceb9b2-af3b-40c2-a2f9-075cc75fee76\",\"name\":\"Rachel  Inman\",\"bio\":\"Rachel is a design lead with an ever-present optimism and knack for cross-functional collaboration. She drives a diverse set of innovative projects across Google Maps, currently focussed on designing Maps experiences that leverage augmented reality. Previously, Rachel designed interactive experiences for Google Earth, Project Sunroof, Google Earth Outreach, Google Apply, Nike, Samsung, and LG Electronics. For the past 5 years, she's also enjoyed teaching design classes in Mexico City, Barcelona, New York City, and Moscow. She's been honored to speak about her work on stage at IxDA's Interaction South America, Strelka Institute for Media, Architecture & Design, and San Francisco's GIS Day.\\n\\nRachel earned a bachelor's degree in industrial design with an emphasis on interaction and urban design from Carnegie Mellon University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/6nqVQDOuRlV1WJSPKARTnIbdSlYBQu1Kcq-4VYzU7sS4mF6iBHM3-LaIqzmMX2UeiDYTGdssA3ZnE9mWdCABz48M\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://rachelinman.design/\",\"Twitter\":\"https://twitter.com/rachel_inman\",\"LinkedIn\":\"https://www.linkedin.com/in/rachelinman/\"}},\"cbfd16d2-1987-497a-a5e0-fce86c123a75\":{\"id\":\"cbfd16d2-1987-497a-a5e0-fce86c123a75\",\"name\":\"Rachel  Myers\",\"bio\":\"Rachel is an engineer on Firebase Security Rules, Cloud Eventing, and Cloud Policy, where she focuses on helping developers build secure systems that protect users’ privacy. She contributes to the Cloud Native Computing Foundation on cloud native privacy and CloudEvents. Before joining Google, Rachel founded Opsolutely, and was an engineer at GitHub.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/cY20mduMsW8jDbUv8LQ7yUAI197aCq28hab2nsKMvP7SoaMfs9GuIrYcj8UBbx_ahYNgKhiXaj17UKEyndsvxJXc\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"09237444-de8c-4025-971f-f22199fcdad1\":{\"id\":\"09237444-de8c-4025-971f-f22199fcdad1\",\"name\":\"Rajeev Kumar\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"ba58e5da-fa63-4199-a00d-1b558b79aad2\":{\"id\":\"ba58e5da-fa63-4199-a00d-1b558b79aad2\",\"name\":\"Ranjith  Kagathi Ananda\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"c99d396d-acb3-4cfe-8fbe-a1ce3a451001\":{\"id\":\"c99d396d-acb3-4cfe-8fbe-a1ce3a451001\",\"name\":\"Ray Tsang\",\"bio\":\"Ray is a Developer Advocate for the Google Cloud Platform and a Java Champion. Ray has extensive hands on cross-industry enterprise systems integration delivery and management experiences during his time at Accenture, managed full stack application development, DevOps. Ray specialized in middleware, big data, and PaaS products during his time at Red Hat while contributing to open source projects, such as Infinispan. Aside from technology, Ray enjoys traveling and adventures.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/JwIZauUUwhd8zMJPCSrhau5hJOeQyxKue5uPDTRx8v1VYNiIcGwmGa0AV0tvuoA5bYYXq7e5eTGvEPtSJw0QhxyRPw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/saturnism\",\"LinkedIn\":\"https://www.linkedin.com/in/rayjtsang/\"}},\"89522fd6-5342-4aeb-8d54-033a9699dc2c\":{\"id\":\"89522fd6-5342-4aeb-8d54-033a9699dc2c\",\"name\":\"René Mayrhofer\",\"bio\":\"René Mayrhofer is currently heading the Android Platform Security team and tries to make recent advances in usable, mobile security available to the Billions of Android users. He is on leave from the Institute of Networks and Security at Johannes Kepler University Linz (JKU), Austria, where he continues to supervise PhD and Master students. He received Dipl.-Ing. (MSc) and Dr. techn. (PhD) degrees from Johannes Kepler University Linz, Austria and his Venia Docendi for Applied Computer Science from University of Vienna, Austria.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/CRmeltkIFOFKhx8509lQTPPUKCHZjsyqAd_8BeAIGl_9tswgebVEqOV5k_a03IFwlQWLlOQ6FiXsunen5QeAU5eOTA\",\"socialLinks\":{\"GitHub\":\"https://github.com/rmayr\",\"Website\":\"https://ai.google/research/people/ReneMayrhofer\",\"Twitter\":\"https://twitter.com/rene_mobile\",\"LinkedIn\":\"\"}},\"5512e4b4-3c24-4d74-b8b8-df6bdd7fce23\":{\"id\":\"5512e4b4-3c24-4d74-b8b8-df6bdd7fce23\",\"name\":\"Ricardo Garcia\",\"bio\":\"Ricardo Garcia (rago) is a Staff Software Engineer in Android Audio Framework team and Tech Lead of Sound Amplifier project. He holds a BSEE from his native Colombia and two MS in Music Engineering (U. of Miami) and Media Arts & Sciences (MIT). Has worked on low bitrate audio codecs (Chaoticom), audio watermarking, psychoacoustic models, genetic programming, hearing health and Founded Base 10 Labs.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/L8lPbCcDm285dtupjqqUq1TTdNH36utXx7D5RYxLieYmUYkTKoioZsQULmr8yVZ0YqDCxK5mNugzIbjVyUT8U-SJMg\",\"socialLinks\":{\"GitHub\":\"https://github.com/ragomusic\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ragomusic\",\"LinkedIn\":\"https://www.linkedin.com/in/ragomusic/\"}},\"77f8f9e4-f907-4205-acbd-2fde4785a539\":{\"id\":\"77f8f9e4-f907-4205-acbd-2fde4785a539\",\"name\":\"Ricardo  Cabello \",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"9ea22c0f-7435-4124-adf5-18faf3a89629\":{\"id\":\"9ea22c0f-7435-4124-adf5-18faf3a89629\",\"name\":\"Richard Wei\",\"bio\":\"Richard Wei is a software engineer at Google Brain, and is a founding member of the Swift for TensorFlow project. He leads the effort of making first-class differentiable programming in Swift possible and designing idiomatic Swift APIs for machine learning. Before joining Google in 2017, Richard received a bachelor's degree from University of Illinois.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/uZ5_-LTXplKCUcssRFesjJiC5y94qpbRB6fctJ4bR57HcKKhCUz4z6NniX1yJ_1bSzkyviH-rVb2IcOcEwU51Hd7\",\"socialLinks\":{\"GitHub\":\"https://github.com/rxwei\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/rxwei\",\"LinkedIn\":\"\"}},\"78720c1e-ca15-4bb9-9783-4e4ccfd939f8\":{\"id\":\"78720c1e-ca15-4bb9-9783-4e4ccfd939f8\",\"name\":\"Rob McCool\",\"bio\":\"Rob McCool is the technical lead for Google's cloud gaming platform. He has nearly 25 years experience developing high performance networked software and has been working on game streaming since 2007.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/JNMXuYDyPw4Vxn8eZbubmBKQ3Xu-vYmo2AYrJ-EtyHec8QIgswj71OcKWExdPX67VzK72F7V_Ctj50i3LhRvx3ek\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"c661dcd4-c92d-4d1c-b52b-3d45869d4883\":{\"id\":\"c661dcd4-c92d-4d1c-b52b-3d45869d4883\",\"name\":\"Robert Kubis\",\"bio\":\"\",\"company\":\"\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"b861cef5-06ef-42e9-bc5f-eaf5325985da\":{\"id\":\"b861cef5-06ef-42e9-bc5f-eaf5325985da\",\"name\":\"Roberto Perez\",\"bio\":\"As tech lead for the developer story team in Android Automotive, Roberto works on expanding Android libraries, tooling, and documentation to support application development on this new form-factor. Prior to Google, Roberto worked as a staff software engineer at Medallia Inc., where he led the development of their flagship mobile application. Roberto earned his bachelor's degree in Systems Analysis at Universidad Tecnológica Nacional at Rosario, Argentina.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/-2T5kI55Y26X-TusX-I0s9kdGM0JnlhSJ0pmxi6kKMnTA8PY1qNprARvVSC_ylqCxe5FoOR6xkePn4DwPFPIJSXT\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/raperez/\"}},\"daf7c371-b75e-4f2f-b454-ba36100d21ec\":{\"id\":\"daf7c371-b75e-4f2f-b454-ba36100d21ec\",\"name\":\"Rohan Shah\",\"bio\":\"Rohan is a product manager at Google on the Android System UI team, with prior experience working with Android development on the Android Gmail team. He received his bachelor's degree in computer science at the University of Illinois at Urbana-Champaign.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dOeNpo4GFjl8zlQh5WgQNA7lwAWS9d_8ZvArIenTbDdxRa8rC2_wDztPByndIBDOgMDSFWXEwNkOas-R1wOhNUrD\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/rohankshah/\"}},\"4f440a3c-2c3b-471f-9968-5ed08a2000c1\":{\"id\":\"4f440a3c-2c3b-471f-9968-5ed08a2000c1\",\"name\":\"Roland Levillain\",\"bio\":\"Roland is a software engineer in the Android Runtime (ART) Team. Within the ART Team, he's been working on the runtime's optimizing compiler and its concurrent copying garbage collector. He's also involved in ART's modularization and updatability efforts. Prior to joining Google, Roland worked as an assistant professor at EPITA/LRDE, France. Roland has a PhD on image processing and software engineering from Université Paris-Est, a master's degree from Télécom ParisTech, and an engineering degree from EPITA.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/iYsA8XSgZR7vq3XN6NOFe8Q5sDitsEhS1oE24aFrdqwuwFXrRG0t-7lIAv7soEvEcNmDI8v4xh2zeQu_twlJbSGYGg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"4b3b400c-d37d-4a0b-b957-c70cae8d2ee3\":{\"id\":\"4b3b400c-d37d-4a0b-b957-c70cae8d2ee3\",\"name\":\"Romain Guy\",\"bio\":\"Romain manages the Android Toolkit team. The team's projects included AndroidX/Jetpack, the UI toolkit, Kotlin support and graphics.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/8r6gQJsmILBaptbg5AqJ_222nZzlDtyJXYQX7WKhguxgLqcevmkrO8qoli95b77G99h-zpKdRk3_iuDx_nPmhak\",\"socialLinks\":{\"GitHub\":\"https://github.com/romainguy\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/romainguy\",\"LinkedIn\":\"https://www.linkedin.com/in/romainguy/\"}},\"2b157cb9-4b5d-4b07-8fe9-431214e9faaa\":{\"id\":\"2b157cb9-4b5d-4b07-8fe9-431214e9faaa\",\"name\":\"Rose La Prairie\",\"bio\":\"As the product manager for Android Digital Wellbeing, Rose La Prairie leads Android's efforts to improve wellbeing by reducing distraction. This expands on her previous work on Android Enterprise focusing on productivity. Before joining Google, Rose worked for McKinsey & Company and the Guardian Media Group. She holds an MBA from Harvard Business School and a BA from the University of Cambridge.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/lr5KkW3tYxaQwSta_32WlBc0fwZhONStq52w0sBOyz1hm6136l_MnL0g0HW--FI7lv7GIaqiEresRoYhAHQMqWs\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"09bdbbfb-557b-405c-9d62-488f164ea11b\":{\"id\":\"09bdbbfb-557b-405c-9d62-488f164ea11b\",\"name\":\"Rudra  Kasturi\",\"bio\":\"Rudra has been with Times Internet for the past 3 years and heads the organic growth (user and revenue) for websites at Times Group India & global. Prior to this, he was head of organic growth for web at Yahoo!, Amazon India & Snapdeal.\",\"company\":\"Times Internet\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MH7HA1j5nUnbbRGjPuvYHa6gg240fbbAK5JvxIoE_09H6nhwisaLBGViJ3zAzXmziLXLRasJHulnKnYk78g3JFSlpw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f5793f26-1c05-433c-8ad1-b7d00a1d707f\":{\"id\":\"f5793f26-1c05-433c-8ad1-b7d00a1d707f\",\"name\":\"Russ Ketchum\",\"bio\":\"Russ Ketchum is a group product manager and the Co-Product Lead for Google Analytics including Google Analytics for Firebase. He’s also the product lead for Google Tag Manager. Russ has been at Google for over nine years where he’s worked as a product manager across a variety of ads and measurement-related products. Russ comes from an entrepreneurial background and has led multiple product and engineering teams across numerous startups.\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"22abdabf-1af3-4dbb-aa7a-d319e2ebebb1\":{\"id\":\"22abdabf-1af3-4dbb-aa7a-d319e2ebebb1\",\"name\":\"Sachit  Mishra\",\"bio\":\"Sachit works on libraries, documentation, and outreach efforts for Actions on Google as a developer programs engineer. He has also supported Android TV and Google Cast. Prior to Google, Sachit was a software engineer working at companies like Bloomberg, Intuit, and Grooveshark. Sachit earned a bachelor’s degree in Computer Science from the University of Florida.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dFNR38B6Dn9-7eaqEvIHUu0tZuA_LzSN3K-BjqCy13L4trQ_5VOXcmm40DfPDLZylaqu2X4etVgCogZlF_rP6D8\",\"socialLinks\":{\"GitHub\":\"https://github.com/smishra2\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/sachitmishradev\",\"LinkedIn\":\"https://www.linkedin.com/in/sachit-mishra-a95301180/\"}},\"e60af0ea-3703-4d78-a648-1c695ac02c72\":{\"id\":\"e60af0ea-3703-4d78-a648-1c695ac02c72\",\"name\":\"Safia Baig\",\"bio\":\"Safia is a User Experience Researcher on Android, focusing on understanding user behavior on mobile products. Safia earned a master's degree in Psychology from California State University, Long Beach. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/p55GCbLmHFh7kco43sK4RIKQR_rKvFAk4oCT47muAy1cPS1vEm3gadkMfw3hUyRY2_H99BxZaSLtpczh5tr5hjsZ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"149ebd98-7436-4082-a21c-0cbc44f1a44a\":{\"id\":\"149ebd98-7436-4082-a21c-0cbc44f1a44a\",\"name\":\"Sagar  Savla\",\"bio\":\"Sagar is a product leader in Google's AI Research group, building cutting edge Machine Learning tech into products like Pixel phone's camera (Most Disruptive Technology award at MWC 2019), Youtube and Google Home.\\r\\n\\r\\nPrior to this, he worked at Facebook on data science and virtual reality, on the best car dispatch system at Lyft and fraud detection ⁄at PayPal.\\r\\n\\r\\nOriginally from Bombay, India, he’s gone on to give talks in over 20 countries on topics like Ethical Hacking, Artificial Intelligence and Javascript. He has won multiple awards for his work in tech competitions and hackathons.\\r\\n\\r\\nHe has a Masters' from Georgia Tech with research in the fields of Machine Learning, User Experience and Privacy Policies. He is co-author of UXonomy: UX for Modern Engineers.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/9JRsYzFmzPxHQ_xKjTCQjByqzsN_KuhwdZA9RoVbF-546oh4GB_4-p5hm-Dct4u4y_CZ17rWMuzSurTmoIlc5vrL\",\"socialLinks\":{\"GitHub\":\"https://github.com/sagz/\",\"Website\":\"https://sagz.in/\",\"Twitter\":\"https://twitter.com/sagz\",\"LinkedIn\":\"https://www.linkedin.com/in/sagarsavla\"}},\"c247a6e1-16d9-4af9-b835-96a3840e9fef\":{\"id\":\"c247a6e1-16d9-4af9-b835-96a3840e9fef\",\"name\":\"Sam  Lin\",\"bio\":\"Sam Lin\\r\\nProduct Manager, Android Studio Team\\r\\n\\r\\nSam is a product manager on the Android Studio team. In this role, he focuses on Android Emulator. \\r\\n\\r\\nSam has been working on mobile platform development for a decade. He is a passionate supporter of open platform and ecosystem.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Fru71JpvguwSVu1n8tkfoc6cbr5EyO5sBZmlhf_d0CYZaIZFoBAESADFdmnL1-66-bFx7fKsFuUsRS0iZltRZ2o\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"9f3124bb-33b4-4a81-9d29-3dd28470367a\":{\"id\":\"9f3124bb-33b4-4a81-9d29-3dd28470367a\",\"name\":\"Sandeep Gupta\",\"bio\":\"Sandeep Gupta is a Product Manager for TensorFlow at Google, where he helps develop and drive the roadmap for TensorFlow (Google’s open-source library and framework for machine learning) for supporting machine learning applications and research. He focuses on TensorFlow’s 2.0 release, and on TensorFlow.js - a library bringing Machine Learning to JavaScript developers. Sandeep is excited about how Machine Learning and AI are transforming our lives in a wide variety of ways, and works with the Google team and external partners to help create powerful, scalable solutions for all. \\r\\n\\r\\nPrior to joining Google, Sandeep was the technology leader for advanced imaging and analytics research and development at GE Global Research with specific emphasis on medical imaging and healthcare analytics. He has a Ph.D in Electrical Engineering from Johns Hopkins University. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/wYpoNedPfRYC4bZ_S-_7sVESM5a9PLQcH36i2bPxL-XiiAV2SsN840qVmnLyIuKPUiEWlIEXOAP12ZtGlLLItkp9wA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/TheSandeepGupta\",\"LinkedIn\":\"https://www.linkedin.com/in/sandeep-gupta-a71a343/\"}},\"b5d6ebcc-d7dc-4902-afdd-c8aad8c6c267\":{\"id\":\"b5d6ebcc-d7dc-4902-afdd-c8aad8c6c267\",\"name\":\"Sandra Lokshina\",\"bio\":\"Sandra is a software engineer on the Shaka Player team who leads the Shaka UI effort.\\nShe is a self-taught developer with a BA in stage management from Russian University of Dramatic Arts.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/OX0YOhdClmu0LgdudEYWggYhqtjLcNVf7O2NFnNnM0ioljhWVg5ILEtTcDtiLafo9FCF9FytkD7LA0Hi1cy3hGcD\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"8051c8e6-4618-43bd-be9e-11414c8b4038\":{\"id\":\"8051c8e6-4618-43bd-be9e-11414c8b4038\",\"name\":\"Sara Kato\",\"bio\":\"Sara Kato is a software engineer on ChromeOS working on ARC++ accessibility, and has been on the team since April 2018.\\r\\nShe has predominantly worked on ensuring that accessibility features from Android and ChromeOS are integrated into ARC++ applications.\\r\\n\\r\\nSara earned a bachelor's degree in Software Engineering with First Class Honours from the University of New South Wales in Australia.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/lIEvqztdEGrigwK7X4Ban8yN_3pQLt-cxRlWIe4OAYiSpKEtir0fZ-hC9W6IaX16bz6fgTKzEHr-NePMBKyxJjti\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/sarakato/\"}},\"1cda2465-852d-4584-a3be-7c86ea075148\":{\"id\":\"1cda2465-852d-4584-a3be-7c86ea075148\",\"name\":\"Sara Robinson\",\"bio\":\"Sara is a developer advocate on the Google Cloud Platform team, focused on machine learning. She inspires developers and data scientists to integrate ML into their applications through demos, online content, and events. Sara has a bachelor’s degree from Brandeis University. Before Google, she was a Developer Advocate on the Firebase team. When she's not programming she can be found on a spin bike, listening to the Hamilton soundtrack, or eating froyo.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/CTTHCqVlGn3J461BnNRnUhPLBEXRJ5BIT51vpY1PZcYZJRbGgwzQW6AZuvpewfssfO8e0kSr0xvTxWUa4I_cDgTV\",\"socialLinks\":{\"GitHub\":\"https://github.com/sararob\",\"Website\":\"https://sararobinson.dev\",\"Twitter\":\"https://twitter.com/SRobTweets\",\"LinkedIn\":\"https://www.linkedin.com/in/sara-robinson-40377924/\"}},\"6a99914f-1a60-4634-8068-b7c2f37af8ab\":{\"id\":\"6a99914f-1a60-4634-8068-b7c2f37af8ab\",\"name\":\"Sarah Sirajuddin\",\"bio\":\"Sarah leads TensorFlowLite and TensorFlow.js. TensorFlow Lite is TensorFlow's cross-platform solution for mobile and embedded devices and TensorFlow.js allows the use of TensorFlow with JavaScript. Sarah is a long time Googler, and prior to TensorFlow, she has spent many years building Google's advertising systems and web search infrastructure.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/OAx4jMxHo3LxChhL7k2QsifRHfs-bWYLZt2dg8ygG7s3rheYfAXKsWSQWkeHWIUOghiTy6t1EI2laBK4peD-OTY\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"d71ae955-1452-42e9-8e40-62bade109e23\":{\"id\":\"d71ae955-1452-42e9-8e40-62bade109e23\",\"name\":\"Sathya  Gunasekaran\",\"bio\":\"Sathya Gunasekaran is a software engineer on the V8 team. In this role, he focuses on implementing and improving the performance of new JavaScript language features in V8.\\n\\nHe serves as a delegate representing Google at TC39, which standardizes new ECMAScript features.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/6X1MkEddGa0WKEbwOTbt0Tg14dfiU7mUsJmyXWic5yA-v-QbVT6q7DySOvlU1KHwh5bhftj9hZvW9SR6e6mgXRji\",\"socialLinks\":{\"GitHub\":\"https://github.com/gsathya\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/_gsathya\",\"LinkedIn\":\"\"}},\"95b55266-5856-43f0-af46-ae7430fca55f\":{\"id\":\"95b55266-5856-43f0-af46-ae7430fca55f\",\"name\":\"Scott  Brissenden\",\"bio\":\"Scott is a software manager at Google Canada.  He works on Firebase Crashlytics, the world's #1 crash reporting SDK. Crashlytics is used on over 3 billion devices worldwide.\\n\\nPrior to Google, Scott served as a software engineer and manager at Intel for 12 years, receiving 3 US patents. \\n\\nScott has a Master’s in Computer Engineering from the University of Toronto and a Bachelor’s from the University of Waterloo.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/LHQKTg2HmSAp5gqwtIiLSIlI6ND0ZCL5dqvc3_tHuKnltT8jETULJD79o30H21DqklGTOkIkH1EGeYCccLYOD6lH\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/sbrissen\",\"LinkedIn\":\"\"}},\"db4cb453-9804-49b9-918e-1277f97ef5fa\":{\"id\":\"db4cb453-9804-49b9-918e-1277f97ef5fa\",\"name\":\"Sean  McQuillan\",\"bio\":\"Sean McQuillan is a developer advocate at google. With a decade of experience at Twilio and other San Francisco startups he is an expert at building apps that scale. Sean is passionate about using great tooling to build high quality apps - quickly. When he is not working on Android you can find him fiddling on the piano or crocheting hats.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/0nmq6vHAGFpe9uZbHORBAthR1rxUDjdMQlyzH5_QujJ4MH-3Es2Tf126ZaTQWGsJFSnCDZHa7Q0hlFwoV_snvUA\",\"socialLinks\":{\"GitHub\":\"https://github.com/objcode\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/objcode\",\"LinkedIn\":\"\"}},\"fef20db9-5738-45cb-863b-66696d461c77\":{\"id\":\"fef20db9-5738-45cb-863b-66696d461c77\",\"name\":\"Seb Grubb\",\"bio\":\"Seb is a product manager at Google with a focus on Android privacy features. Seb covers features that touch storage APIs and permissions. Prior to Google, he studied in London and started his career as an engineer at a sound recognition startup.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MqIAx-JTyNsY_UoCp2KkTsJh5Th9fV6rGkW5p-mRF19B8OdGfaQU0SzKWsMXxFhxyE1ESqlz6Fxj4EgzOC0Ov1s\",\"socialLinks\":{\"GitHub\":\"https://github.com/sg3510\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/seb_uk\",\"LinkedIn\":\"https://www.linkedin.com/in/sebastiangrubb/en\"}},\"0334b0be-ada4-4667-9a75-88f0e87eec22\":{\"id\":\"0334b0be-ada4-4667-9a75-88f0e87eec22\",\"name\":\"Seigo Nonaka\",\"bio\":\"Seigo is the Android framework engineer at Google. In this role, he focuses on providing faster text rendering and useful APIs on Android.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/iMs338L92ePdaTT4t5llB3tA2AeER6IhR_Yzqwsq5TLUmjrLrKmGoUPpCL37XxSNGycN0-2Kh2ZK_wqh8GF9xKkr\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"4a07285f-2b43-4e71-87e5-b4793e386184\":{\"id\":\"4a07285f-2b43-4e71-87e5-b4793e386184\",\"name\":\"Serge Beauchamp\",\"bio\":\"Serge is an engineer in the Google Play Console, leading the testing program team, which is responsible for launching features such as the internal test track, and improvements to the open and closed testing tracks.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/SINyMXtKvbUFG_leIUX26AoUO9YfaI0qh2TEGfpJ6HotoYloI-15vKC3sv2hHwFQtk38Y7CFOV8-Y6s7nQpvZy125g\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"d14366fe-1b3e-4496-b792-52d12a796ea8\":{\"id\":\"d14366fe-1b3e-4496-b792-52d12a796ea8\",\"name\":\"Sergey Vasilinetc\",\"bio\":\"Sergey is a software engineer working on the Android UI Toolkit team. His work focuses on Android Architecture Components. Prior to Google he worked at SPB Software. He earned his degree from Saint Petersburg State University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/8jIEfGRJY1yfAN2BWQGF7DXgSjBdlQh4Q-GFyyorJNQVh7W5pEbcUEcE0zQJOXyP0U8ePwYu7p9dX7LWZs6XX0U\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ZelenetS\",\"LinkedIn\":\"\"}},\"4a98189f-006e-41c3-8af5-2d0172a105a8\":{\"id\":\"4a98189f-006e-41c3-8af5-2d0172a105a8\",\"name\":\"Sergio  Guadarrama\",\"bio\":\"Dr. Sergio Guadarrama is a Senior Software Engineer in the Google Brain team. Currently he is the tech lead of TF-Agents and a core developer of TensorFlow. His research focus is on robust and efficient Reinforcement Learning. Before joining Google he was a Research Scientist at the University of California, Berkeley. He received his Bachelor and PhD degrees from the Technical University of Madrid.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/n59GCBjaDculANLGZBzNuZxl7NeQsE9VLzEhhEobPCZx6ux-D0L81hQzS7YrDl1YsbAe53DPGORKosECR9xak7Y\",\"socialLinks\":{\"GitHub\":\"https://github.com/sguada\",\"Website\":\"https://ai.google/research/people/105009\",\"Twitter\":\"https://twitter.com/sguada\",\"LinkedIn\":\"https://www.linkedin.com/in/sergio-guadarrama-1724379/\"}},\"c985220f-61ca-40b6-a894-ad533b5b0b35\":{\"id\":\"c985220f-61ca-40b6-a894-ad533b5b0b35\",\"name\":\"Seth Vargo\",\"bio\":\"Seth Vargo is an engineer at Google Cloud. Previously he worked at HashiCorp, Chef Software, CustomInk, and some Pittsburgh-based startups. He is the author of Learning Chef and is passionate about reducing inequality in technology. When he is not writing, working on open source, teaching, or speaking at conferences, Seth advises non-profits.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/DeEAGkNEIioof71hsTZcsehgv_lrPd9GIrflGaCm6WwfegB77aghyUdFTkPublhkMo5eOuxZJ5Ho7jF-xoSaO_WO\",\"socialLinks\":{\"GitHub\":\"https://github.com/sethvargo\",\"Website\":\"https://www.sethvargo.com\",\"Twitter\":\"https://twitter.com/sethvargo\",\"LinkedIn\":\"https://www.linkedin.com/in/sethvargo/\"}},\"34429bcf-ea14-4caa-8752-4ce6c222cd98\":{\"id\":\"34429bcf-ea14-4caa-8752-4ce6c222cd98\",\"name\":\"Shalini GovilPai‎\",\"bio\":\"Shalini GovilPai is currently head of  Android TV. She was previously Sr. Director at YouTube where she headed up technology solutions globally for YouTube creators.  Prior to that she has been PM on Adwords and GoogleTV, where she was awarded the Google OC Award.  \\r\\nPrior to Google, Shalini was Technical Director at Pixar Animation, where she led technical efforts for block-buster films ‘A Bug’s Life’ and ‘Toy Story’.  She is the author of two internationally-published books in Computer Graphics – Principles of Computer Graphics and Learning Computer Graphics.\\r\\nShalini has a BS and MS in Computer Science.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/DeOcDL1Q9MgHs7gyhDXDM_ibZ0aeAdia-RjhkRuqd2igFxctFCy8m1Ap2E-DalVmyQrp4adDeUK8NHyIKXBWQ_iL\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"1e89dccf-d14b-4c42-ac4f-b0aefb4dd258\":{\"id\":\"1e89dccf-d14b-4c42-ac4f-b0aefb4dd258\",\"name\":\"Shikha Sehgal\",\"bio\":\"Shikha leads the gTech Actions on Google Capabilities team, which incubates platform features for Google Assistant to help developers and partners create great user experiences. She joined Google 3.5 years ago and has led partner technology management for Google Search & Assistant efforts such as App Indexing, Identity and Channel Partner Program. Prior to Google, Shikha was at LinkedIn, where she designed their Mobile SDKs and led Partner Engineering for various monetization products. Shikha has earned a Masters in Software Engineering and Development Management from Carnegie Mellon University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/2_9DMExPeLY5mjoPS6bI5q92qHSWhcKnDwoNiaCqNZdFaHazWT71_GTsMcokkL7pKL0bedFumCsQSTTAvV4_2G0\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/sehgalshikha/\"}},\"c563af6b-f653-4fec-a2b7-ce8aa5fab311\":{\"id\":\"c563af6b-f653-4fec-a2b7-ce8aa5fab311\",\"name\":\"Shiyu  Hu\",\"bio\":\"Shiyu is an engineer lead in ML Kit, where he is passionate about bringing simple-to-use machine learning solutions to mobile developers. Previously at Google he's worked on Android Location and Context, Google Ads Quality and Federated Learning. Shiyu has a Ph.D in Computer Science from Texas A&M University, a MS in Robotics from Shanghai Jiao Tong University and a BS in Automation from Huazhong University of Science and Technology.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/zlScW6_QRsG5BdzExKNbIGm6tHCoyro-FqFx4RHhBKuYcvPSvhsRCtC6159Y2TugdzzWDVVQxnKVaDmDui6W8d1hzw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"9c47cc0f-a319-4597-843a-f4496895d05e\":{\"id\":\"9c47cc0f-a319-4597-843a-f4496895d05e\",\"name\":\"Shubhie Panicker\",\"bio\":\"Shubhie leads web performance efforts as an engineer on Chrome’s Web Platform team -- working on web standards as well as chromium implementation. She also works on developer ecosystem initiatives on performance for loading and responsiveness.\\r\\nPrior to Chrome, she worked on server infrastructure and web frameworks for products like Google Search, Google Photos etc. \\r\\nShubhie holds a master’s degree from Carnegie Mellon University.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/P0wkUY9_DCNqLlnLv0EE2bjFXJAs8hLTgnWG28Iw3H-4KO31xbWxnO4VXCaJKe4dLC7wZHrNBlJ74srU7qCrbX0apQ\",\"socialLinks\":{\"GitHub\":\"https://github.com/spanicker\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/shubhie\",\"LinkedIn\":\"\"}},\"d1974742-cad2-40ef-a8ff-e9fb4c6dcd51\":{\"id\":\"d1974742-cad2-40ef-a8ff-e9fb4c6dcd51\",\"name\":\"Siyamed  Sinir\",\"bio\":\"Siyamed is a tech lead on the Android UI Toolkit team focused on text and UI widgets. Prior to Google, he developed consumer internet and Android applications in San Francisco, and co-founded a vertical search engine platform.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/vyl8p1cKPGiO6HNpg218bxUB6t3Fzm0WOa6Bx-UJIQBLMvLovcTkKFeC27_RSqkLHy61gmUzrhzxt0hkavDIlPt9\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/siyamed\",\"LinkedIn\":\"\"}},\"37c6fb5f-29cc-423c-a947-9cdcad0e1ac7\":{\"id\":\"37c6fb5f-29cc-423c-a947-9cdcad0e1ac7\",\"name\":\"Sofia  Altuna\",\"bio\":\"Sofia Altuna works on Global Product Partnerships for Actions on Google. Her focus is on launching new platform capabilities, helping developers with discovery and reengagement, and delivering great user experiences. Sofia studied Finance and Leadership & Management at Boston College. She currently resides in NYC.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/rAPaFxICxSbXz0czA53hO5O0wFjXeSWnPDGkQJ7eeHVFDQvXvHQav5XwksB9SJe2AmObLtlxe76b7ZehnN7v7V_m\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/sofia-altuna-4ab2b24a/\"}},\"539870ac-1f7d-4697-b8c1-ac2f9ffed80d\":{\"id\":\"539870ac-1f7d-4697-b8c1-ac2f9ffed80d\",\"name\":\"Sofien  Bouaziz\",\"bio\":\"Sofien Bouaziz is currently a staff research scientist at Google. Prior to Google, he was a principal research scientist at Apple where he designed the face tracking algorithm powering the iPhone X. Sofien completed his PhD degree at EPFL in 2015. His thesis was awarded the 2016 SIGGRAPH outstanding doctoral dissertation award honorable mention, the 2015 ETHZ Fritz Kutter PhD thesis award, and the 2015 EPFL Patrick Denantes PhD award honorable mention. He also received the 2018 Eurographics Young Researcher Award. In 2012, Sofien co-founded faceshift AG, a startup that brought high-quality markerless facial motion capture to the consumer market.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/UEaOWMBvoGNt_0Lm0D_rzFyeu9_CXwGO5_2ZGwkJ5tU3IrUTDo5EqPNWdn4b9WKaJvM8IvMu8mJUzjHyUvUI73F7\",\"socialLinks\":{\"GitHub\":\"https://github.com/sofienbouaziz\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/_sofien_\",\"LinkedIn\":\"https://www.linkedin.com/in/sofienbouaziz\"}},\"ed1d5220-af7c-4e11-bb1f-2980d6d892e7\":{\"id\":\"ed1d5220-af7c-4e11-bb1f-2980d6d892e7\",\"name\":\"Sonakshi  Watel\",\"bio\":\"Sonakshi is an interaction designer on the Firebase team. In this role, she designs intuitive user interfaces for developers. She worked as a software developer before she did her Masters in Human-Computer Interaction from the University of Michigan Ann Arbor. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/4fPYbh8vH0oESxjwYZjAa_ne2BulaVeZUE9ODjIgTTvqILanX4-BWkuyDFFC-HK8QliBn0W1iwDor8GxgqizN9YQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"5c02aab1-b1f1-44ee-ab75-d947245defc3\":{\"id\":\"5c02aab1-b1f1-44ee-ab75-d947245defc3\",\"name\":\"Soonil Nagarkar\",\"bio\":\"Soonil is a senior software engineer on the Android Location and Context team. He works on the core location framework, as well as the Android Emergency Location Service which provides fast and accurate emergency locations to first responders.\\r\\n\\r\\nSoonil has a master’s degree from the University of Southern California. He earned a bachelor’s degree in Computer Science from the University of Michigan.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/Y6eNN8M_YkjDU-OzE-sDszrseb2XsvIpJxQ6z4eb7G8mwRoylqq9UeB8-RxLpQLJzqPo1ikAAIwjSlB0PNhvSUJ9rg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/sooniln/\"}},\"defbc8e7-1f90-4627-baa4-ff2d695126ec\":{\"id\":\"defbc8e7-1f90-4627-baa4-ff2d695126ec\",\"name\":\"Sougwen  Chung\",\"bio\":\"Chung's work explores the mark-made-by-hand and the mark-made-by-machine as an approach to understanding the interaction between humans and systems.\\r\\nHer speculative critical practice spans installation, sculpture, still image, drawing, and performance.\\r\\nShe is a former research fellow at MIT’s Media Lab and a pioneering E.A.T. Artist in Resident in partnership with New Museum and Bell Labs. She is an inaugural member of NEW INC, the first museum-led art and technology incubator. Chung received Japan Media Art’s Excellence Award in 2016 for her project, ‘Drawing Operations’. She has been awarded Artist in Residence positions at Google, Eyebeam, Japan Media Arts, and Pier 9 Autodesk. In 2014, she was selected as one of the Top 20 New Visual Artists by Print Magazine.\\r\\nHer work has been exhibited internationally, including at the National Art Center, Tokyo; NTT InterCommunication Center [ICC], Tokyo, Japan; MIT Media Lab, Cambridge; The Drawing Center, New York; The New Museum (Sky Room), New York; Museum of Contemporary Art, Geneva; Mana Contemporary, New York, Tribeca Film Festival, New York; The Hospital Club, London; Mutek Festival, Montreal & Mexico City; Sonar Festival, Barcelona. Her work has also been featured in The New Yorker, Wired, Art F City, Dazed and Confused, The Creators Project, MASHABLE, Engadget, Business Insider, Fast Company and USA Today.\\r\\nShe has spoken internationally at conferences including Tribeca Film Festival Interactive, New York; OFFF, Barcelona; FITC, Tokyo; Internet Dargana, Stockholm; SXSW, Austin; The Art Directors Club, New York.\\r\\n\",\"company\":\"\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/9li2szf2IqSQdzrHF0io45haSz3VwdP39pwrzzG-HPw4Tw3fMr0PmSNgJUrHW_tX8z9tY4wZxUXIfvPJoFwkdTsU\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/sougwen?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor\",\"LinkedIn\":\"https://www.linkedin.com/in/sougwenchung/\"}},\"dffb3f2f-35bc-42e0-8a46-9cc9d6f7559b\":{\"id\":\"dffb3f2f-35bc-42e0-8a46-9cc9d6f7559b\",\"name\":\"Stanley  Tng\",\"bio\":\"Stanley is the technical lead for Android Hearing Aid Audio Support Using Bluetooth LE.\\nStanley graduated from University of Illinois, Urbana-Champaign (UIUC) with a Masters of Science in Computer Science. He earned a bachelor's degree in Computer Engineer at UIUC and a bronze tablet recipient.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/_AXUUavILIsL1IZRqYT8lm9uNtw8tlonpTB2KF8wMFOKglzcNC-aSdH53xSS7MPD1Nqx8wz8-82GgE8eSPntS7qc4Q\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"939580a6-8fa2-4bf9-8eac-d9f34b151a98\":{\"id\":\"939580a6-8fa2-4bf9-8eac-d9f34b151a98\",\"name\":\"Stefan Kuhne\",\"bio\":\"Stefan works as tech lead on the Android window manager integration into ChromeOS. He also worked on Chrome / Chrome OS (UI, multi user, memory management, etc.) and Google Earth before. Prior to Google he developed at miro / Pinnacle / Avid a realtime 3D video effects engine used in different video editors. Stefan earned a Masters degree in computer science from the University of Dortmund, Germany.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/HaqRxVVFDUkZbG2ijjFBQwhY9M5Xf6zJCVNi-y28TsJc_zbIFarFk3KJTTUCPPnLObyVelLX6PIDIsM1LRca0Dw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"d2fefe36-a707-4d6c-8245-ab48a756fca9\":{\"id\":\"d2fefe36-a707-4d6c-8245-ab48a756fca9\",\"name\":\"Stephanie Saad\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"04300f51-04c6-4efb-8f0e-94988798a049\":{\"id\":\"04300f51-04c6-4efb-8f0e-94988798a049\",\"name\":\"Stephen Fluin\",\"bio\":\"Stephen leads Developer Relations for the Angular Team at Google. Stephen works to solve real world problems faced by developers and businesses, and to represent the needs of the community within the Angular team.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/BIvCNxgR8CRBKbmudLoTOS3hY0qrrxCu6Gi7xiWtt_ZzuioPozuSDJkpBIKFjwk0c5y2w5iaqrrg_XzuJzkzuLyy\",\"socialLinks\":{\"GitHub\":\"https://github.com/stephenfluin/\",\"Website\":\"https://angular.io\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/stephenfluin/\"}},\"6cd93fce-3ccc-419a-a1ac-1ca471b537b5\":{\"id\":\"6cd93fce-3ccc-419a-a1ac-1ca471b537b5\",\"name\":\"Stephen Fulwider\",\"bio\":\"Stephen is the engineering lead on the Google Play In-app Billing & Subscriptions team. In this role, he focuses on Google Play Billing client and server APIs, the Google Play Subscription Platform, and developer adoption of Google Play Billing into their apps.\\n\\nStephen has a BS & MSc in Computer Science from the University of Central Florida, where he graduate magna cum laude. Before graduating, he was deeply involved with the school's programming team, competing in the ACM ICPC world finals in Banff and Stockholm before taking on the head coaching role for the team.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/6u6p-ekJpw0X20X2bR41Z3WcVx8CDi9FtyXgFIbAW8LSFRYagaLFZ94Q29Ma-Agsr-HuJn2eaZl3oseTTV7Of150\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"05f8f393-cf0b-4fe5-b0ad-79968997cbbf\":{\"id\":\"05f8f393-cf0b-4fe5-b0ad-79968997cbbf\",\"name\":\"Steve Ganem\",\"bio\":\"Steve is a product manager of Google Analytics for Firebase, overseeing developer features and integrations with other Google and Firebase features. Prior to joining Google, Steve spent 19 years in the video game industry, starting with Electronic Arts and Activision, where he was the lead tools and online engineer for Tony Hawk's Pro Skater. He went on to found SuperVillain Studios - an independent game studio in Southern California - where he served as CTO and CEO for 11 years.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/WQkPE5EwmwbtBBlLgHJWpQuF04fuZZebZ0dow_QjlBvUi-MuI1B07Lqnp9sDEmBw9XmUYmTVNKgrK9g0n_K84Xxh\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/sganem1\",\"LinkedIn\":\"https://www.linkedin.com/in/steve-ganem-7215b4/\"}},\"b6580512-871f-4564-92b2-554ae8791517\":{\"id\":\"b6580512-871f-4564-92b2-554ae8791517\",\"name\":\"Steve Suppe\",\"bio\":\"Steve is a product manager on the Google Play Console. Steve is based in London and has lived in California, Colorado, Mississippi, New York, Israel and Switzerland. He's a Fulbright Scholar in Computer Science and holds an MBA from London Business School as well as a BSc in Computer Science from the US Air Force Academy. Steve's current favorite album is Hadestown by Anaïs Mitchell.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/CPnQcMlridSEffmqR6xVT4ltBvEmR6QR7nRZ963bjBlj8AhbHM2KHdOvuWkMb_DG6Lb0iYrT0VLG9Teb0Nd5CX9U\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"12259151-d3e0-4fa5-8ffa-6105ec56b54d\":{\"id\":\"12259151-d3e0-4fa5-8ffa-6105ec56b54d\",\"name\":\"Steve  Malkos\",\"bio\":\"Mr. Malkos is the Technical Program Manager in the Android Location and Context Group at Google. He manages engineering aspects for Android’s Location and Context programs. Mr. Malkos is responsible for defining these initiatives within Google which includes everything from Emergency Location Service (ELS), GPS, Activity Recognition, Fused Location Provider (FLP), Android Sensor Hub, Sensors, and more. Mr. Malkos has been involved in the field of location for over 16 years. Prior to his role at Google, he worked as an Associate Program Management Director at Broadcom, where he managed engineering teams within Broadcom’s GNSS software. In 2016, Mr. Malkos received the GPS Leadership Award in Services which is recognized significant achievements in Satellites, Signals, Services and Products.  He holds a B.S. in Computer Science from Purdue University and currently holds 8 patents in the field of location.\",\"company\":\"\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/FoMrkJ0MLe9xTz9QQsCWhvoBvSjgz19fip4P7xJbIXZ1L0d03QWr-b1U79_HFQc-jetzAJ8OTJbWVQDVpoQndpLFIg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/steve-malkos-1421b72/\"}},\"b839623d-16af-4cd5-978d-d82fb2078240\":{\"id\":\"b839623d-16af-4cd5-978d-d82fb2078240\",\"name\":\"Steven Soneff\",\"bio\":\"Steven is product manager for Google's developer APIs for authentication and account security. He previously worked as an engineer on Android apps at Google, did development at several start-up companies, and wrote the original Facebook Android SDK launched in 2010.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/IdteEwA1EqkYUdfMWlSIK4-6yh-Ul10zdd1JLIXAwJ02XjufuO6W_s62sxH-8vT4HYgb6UdVsjLp1GJBh5zTMIuR\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"792cb0a0-c395-40ee-8eab-8d41f2098e67\":{\"id\":\"792cb0a0-c395-40ee-8eab-8d41f2098e67\",\"name\":\"Sudha Broslawsky\",\"bio\":\"Sudha is a UX designer on the Chrome OS team. In this role, she focuses on crafting intuitive user experiences for Linux and essential media app experiences. \\r\\n\\r\\nPrior to this team, Sudha worked on solving complex problems relating to the Audiences experience on AdWords. Before joining Google, Sudha led design initiatives for companies including Yahoo, Facebook, and Tile.\\r\\n\\r\\nSudha has a Bachelor’s degree in Commerce and a degree in Multimedia.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/x2j5hQmwN_WQVAo-H-C3xgvAj2x-5kBx6_G8P_cTw4adHdrEFdXEYfXveypMr6LCY5vmZEtu1OdGURWBaesGVCfi\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/sudhabroslawsky\",\"LinkedIn\":\"https://www.linkedin.com/in/sudhabroslawsky\"}},\"1c316f6e-ec29-4650-8556-3650f578812e\":{\"id\":\"1c316f6e-ec29-4650-8556-3650f578812e\",\"name\":\"Sumir Kataria\",\"bio\":\"Sumir is a software engineer on the Android team and has been the lead of various Google apps. While at Google, Sumir has been part of YouTube, Google+, and Search. Before Google, he was a gameplay and AI programmer in the video game industry.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/84BEZEzHQ2-NxXnOEwEsYuBzxxcV3i2CxFdKN4QnvlAQT3niQZrKQH53gusWMJa-N63w79XZTyVcWN_L-aJXIMg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/SumirKodes\",\"LinkedIn\":\"\"}},\"2b1ab2cf-5cc3-4ab0-8334-88970cdcdcc7\":{\"id\":\"2b1ab2cf-5cc3-4ab0-8334-88970cdcdcc7\",\"name\":\"Sumit Chandel\",\"bio\":\"Sumit works as a senior developer advocate on Firebase, focusing on developer outreach both digitally and in-person by presenting at conferences and meetups globally. Previously, Sumit managed the AdWords API advocacy team, worked on Android Wear and Instant Apps, and was a developer programs engineer on the Google Web Toolkit. Prior to joining Google, Sumit was a software engineer at Motorola, Optimal Payments and Westfield Insurance Group.\\r\\n\\r\\nSumit earned a bachelor's degree in software engineering from Concordia University in Montreal, Quebec.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/oSbvDIWW_idHIJQWmJ0Uug1b_X1gMDbWnDkAqxZCVmFXh0qmwBYdLiUYfG27VemdlEI4iY9ybYW6OjUsX_1bikec0w\",\"socialLinks\":{\"GitHub\":\"https://github.com/schandel\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/s_chande\",\"LinkedIn\":\"https://www.linkedin.com/in/sumit-chandel-a273792/\"}},\"a4e79ee1-d1a9-460e-9f29-f97084e0c5b3\":{\"id\":\"a4e79ee1-d1a9-460e-9f29-f97084e0c5b3\",\"name\":\"Sunil Rayan\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"d85e8e66-bdb7-495d-aede-2b05a73d65a5\":{\"id\":\"d85e8e66-bdb7-495d-aede-2b05a73d65a5\",\"name\":\"Surma Surma\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/8LaJeSX35j7R5shxAH9BcNAkvgI5c0eKsBhdOtaKMLJ4--vk0I6y6YoJxy-BeIevtBdn5-3mjNEG6qmtsOaPLqYXFg\",\"socialLinks\":{\"GitHub\":\"https://github.com/surma\",\"Website\":\"https://dassur.ma\",\"Twitter\":\"https://twitter.com/dassurma\",\"LinkedIn\":\"\"}},\"3f304564-a58f-4578-9492-154964f82b2c\":{\"id\":\"3f304564-a58f-4578-9492-154964f82b2c\",\"name\":\"Svetoslav Ganov\",\"bio\":\"Svetoslav Ganov\\r\\nSoftware Engineer, Android Core Framework\\r\\n\\r\\nSvet is a Software Engineer on the Android core framework team. He is the privacy tech lead on Android helping various teams to deliver their privacy related features. He is also managing the package manager and resources, autofill and suggestions, privacy, and accessibility teams. Previously, Svet worked on various parts of the platform including accessibility, printing, runtime permissions, autofill, UI widgets, package manager, instant apps. Svet earned a Masters in computer engineering from University of Texas at Austin, Austin USA and a Masters in international business from the University of National and World Economy, Sofia Bulgaria.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/QJbw3vTrycdVjJyn5p5W7fdn04rD_9ZfAP9NekyudgIxsKn3jj0lDRSKKIOa_jz9TJbhvGKWpV3ED0msbHB7Bfha2Q\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f2af1433-a7ce-4372-8fb2-91acd8288ae6\":{\"id\":\"f2af1433-a7ce-4372-8fb2-91acd8288ae6\",\"name\":\"Sweet Song\",\"bio\":\"Sweet is a product manager on the Chrome OS team. In this role, she focuses on Android apps.\\r\\n\\r\\nSweet has a Masters from Stanford University. She earned a bachelor's degree in Computer Science and Economics from Cornell University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/AyCzGCc5MlodltN0F9JjTtsvVxOq3pj1k5LiZpufiimqz14G1CK6FvxEjkFbcjGwBsZT-1CoaHWbFLMHXiTrCJX1\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"b8eb57f9-6a61-4609-aef8-8fce088448f9\":{\"id\":\"b8eb57f9-6a61-4609-aef8-8fce088448f9\",\"name\":\"Tali  Sason\",\"bio\":\"Tali Sason is a software engineering manager at Google, where she coaches talented teams of engineers building Firebase’s app quality tools. She is passionate about giving developers the tools they need to build stable and performant products that enable innovation. Before joining Google, Tali managed Crashlytics at Twitter. Prior to that, Tali was an engineering leader at Wayfair where she founded Wayfair Labs. Tali holds a degree in Computer Engineering from Bucknell University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/UizUmArvT6WpS3MsHxmeP_j6PwzG1PcibIKYUGXaeOvhQOP5X0rWGkmb2hfj0raOsoYZMzpU9c8-HAyGeWpYw-a9\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ItsTaliTime\",\"LinkedIn\":\"https://www.linkedin.com/in/tali-sason-7923bb38/\"}},\"2d81f1ab-0098-4d72-b171-9750288f0b3c\":{\"id\":\"2d81f1ab-0098-4d72-b171-9750288f0b3c\",\"name\":\"Thomas Steiner\",\"bio\":\"Thomas Steiner is a Developer Advocate at Google Hamburg, focused on making the Web a better place through standardization, creating and sharing best practices, and doing research. He blogs at https://blog.tomayac.com/ and tweets as @tomayac. Thomas has earned a PhD in Computer Science from the Polytechnic University of Catalonia, Barcelona, Spain.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/6PlTWDFtOt-OW1c7jowemska0avTSugv-7j6z2rjFy-ipyc0tOKKWMKgHIdj4S_faVObmsvUYJ1pMrtBm4fy5Ys\",\"socialLinks\":{\"GitHub\":\"https://github.com/tomayac\",\"Website\":\"https://blog.tomayac.com/\",\"Twitter\":\"https://twitter.com/tomayac\",\"LinkedIn\":\"https://www.linkedin.com/in/thomassteinerlinkedin/\"}},\"e5b1b626-8e6f-41ee-8ab5-52b05d97ad84\":{\"id\":\"e5b1b626-8e6f-41ee-8ab5-52b05d97ad84\",\"name\":\"Thomas  Ingenlath\",\"bio\":\"Thomas Ingenlath was appointed Chief Executive Officer of Polestar on 17 June 2017, and he leads the Polestar management team. He also holds the dual-role of Chief Design Officer for the Volvo Car Group. Thomas joined Volvo Car Corporation on 1 July 2012 as Vice President Design, arriving from a position as head of the Volkswagen Design Centre in Potsdam, Germany. Prior to joining Volvo, he has 20 years’ experience from the automotive industry, after completion of design studies at the Fachhochschule für Gestaltung in Pforzheim and the Royal College of Art in London. He worked in top design positions at Audi (1991-1994), Volkswagen (1995-2000) and Skoda (2000-2006). As from 2006 he was the Director for Design at the Volkswagen Design Centre in Potsdam, designing for all brands of the Volkswagen Group.\",\"company\":\"Polestar\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/fUNDfqktbmTryXe1kKonH_FpVVg8MuczmSI2N86mcLPNpO7LVWiJ49cOLdWpfKODEwnUAJTZX2umkthokPWQrjry\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"d0de27b1-2ec2-4369-889f-8a83dcaad39c\":{\"id\":\"d0de27b1-2ec2-4369-889f-8a83dcaad39c\",\"name\":\"Tian Lim\",\"bio\":\"Tian Lim runs UX and Product for Play.  He was previously CTO of Hulu, and also helped build the Playstation 4, Xbox 360 and Nintendo GAMECUBE.  He holds degrees in computer science & engineering from Carnegie Mellon University and the University of Washington.\\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/1We2v7oTZ8V9kemcRaz7z9WqVxMmP_R4lowijTqq03lZfZT5c9lsFNe-ZNkQX8lcG1_1xVo7yxiEPYrJvbdDR2j7\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/hellfire360\",\"LinkedIn\":\"https://www.linkedin.com/in/tian-lim-9049017/\"}},\"e5031116-f662-49f1-b9bf-60a55da72213\":{\"id\":\"e5031116-f662-49f1-b9bf-60a55da72213\",\"name\":\"Tim Davis\",\"bio\":\"Tim is a Product Manager for TensorFlow inside Google Brain leading the roadmap for on-device machine learning. Previously an entrepreneur working on image and logistics startups, Tim has worked in numerous teams at Google in advertising, shopping and machine learning. He has a background in engineering, finance and law and has studied at Stanford and at Monash University and Melbourne University in Australia.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/SXuhKqc4V4vOcwZ5owNljHFiTBSQcvzmhDQfNCzgMeZ0jssT8VyzCMa6o1rOdEJ4jmW58wKMP3v1COLJ61tp80g\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://www.timdavis.com\",\"Twitter\":\"https://www.twitter.com/iamtimdavis\",\"LinkedIn\":\"https://www.linkedin.com/in/timdavisau/\"}},\"e49d5529-e67c-4c31-bd05-7c5e7f9b6ec2\":{\"id\":\"e49d5529-e67c-4c31-bd05-7c5e7f9b6ec2\",\"name\":\"Tim Murray\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"46f34c6c-07a3-4d1a-8a86-643025abbd72\":{\"id\":\"46f34c6c-07a3-4d1a-8a86-643025abbd72\",\"name\":\"Todd Kerpelman\",\"bio\":\"Todd Kerpelman is a Developer Advocate at Google, which means he primarily spends his time making YouTube videos and has somehow convinced Google to pay him for it. Todd has two small children, so his hobbies mostly consist of falling asleep on the couch, attending Harry Potter-themed birthday parties, and reminiscing about the days when he wasn't too tired to have actual hobbies.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/hJdNUK1tsoa_eAo5RS1rPaPT3rEciRwmG0zIZFiMEWsKCKZXPNfF1C2-B4wsGmldrQdXuEGKt3PNpLrmp-IwxlAU\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"af23f052-3359-4d62-9c95-e23de7a45c94\":{\"id\":\"af23f052-3359-4d62-9c95-e23de7a45c94\",\"name\":\"Tom Grinsted\",\"bio\":\"Tom is a product manager on the Google Play Console. He specialises in metrics and business reporting projects. These make exclusive Google Play data and capabilities available and useful for developers, helping them optimize their businesses, and build successful apps on Android. Before joining Google, he was Head of Product for Web & Apps at The Guardian.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/EOHglnXtJY6-Q5ukidB9Ua6hTJkXDKs8wsa3uwInQnjRRTw0QdSH_tRCIQWD4jGJKA4dhTQ6QLeQ-nPv35fWoAeaJw\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f93f249a-a3f2-44e6-b504-b61bb5fbeec2\":{\"id\":\"f93f249a-a3f2-44e6-b504-b61bb5fbeec2\",\"name\":\"Tom Olson\",\"bio\":\"\",\"company\":\"Arm\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"3e710d8e-ac01-4f7d-a4e3-6630ef012e3b\":{\"id\":\"3e710d8e-ac01-4f7d-a4e3-6630ef012e3b\",\"name\":\"Tom  Buckley\",\"bio\":\"Tom is a product manager on the Chrome OS team, focusing on Linux app support and stylus features. Tom earned a bachelor's degree in computer science from Harvard University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/QbILTB5fkHgIxd1D0-81jzHFVpUtzDdBLkTAFG5sWdZE1GlDBk-kZC_pDj5hfdUAsc9uj8PWSR62CyUQMXTEBy4m\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"682b16fd-f71b-4732-b553-9da0cbef8904\":{\"id\":\"682b16fd-f71b-4732-b553-9da0cbef8904\",\"name\":\"Tom  Greenaway\",\"bio\":\"Tom Greenaway is the games lead of Chrome and Web Developer Relations at Google. He believes the key to unlocking the web gaming ecosystem is not simply through technology, rather the solution will be a mixture of business and user experience improvements. Before joining Google Tom ran his own game development studio and created the award-winning mobile game “Duet” which was downloaded over 15 million times.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ZtEUo_jOgWNn9WL3xt67Qy5sOj8aukFAu3eoOrNv3zwx5NJ8r3DhrwQki7Jvdfa0TsSRsMO0g2SB94Yo5szadx9pzg\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://www.twitter.com/tcmg\",\"LinkedIn\":\"https://www.linkedin.com/in/tom-greenaway\"}},\"8dc635d6-ca19-4fde-909e-2b8689e39d3e\":{\"id\":\"8dc635d6-ca19-4fde-909e-2b8689e39d3e\",\"name\":\"Tor Norbye\",\"bio\":\"Tor Norbye is the tech lead for Android Studio. Prior to joining Google in 2010 he worked for 14 years at Sun Microsystems, also on developer tools. He holds a master's degree in computer science from Stanford University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/DWRJp16CXjYrfSjL9SYBVqY9mUXIE0-JJ2YS2OXSLSaobG1b1oAmsrYGfoGjvcPpZnb7pNpkbYzsk5i5Qz2CC1E\",\"socialLinks\":{\"GitHub\":\"https://github.com/tnorbye\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/tornorbye\",\"LinkedIn\":\"\"}},\"429936d4-84af-4245-b3d1-a26a948edce1\":{\"id\":\"429936d4-84af-4245-b3d1-a26a948edce1\",\"name\":\"Torry  Yang\",\"bio\":\"Torry is an engineer at Google, where he works to improve the experience of machine learning developers on Google Cloud. Recently, he has worked on Cloud AutoML, BigQuery ML, and Cloud ML Engine.\\n\\nTorry has a bachelor's degree in computer science from the University of Virginia.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/XxJjgIL-zoOlnX4Fw8CJv08LZjDNwEbHcyLBRCbYONKAtEhwmDAG8riOt9WfMypQIq8Ed6mRkni8sdZEWXSYYCSJ\",\"socialLinks\":{\"GitHub\":\"https://github.com/sirtorry\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/torryyang\",\"LinkedIn\":\"https://www.linkedin.com/in/torryyang\"}},\"5f29fc0f-5d01-4951-ae86-a4c9e3c514c3\":{\"id\":\"5f29fc0f-5d01-4951-ae86-a4c9e3c514c3\",\"name\":\"Travis McPhail\",\"bio\":\"Travis McPhail, PhD. is the engineering lead for Google Maps Enterprise Teams in Seattle, WA. \\r\\n\\r\\nHe was originally hired to help rebuild the technical infrastructure for Google Maps on Android around the time Apple launched it's Maps product. Travis has worked on Google Maps, Google Earth, and Streetview across all major platforms including watches and infotainment systems. Travis has led map rendering in Google’s Maps across Android, Web, 3rd-party APIs, as well as led rendering for Streetview on Android/iOS. Travis also focuses on Google's engagement with communities of color across the world. He champions expanding access to computer science education and partners with Google in fostering tech talent at HBCUs. In 2018, Travis unveiled his interactive at National Museum of African-American History and Culture (NMAAHC) that allows visitors to explore artifacts managed by the Smithsonian but not shown within the museum. Travis joined the board of the Urban League in Seattle where he desires to establish more partnerships between the Urban League and tech companies to work on challenges facing underrepresented communities.\\r\\n\\r\\nTravis was born in Dallas, TX and later attended Rice University in Houston, TX to double major in Computer Science and Electrical Engineering. He would later complete his Master’s and Ph.D. degrees in Computer Science from Rice contributing research to the specials effect, biomedical, gaming communities.\\r\\n\\r\\nTravis would later work with M.D. Anderson Cancer Center, Schlumberger, and IHS before moving to California and joining Google. He strives to help people move toward their calling and encourages people to take advantage of every opportunity and not accept limitations placed on them.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/dSlp2oP_hKp5bVz_-0-T1JPFcG8mO8HNaOu-SJ5EMvQ-Y8p7Ff3RuXIpocQqHldYGSIyk9AVUFIgeRbCXsvS01vx\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/travis-mcphail-ph-d-21677b1b/\"}},\"34b046db-a566-423c-a7b3-32ddaedee70e\":{\"id\":\"34b046db-a566-423c-a7b3-32ddaedee70e\",\"name\":\"Trevor McGuire\",\"bio\":\"Trevor is a software engineer at Google working on camera APIs for Android. Previously, Trevor developed camera software for light-field camera startup Lytro. He received a bachelors degree in electric engineering from California Polytechnic State University and a masters degree in electrical engineering from the University of Southern California. When Trevor isn't writing code, he's probably on the court playing tennis.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/THisGr5zrYn5YY2DwOsYr58zED7WvJtULxhtyYZxPdv-zftUwcW1VG1R8UckA2SZkoHsm6mJ7GHlg8fX82Byto4\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/trevormcguire/\"}},\"f5329d37-e34a-484c-9089-7297387385a2\":{\"id\":\"f5329d37-e34a-484c-9089-7297387385a2\",\"name\":\"Tulsee Doshi\",\"bio\":\"Tulsee is the Product Lead for Google’s ML Fairness Effort. In this role, she leads the development of Google-wide resources and best practices for developing more inclusive and diverse products.  Prior to ML Fairness, Tulsee worked on the YouTube recommendations team. She received her BS in Symbolic Systems and MS in Computer Science from Stanford University. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/xdtCqWjYq_dv_JOzSWIrCQK2kSeRe0r0Xi5vuV4oBEXLhTZK7Fv9O19-6G316s61SJJ4dbhYPyRxpW-PM3oHri-4\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/tulsee-doshi-7075195b\"}},\"986c1af0-c999-4edd-aed0-7071f1dcb4e4\":{\"id\":\"986c1af0-c999-4edd-aed0-7071f1dcb4e4\",\"name\":\"Vadim  Caen\",\"bio\":\"Vadim is a software engineer working on the Design Tools of Android Studio in London. Prior to joining Google, he was a daily user of Android Studio and wanted to improve UI development workflows. That's why he made this his daily mission at Google. Prior to his professional life, Vadim obtained a Master degree in computer science from the INSA Lyon in France.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/LRSX-kX9_OVYYU26H49swAD2cFSZQziAiYiCAU-HVgEC_oULrsybX7UU0mZhwr9MuXUMyiqH8CaG5AFSCRP_e9Cp\",\"socialLinks\":{\"GitHub\":\"https://github.com/vcaen\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/vcaen/\"}},\"03185fc8-d76d-4db4-801c-9e879e3d51ca\":{\"id\":\"03185fc8-d76d-4db4-801c-9e879e3d51ca\",\"name\":\"Vera Tzoneva\",\"bio\":\"Vera and her team is responsible for launching and managing Assistant Distribution partners globally for Smart Home. Before that, Vera was on the Global Product Partnerships team, responsible for Business Development for the Assistant platform, Actions on Google. Vera has also worked on Search deals, helping optimize results for Mobile, and on Photos deals. \\r\\n\\r\\nVera earned a degree from Yale University, and in her spare time enjoys skiing -- a lot. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/4bYJxiD1X4IsaoqxBDOiEKIEo0ZZ3QzrRdS44MyuNFZFJW_4llFD7wxALaGLB6Ke2n5ihMirP-UJ552ltKJ2yso\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"c2f26c54-5fdf-4654-8a01-f03eeea54c89\":{\"id\":\"c2f26c54-5fdf-4654-8a01-f03eeea54c89\",\"name\":\"Vikram Subramanian\",\"bio\":\"Vikram is an engineer in the Angular team at Google. He leads the Angular Server-Side Rendering project. He has helped many teams at Google ship their Angular based products. He is currently focused on a Angular Full-Stack solution that guarantees performance.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/F75lAED3LCS0WVUskP9m4J8UZ3b6Pf7AQQoQOGdmQIdFG0YzqaaH8wfRLVV9_WcYQPkR0SISU1pS0Nf-3g2OKIK23A\",\"socialLinks\":{\"GitHub\":\"https://github.com/vikerman/\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/vikerman\",\"LinkedIn\":\"https://www.linkedin.com/in/vikram-subramanian-5b63429/\"}},\"a6b0b170-02a1-4d44-afde-06057ba6d115\":{\"id\":\"a6b0b170-02a1-4d44-afde-06057ba6d115\",\"name\":\"Vinay Mahagaokar\",\"bio\":\"Vinay Mahagaokar is a Product Manager at Google working on AMP Stories. He is responsible for both the AMP story format and the AMP story consumption experience on Google. Previously, Vinay worked at YouTube, where he focused on the iOS app and offline functionality. Vinay received his Bachelor of Science in Electrical Engineering from Stanford University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/1vbD88WkXkR9EcKEtIB8LgDp748ONy0giyLLEH5BWNH8gBmmrB8Gx_59BAo3yHI87mi6XLyOGXjCVLKQLayN0jwH\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/vinay-mahagaokar-b45a59/\"}},\"8e854cdc-dc11-4b40-a708-08ce63a0c0a6\":{\"id\":\"8e854cdc-dc11-4b40-a708-08ce63a0c0a6\",\"name\":\"Vinit  Modi\",\"bio\":\"Vinit is the Product Manager for Android Camera Platform. In his role he is responsible for camera2 framework, CameraX, and advancing the camera ecosystem. Prior to Google, Vinit led product at multiple startups and developed products for companies including Apple, Amazon, Nokia, and Qualcomm.\\r\\n\\r\\nVinit earned a bachelor's degree in electrical engineering from the University of California at San Diego. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/B9-F1PP9JhYwZ6iqPcRdbUICdi89xJfK--Hum1BrtfMfGcZc0UX7x9imQxXs7_gYMiw1NcH0VBKm2bm1uhQ_a0M\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/vinitm/\"}},\"6f509185-e53a-4a2b-91ea-13a5e0939f15\":{\"id\":\"6f509185-e53a-4a2b-91ea-13a5e0939f15\",\"name\":\"Vitor  Baccetti\",\"bio\":\"Vitor is a product manager responsible for app distribution on Google Play, focusing on features that eliminate friction in delivering apps to billions of users around the world. Vitor holds a MBA from Harvard Business School, a Masters of Engineering from Telecom ParisTech (France) and a Bachelor of Computer Engineering from Unicamp (Brazil).\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/lCH_j7t2BVdvHmC6ChwNE1XJlS8OlCQrdhM0WOp1pdYdIq56XkAfzyIitTgStd9KRTt6_9C9R7bp8rtTXe7Ov3c\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/vitorbaccetti\",\"LinkedIn\":\"https://www.linkedin.com/in/vitorbaccetti/\"}},\"8ccad61e-cba1-47d1-b52f-e67d71e5d563\":{\"id\":\"8ccad61e-cba1-47d1-b52f-e67d71e5d563\",\"name\":\"Vladimir Vuskovic\",\"bio\":\"Vladimir Vuskovic is a Senior Product Manager at Google on the Google Assistant team where he is responsible for the Google Assistant for the next billion users and internationally. Vladimir has been at Google since 2011 and has lead several projects including YouTube uploads and APIs, and the Google Assistant Personality. Prior to Google Vladimir has earned a PhD in Robotics and has worked as a developer. \",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/3mNorC57rN1vqoxzgEE2-g7mUANkHE1B4Lz4ByCrSbma0XQJVI4jH1vDN7SgjtQKVznFGIT3YpBYWbXoj71xewbrvA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/vvuskovic\",\"LinkedIn\":\"https://www.linkedin.com/in/vladimir-vuskovic-626595\"}},\"4cbfff94-349b-42bb-9d7b-2683479c0e25\":{\"id\":\"4cbfff94-349b-42bb-9d7b-2683479c0e25\",\"name\":\"Walter  Brill\",\"bio\":\"Wally helps internal groups and external partners maintain best practices of design for conversational speech systems. Previously as Google’s senior persona designer he helped bring the character of The Google Assistant to life. Prior to coming to Google, he designed persona driven, speech recognition systems for enterprises and governments from Allstate Insurance and British Airways to eBay and The U.S. Navy. Wally studied electronic music composition at The New School for Social Research.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/TFnqyb18X38HcxTPX8PgA6e1kjd1Ug9gIfwXvaFz8tetHs3pFctwl_t-lkKSEPqtXAdelIn_UAKUwGmBPsaMUM7n\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"0b02798b-ed16-4fff-90dd-0476d9440015\":{\"id\":\"0b02798b-ed16-4fff-90dd-0476d9440015\",\"name\":\"Wan-Chun  Alex Ma\",\"bio\":\"Wan-Chun Alex Ma is a software engineer at Google within the AR/VR division. Prior to Google he was at Activision as a senior research engineer and a visiting scholar at ETH Zurich. He was also a research scientist at Weta Digital where his work on facial performance capture contributed to many recent motion pictures including the Hobbit trilogy, Iron Man 3, the reboot Planet of the Apes series, Furious 7, and BFG. His researches have been published in top tier graphics conferences including SIGGRAPH, SIGGRAPH Asia, Eurographics, EGSR, SGP and I3D, in research areas such as facial animation, performance capture, photogrammetry, image-based modeling and rendering, geometry processing and machine learning. Ma received the Academy Award for Technical Achievement in 2019 for his work on Polarized Spherical Gradient Illumination facial appearance capture system used in creating photoreal digital actors. He received his Ph.D. from National Taiwan University in 2008.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/oNt9jM1zwND2WYYDrtQVx1lqROKNrDoyI_13itgHIcSSvmYOoiVfwvxKySEQUYRy8LDkYOVG8N6DKkS_dWfM0TlH\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/wanchunma/\"}},\"0924a755-17a4-439e-a403-210e17e1e53d\":{\"id\":\"0924a755-17a4-439e-a403-210e17e1e53d\",\"name\":\"Wei Hong\",\"bio\":\"\",\"company\":\"Google\",\"thumbnailUrl\":\"\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"6710442f-dfb9-4d1c-b84d-a16b6cc0ade9\":{\"id\":\"6710442f-dfb9-4d1c-b84d-a16b6cc0ade9\",\"name\":\"Wei Wang\",\"bio\":\"Wei is a software engineer in Android Location and Context team. He works on Fused Location Provider API. His main focus is reducing battery consumption of location, as well increasing location accuracy. Wei received a master's degree in Information Security from Carnegie Mellon University. Prior to that he earned a master’s degree and a bachelor degree from Southeast University in China.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/bP0lupviv6J6vHUeFUj1yQigbqXLMEbOPgG4Qjiz6V6_wJkF-MmY1Q7pwO-FADCVNZ4t9ByElptdbyhqqLgCLFvU\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"63d5cf0c-0118-411c-ad8f-b0f0efd57ac0\":{\"id\":\"63d5cf0c-0118-411c-ad8f-b0f0efd57ac0\",\"name\":\"Will  Larche\",\"bio\":\"Will is the lead Flutter engineer on the Material Design team. He earned his bachelor of fine arts from the Boston Conservatory ('08), was previously the chief product officer of a startup in fashion and e-commerce, and led iOS engineering at multiple companies. His husband is also a software engineer.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/MAUUzlxRf4Hmr0liktxpHg8GBZqgerH3f0Mup0Cf6ljrS-oRhrUUaei8eZpfxJkFQh79zceu-ZRwzhmmyuIHFt34\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"bc50a57d-47da-40a6-b8f7-b11c9274e7e8\":{\"id\":\"bc50a57d-47da-40a6-b8f7-b11c9274e7e8\",\"name\":\"Will  Leszczuk\",\"bio\":\"Will is an engineering manager on the Google Search team working on new features for Search and the Assistant powered by data from the web. Prior to Google, Will spent 8 years building products for consumers and small businesses in the internet industry. Will earned a Bachelor's degree in Computer Science from Rutgers University.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/OCnwTO7N4SCNjsCvexFKTxwG3wS_p4LQN_ekwq1oZS5hF40lIKr2P7gMz51b0vZ_9hV3oIg5uLG83KHL6i2y_yslzQ\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/wleszczuk\"}},\"22f8a7d4-1dc4-4d9d-8839-39f05c894665\":{\"id\":\"22f8a7d4-1dc4-4d9d-8839-39f05c894665\",\"name\":\"Xavier Ducrohet\",\"bio\":\"Xavier is a leader for the Android Studio group, with a focus on Build, and emulator. He joined Google in 2007 and has worked on developer tools for Android since then.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/F-s0kK_Al3SDi71Ofu1acAZiKpnKFxZBljznlr8HU6Mq-r2BVaZqfupAK8cqrX_lIvRBo2h4hXySuvrYXcQ7NM7z\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"f455acc7-3a64-4437-a319-c402af3ea17a\":{\"id\":\"f455acc7-3a64-4437-a319-c402af3ea17a\",\"name\":\"Xiaowen Xin\",\"bio\":\"Xiaowen is the product manager for security features within Android platform, Pixel, and Android Enterprise. She has almost fifteen years of experience in the tech industry, having worked on both Android and Chrome OS at Google, as well as at a number of startups and other major tech companies like Microsoft and EMC. Xiaowen earned a bachelor’s degree in computer science from MIT.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/J-6MrU4tzw5rtz701-501Rv7TOE5ZyV3e23xy0_Qw39G-zP2oOw68IxN1IEMQf3Jp5WOQkKEGJRkxY-CW2qxIao\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"5197a3af-924b-4d12-810d-f298cdba9f1c\":{\"id\":\"5197a3af-924b-4d12-810d-f298cdba9f1c\",\"name\":\"Yacine Rezgui\",\"bio\":\"Yacine is an Android developer advocate in London, UK. He's working on Android Studio, privacy, Kotlin and UI components. He previously was an AI developer advocate at IBM and organised the London Phonegap meetup.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/kRQsSh7BvLq6kUyOXxA57XNdUF4yd5UYJYP5WsC9QYT4szYHlAowfUjPJymF9JhU2iUryYMoJ_wJ_plkmlCbqEE\",\"socialLinks\":{\"GitHub\":\"https://github.com/yrezgui\",\"Website\":\"https://yrezgui.com\",\"Twitter\":\"https://twitter.com/yrezgui\",\"LinkedIn\":\"https://uk.linkedin.com/in/yrezgui\"}},\"b7b63215-b88f-4352-9ad7-8ff3d98a74b5\":{\"id\":\"b7b63215-b88f-4352-9ad7-8ff3d98a74b5\",\"name\":\"Yafit  Becher\",\"bio\":\"Yafit has been a PM at Google since Jan 2015. She is in charge of bringing to life the vision of dynamic and customizable delivery. In her previous role she was part of the Identity & Authentication team, helping users with keeping their account secure. Yafit started her career on the engineering side at Sun Microsystems working on the Java Mobile IDE.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/qVcPw-3TUU-gQitxmPmxd7DObfcR6WfwZkbHcyL3Fz7_a7wroWpoh677GG0RthKcBAJetFU1Tdzwdhc6bI4gYexA\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"https://www.linkedin.com/in/yafitbecher/\"}},\"9e49f28d-0205-483e-a88e-7d1f7e145a1e\":{\"id\":\"9e49f28d-0205-483e-a88e-7d1f7e145a1e\",\"name\":\"Yannick Assogba\",\"bio\":\"Yannick is a software engineer on Google Brain's Big Picture team where he works on TensorFlow.js. He has a background in information visualization in research and industry contexts.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/naCZAVprtTbURgmzLt-YO3wbe7pAz2PaUDAIwqNlS1AfPmr2IXRyDygBd7q0g5m5jawOALA_qHE62AZdEjJOug-P\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/tafsiri\",\"LinkedIn\":\"\"}},\"7ea35afb-f85d-4635-bc0d-c54d511deb58\":{\"id\":\"7ea35afb-f85d-4635-bc0d-c54d511deb58\",\"name\":\"Yasmine Evjen\",\"bio\":\"Yasmine Evjen is a Design Advocate at Google where she helps designers and developers build human-centered experiences using Material Design. She is the creator and host of Centered, a video series from Google Design exploring the intersection of design, product, and people around the world.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/ugpJWLxJ43Xlc6scP3kLjA217ABKgit609vGv5blkh4PdZuGcLcL5tcjSDXcZK506i9U-NYFs26BDHg5rw9kF2I\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://yt.be/centered\",\"Twitter\":\"https://twitter.com/yasmineevjen\",\"LinkedIn\":\"\"}},\"35155de0-bf0a-4c91-a017-4f05d21ab97e\":{\"id\":\"35155de0-bf0a-4c91-a017-4f05d21ab97e\",\"name\":\"Yigit Boyar\",\"bio\":\"Yigit leads the Architecture Components for Android, focusing on the developer experience and dreams of making app development easy. Previously, he was working on Data Binding and RecyclerView in the Android Toolkit Team. Prior to Google, he was the Android engineering manager at Path.com. He received his B.S. in Computer Engineering from Middle East Technical University / Turkey.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/8wVXe0OsY0Ny3syhBxfGC-4xQJaywoZHLQwBu0EXl88MrEqi-RpgcVV2YmXlmkXJlxGPdZ-eKIFG5hMHztIHTkux\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"https://www.birbit.com/\",\"Twitter\":\"https://twitter.com/yigitboyar\",\"LinkedIn\":\"\"}},\"7f2c6096-740c-4b1d-b2e1-931bb7e98d0f\":{\"id\":\"7f2c6096-740c-4b1d-b2e1-931bb7e98d0f\",\"name\":\"Ying  Hao\",\"bio\":\"Ying is a Tech Lead on Firebase Auth team focusing on server side. She works to provide a secure, scalable, highly-available authentication solution for developers from organizations big or small. Prior to Firebase Auth, Ying led an effort that connects users' Google account with other accounts to help users get things done when interacting with Google.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/IfJXPOx8n0_PcBAP1UMRnPswjTd5vTlUx0zZAb3wTLSTxWzSaqrZH5_CaJ4OpW6TYSsB_jKo5R_Y_tIgts8GpGs-\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}},\"ab229a5f-b921-4fe5-95b0-3364e53ed2db\":{\"id\":\"ab229a5f-b921-4fe5-95b0-3364e53ed2db\",\"name\":\"Yossi  Matias\",\"bio\":\"Yossi is Vice President, Engineering, at Google. He is leading efforts in Search (Google Autocomplete, Search Live Results, Google Trends, Search Console), Conversational AI (Google Duplex, Call Screen, Listening to the web), and other Research initiatives (from foundations to applications in Health). He is the global lead of Crisis Response (SOS Alerts, Public Alerts, Flood Forecasting), and is on the steering committee for the AI for Social Good initiative.\\r\\n \\r\\nYossi is the founding Head of Google's R&D Center in Israel (which he grew to over 1000 on staff). He is also the founding executive lead of Google's Campus Tel Aviv, and of Launchpad and other global entrepreneurship programs. \\r\\n \\r\\nIn addition to his experience as an executive and entrepreneur, Yossi has a rich record of scientific research as a Computer Science professor at Tel Aviv University, and previously a Research Scientist at Bell Labs and visiting professor at Stanford. He published extensively, has dozens of patents on his name, and pioneered some of the early technologies for the effective analysis of big data, internet privacy, and contextual search. Yossi is a recipient of the Godel Prize and is an ACM Fellow. \\r\\n \\r\\n\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/S43B5wO9OvFJ4EKiPjQd6mvBB2CAL7gulT9O0_FUAJJhdaO8-mpNnZhaRL8PCLK3Ecj4W2N2lq87l01eZLsNIFI\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"https://twitter.com/ymatias?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor\",\"LinkedIn\":\"https://www.linkedin.com/in/yossimatias/\"}},\"e259b65b-d623-4ffa-9451-c43d951b367e\":{\"id\":\"e259b65b-d623-4ffa-9451-c43d951b367e\",\"name\":\"Zoe  Clifford\",\"bio\":\"Zoe is a software engineer who works on web rendering. She earned a bachelor's degree in computer science from University of Idaho.\",\"company\":\"Google\",\"thumbnailUrl\":\"https://lh3.googleusercontent.com/UEXK1D1pbGmH8_o07KW3b4y3n4BkZ3c5rhr3x8KpTKlxun6D_6FNf0NCghRxYHgqlIron7cLFjYnD0p3YmwZGjy9\",\"socialLinks\":{\"GitHub\":\"\",\"Website\":\"\",\"Twitter\":\"\",\"LinkedIn\":\"\"}}}}"
  },
  {
    "path": "shared/src/release/google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_number\": \"627211894852\",\n    \"firebase_url\": \"https://events-d07ac.firebaseio.com\",\n    \"project_id\": \"events-d07ac\",\n    \"storage_bucket\": \"events-d07ac.appspot.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:627211894852:android:f642e16a06f96c5c\",\n        \"android_client_info\": {\n          \"package_name\": \"com.google.samples.apps.iosched.shared\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"627211894852-8n0gkpr76ho3vfjkodr9cr5766hd20kn.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.google.samples.apps.iosched.shared\",\n            \"certificate_hash\": \"d9b2069d4bc7ecf3e10c8b64f13fd5f1314c6e67\"\n          }\n        },\n        {\n          \"client_id\": \"627211894852-eglljbslsqdegn1ct9eiu6svvt3r84sh.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyD8FgzBb2Kbh7Wi71t-jDZlGXmokJJM9o0\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"appinvite_service\": {\n          \"status\": 2,\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"627211894852-eglljbslsqdegn1ct9eiu6svvt3r84sh.apps.googleusercontent.com\",\n              \"client_type\": 3\n            }\n          ]\n        },\n        \"ads_service\": {\n          \"status\": 2\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/data/FakeAnnouncementDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.shared.data.feed.AnnouncementDataSource\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\n\n/**\n * Returns hardcoded data for development and testing.\n */\nobject FakeAnnouncementDataSource : AnnouncementDataSource {\n    private val feedItem1 = Announcement(\n        id = \"0\", title = \"Item 1\", message = \"First item\",\n        timestamp = TimeUtils.ConferenceDays[0].start, imageUrl = \"\", color = 0,\n        category = \"\", priority = false, emergency = false\n    )\n\n    private val feedItem2 = Announcement(\n        id = \"1\", title = \"Item 2\", message = \"Second item\",\n        timestamp = TimeUtils.ConferenceDays[0].end, imageUrl = \"\", color = 0,\n        category = \"\", priority = true, emergency = true\n    )\n\n    private val feedItem3 = Announcement(\n        id = \"2\", title = \"Item 3\", message = \"Third item\",\n        timestamp = TimeUtils.ConferenceDays[1].start, imageUrl = \"\", color = 0,\n        category = \"\", priority = false, emergency = false\n    )\n\n    private val feedItem4 = Announcement(\n        id = \"3\", title = \"Item 4\", message = \"Fourth item\",\n        timestamp = TimeUtils.ConferenceDays[1].end, imageUrl = \"\", color = 0,\n        category = \"\", priority = false, emergency = false\n    )\n\n    private val feed = listOf(feedItem1, feedItem2, feedItem3, feedItem4)\n\n    override fun getAnnouncements(): List<Announcement> = feed\n}\n"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/data/FakeAppConfigDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport android.content.res.Resources.NotFoundException\nimport com.google.samples.apps.iosched.model.ConferenceWifiInfo\nimport com.google.samples.apps.iosched.shared.data.config.AgendaTimestampsKey\nimport com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport org.threeten.bp.ZonedDateTime\nimport org.threeten.bp.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME\nimport kotlin.collections.Map.Entry\n\nclass FakeAppConfigDataSource() : AppConfigDataSource {\n\n    private val times1 = mutableMapOf(\n        AgendaTimestampsKey.BADGE_PICK_UP_DAY1_START_TIME.key to \"\",\n        AgendaTimestampsKey.BADGE_PICK_UP_DAY1_END_TIME.key to \"\",\n        AgendaTimestampsKey.BADGE_PICK_UP_DAY0_START_TIME.key to \"\",\n        AgendaTimestampsKey.BADGE_PICK_UP_DAY0_END_TIME.key to \"\",\n        AgendaTimestampsKey.BREAKFAST_DAY1_START_TIME.key to \"\",\n        AgendaTimestampsKey.BREAKFAST_DAY1_END_TIME.key to \"\",\n        AgendaTimestampsKey.GOOGLE_KEYNOTE_START_TIME.key to \"\",\n        AgendaTimestampsKey.GOOGLE_KEYNOTE_END_TIME.key to \"\",\n        AgendaTimestampsKey.IO_STORE_DAY1_START_TIME.key to \"\",\n        AgendaTimestampsKey.IO_STORE_DAY1_END_TIME.key to \"\",\n        AgendaTimestampsKey.LUNCH_DAY1_START_TIME.key to \"\",\n        AgendaTimestampsKey.BADGE_PICK_UP_DAY0_END_TIME.key to \"\",\n        AgendaTimestampsKey.LUNCH_DAY1_END_TIME.key to \"\",\n        AgendaTimestampsKey.DEVELOPER_KEYNOTE_START_TIME.key to \"\",\n        AgendaTimestampsKey.DEVELOPER_KEYNOTE_END_TIME.key to \"\",\n        AgendaTimestampsKey.SESSIONS_DAY1_START_TIME.key to \"\",\n        AgendaTimestampsKey.SESSIONS_DAY1_END_TIME.key to \"\",\n        AgendaTimestampsKey.CODELABS_DAY1_START_TIME.key to \"\",\n        AgendaTimestampsKey.CODELABS_DAY1_END_TIME.key to \"\",\n        AgendaTimestampsKey.OFFICE_HOURS_DAY1_START_TIME.key to \"\",\n        AgendaTimestampsKey.OFFICE_HOURS_DAY1_END_TIME.key to \"\",\n        AgendaTimestampsKey.SANDBOXES_DAY1_START_TIME.key to \"\",\n        AgendaTimestampsKey.SANDBOXES_DAY1_END_TIME.key to \"\",\n        AgendaTimestampsKey.AFTER_DARK_START_TIME.key to \"\",\n        AgendaTimestampsKey.AFTER_DARK_END_TIME.key to \"\"\n    )\n\n    private val times2 = mutableMapOf(\n        AgendaTimestampsKey.BADGE_DEVICE_PICK_UP_DAY2_START_TIME.key to \"\",\n        AgendaTimestampsKey.BADGE_DEVICE_PICK_UP_DAY2_END_TIME.key to \"\",\n        AgendaTimestampsKey.BREAKFAST_DAY2_START_TIME.key to \"\",\n        AgendaTimestampsKey.BREAKFAST_DAY2_END_TIME.key to \"\",\n        AgendaTimestampsKey.IO_STORE_DAY2_START_TIME.key to \"\",\n        AgendaTimestampsKey.IO_STORE_DAY2_END_TIME.key to \"\",\n        AgendaTimestampsKey.LUNCH_DAY2_START_TIME.key to \"\",\n        AgendaTimestampsKey.LUNCH_DAY2_END_TIME.key to \"\",\n        AgendaTimestampsKey.SESSIONS_DAY2_START_TIME.key to \"\",\n        AgendaTimestampsKey.SESSIONS_DAY2_END_TIME.key to \"\",\n        AgendaTimestampsKey.CODELABS_DAY2_START_TIME.key to \"\",\n        AgendaTimestampsKey.CODELABS_DAY2_END_TIME.key to \"\",\n        AgendaTimestampsKey.OFFICE_HOURS_DAY2_START_TIME.key to \"\",\n        AgendaTimestampsKey.OFFICE_HOURS_DAY2_END_TIME.key to \"\",\n        AgendaTimestampsKey.SANDBOXES_DAY2_START_TIME.key to \"\",\n        AgendaTimestampsKey.SANDBOXES_DAY2_END_TIME.key to \"\",\n        AgendaTimestampsKey.CONCERT_START_TIME.key to \"\",\n        AgendaTimestampsKey.CONCERT_END_TIME.key to \"\"\n    )\n\n    private val times3 = mutableMapOf(\n        AgendaTimestampsKey.BADGE_DEVICE_PICK_UP_DAY3_START_TIME.key to \"\",\n        AgendaTimestampsKey.BADGE_DEVICE_PICK_UP_DAY3_END_TIME.key to \"\",\n        AgendaTimestampsKey.BREAKFAST_DAY3_START_TIME.key to \"\",\n        AgendaTimestampsKey.BREAKFAST_DAY3_END_TIME.key to \"\",\n        AgendaTimestampsKey.IO_STORE_DAY3_START_TIME.key to \"\",\n        AgendaTimestampsKey.IO_STORE_DAY3_END_TIME.key to \"\",\n        AgendaTimestampsKey.LUNCH_DAY3_START_TIME.key to \"\",\n        AgendaTimestampsKey.LUNCH_DAY3_END_TIME.key to \"\",\n        AgendaTimestampsKey.SESSIONS_DAY3_START_TIME.key to \"\",\n        AgendaTimestampsKey.SESSIONS_DAY3_END_TIME.key to \"\",\n        AgendaTimestampsKey.CODELABS_DAY3_START_TIME.key to \"\",\n        AgendaTimestampsKey.CODELABS_DAY3_END_TIME.key to \"\",\n        AgendaTimestampsKey.OFFICE_HOURS_DAY3_START_TIME.key to \"\",\n        AgendaTimestampsKey.OFFICE_HOURS_DAY3_END_TIME.key to \"\",\n        AgendaTimestampsKey.SANDBOXES_DAY3_START_TIME.key to \"\",\n        AgendaTimestampsKey.SANDBOXES_DAY3_END_TIME.key to \"\"\n    )\n\n    init {\n        val startTimeDay1 = TimeUtils.ConferenceDays[0].start\n        initTimes(startTimeDay1, times1)\n        val startTimeDay2 = TimeUtils.ConferenceDays[1].start\n        initTimes(startTimeDay2, times2)\n        val startTimeDay3 = TimeUtils.ConferenceDays[2].start\n        initTimes(startTimeDay3, times3)\n    }\n\n    private fun initTimes(\n        startTimeDay: ZonedDateTime,\n        times: MutableMap<String, String>\n    ) {\n        times.onEachIndexed { index, entry: Entry<String, String> ->\n            times[entry.key] = startTimeDay.plusMinutes(index.toLong()).format(ISO_OFFSET_DATE_TIME)\n        }\n    }\n\n    override fun getTimestamp(key: String): String {\n        return times1[key] ?: times2[key] ?: times3[key]\n            ?: throw NotFoundException(\"Value for $key not found\")\n    }\n\n    override suspend fun syncStrings() {}\n\n    override fun getWifiInfo(): ConferenceWifiInfo = ConferenceWifiInfo(\"\", \"\")\n    override fun isMapFeatureEnabled(): Boolean = false\n    override fun isExploreArFeatureEnabled(): Boolean = false\n    override fun isCodelabsFeatureEnabled(): Boolean = true\n    override fun isSearchScheduleFeatureEnabled(): Boolean = true\n    override fun isSearchUsingRoomFeatureEnabled(): Boolean = true\n    override fun isAssistantAppFeatureEnabled(): Boolean = false\n    override fun isReservationFeatureEnabled(): Boolean = false\n    override fun isFeedEnabled(): Boolean = false\n}\n"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/data/FakeConferenceDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport android.graphics.Color\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.Tag\nimport com.google.samples.apps.iosched.shared.util.TimeUtils.ConferenceDays\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * ConferenceDataSource data source that never touches the network.\n *\n * This class is only available with the staging variant. It's used for UI tests and\n * faster development.\n */\nobject FakeConferenceDataSource : ConferenceDataSource {\n\n    override fun getRemoteConferenceData() = getOfflineConferenceData()\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        val bootstrapContent = BootstrapConferenceDataSource.getOfflineConferenceData()\n\n        return transformDataForStaging(bootstrapContent ?: throw Exception(\"Couldn't load data\"))\n    }\n\n    private fun transformDataForStaging(data: ConferenceData): ConferenceData {\n        val sessions = data.sessions.toMutableList()\n        val speakers = data.speakers.toMutableList()\n        val codelabs = data.codelabs.toMutableList()\n        val tags = data.tags.toMutableList()\n\n        // Rename the first session of each day\n        ConferenceDays.forEachIndexed daysForEach@{ index, day ->\n            val firstSessionIndex = sessions.indexOfFirst { it in day }\n            if (firstSessionIndex != -1) {\n                val firstSession = sessions[firstSessionIndex]\n                sessions.removeAt(firstSessionIndex)\n                sessions.add(\n                    firstSessionIndex,\n                    firstSession.copy(title = \"First session day ${index + 1}\")\n                )\n            }\n        }\n\n        // Create a fake tag\n        val stagingTag = Tag(\n            displayName = FAKE_SESSION_TAG_NAME, id = \"FAKE_TAG\", tagName = \"topic_staging\",\n            color = Color.BLUE, fontColor = Color.CYAN, category = \"topic\",\n            orderInCategory = 99\n        )\n        tags.add(stagingTag)\n\n        // Create a fake speaker\n        val stagingSpeaker =\n            speakers.first().copy(id = \"FAKE_SPEAKER\", name = FAKE_SESSION_SPEAKER_NAME)\n        speakers.add(stagingSpeaker)\n\n        // Create a fake session with some known fields on the first day.\n        val startTime = ConferenceDays.first().start.plusHours(4)\n        val stagingSession = Session(\n            id = FAKE_SESSION_ID,\n            title = FAKE_SESSION_NAME,\n            description = \"Staging session description\",\n            room = data.rooms.first(),\n            speakers = setOf(stagingSpeaker),\n            tags = listOf(stagingTag),\n            displayTags = listOf(stagingTag),\n            startTime = startTime,\n            endTime = startTime.plusHours(1),\n            isLivestream = false,\n            photoUrl = \"\",\n            relatedSessions = emptySet(),\n            sessionUrl = \"\",\n            doryLink = \"\",\n            youTubeUrl = \"\"\n        )\n        sessions.add(stagingSession)\n\n        // Add a fake codelab\n        val codelab = Codelab(\n            id = FAKE_CODELAB_TITLE,\n            title = FAKE_CODELAB_TITLE,\n            description = FAKE_CODELAB_DESC,\n            codelabUrl = \"\",\n            durationMinutes = 1,\n            iconUrl = null,\n            sortPriority = Int.MAX_VALUE,\n            tags = listOf(stagingTag)\n        )\n        codelabs.add(0, codelab)\n\n        // TODO: Find a way to test alarms without introducing a session with invalid timestamps.\n        // addSessionForAlarmsTesting(sessions, stagingSession)\n\n        // Return the new data replacing the modified properties only.\n        return data.copy(sessions = sessions, speakers = speakers, tags = tags, codelabs = codelabs)\n    }\n\n    private fun addSessionForAlarmsTesting(\n        sessions: MutableList<Session>,\n        exampleSession: Session\n    ) {\n        val timeIn5Minutes = ZonedDateTime.now().plusMinutes(5).plusSeconds(10)\n        sessions.add(\n            exampleSession.copy(\n                id = ALARM_SESSION_ID,\n                title = \"Fake session that starts in 5:10 minutes\",\n                relatedSessions = emptySet(),\n                startTime = timeIn5Minutes,\n                endTime = timeIn5Minutes.plusMinutes(30)\n            )\n        )\n    }\n\n    const val FAKE_SESSION_NAME = \"Fake session on day 1\"\n    const val FAKE_SESSION_ID = \"FAKE_SESSION_ID\"\n    const val FAKE_SESSION_TAG_NAME = \"Staging tag\"\n    const val FAKE_SESSION_SPEAKER_NAME = \"Dr. Staging\"\n    const val ALARM_SESSION_ID = \"abcdefg\"\n\n    const val FAKE_CODELAB_TITLE = \"Baking an Android Cake\"\n    const val FAKE_CODELAB_DESC = \"In this codelab you'll something something something spatula.\"\n}\n"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/data/FakeFeedbackEndpoint.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.data.feedback.FeedbackEndpoint\nimport com.google.samples.apps.iosched.shared.result.Result\n\nobject FakeFeedbackEndpoint : FeedbackEndpoint {\n\n    override suspend fun sendFeedback(\n        sessionId: SessionId,\n        responses: Map<String, Int>\n    ): Result<Unit> {\n        return Result.Success(Unit)\n    }\n}\n"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/data/ar/FakeArDebugFlagEndpoint.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.ar\n\nobject FakeArDebugFlagEndpoint : ArDebugFlagEndpoint {\n\n    override suspend fun canDemoAr(): Boolean {\n        return true\n    }\n}\n"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/data/feed/FakeMomentDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.feed\n\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.shared.util.ColorUtils\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Returns hardcoded data for development and testing.\n */\nobject FakeMomentDataSource : MomentDataSource {\n    private val imageBaseUrl =\n        \"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fhome/\"\n    private val moment = Moment(\n        id = \"1\",\n        title = \"Keynote\",\n        streamUrl = \"https://youtu.be/lyRPyRKHO8M\",\n        startTime = ZonedDateTime.parse(\"2019-05-07T10:00:00-07:00\"),\n        endTime = ZonedDateTime.parse(\"2019-05-07T11:30:00-07:00\"),\n        textColor = ColorUtils.parseHexColor(\"#ffffff\"),\n        ctaType = Moment.CTA_LIVE_STREAM,\n        imageUrl = \"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images%2Fhome\" +\n            \"%2FHome-GoogleKeynote%402x.png?alt=media&token=0df80e81-5bea-4171-9016-4f1e3dcfc7f9\",\n        imageUrlDarkTheme = \"https://firebasestorage.googleapis.com/v0/b/io2019-festivus/o/images\" +\n            \"%2Fhome%2FDM-Home-GoogleKeynote%402x.png?alt=media&token=bfd169ae-f501-4cf8-94be-\" +\n            \"462682d40fd7\",\n        attendeeRequired = false,\n        timeVisible = false,\n        featureId = \"\",\n        featureName = \"\"\n    )\n\n    override fun getMoments(): List<Moment> = listOf(moment)\n}\n"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/data/userevent/FakeUserEventDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.userevent\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_SUCCEEDED\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.data.BootstrapConferenceDataSource\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.CancelAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestAction\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.Result.Success\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flow\n\n/**\n * Returns data loaded from a local JSON file for development and testing.\n */\nobject FakeUserEventDataSource : UserEventDataSource {\n\n    private val conferenceData = BootstrapConferenceDataSource.getOfflineConferenceData()!!\n    private val userEvents = ArrayList<UserEvent>()\n\n    init {\n        conferenceData.sessions.forEachIndexed { i, session ->\n            val reservation = ReservationRequestResult(\n                RESERVE_SUCCEEDED, \"123\",\n                System.currentTimeMillis()\n            )\n            if (i in 1..50) {\n                userEvents.add(\n                    UserEvent(\n                        session.id,\n                        isStarred = i % 2 == 0,\n                        reservationRequestResult = reservation\n                    )\n                )\n            }\n        }\n    }\n\n    override fun getObservableUserEvents(userId: String): Flow<UserEventsResult> {\n        return flow { emit(UserEventsResult(userEvents)) }\n    }\n\n    override fun getObservableUserEvent(\n        userId: String,\n        eventId: SessionId\n    ) = flow {\n        emit(UserEventResult(userEvents[0]))\n    }\n\n    override suspend fun starEvent(\n        userId: SessionId,\n        userEvent: UserEvent\n    ) = Success(\n        if (userEvent.isStarred) StarUpdatedStatus.STARRED\n        else StarUpdatedStatus.UNSTARRED\n    )\n\n    override suspend fun recordFeedbackSent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<Unit> = Success(Unit)\n\n    override suspend fun requestReservation(\n        userId: String,\n        session: Session,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction> =\n        Success(\n            if (action is RequestAction) RequestAction() else CancelAction()\n        )\n\n    override fun getUserEvents(userId: String): List<UserEvent> {\n        return userEvents\n    }\n\n    override suspend fun swapReservation(\n        userId: String,\n        fromSession: Session,\n        toSession: Session\n    ): Result<SwapRequestAction> = Success(SwapRequestAction())\n\n    override fun getUserEvent(userId: String, eventId: SessionId): UserEvent? {\n        return userEvents.firstOrNull { it.id == eventId }\n    }\n\n    override fun clearSingleEventSubscriptions() {}\n}\n"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/di/SharedModule.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.di\n\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataSource\nimport com.google.samples.apps.iosched.shared.data.FakeAnnouncementDataSource\nimport com.google.samples.apps.iosched.shared.data.FakeAppConfigDataSource\nimport com.google.samples.apps.iosched.shared.data.FakeConferenceDataSource\nimport com.google.samples.apps.iosched.shared.data.FakeFeedbackEndpoint\nimport com.google.samples.apps.iosched.shared.data.ar.ArDebugFlagEndpoint\nimport com.google.samples.apps.iosched.shared.data.ar.FakeArDebugFlagEndpoint\nimport com.google.samples.apps.iosched.shared.data.config.AppConfigDataSource\nimport com.google.samples.apps.iosched.shared.data.db.AppDatabase\nimport com.google.samples.apps.iosched.shared.data.feed.AnnouncementDataSource\nimport com.google.samples.apps.iosched.shared.data.feed.DefaultFeedRepository\nimport com.google.samples.apps.iosched.shared.data.feed.FakeMomentDataSource\nimport com.google.samples.apps.iosched.shared.data.feed.FeedRepository\nimport com.google.samples.apps.iosched.shared.data.feed.MomentDataSource\nimport com.google.samples.apps.iosched.shared.data.feedback.FeedbackEndpoint\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.session.SessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.FakeUserEventDataSource\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventDataSource\nimport com.google.samples.apps.iosched.shared.domain.search.FtsMatchStrategy\nimport com.google.samples.apps.iosched.shared.domain.search.SessionTextMatchStrategy\nimport com.google.samples.apps.iosched.shared.domain.search.SimpleMatchStrategy\nimport com.google.samples.apps.iosched.shared.fcm.StagingTopicSubscriber\nimport com.google.samples.apps.iosched.shared.fcm.TopicSubscriber\nimport com.google.samples.apps.iosched.shared.time.DefaultTimeProvider\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport javax.inject.Named\nimport javax.inject.Singleton\n\n/**\n * Module where classes created in the shared module are created.\n */\n@InstallIn(SingletonComponent::class)\n@Module\nclass SharedModule {\n\n// Define the data source implementations that should be used. All data sources are singletons.\n\n    @Singleton\n    @Provides\n    @Named(\"remoteConfDatasource\")\n    fun provideConferenceDataSource(): ConferenceDataSource {\n        return FakeConferenceDataSource\n    }\n\n    @Singleton\n    @Provides\n    @Named(\"bootstrapConfDataSource\")\n    fun provideBootstrapRemoteSessionDataSource(): ConferenceDataSource {\n        return FakeConferenceDataSource\n    }\n\n    @Singleton\n    @Provides\n    fun provideConferenceDataRepository(\n        @Named(\"remoteConfDatasource\") remoteDataSource: ConferenceDataSource,\n        @Named(\"bootstrapConfDataSource\") boostrapDataSource: ConferenceDataSource,\n        appDatabase: AppDatabase\n    ): ConferenceDataRepository {\n        return ConferenceDataRepository(remoteDataSource, boostrapDataSource, appDatabase)\n    }\n\n    @Singleton\n    @Provides\n    fun provideSessionRepository(\n        conferenceDataRepository: ConferenceDataRepository\n    ): SessionRepository {\n        return DefaultSessionRepository(conferenceDataRepository)\n    }\n\n    @Singleton\n    @Provides\n    fun provideUserEventDataSource(): UserEventDataSource {\n        return FakeUserEventDataSource\n    }\n\n    @Singleton\n    @Provides\n    fun provideFeedbackEndpoint(): FeedbackEndpoint {\n        return FakeFeedbackEndpoint\n    }\n\n    @Singleton\n    @Provides\n    fun provideSessionAndUserEventRepository(\n        userEventDataSource: UserEventDataSource,\n        sessionRepository: SessionRepository\n    ): SessionAndUserEventRepository {\n        return DefaultSessionAndUserEventRepository(\n            userEventDataSource,\n            sessionRepository\n        )\n    }\n\n    @Singleton\n    @Provides\n    fun provideTopicSubscriber(): TopicSubscriber {\n        return StagingTopicSubscriber()\n    }\n\n    @Singleton\n    @Provides\n    fun provideAppConfigDataSource(): AppConfigDataSource {\n        return FakeAppConfigDataSource()\n    }\n\n    @Singleton\n    @Provides\n    fun provideTimeProvider(): TimeProvider {\n        // TODO: Make the time configurable\n        return DefaultTimeProvider\n    }\n\n    @Singleton\n    @Provides\n    fun provideAnnouncementDataSource(): AnnouncementDataSource {\n        return FakeAnnouncementDataSource\n    }\n\n    @Singleton\n    @Provides\n    fun provideMomentDataSource(): MomentDataSource {\n        return FakeMomentDataSource\n    }\n\n    @Singleton\n    @Provides\n    fun provideFeedRepository(\n        announcementDataSource: AnnouncementDataSource,\n        momentDataSource: MomentDataSource\n    ): FeedRepository {\n        return DefaultFeedRepository(announcementDataSource, momentDataSource)\n    }\n\n    @Singleton\n    @Provides\n    fun provideArDebugFlagEndpoint(): ArDebugFlagEndpoint {\n        return FakeArDebugFlagEndpoint\n    }\n\n    @Singleton\n    @Provides\n    fun provideSessionTextMatchStrategy(\n        @SearchUsingRoomEnabledFlag useRoom: Boolean,\n        appDatabase: AppDatabase\n    ): SessionTextMatchStrategy {\n        return if (useRoom) FtsMatchStrategy(appDatabase) else SimpleMatchStrategy\n    }\n}\n"
  },
  {
    "path": "shared/src/staging/java/com/google/samples/apps/iosched/shared/fcm/StagingTopicSubscriber.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.fcm\n\nclass StagingTopicSubscriber : TopicSubscriber {\n    override fun subscribeToScheduleUpdates() {\n        // No-op\n    }\n\n    override fun subscribeToAttendeeUpdates() {\n        // No-op\n    }\n\n    override fun unsubscribeFromAttendeeUpdates() {\n        // No-op\n    }\n}\n"
  },
  {
    "path": "shared/src/staging/res/drawable/staging_user_profile.xml",
    "content": "<!--\n  ~ Copyright 2019 Google LLC\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     https://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"400\"\n    android:viewportHeight=\"400\">\n    <path\n        android:fillColor=\"#54abd0f2\"\n        android:pathData=\"M0,0H400V400H0Z\" />\n    <path\n        android:fillColor=\"#39c79d\"\n        android:pathData=\"M128.38,249.06l200.29,-93.4l84.52,181.26l-200.29,93.4z\" />\n    <path\n        android:fillColor=\"#39c79d\"\n        android:pathData=\"m234.01,51.46c-1.71,-0.11,-3.47,0.64,-3.57,2.34l-2.3,36.98c-15.57,0.04,-36.95,4.5,-49.36,11.05c-12.41,6.54,-29.39,18.36,-37.65,29.5l-29.9,-21.83c-2.73,-1.99,-6.84,4.25,-4.37,6.02l29.53,21.18c-17.89,24.71,-32.06,65.52,-11.61,104.38l200.29,-93.41c-20.44,-40.92,-60.98,-56.99,-89.46,-56.79l1.7,-36.56c0.08,-1.76,-1.58,-2.74,-3.29,-2.85zm15.28,66.82a10,10,109.31,0,1,9.27,10.68a10,10,57.89,0,1,-10.68,9.27a10,10,133.25,0,1,-9.27,-10.68a10,10,109.31,0,1,10.68,-9.27zm-91.24,42.68a10,10,75.94,0,1,9.27,10.68a10,10,101.53,0,1,-10.68,9.27a10,10,96.27,0,1,-9.27,-10.68a10,10,105.46,0,1,10.68,-9.27z\" />\n    <path\n        android:fillColor=\"#39c79d\"\n        android:pathData=\"M21.59,180.86a24,24,110.64,0,1,33.82,2.96l71.99,85.79a24,24,105.88,0,1,-2.96,33.82a24,24,105.88,0,1,-33.81,-2.96l-71.99,-85.8a24,24,110.64,0,1,2.95,-33.81z\" />\n    <path\n        android:fillColor=\"#39c79d\"\n        android:pathData=\"M357.9,142.03a24,24,108.07,0,1,31.89,11.61l47.34,101.5a24,24,110.06,0,1,-11.61,31.9a24,24,110.06,0,1,-31.9,-11.61l-47.33,-101.51a24,24,108.07,0,1,11.61,-31.89z\" />\n</vector>\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/firestore/entity/ReservationRequestResultTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.firestore.entity\n\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult\nimport org.hamcrest.Matchers.notNullValue\nimport org.hamcrest.Matchers.nullValue\nimport org.hamcrest.core.Is.`is`\nimport org.junit.Assert.assertThat\nimport org.junit.Test\n\nclass ReservationRequestResultTest {\n\n    @Test\n    fun getIfPresent_nutNull() {\n        val presentName =\n            ReservationRequestResult.ReservationRequestStatus.RESERVE_SUCCEEDED.toString()\n\n        assertThat(\n            ReservationRequestResult.ReservationRequestStatus.getIfPresent(presentName),\n            `is`(notNullValue())\n        )\n    }\n\n    @Test\n    fun getIfPresent_notPresent_returnsNull() {\n        val notPresentName = \"not present\"\n\n        assertThat(\n            ReservationRequestResult.ReservationRequestStatus.getIfPresent(notPresentName),\n            `is`(nullValue())\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/firestore/entity/UserEventTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.firestore.entity\n\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.model.userdata.UserEvent.ReservationStatus\nimport com.google.samples.apps.iosched.model.userdata.UserEvent.ReservationStatus.NONE\nimport com.google.samples.apps.iosched.model.userdata.UserEvent.ReservationStatus.RESERVED\nimport com.google.samples.apps.iosched.model.userdata.UserEvent.ReservationStatus.WAITLISTED\nimport com.google.samples.apps.iosched.test.data.TestData\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\nclass UserEventTest {\n\n    private fun createTestEvent(\n        isStarred: Boolean = false,\n        status: ReservationStatus = NONE,\n        requestResult: ReservationRequestResult? = null\n    ): UserEvent {\n        return TestData.userEvents[0].copy(\n            isStarred = isStarred,\n            reservationStatus = status,\n            reservationRequestResult = requestResult\n        )\n    }\n\n    private fun createRequestResult(\n        requestStatus: ReservationRequestStatus\n    ): ReservationRequestResult {\n        return ReservationRequestResult(requestStatus, requestId = \"dummy\", timestamp = -1)\n    }\n\n    @Test\n    fun starred_isPinned() {\n        val userEvent = createTestEvent(isStarred = true, status = NONE)\n        assertTrue(userEvent.isStarredOrReserved())\n    }\n\n    @Test\n    fun notStarred_waitlisted_isPinned() {\n        val waitlisted = createTestEvent(isStarred = false, status = WAITLISTED)\n        assertTrue(waitlisted.isStarredOrReserved())\n    }\n\n    @Test\n    fun notStarred_reserved_isPinned() {\n        val reserved = createTestEvent(isStarred = false, status = RESERVED)\n        assertTrue(reserved.isStarredOrReserved())\n    }\n\n    @Test\n    fun changedBySwap_isLastRequestResultBySwap() {\n        val reservedUserEvent = createTestEvent(\n            status = RESERVED,\n            requestResult = createRequestResult(ReservationRequestStatus.SWAP_SUCCEEDED)\n        )\n        assertTrue(reservedUserEvent.isLastRequestResultBySwap())\n\n        val noneUserEvent = createTestEvent(\n            status = NONE,\n            requestResult = createRequestResult(ReservationRequestStatus.SWAP_SUCCEEDED)\n        )\n        assertTrue(noneUserEvent.isLastRequestResultBySwap())\n\n        val waitlistedUserEvent = createTestEvent(\n            status = WAITLISTED,\n            requestResult = createRequestResult(ReservationRequestStatus.SWAP_WAITLISTED)\n        )\n        assertTrue(waitlistedUserEvent.isLastRequestResultBySwap())\n    }\n\n    // TODO: Add tests for isReserved, isWaitlisted, etc.\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/data/BootstrapConferenceDataSourceTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport org.hamcrest.Matchers.greaterThan\nimport org.hamcrest.Matchers.hasSize\nimport org.junit.Assert\nimport org.junit.Test\n\n/**\n * Tests for [BootstrapConferenceDataSource]\n */\nclass BootstrapConferenceDataSourceTest {\n\n    @Test\n    fun loadJson_resultIsNotEmpty() {\n        val data = BootstrapConferenceDataSource.loadAndParseBootstrapData()\n        Assert.assertThat(data.sessions, hasSize(greaterThan(0)))\n        Assert.assertThat(data.rooms, hasSize(greaterThan(0)))\n        Assert.assertThat(data.speakers, hasSize(greaterThan(0)))\n        Assert.assertThat(data.tags, hasSize(greaterThan(0)))\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/data/ConferenceDataJsonParserTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport com.google.gson.JsonSyntaxException\nimport com.google.samples.apps.iosched.model.Speaker\nimport org.hamcrest.CoreMatchers.hasItem\nimport org.hamcrest.core.Is.`is` as Is\nimport org.hamcrest.core.IsEqual.equalTo\nimport org.junit.Assert.assertThat\nimport org.junit.Test\n\nprivate const val FILENAME = \"test_conference_data1.json\"\nprivate const val MALFORMED_FILENAME = \"malformed_conference_data.json\"\n\n/**\n * Unit tests for [ConferenceDataJsonParser].\n */\nclass ConferenceDataJsonParserTest {\n\n    @Test\n    fun testFakeData1() {\n        val inputStream = this.javaClass.classLoader!!.getResource(FILENAME)\n            .openStream()\n\n        val data = ConferenceDataJsonParser.parseConferenceData(inputStream)\n\n        assertThat(data.sessions.size, Is(equalTo(3)))\n        assertThat(data.rooms.size, Is(equalTo(2)))\n        assertThat(data.speakers.size, Is(equalTo(3)))\n        assertThat(data.tags.size, Is(equalTo(3)))\n        assertThat(data.codelabs.size, Is(equalTo(2)))\n        assertThat(data.version, Is(equalTo(42)))\n\n        /* Relations */\n\n        // Speakers\n        val speakersSecondSession: Set<Speaker> = data.sessions[1].speakers\n        val firstSpeaker: Speaker = data.speakers[0]\n        assertThat(speakersSecondSession, hasItem(firstSpeaker))\n\n        // Tags\n        assertThat(data.sessions[1].tags, hasItem(data.tags[0]))\n\n        // rooms\n        assertThat(data.sessions[1].room, Is(equalTo(data.rooms[0])))\n    }\n\n    @Test(expected = JsonSyntaxException::class)\n    fun testMalformedJson() {\n        val inputStream = this.javaClass.classLoader!!.getResource(MALFORMED_FILENAME)\n            .openStream()\n\n        ConferenceDataJsonParser.parseConferenceData(inputStream)\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/data/ConferenceDataRepositoryTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.data.TestData.session1\nimport com.google.samples.apps.iosched.test.data.TestData.session3\nimport com.google.samples.apps.iosched.test.util.FakeAppDatabase\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport java.io.IOException\nimport org.hamcrest.core.Is.`is` as Is\nimport org.hamcrest.core.IsEqual.equalTo\nimport org.hamcrest.core.IsNot.not\nimport org.hamcrest.core.IsNull.notNullValue\nimport org.hamcrest.core.IsNull.nullValue\nimport org.junit.Assert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [ConferenceDataRepository].\n */\nclass ConferenceDataRepositoryTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private lateinit var repo: ConferenceDataRepository\n\n    private val testDispatcher = coroutineRule.testDispatcher\n\n    @Test\n    fun remotePrevailsOverBootstrap() = runTest {\n        // Given a repo with a working remote data source that returns session0\n        // and a bootstrap that returns session 3\n        repo = ConferenceDataRepository(\n            remoteDataSource = TestConfDataSourceSession0(),\n            boostrapDataSource = BootstrapDataSourceSession3(),\n            appDatabase = FakeAppDatabase()\n        )\n\n        // When requesting previously-refreshed data\n        repo.refreshCacheWithRemoteConferenceData()\n        val data = repo.getOfflineConferenceData()\n\n        // Only session 0 should be available because remote has priority\n        assertThat(data.sessions.first(), Is(equalTo(TestData.session0)))\n        // and meta info should be set\n        assertThat(repo.latestUpdateSource, Is(equalTo(UpdateSource.NETWORK)))\n        val lastUpdate = repo.dataLastUpdatedObservable.first()\n        assertThat(lastUpdate, Is(not(equalTo(0L))))\n        assertThat(repo.latestException, Is(nullValue()))\n        assertThat(repo.currentConferenceDataVersion, Is(equalTo(NETWORK_DATA_VERSION)))\n    }\n\n    // TODO: Takes 2 seconds\n    @Test\n    fun remoteNotAvailable_bootstrapUsed() = runTest {\n        // Given a repo with unavailable remote data source\n        // and a bootstrap that returns session 3\n        repo = ConferenceDataRepository(\n            remoteDataSource = NotAvailableDataSource(),\n            boostrapDataSource = BootstrapDataSourceSession3(),\n            appDatabase = FakeAppDatabase()\n        )\n\n        // Remote conference throws an error\n        try {\n            repo.refreshCacheWithRemoteConferenceData()\n        } catch (e: Exception) {\n            assertThat(e, Is(notNullValue()))\n        }\n\n        // When requesting data, the only data available is Bootstrap\n        val data = repo.getOfflineConferenceData()\n\n        // Only session 3 should be available because remote has priority\n        assertThat(data.sessions.first(), Is(equalTo(session3)))\n        // and meta info should be set\n        assertThat(repo.latestUpdateSource, Is(equalTo(UpdateSource.BOOTSTRAP)))\n        assertThat(repo.latestException, Is(notNullValue()))\n        assertThat(repo.currentConferenceDataVersion, Is(equalTo(BOOTSTRAP_DATA_VERSION)))\n    }\n\n    @Test\n    fun networkExceptionCacheUnavailable_cacheReturned() = runTest {\n        // Given a repo with unavailable remote data (that throws an exception) and no cache\n        // and a bootstrap that returns session 1\n        repo = ConferenceDataRepository(\n            remoteDataSource = ThrowingDataSourceNoCache(),\n            boostrapDataSource = TestConfDataSourceSession1(),\n            appDatabase = FakeAppDatabase()\n        )\n\n        // Remote conference throws an error\n        try {\n            repo.refreshCacheWithRemoteConferenceData()\n        } catch (e: Exception) {\n            assertThat(e, Is(notNullValue()))\n        }\n\n        // When requesting data\n        val data = repo.getOfflineConferenceData()\n\n        // Only session 1 should be available because remote has no good data\n        assertThat(data.sessions.first(), Is(equalTo(session1)))\n        // and meta info should be set\n        assertThat(repo.latestUpdateSource, Is(equalTo(UpdateSource.BOOTSTRAP)))\n        assertThat(repo.latestException, Is(notNullValue()))\n        assertThat(repo.currentConferenceDataVersion, Is(equalTo(CACHE_DATA_VERSION)))\n    }\n}\n\n/**\n * Test data and classes:\n */\n\nprivate const val NETWORK_DATA_VERSION = 42\nprivate const val CACHE_DATA_VERSION = 23\nprivate const val BOOTSTRAP_DATA_VERSION = 314\n\nclass TestConfDataSourceSession0 : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        return conferenceData\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return conferenceData\n    }\n\n    private val conferenceData = ConferenceData(\n        sessions = listOf(TestData.session0),\n        speakers = listOf(TestData.speaker1),\n        rooms = emptyList(),\n        codelabs = emptyList(),\n        tags = listOf(TestData.androidTag, TestData.webTag),\n        version = NETWORK_DATA_VERSION\n    )\n}\n\nprivate class TestConfDataSourceSession1 : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        return ConferenceData(\n            sessions = listOf(TestData.session1),\n            speakers = listOf(TestData.speaker1),\n            rooms = emptyList(),\n            codelabs = emptyList(),\n            tags = listOf(TestData.androidTag, TestData.webTag),\n            version = NETWORK_DATA_VERSION\n        )\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return ConferenceData(\n            sessions = listOf(TestData.session1),\n            speakers = listOf(TestData.speaker1),\n            rooms = emptyList(),\n            codelabs = emptyList(),\n            tags = listOf(TestData.androidTag, TestData.webTag),\n            version = CACHE_DATA_VERSION\n        )\n    }\n}\n\nclass BootstrapDataSourceSession3 : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        throw NotImplementedError() // Not used\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return ConferenceData(\n            sessions = listOf(TestData.session3),\n            speakers = listOf(TestData.speaker1),\n            rooms = emptyList(),\n            codelabs = emptyList(),\n            tags = listOf(TestData.androidTag, TestData.webTag),\n            version = BOOTSTRAP_DATA_VERSION\n        )\n    }\n}\n\nprivate class TestConfDataSourceOnlyCachedSession1 : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        return null\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return ConferenceData(\n            sessions = listOf(TestData.session1),\n            speakers = listOf(TestData.speaker1),\n            rooms = emptyList(),\n            codelabs = emptyList(),\n            tags = listOf(TestData.androidTag, TestData.webTag),\n            version = CACHE_DATA_VERSION\n        )\n    }\n}\n\nclass NotAvailableDataSource : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        return null\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return null\n    }\n}\n\nprivate class ThrowingDataSourceCacheSession2 : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        throw IOException(\"Test\")\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return ConferenceData(\n            sessions = listOf(TestData.session2),\n            speakers = listOf(TestData.speaker1),\n            rooms = emptyList(),\n            codelabs = emptyList(),\n            tags = listOf(TestData.androidTag, TestData.webTag),\n            version = CACHE_DATA_VERSION\n        )\n    }\n}\n\nprivate class ThrowingDataSourceNoCache : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        throw IOException(\"Test\")\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return null\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/data/signin/ObserveUserAuthStateUseCaseTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.signin\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.AuthStateUserDataSource\nimport com.google.samples.apps.iosched.shared.data.signin.datasources.RegisteredUserDataSource\nimport com.google.samples.apps.iosched.shared.domain.auth.ObserveUserAuthStateUseCase\nimport com.google.samples.apps.iosched.shared.fcm.TopicSubscriber\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.test.data.CoroutineScope\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.nhaarman.mockito_kotlin.doReturn\nimport com.nhaarman.mockito_kotlin.mock\nimport com.nhaarman.mockito_kotlin.never\nimport com.nhaarman.mockito_kotlin.verify\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.hamcrest.Matchers.instanceOf\nimport org.hamcrest.core.Is.`is`\nimport org.hamcrest.core.IsEqual.equalTo\nimport org.junit.Rule\nimport org.junit.Test\n\nconst val TEST_USER_ID = \"testuser\"\n\n/**\n * Tests for [ObserveUserAuthStateUseCase].\n */\nclass ObserveUserAuthStateUseCaseTest {\n\n    @get:Rule\n    val instantTaskExecutor = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun userSuccessRegistered() = runTest {\n\n        val topicSubscriber = mock<TopicSubscriber> {}\n\n        val subject = createObserveUserAuthStateUseCase(\n            isAnonymous = false,\n            isRegistered = true,\n            isSuccess = true,\n            userId = TEST_USER_ID,\n            topicSubscriber = topicSubscriber\n        )\n\n        val result = subject(Any()).first().data\n\n        assertThat(\n            result?.getUid(),\n            `is`(equalTo(TEST_USER_ID))\n        )\n        assertThat(\n            result?.isSignedIn(),\n            `is`(equalTo(true))\n        )\n        assertThat(\n            result?.isRegistered(),\n            `is`(equalTo(true))\n        )\n\n        verify(topicSubscriber).subscribeToAttendeeUpdates()\n        verify(topicSubscriber, never()).unsubscribeFromAttendeeUpdates()\n    }\n\n    @Test\n    fun userSuccessNotRegistered() = runTest {\n        val topicSubscriber = mock<TopicSubscriber> {}\n\n        val subject = createObserveUserAuthStateUseCase(\n            isAnonymous = false,\n            isRegistered = false,\n            isSuccess = true,\n            userId = TEST_USER_ID,\n            topicSubscriber = topicSubscriber\n        )\n\n        val result = subject(Any()).first().data\n\n        assertThat(\n            result?.getUid(),\n            `is`(equalTo(TEST_USER_ID))\n        )\n        assertThat(\n            result?.isSignedIn(),\n            `is`(equalTo(true))\n        )\n        assertThat(\n            result?.isRegistered(),\n            `is`(equalTo(false))\n        )\n        verify(topicSubscriber, never()).subscribeToAttendeeUpdates()\n        verify(topicSubscriber, never()).unsubscribeFromAttendeeUpdates()\n    }\n\n    @Test\n    fun userErrorNotRegistered() = runTest {\n        val topicSubscriber = mock<TopicSubscriber> {}\n\n        val subject = createObserveUserAuthStateUseCase(\n            isAnonymous = false,\n            isRegistered = true,\n            isSuccess = false,\n            userId = TEST_USER_ID,\n            topicSubscriber = topicSubscriber\n        )\n\n        val result = subject(Any()).first()\n\n        assertThat(\n            result,\n            `is`(instanceOf(Result.Error::class.java))\n        )\n        verify(topicSubscriber, never()).subscribeToAttendeeUpdates()\n        verify(topicSubscriber, never()).unsubscribeFromAttendeeUpdates()\n    }\n\n    @Test\n    fun userLogsOut() = runTest {\n\n        val topicSubscriber = mock<TopicSubscriber> {}\n\n        val subject = createObserveUserAuthStateUseCase(\n            isAnonymous = true,\n            isRegistered = false,\n            isSuccess = true,\n            userId = TEST_USER_ID,\n            topicSubscriber = topicSubscriber\n        )\n\n        val result = subject(Any()).first().data\n\n        assertThat(\n            result?.getUid(),\n            `is`(equalTo(TEST_USER_ID))\n        )\n        assertThat(\n            result?.isSignedIn(),\n            `is`(equalTo(false))\n        )\n        assertThat(\n            result?.isRegistered(),\n            `is`(equalTo(false))\n        )\n\n        verify(topicSubscriber).unsubscribeFromAttendeeUpdates()\n        verify(topicSubscriber, never()).subscribeToAttendeeUpdates()\n    }\n\n    private fun createObserveUserAuthStateUseCase(\n        isAnonymous: Boolean,\n        isRegistered: Boolean,\n        isSuccess: Boolean,\n        userId: String,\n        topicSubscriber: TopicSubscriber = mock {}\n    ): ObserveUserAuthStateUseCase {\n        val authStateUserDataSource = FakeAuthStateUserDataSource(\n            isAnonymous, isSuccess, userId\n        )\n\n        val registeredUserDataSource = FakeRegisteredUserDataSource(isRegistered)\n        return ObserveUserAuthStateUseCase(\n            registeredUserDataSource,\n            authStateUserDataSource,\n            topicSubscriber,\n            coroutineRule.CoroutineScope(),\n            coroutineRule.testDispatcher\n        )\n    }\n}\n\nclass FakeRegisteredUserDataSource(private val isRegistered: Boolean) : RegisteredUserDataSource {\n    override fun observeUserChanges(userId: String): Flow<Result<Boolean?>> = flow {\n        emit(Result.Success(isRegistered))\n    }\n}\n\nclass FakeAuthStateUserDataSource(\n    private val isAnonymous: Boolean,\n    private val successFirebaseUser: Boolean,\n    private val userId: String?\n) : AuthStateUserDataSource {\n\n    override fun getBasicUserInfo(): Flow<Result<AuthenticatedUserInfoBasic?>> = flow {\n        if (successFirebaseUser) {\n            val mockUser = mock<AuthenticatedUserInfoBasic> {\n                on { isAnonymous() }.doReturn(isAnonymous)\n                on { getUid() }.doReturn(userId)\n                on { isSignedIn() }.doReturn(!isAnonymous)\n            }\n            emit(Result.Success(mockUser))\n        } else {\n            emit(Result.Error(Exception(\"Test\")))\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/data/userevent/CompareOldAndNewUserEventsTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.userevent\n\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequest\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequest.ReservationRequestEntityAction\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.SWAP_SUCCEEDED\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.SWAP_WAITLISTED\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport org.hamcrest.core.Is.`is`\nimport org.hamcrest.core.IsEqual.equalTo\nimport org.hamcrest.core.IsNull.nullValue\nimport org.junit.Assert.assertThat\nimport org.junit.Test\n\n/**\n * Unit tests for [compareOldAndNewUserEvents].\n */\nclass CompareOldAndNewUserEventsTest {\n\n    @Test\n    fun generateReservationChangeMsg_noMessage() {\n\n        val oldState = createUserEvent()\n        val newState = createUserEvent()\n\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n\n        assertThat(result?.type, `is`(nullValue()))\n    }\n\n    @Test\n    fun compareOldAndNew_newStateReserved_reservationChangeMessage() {\n\n        val oldState = createUserEvent()\n        val newState = createUserEvent(reservationStatus = UserEvent.ReservationStatus.RESERVED)\n\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n\n        assertThat(result?.type, `is`(equalTo(UserEventMessageChangeType.CHANGES_IN_RESERVATIONS)))\n    }\n\n    @Test\n    fun compareOldAndNew_newStateReservedBySwap_reservationReplacedMessage() {\n        val oldState = createUserEvent()\n        val newState = createUserEvent(\n            reservationStatus = UserEvent.ReservationStatus.RESERVED,\n            reservationRequestResult = createReservationResult(requestResult = SWAP_SUCCEEDED)\n        )\n\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n\n        assertThat(result?.type, `is`(equalTo(UserEventMessageChangeType.RESERVATIONS_REPLACED)))\n    }\n\n    @Test\n    fun compareOldAndNew_newStateWaitlistedBySwap_waitlistChangeMessage() {\n        val oldState = createUserEvent(\n            reservationRequest = createReservationRequest(\n                ReservationRequestEntityAction.RESERVE_REQUESTED\n            )\n        )\n        val newState = createUserEvent(\n            reservationStatus = UserEvent.ReservationStatus.WAITLISTED,\n            reservationRequestResult = createReservationResult(requestResult = SWAP_WAITLISTED)\n        )\n\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n\n        assertThat(result?.type, `is`(equalTo(UserEventMessageChangeType.CHANGES_IN_WAITLIST)))\n    }\n\n    @Test\n    fun compareOldAndNew_newStateUnreserved_reservationChangeMessage() {\n\n        val oldState = createUserEvent(reservationStatus = UserEvent.ReservationStatus.RESERVED)\n        val newState = createUserEvent()\n\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n\n        assertThat(result?.type, `is`(equalTo(UserEventMessageChangeType.RESERVATION_CANCELED)))\n    }\n\n    @Test\n    fun compareOldAndNew_newStateWaitlisted_waitlistChangeMessage() {\n\n        val oldState = createUserEvent(\n            reservationRequest = createReservationRequest(\n                ReservationRequestEntityAction.RESERVE_REQUESTED\n            )\n        )\n\n        val newState = createUserEvent(reservationStatus = UserEvent.ReservationStatus.WAITLISTED)\n\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n\n        assertThat(result?.type, `is`(equalTo(UserEventMessageChangeType.CHANGES_IN_WAITLIST)))\n    }\n\n    @Test\n    fun compareOldAndNew_newStateCancelWaitlist_waitlistCancelMessage() {\n\n        val oldState = createUserEvent(reservationStatus = UserEvent.ReservationStatus.WAITLISTED)\n        val newState = createUserEvent()\n\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n\n        assertThat(result?.type, `is`(equalTo(UserEventMessageChangeType.WAITLIST_CANCELED)))\n    }\n\n    @Test\n    fun compareOldAndNew_requestMade_noMessage() {\n\n        val oldState = createUserEvent()\n        val newStateRequest = createReservationRequest(\n            action = ReservationRequestEntityAction.RESERVE_REQUESTED\n        )\n\n        val newState = createUserEvent(\n            reservationRequest = newStateRequest\n        )\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n        assertThat(result?.type, `is`(nullValue()))\n    }\n\n    @Test\n    fun compareOldAndNew_differentIdsOldResult_noMessage() {\n\n        val oldState = createUserEvent()\n        val newStateRequest = createReservationRequest(\n            action = ReservationRequestEntityAction.RESERVE_REQUESTED,\n            requestId = \"something\"\n        )\n        val newRequestResult = createReservationResult(\n            requestResult = ReservationRequestStatus.RESERVE_DENIED_CLASH,\n            requestId = \"something_different\"\n\n        )\n\n        val newState = createUserEvent(\n            reservationRequest = newStateRequest,\n            reservationRequestResult = newRequestResult\n        )\n\n        val result = compareOldAndNewUserEvents(oldState, newState, oldState.id)\n\n        assertThat(result?.type, `is`(nullValue()))\n    }\n\n    @Test\n    fun compareOldAndNew_sameId_errorMessageClash() {\n\n        val result = generateErrorResult(ReservationRequestStatus.RESERVE_DENIED_CLASH)\n\n        assertThat(result?.type, `is`(equalTo(UserEventMessageChangeType.RESERVATION_DENIED_CLASH)))\n    }\n\n    @Test\n    fun compareOldAndNew_sameId_errorMessageClashBySwap() {\n\n        val result = generateErrorResult(ReservationRequestStatus.SWAP_DENIED_CLASH)\n\n        assertThat(result?.type, `is`(equalTo(UserEventMessageChangeType.RESERVATION_DENIED_CLASH)))\n    }\n\n    @Test\n    fun compareOldAndNew_sameId_errorMessageCutoff() {\n\n        val result = generateErrorResult(ReservationRequestStatus.RESERVE_DENIED_CUTOFF)\n\n        assertThat(\n            result?.type,\n            `is`(equalTo(UserEventMessageChangeType.RESERVATION_DENIED_CUTOFF))\n        )\n    }\n\n    @Test\n    fun compareOldAndNew_sameId_errorMessageCutoffBySwap() {\n\n        val result = generateErrorResult(ReservationRequestStatus.SWAP_DENIED_CUTOFF)\n\n        assertThat(\n            result?.type,\n            `is`(equalTo(UserEventMessageChangeType.RESERVATION_DENIED_CUTOFF))\n        )\n    }\n\n    @Test\n    fun compareOldAndNew_sameId_errorMessageUnknown() {\n\n        val result = generateErrorResult(ReservationRequestStatus.RESERVE_DENIED_UNKNOWN)\n\n        assertThat(\n            result?.type,\n            `is`(equalTo(UserEventMessageChangeType.RESERVATION_DENIED_UNKNOWN))\n        )\n    }\n\n    @Test\n    fun compareOldAndNew_sameId_errorMessageUnknownBySwap() {\n\n        val result = generateErrorResult(ReservationRequestStatus.SWAP_DENIED_UNKNOWN)\n\n        assertThat(\n            result?.type,\n            `is`(equalTo(UserEventMessageChangeType.RESERVATION_DENIED_UNKNOWN))\n        )\n    }\n\n    @Test\n    fun compareOldAndNew_sameId_errorMessageCancelCutoff() {\n\n        val result = generateErrorResult(ReservationRequestStatus.CANCEL_DENIED_CUTOFF)\n\n        assertThat(\n            result?.type,\n            `is`(equalTo(UserEventMessageChangeType.CANCELLATION_DENIED_CUTOFF))\n        )\n    }\n\n    @Test\n    fun compareOldAndNew_sameId_errorMessageCancelUknown() {\n\n        val result = generateErrorResult(ReservationRequestStatus.CANCEL_DENIED_UNKNOWN)\n\n        assertThat(\n            result?.type,\n            `is`(equalTo(UserEventMessageChangeType.CANCELLATION_DENIED_UNKNOWN))\n        )\n    }\n\n    private fun generateErrorResult(errorResult: ReservationRequestStatus): UserEventMessage? {\n        val oldState = createUserEvent()\n        val newStateRequest = createReservationRequest(\n            action = ReservationRequestEntityAction.RESERVE_REQUESTED,\n            requestId = \"42\"\n        )\n        val newRequestResult = createReservationResult(\n            requestResult = errorResult,\n            requestId = \"42\"\n\n        )\n\n        val newState = createUserEvent(\n            reservationRequest = newStateRequest,\n            reservationRequestResult = newRequestResult\n        )\n\n        return compareOldAndNewUserEvents(oldState, newState, oldState.id)\n    }\n\n    private fun createUserEvent(\n        id: String = \"123\",\n        isStarred: Boolean = false,\n        isReviewed: Boolean = false,\n        reservationStatus: UserEvent.ReservationStatus? = null,\n        reservationRequestResult: ReservationRequestResult? = null,\n        reservationRequest: ReservationRequest? = null\n    ): UserEvent {\n        return UserEvent(\n            id,\n            isStarred,\n            isReviewed,\n            reservationStatus,\n            reservationRequestResult,\n            reservationRequest\n        )\n    }\n\n    private fun createReservationResult(\n        requestResult: ReservationRequestResult.ReservationRequestStatus? = null,\n        requestId: String = \"213\",\n        timestamp: Long = -1\n    ): ReservationRequestResult {\n\n        return ReservationRequestResult(\n            requestResult = requestResult,\n            requestId = requestId,\n            timestamp = timestamp\n        )\n    }\n\n    private fun createReservationRequest(\n        action: ReservationRequestEntityAction =\n            ReservationRequestEntityAction.RESERVE_REQUESTED,\n        requestId: String = \"321\"\n    ): ReservationRequest {\n        return ReservationRequest(\n            action = action,\n            requestId = requestId\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/data/userevent/DefaultSessionAndUserEventRepositoryTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.data.userevent\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.domain.repository.TestUserEventDataSource\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.Matchers.equalTo\nimport org.hamcrest.Matchers.instanceOf\nimport org.hamcrest.core.Is.`is`\nimport org.hamcrest.core.IsInstanceOf\nimport org.junit.Assert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit test for [DefaultSessionAndUserEventRepository].\n */\n@ExperimentalCoroutinesApi\nclass DefaultSessionAndUserEventRepositoryTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun observableUserEvents_areMappedCorrectly() = runTest {\n        val repository = DefaultSessionAndUserEventRepository(\n            userEventDataSource = TestUserEventDataSource(),\n            sessionRepository = DefaultSessionRepository(TestDataRepository)\n        )\n\n        val userEvents = repository.getObservableUserEvents(\"user\").first { it is Result.Success }\n\n        assertThat(userEvents, `is`(IsInstanceOf(Result.Success::class.java)))\n        val successResult = userEvents as Result.Success\n\n        assertThat(\n            successResult.data.userSessions.size,\n            `is`(equalTo(TestData.userSessionList.size))\n        )\n\n        // Starred session\n        assertThat(\n            successResult.data.userSessions[0].userEvent.isStarred,\n            `is`(equalTo(TestData.userEvents[0].isStarred))\n        )\n\n        // Non-starred session\n        assertThat(\n            successResult.data.userSessions[1].userEvent.isStarred,\n            `is`(equalTo(TestData.userEvents[1].isStarred))\n        )\n\n        // Session info gets merged too\n        assertThat(successResult.data.userSessions[0].session, `is`(equalTo(TestData.session0)))\n    }\n\n    @Test\n    fun observableUserEvent() = runTest {\n        val repository = DefaultSessionAndUserEventRepository(\n            userEventDataSource = TestUserEventDataSource(),\n            sessionRepository = DefaultSessionRepository(TestDataRepository)\n        )\n        val userEvent = repository.getObservableUserEvent(\"user\", \"2\").first()\n\n        assertThat(userEvent, `is`(instanceOf(Result.Success::class.java)))\n\n        (userEvent as Result.Success).data.userSession.let { userSession ->\n            assertThat(userSession.session.id, `is`(equalTo(\"2\")))\n            assertThat(userSession.userEvent.isStarred, `is`(true))\n            assertThat(userSession.userEvent.isReviewed, `is`(false))\n        }\n    }\n\n    // TODO: Test error cases\n\n    // TODO: Test updateIsStarred\n\n    // TODO: Test changeReservation\n\n    // TODO: mapUserDataAndSessions with allDataSynced = true\n\n    // TODO: mapUserDataAndSessions with Result.Error\n\n    // TODO: mapUserDataAndSessions are sorted\n\n    // TODO: Test changeReservation returns SwapAction\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/FlowUseCaseTest.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain\n\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.CoreMatchers.instanceOf\nimport org.junit.Assert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\n\nclass FlowUseCaseTest {\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private val testDispatcher = coroutineRule.testDispatcher\n\n    @Test\n    fun `exception emits Result#Error`() = runTest {\n        val useCase = ExceptionUseCase(testDispatcher)\n        val result = useCase(Unit)\n        assertThat(result.first(), instanceOf(Result.Error::class.java))\n    }\n\n    class ExceptionUseCase(dispatcher: CoroutineDispatcher) : FlowUseCase<Unit, Unit>(dispatcher) {\n        override fun execute(parameters: Unit): Flow<Result<Unit>> = flow {\n            throw Exception(\"Test exception\")\n        }\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/codelabs/LoadCodelabsUseCaseTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.codelabs\n\nimport com.google.samples.apps.iosched.shared.data.codelabs.CodelabsRepository\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.CoreMatchers.`is`\nimport org.hamcrest.CoreMatchers.equalTo\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\n\nclass LoadCodelabsUseCaseTest {\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun loadCodelabsList() = runTest {\n        val loadCodelabsUseCase = LoadCodelabsUseCase(\n            CodelabsRepository(TestDataRepository), coroutineRule.testDispatcher\n        )\n        val result = loadCodelabsUseCase(Unit)\n        assertThat(result.data, `is`(equalTo(TestData.codelabsSorted)))\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/feed/GetConferenceStateUseCaseTest.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.feed\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.asLiveData\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.ENDED\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.STARTED\nimport com.google.samples.apps.iosched.shared.domain.feed.ConferenceState.UPCOMING\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.time.TimeProvider\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.nhaarman.mockito_kotlin.doReturn\nimport com.nhaarman.mockito_kotlin.mock\nimport java.util.concurrent.TimeUnit\nimport junit.framework.Assert.assertEquals\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.advanceTimeBy\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Rule\nimport org.junit.Test\nimport org.mockito.Mockito.`when`\nimport org.mockito.Mockito.verify\nimport org.threeten.bp.Instant\n\nprivate val INSTANT_BEFORE_CONFERENCE_START: Instant =\n    TestData.TestConferenceDays[0].start.toInstant()\n// Conference actually starts after 3 hours of day0 start time\nprivate val INSTANT_DURING_CONFERENCE: Instant =\n    TestData.TestConferenceDays[0].start.plusHours(4).toInstant()\nprivate val INSTANT_AFTER_CONFERENCE_END: Instant =\n    TestData.TestConferenceDays[2].end.plusSeconds(1).toInstant()\n\n/**\n * Unit tests for [GetConferenceStateUseCase]\n *\n * TODO: Remove excessive mocking and LiveData bridges\n */\nclass GetConferenceStateUseCaseTest {\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private val testDispatcher = coroutineRule.testDispatcher\n\n    @Test\n    fun testUpcomingState() = runTest {\n        val getConferenceStateUseCase =\n            createGetConferenceStateUseCase(\n                instant = INSTANT_BEFORE_CONFERENCE_START\n            )\n\n        val currentState = getConferenceStateUseCase(Unit).first()\n\n        assertEquals(\n            Result.Success(UPCOMING),\n            currentState\n        )\n    }\n\n    @Test\n    fun testStartedState() = runTest {\n        val getConferenceStateUseCase =\n            createGetConferenceStateUseCase(\n                instant = INSTANT_DURING_CONFERENCE\n            )\n\n        val currentState = getConferenceStateUseCase(Unit).first()\n\n        assertEquals(\n            Result.Success(STARTED),\n            currentState\n        )\n    }\n\n    @Test\n    fun testEndedState() = runTest {\n        val getConferenceStateUseCase =\n            createGetConferenceStateUseCase(\n                instant = INSTANT_AFTER_CONFERENCE_END\n            )\n\n        val currentState = getConferenceStateUseCase(Unit).first()\n\n        assertEquals(\n            Result.Success(ENDED),\n            currentState\n        )\n    }\n\n    @Test\n    fun testStateTransition() = runTest {\n        val mockTimeProvider = mock<TimeProvider> {\n            on { now() }.doReturn(\n                INSTANT_BEFORE_CONFERENCE_START\n            )\n        }\n        val conferenceStateUseCase =\n            createGetConferenceStateUseCase(\n                timeProvider = mockTimeProvider\n            )\n\n        val observer = mock<Observer<Result<ConferenceState>>> {\n        }\n\n        // Act\n        conferenceStateUseCase(Unit).asLiveData().observeForever(observer)\n\n        verify(observer).onChanged(Result.Success(UPCOMING))\n\n        // Arrange for STARTED state\n        `when`(mockTimeProvider.now()).thenReturn(\n            INSTANT_DURING_CONFERENCE\n        )\n        advanceTimeBy(TimeUnit.DAYS.toMillis(1))\n\n        verify(observer).onChanged(Result.Success(STARTED))\n\n        // Arrange for ENDED state\n        `when`(mockTimeProvider.now()).thenReturn(\n            INSTANT_AFTER_CONFERENCE_END\n        )\n        advanceTimeBy(TimeUnit.DAYS.toMillis(4))\n\n        verify(observer).onChanged(Result.Success(ENDED))\n    }\n\n    private fun createGetConferenceStateUseCase(\n        instant: Instant = Instant.now(),\n        timeProvider: TimeProvider = mock {\n            on { now() }.doReturn(instant)\n        }\n    ): GetConferenceStateUseCase {\n        return GetConferenceStateUseCase(testDispatcher, timeProvider)\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/feed/LoadAnnouncementsUseCaseTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.feed\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.shared.data.feed.DefaultFeedRepository\nimport com.google.samples.apps.iosched.shared.data.feed.FeedRepository\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\nimport org.threeten.bp.Instant\n\n/**\n * Unit tests for [LoadAnnouncementsUseCase]\n */\nclass LoadAnnouncementsUseCaseTest {\n\n    @get:Rule\n    val instantRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun announcementsLoadedSuccessfully() = runTest {\n        val useCase =\n            LoadAnnouncementsUseCase(successfulFeedRepository, coroutineRule.testDispatcher)\n\n        // Load all items\n        val time = TestData.TestConferenceDays.last().end.toInstant()\n        val result = useCase(time)\n\n        assertEquals(result, Result.Success(TestData.announcements))\n    }\n\n    @Test\n    fun announcementsLoadedUnsuccessfully() = runTest {\n        val useCase =\n            LoadAnnouncementsUseCase(unsuccessfulFeedRepository, coroutineRule.testDispatcher)\n\n        // Time doesn't matter\n        val result = useCase(Instant.now())\n\n        assertTrue(result is Result.Error)\n    }\n\n    @Test\n    fun announcementsLoaded_filteredByTimestamp() = runTest {\n        val useCase =\n            LoadAnnouncementsUseCase(successfulFeedRepository, coroutineRule.testDispatcher)\n\n        // Load only the first day's items\n        val time = TestData.TestConferenceDays.first().end.plusMinutes(1).toInstant()\n        val result = useCase(time)\n\n        assertEquals(result, Result.Success(TestData.announcements.subList(0, 2)))\n    }\n}\n\nprivate val successfulFeedRepository = DefaultFeedRepository(\n    TestAnnouncementDataSource, TestMomentDataSource\n)\n\nprivate val unsuccessfulFeedRepository = object : FeedRepository {\n\n    override fun getAnnouncements(): List<Announcement> {\n        throw Exception(\"Error!\")\n    }\n\n    override fun getMoments(): List<Moment> {\n        throw Exception(\"Error!\")\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/feed/LoadCurrentMomentUseCaseTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.feed\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.shared.data.feed.DefaultFeedRepository\nimport com.google.samples.apps.iosched.shared.data.feed.FeedRepository\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\nimport org.threeten.bp.Instant\n\n/**\n * Unit tests for [LoadCurrentMomentUseCase]\n */\nclass LoadCurrentMomentUseCaseTest {\n\n    @get:Rule\n    val instantRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun timeDuringMoment_loadsMoment() = runTest {\n        val time = TestData.TestConferenceDays.first().start.plusHours(3).toInstant()\n        val moment = loadMomentForTime(time)\n        assertEquals(moment, TestData.moment1)\n    }\n\n    @Test\n    fun timeBeforeFirstMoment_loadsNull() = runTest {\n        val time = TestData.TestConferenceDays.first().start.minusMinutes(1).toInstant()\n        val moment = loadMomentForTime(time)\n        assertNull(moment)\n    }\n\n    @Test\n    fun timeAfterLastMoment_loadsNull() = runTest {\n        val time = TestData.TestConferenceDays.last().end.plusMinutes(1).toInstant()\n        val moment = loadMomentForTime(time)\n        assertNull(moment)\n    }\n\n    @Test\n    fun loadsError() = runTest {\n        val useCase =\n            LoadCurrentMomentUseCase(unsuccessfulFeedRepository, coroutineRule.testDispatcher)\n\n        // Time doesn't matter\n        val result = useCase(Instant.now())\n\n        assertTrue(result is Result.Error)\n    }\n\n    private suspend fun loadMomentForTime(time: Instant): Moment? {\n        // Build use case with the test data\n        val useCase =\n            LoadCurrentMomentUseCase(successfulFeedRepository, coroutineRule.testDispatcher)\n\n        // Execute the use case\n        val result = useCase(time)\n\n        // Verify successful execution\n        assertTrue(result is Result.Success)\n\n        // Previous assert ensures this is actually a success\n        return result.successOr(null)\n    }\n}\n\nprivate val successfulFeedRepository = DefaultFeedRepository(\n    TestAnnouncementDataSource, TestMomentDataSource\n)\n\nprivate val unsuccessfulFeedRepository = object : FeedRepository {\n\n    override fun getAnnouncements(): List<Announcement> {\n        throw Exception(\"Error!\")\n    }\n\n    override fun getMoments(): List<Moment> {\n        throw Exception(\"Error!\")\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/feed/TestAnnouncementDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.feed\n\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.shared.data.feed.AnnouncementDataSource\nimport com.google.samples.apps.iosched.test.data.TestData\n\nobject TestAnnouncementDataSource : AnnouncementDataSource {\n\n    override fun getAnnouncements(): List<Announcement> = TestData.announcements\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/feed/TestMomentDataSource.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.feed\n\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.shared.data.feed.MomentDataSource\nimport com.google.samples.apps.iosched.test.data.TestData\n\n/**\n * Generates dummy moments data to be used in tests.\n */\nobject TestMomentDataSource : MomentDataSource {\n\n    override fun getMoments(): List<Moment> = TestData.moments\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/filters/UserSessionFilterMatcherTest.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.filters\n\nimport com.google.samples.apps.iosched.model.filters.Filter\nimport com.google.samples.apps.iosched.model.filters.Filter.DateFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.MyScheduleFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.TagFilter\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.test.data.TestData\nimport org.hamcrest.CoreMatchers.`is`\nimport org.hamcrest.CoreMatchers.equalTo\nimport org.junit.Assert.assertThat\nimport org.junit.Test\n\nclass UserSessionFilterMatcherTest {\n\n    private fun assertMatchedSessions(\n        filters: List<Filter>,\n        expectedSessions: List<UserSession>\n    ) {\n        val matcher = UserSessionFilterMatcher(filters)\n        val sessions = TestData.userSessionList.filter {\n            matcher.matches(it)\n        }\n        assertThat(sessions, `is`(equalTo(expectedSessions)))\n    }\n\n    @Test\n    fun `no filters matches all`() = assertMatchedSessions(\n        filters = emptyList(),\n        expectedSessions = TestData.userSessionList\n    )\n\n    @Test\n    fun `filter by date`() = assertMatchedSessions(\n        filters = listOf(DateFilter(TestData.TestConferenceDays[0])),\n        expectedSessions = listOf(TestData.userSession0, TestData.userSession1)\n    )\n\n    @Test\n    fun `filter by multiple dates`() = assertMatchedSessions(\n        filters = listOf(\n            DateFilter(TestData.TestConferenceDays[0]),\n            DateFilter(TestData.TestConferenceDays[1])\n        ),\n        expectedSessions = listOf(\n            TestData.userSession0,\n            TestData.userSession1,\n            TestData.userSession2\n        )\n    )\n\n    @Test\n    fun `filter by tag`() = assertMatchedSessions(\n        filters = listOf(TagFilter(TestData.cloudTag)),\n        expectedSessions = listOf(TestData.userSession1)\n    )\n\n    @Test\n    fun `filter by multiple tags in same category`() = assertMatchedSessions(\n        filters = listOf( // 2 topics\n            TagFilter(TestData.cloudTag),\n            TagFilter(TestData.webTag)\n        ),\n        expectedSessions = listOf(\n            TestData.userSession0, // web\n            TestData.userSession1, // cloud\n            TestData.userSession3, // web\n            TestData.userSession4 // cloud\n        )\n    )\n\n    @Test\n    fun `filter by tags in multiple categories`() = assertMatchedSessions(\n        filters = listOf(\n            TagFilter(TestData.androidTag), // topic\n            TagFilter(TestData.sessionsTag) // type\n        ),\n        expectedSessions = listOf(TestData.userSession0, TestData.userSession2)\n    )\n\n    @Test\n    fun `filter by my schedule`() = assertMatchedSessions(\n        filters = listOf(MyScheduleFilter),\n        expectedSessions = listOf(\n            TestData.userSession0, TestData.userSession1, TestData.userSession2\n        )\n    )\n\n    @Test\n    fun `multiple filter types with match`() = assertMatchedSessions(\n        filters = listOf(\n            TagFilter(TestData.androidTag), // topic\n            TagFilter(TestData.sessionsTag), // type\n            MyScheduleFilter,\n            DateFilter(TestData.TestConferenceDays[0])\n        ),\n        expectedSessions = listOf(TestData.userSession0)\n    )\n\n    @Test\n    fun `multiple filter types no match`() = assertMatchedSessions(\n        filters = listOf(\n            TagFilter(TestData.androidTag), // topic\n            TagFilter(TestData.sessionsTag), // type\n            DateFilter(TestData.TestConferenceDays[2])\n        ),\n        expectedSessions = emptyList()\n    )\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/repository/TestUserEventDataSource.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.repository\n\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventDataSource\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventResult\nimport com.google.samples.apps.iosched.shared.data.userevent.UserEventsResult\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.CancelAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus.STARRED\nimport com.google.samples.apps.iosched.shared.domain.users.StarUpdatedStatus.UNSTARRED\nimport com.google.samples.apps.iosched.shared.domain.users.SwapRequestAction\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.flow.flow\n\nclass TestUserEventDataSource : UserEventDataSource {\n\n    override fun getObservableUserEvents(userId: String) = flow {\n        emit(UserEventsResult(TestData.userEvents))\n    }\n\n    override fun getObservableUserEvent(userId: String, eventId: SessionId) = flow {\n        emit(UserEventResult(TestData.userEvents.find { it.id == eventId }))\n    }\n\n    override suspend fun starEvent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<StarUpdatedStatus> = Result.Success(if (userEvent.isStarred) STARRED else UNSTARRED)\n\n    override suspend fun recordFeedbackSent(userId: String, userEvent: UserEvent): Result<Unit> {\n        return Result.Success(Unit)\n    }\n\n    override suspend fun requestReservation(\n        userId: String,\n        session: Session,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction> =\n        Result.Success(\n            if (action is RequestAction) RequestAction() else CancelAction()\n        )\n\n    override fun getUserEvents(userId: String): List<UserEvent> = TestData.userEvents\n\n    override suspend fun swapReservation(\n        userId: String,\n        fromSession: Session,\n        toSession: Session\n    ): Result<SwapRequestAction> = Result.Success(SwapRequestAction())\n\n    override fun clearSingleEventSubscriptions() {}\n\n    override fun getUserEvent(userId: String, eventId: SessionId): UserEvent? {\n        throw NotImplementedError()\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/search/LoadSearchFiltersUseCaseTest.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.search\n\nimport com.google.samples.apps.iosched.model.filters.Filter.DateFilter\nimport com.google.samples.apps.iosched.model.filters.Filter.TagFilter\nimport com.google.samples.apps.iosched.shared.data.tag.TagRepository\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.result.successOr\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.CoreMatchers.`is`\nimport org.hamcrest.CoreMatchers.equalTo\nimport org.junit.Assert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [LoadSearchFiltersUseCase]\n */\nclass LoadSearchFiltersUseCaseTest {\n\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun `returns ordered filters`() = runTest {\n        val useCase = LoadSearchFiltersUseCase(\n            TestDataRepository,\n            TagRepository(TestDataRepository),\n            coroutineRule.testDispatcher\n        )\n        val filters = useCase(Unit).successOr(emptyList()) // empty list will fail assert\n\n        // Expected values to assert\n        val expected = listOf(\n            DateFilter(TestData.TestConferenceDays[0]),\n            DateFilter(TestData.TestConferenceDays[1]),\n            DateFilter(TestData.TestConferenceDays[2]),\n            TagFilter(TestData.sessionsTag),\n            TagFilter(TestData.codelabsTag),\n            TagFilter(TestData.androidTag),\n            TagFilter(TestData.cloudTag),\n            TagFilter(TestData.webTag),\n            TagFilter(TestData.beginnerTag),\n            TagFilter(TestData.intermediateTag),\n            TagFilter(TestData.advancedTag)\n            // no TestData.themeTag\n        )\n\n        assertThat(filters, `is`(equalTo(expected)))\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/search/SessionTextMatchStrategyTest.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.search\n\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.FakeSearchAppDatabase\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.core.Is.`is`\nimport org.hamcrest.core.IsEqual.equalTo\nimport org.junit.Assert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n@ExperimentalCoroutinesApi\n@RunWith(Parameterized::class)\nclass SessionTextMatchStrategyTest(private val strategy: SessionTextMatchStrategy) {\n\n    companion object {\n        val coroutineRule = MainCoroutineRule()\n\n        @JvmStatic\n        @Parameterized.Parameters\n        fun useCases() = listOf(\n            arrayOf(SimpleMatchStrategy),\n            arrayOf(FtsMatchStrategy(FakeSearchAppDatabase()))\n        )\n    }\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = Companion.coroutineRule\n\n    @Test\n    fun `match on title`() = assertSearchResults(\n        FakeSearchAppDatabase.QUERY_TITLE,\n        listOf(TestData.userSession0)\n    )\n\n    @Test\n    fun `match on description`() = assertSearchResults(\n        FakeSearchAppDatabase.QUERY_ABSTRACT,\n        listOf(TestData.userSession0)\n    )\n\n    @Test\n    fun `no match returns empty list`() = assertSearchResults(\n        FakeSearchAppDatabase.QUERY_WITH_NO_MATCH,\n        emptyList()\n    )\n\n    @Test\n    fun `blank query returns empty list`() = assertSearchResults(\n        FakeSearchAppDatabase.QUERY_ONLY_SPACES,\n        emptyList()\n    )\n\n    @Test\n    fun `empty query returns all`() = assertSearchResults(\"\", TestData.userSessionList)\n\n    private fun assertSearchResults(\n        query: String,\n        expectedSessions: List<UserSession>\n    ) = runTest {\n        val sessions = strategy.searchSessions(TestData.userSessionList, query)\n        assertThat(sessions, `is`(equalTo(expectedSessions)))\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadPinnedSessionsJsonUseCaseTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.gson.GsonBuilder\nimport com.google.samples.apps.iosched.model.schedule.PinnedSession\nimport com.google.samples.apps.iosched.model.schedule.PinnedSessionsSchedule\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.repository.TestUserEventDataSource\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.result.Result.Loading\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.shared.util.TimeUtils\nimport com.google.samples.apps.iosched.shared.util.toEpochMilli\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.flow.take\nimport kotlinx.coroutines.flow.toList\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.CoreMatchers.`is`\nimport org.hamcrest.Matchers.equalTo\nimport org.hamcrest.Matchers.instanceOf\nimport org.junit.Assert.assertThat\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [LoadPinnedSessionsJsonUseCase]\n */\nclass LoadPinnedSessionsJsonUseCaseTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun returnedUserSessions_areStarredOrReserved() = runTest {\n        // Arrange\n        val gson = GsonBuilder().create()\n\n        val testUserEventRepository = DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(),\n            DefaultSessionRepository(TestDataRepository)\n        )\n        val useCase = LoadPinnedSessionsJsonUseCase(\n            testUserEventRepository, gson, coroutineRule.testDispatcher\n        )\n\n        // Act\n        val results = useCase(\"user1\").take(2).toList()\n\n        // Assert\n        val expected = PinnedSessionsSchedule(\n            listOf(TestData.session0, TestData.session1, TestData.session2)\n                .map {\n                    PinnedSession(\n                        name = it.title,\n                        location = it.room?.name ?: \"\",\n                        day = TimeUtils.abbreviatedDayForAr(it.startTime),\n                        time = TimeUtils.abbreviatedTimeForAr(it.startTime),\n                        timestamp = it.startTime.toEpochMilli(),\n                        description = it.description\n                    )\n                }\n        )\n\n        assertThat(results[0], `is`(instanceOf(Loading::class.java)))\n        assertThat(results[1].data, `is`(equalTo(gson.toJson(expected))))\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadScheduleUserSessionsUseCaseTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.session.SessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.repository.TestUserEventDataSource\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.data.TestData.TestConferenceDays\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.CoreMatchers.`is`\nimport org.hamcrest.Matchers.equalTo\nimport org.junit.Assert.assertThat\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [LoadScheduleUserSessionsUseCase]\n */\nclass LoadScheduleUserSessionsUseCaseTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private lateinit var useCase: LoadScheduleUserSessionsUseCase\n\n    @Before\n    fun setup() {\n        val testUserEventRepository = DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(),\n            DefaultSessionRepository(TestDataRepository)\n        )\n        useCase =\n            LoadScheduleUserSessionsUseCase(testUserEventRepository, coroutineRule.testDispatcher)\n    }\n\n    @Test\n    fun returnsMapOfSessions() = runTest {\n        val useCaseResult = useCase(LoadScheduleUserSessionsParameters(\"user1\"))\n            .first { it is Result.Success }\n\n        assertThat(TestData.userSessionList, `is`(equalTo(useCaseResult.data?.userSessions)))\n    }\n\n    /* to fix this: b/149009118\n    @Test\n    fun userEventsMessage() {\n\n        val userEventsResult: MutableLiveData<UserEventsResult> = MutableLiveData()\n\n        val testUserEventRepository = DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(userEventsResult),\n            DefaultSessionRepository(TestDataRepository)\n        )\n        val useCase = LoadFilteredUserSessionsUseCase(\n            testUserEventRepository,\n            coroutineRule.testDispatcher\n        )\n\n\n\n        useCase.execute(LoadFilteredUserSessionsParameters(UserSessionMatcher(), \"user1\"))\n\n        userEventsResult.postValue(\n            UserEventsResult(\n                userEventsMessage = UserEventMessage(\n                    UserEventMessageChangeType.CHANGES_IN_RESERVATIONS\n                ),\n                userEvents = TestData.userEvents\n            )\n        )\n\n        val result = LiveDataTestUtil.getValue(resultLiveData)\n            as Result.Success<LoadFilteredUserSessionsResult>\n\n        assertThat(TestData.userSessionList, `is`(equalTo(result.data.userSessions)))\n\n        // TODO(b/122306429) fix this\n//        assertThat(\n//            UserEventMessage(UserEventMessageChangeType.CHANGES_IN_RESERVATIONS),\n//            `is`(equalTo(result.data.userMessage))\n//        )\n    }\n     */\n\n    @Test\n    fun errorCase() = runTest {\n        // Use a repository that throws an error\n        val testUserEventRepository = DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(),\n            FailingSessionRepository\n        )\n        val errorUseCase =\n            LoadScheduleUserSessionsUseCase(testUserEventRepository, coroutineRule.testDispatcher)\n\n        val useCaseResult = errorUseCase(LoadScheduleUserSessionsParameters(\"user1\"))\n            .first { it is Result.Error }\n\n        assertTrue(useCaseResult is Result.Error)\n    }\n\n    @Test\n    fun returnsCurrentEventIndex() = runTest {\n        // When we execute it, passing Day 2 +3hrs as the current time\n        val now = TestConferenceDays.first().start.plusHours(3L)\n        val useCaseResult = useCase(LoadScheduleUserSessionsParameters(\"user1\", now))\n            .first { it is Result.Success }\n\n        assertThat(useCaseResult.data?.firstUnfinishedSessionIndex, `is`(equalTo(0)))\n    }\n\n    @Test\n    fun midConference_afterDayEnd_returnsCurrentEventIndex() = runTest {\n        // When we execute it, passing Day 2 *after the end of day*\n        val now = TestConferenceDays[1].end.plusHours(3L)\n\n        val useCaseResult = useCase(LoadScheduleUserSessionsParameters(\"user1\", now))\n            .first { it is Result.Success }\n\n        assertThat(useCaseResult.data?.firstUnfinishedSessionIndex, `is`(equalTo(3)))\n    }\n\n    @Test\n    fun beforeConference_returnsNoCurrentEventIndex() = runTest {\n        // When we execute it, passing a current time *before* the conference\n        val now = TestConferenceDays.first().start.minusDays(2L)\n        val useCaseResult = useCase(LoadScheduleUserSessionsParameters(\"user1\", now))\n            .first { it is Result.Success }\n\n        assertThat(useCaseResult.data?.firstUnfinishedSessionIndex, `is`(equalTo(-1)))\n    }\n\n    @Test\n    fun afterConference_returnsNoCurrentEventIndex() = runTest {\n        // When we execute it, passing a current time *after* the conference\n        val now = TestConferenceDays.last().end.plusHours(2L)\n        val useCaseResult = useCase(LoadScheduleUserSessionsParameters(\"user1\", now))\n            .first { it is Result.Success }\n\n        assertThat(useCaseResult.data?.firstUnfinishedSessionIndex, `is`(equalTo(-1)))\n    }\n}\n\nobject FailingSessionRepository : SessionRepository {\n    override fun getSessions(): List<Session> {\n        throw Exception(\"test\")\n    }\n\n    override fun getSession(eventId: SessionId): Session {\n        throw Exception(\"test\")\n    }\n\n    override fun getConferenceDays(): List<ConferenceDay> {\n        throw Exception(\"test\")\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/sessions/LoadStarredAndReservedSessionsUseCaseTest.kt",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.repository.TestUserEventDataSource\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.shared.result.data\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.CoreMatchers.`is`\nimport org.hamcrest.CoreMatchers.equalTo\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\n\nclass LoadStarredAndReservedSessionsUseCaseTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    private lateinit var useCase: LoadStarredAndReservedSessionsUseCase\n\n    @Before\n    fun setup() {\n        val testUserEventRepository = DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(),\n            DefaultSessionRepository(TestDataRepository)\n        )\n\n        useCase = LoadStarredAndReservedSessionsUseCase(\n            testUserEventRepository,\n            coroutineRule.testDispatcher\n        )\n    }\n\n    @Test\n    fun `returns starred or reserved sessions`() = runTest {\n        val result = useCase(\"user1\").first { it is Result.Success }\n        Assert.assertThat(\n            result.data,\n            `is`(equalTo(TestData.starredOrReservedSessions))\n        )\n    }\n\n    @Test\n    fun `null user id returns empty list`() = runTest {\n        val result = useCase(null).first { it is Result.Success }\n        Assert.assertThat(\n            result.data,\n            `is`(equalTo(emptyList()))\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/sessions/ObserveConferenceDataUseCaseTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.sessions\n\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.hamcrest.Matchers.notNullValue\nimport org.hamcrest.core.Is.`is`\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [ObserveConferenceDataUseCase].\n */\nclass ObserveConferenceDataUseCaseTest {\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun remoteConfDataRefreshed_valueIsUpdated() = runTest {\n\n        val repo = TestDataRepository\n        val subject = ObserveConferenceDataUseCase(repo, coroutineRule.testDispatcher)\n        repo.refreshCacheWithRemoteConferenceData()\n        // Start the listeners\n        val result = subject(Unit).first()\n\n        assertThat(result, `is`(notNullValue()))\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/users/FeedbackUseCaseTest.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.users\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.shared.data.feedback.FeedbackEndpoint\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.repository.TestUserEventDataSource\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport junit.framework.Assert.assertEquals\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [FeedbackUseCase]\n */\nclass FeedbackUseCaseTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun submit() = runTest {\n        val testFeedbackEndpoint = object : FeedbackEndpoint {\n            override suspend fun sendFeedback(\n                sessionId: SessionId,\n                responses: Map<String, Int>\n            ): Result<Unit> {\n                return Result.Success(Unit)\n            }\n        }\n        val testUserEventRepository = DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(), DefaultSessionRepository(TestDataRepository)\n        )\n\n        val result = FeedbackUseCase(\n            testFeedbackEndpoint,\n            testUserEventRepository,\n            coroutineRule.testDispatcher\n        )(\n            FeedbackParameter(\n                \"userIdTest\",\n                TestData.userEvents[0],\n                TestData.userEvents[0].id,\n                mapOf(\"q1\" to 1)\n            )\n        )\n\n        assertEquals(Result.Success(Unit), result)\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/users/ReservationActionUseCaseTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.users\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.userevent.ObservableUserEvents\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCaseResult\nimport com.google.samples.apps.iosched.shared.domain.sessions.StarReserveNotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.CancelAction\nimport com.google.samples.apps.iosched.shared.domain.users.ReservationRequestAction.RequestAction\nimport com.google.samples.apps.iosched.shared.notifications.SessionAlarmManager\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.nhaarman.mockito_kotlin.any\nimport com.nhaarman.mockito_kotlin.doNothing\nimport com.nhaarman.mockito_kotlin.mock\nimport com.nhaarman.mockito_kotlin.whenever\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [ReservationActionUseCase].\n */\nclass ReservationActionUseCaseTest {\n\n    // Executes tasks in the Architecture Components in the same thread\n    @get:Rule\n    var instantTaskExecutorRule = InstantTaskExecutorRule()\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun sessionIsRequestedSuccessfully() = runTest {\n        val useCase = ReservationActionUseCase(\n            TestUserEventRepository,\n            createFakeUpdater(),\n            coroutineRule.testDispatcher\n        )\n\n        val result = useCase(\n            ReservationRequestParameters(\n                \"userTest\",\n                TestData.session0.id,\n                RequestAction(),\n                null\n            )\n        )\n        Assert.assertEquals(result, Result.Success(RequestAction()))\n    }\n\n    @Test\n    fun sessionIsCanceledSuccessfully() = runTest {\n        val useCase = ReservationActionUseCase(\n            TestUserEventRepository,\n            createFakeUpdater(),\n            coroutineRule.testDispatcher\n        )\n\n        val result = useCase(\n            ReservationRequestParameters(\n                \"userTest\", TestData.session0.id,\n                CancelAction(),\n                null\n            )\n        )\n\n        Assert.assertEquals(result, Result.Success(CancelAction()))\n    }\n\n    @Test\n    fun requestFails() = runTest {\n        val useCase = ReservationActionUseCase(\n            FailingUserEventRepository,\n            createFakeUpdater(),\n            coroutineRule.testDispatcher\n        )\n\n        val result = useCase(\n            ReservationRequestParameters(\n                \"userTest\", TestData.session0.id,\n                CancelAction(),\n                null\n            )\n        )\n        assertTrue(result is Result.Error)\n    }\n}\n\nobject TestUserEventRepository : SessionAndUserEventRepository {\n    override fun getObservableUserEvents(\n        userId: String?\n    ): Flow<Result<ObservableUserEvents>> {\n        TODO(\"not implemented\")\n    }\n\n    override fun getObservableUserEvent(\n        userId: String?,\n        eventId: SessionId\n    ): Flow<Result<LoadUserSessionUseCaseResult>> {\n        TODO(\"not implemented\")\n    }\n\n    override suspend fun starEvent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<StarUpdatedStatus> {\n        TODO(\"not implemented\")\n    }\n\n    override suspend fun recordFeedbackSent(userId: String, userEvent: UserEvent): Result<Unit> {\n        TODO(\"not implemented\")\n    }\n\n    override suspend fun changeReservation(\n        userId: String,\n        sessionId: SessionId,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction> =\n        Result.Success(\n            if (action is RequestAction) RequestAction() else CancelAction()\n        )\n\n    override fun getUserEvents(userId: String?): List<UserEvent> {\n        TODO(\"not implemented\")\n    }\n\n    override suspend fun swapReservation(\n        userId: String,\n        fromId: SessionId,\n        toId: SessionId\n    ): Result<SwapRequestAction> {\n        TODO(\"not implemented\")\n    }\n\n    override fun getConferenceDays(): List<ConferenceDay> {\n        TODO(\"not implemented\")\n    }\n\n    override fun getUserSession(userId: String, sessionId: SessionId): UserSession {\n        TODO(\"not implemented\")\n    }\n}\n\nobject FailingUserEventRepository : SessionAndUserEventRepository {\n    override fun getObservableUserEvents(\n        userId: String?\n    ): Flow<Result<ObservableUserEvents>> {\n        TODO(\"not implemented\")\n    }\n\n    override fun getObservableUserEvent(\n        userId: String?,\n        eventId: SessionId\n    ): Flow<Result<LoadUserSessionUseCaseResult>> {\n        TODO(\"not implemented\")\n    }\n\n    override suspend fun starEvent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<StarUpdatedStatus> {\n        TODO(\"not implemented\")\n    }\n\n    override suspend fun recordFeedbackSent(userId: String, userEvent: UserEvent): Result<Unit> {\n        TODO(\"not implemented\")\n    }\n\n    override suspend fun changeReservation(\n        userId: String,\n        sessionId: SessionId,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction> {\n        throw Exception(\"Test\")\n    }\n\n    override fun getUserEvents(userId: String?): List<UserEvent> {\n        TODO(\"not implemented\")\n    }\n\n    override suspend fun swapReservation(\n        userId: String,\n        fromId: SessionId,\n        toId: SessionId\n    ): Result<SwapRequestAction> {\n        TODO(\"not implemented\")\n    }\n\n    override fun getConferenceDays(): List<ConferenceDay> {\n        TODO(\"not implemented\")\n    }\n\n    override fun getUserSession(userId: String, sessionId: SessionId): UserSession {\n        TODO(\"not implemented\")\n    }\n}\n\nprivate fun createFakeUpdater(): StarReserveNotificationAlarmUpdater {\n    val alarmManager: SessionAlarmManager = mock()\n    doNothing().whenever(alarmManager).cancelAlarmForSession(any())\n    return StarReserveNotificationAlarmUpdater(alarmManager)\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/domain/users/StarEventUseCaseTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.domain.users\n\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.SessionId\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport com.google.samples.apps.iosched.shared.data.session.DefaultSessionRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.DefaultSessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.data.userevent.ObservableUserEvents\nimport com.google.samples.apps.iosched.shared.data.userevent.SessionAndUserEventRepository\nimport com.google.samples.apps.iosched.shared.domain.repository.TestUserEventDataSource\nimport com.google.samples.apps.iosched.shared.domain.sessions.LoadUserSessionUseCaseResult\nimport com.google.samples.apps.iosched.shared.domain.sessions.StarReserveNotificationAlarmUpdater\nimport com.google.samples.apps.iosched.shared.model.TestDataRepository\nimport com.google.samples.apps.iosched.shared.notifications.SessionAlarmManager\nimport com.google.samples.apps.iosched.shared.result.Result\nimport com.google.samples.apps.iosched.test.data.MainCoroutineRule\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.nhaarman.mockito_kotlin.any\nimport com.nhaarman.mockito_kotlin.doNothing\nimport com.nhaarman.mockito_kotlin.mock\nimport com.nhaarman.mockito_kotlin.verify\nimport com.nhaarman.mockito_kotlin.whenever\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\n\n/**\n * Unit tests for [StarEventAndNotifyUseCase]\n */\nclass StarEventAndNotifyUseCaseTest {\n\n    // Overrides Dispatchers.Main used in Coroutines\n    @get:Rule\n    var coroutineRule = MainCoroutineRule()\n\n    @Test\n    fun sessionIsStarredSuccessfully() = runTest {\n        val testUserEventRepository = DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(), DefaultSessionRepository(TestDataRepository)\n        )\n        val useCase = StarEventAndNotifyUseCase(\n            testUserEventRepository,\n            mock {},\n            coroutineRule.testDispatcher\n        )\n\n        val result = useCase(StarEventParameter(\"userIdTest\", TestData.userSession1))\n\n        Assert.assertEquals(result, Result.Success(StarUpdatedStatus.STARRED))\n    }\n\n    @Test\n    fun sessionIsStarredUnsuccessfully() = runTest {\n        val alarmManager: SessionAlarmManager = mock()\n        doNothing().whenever(alarmManager).cancelAlarmForSession(any())\n        val alarmUpdater = StarReserveNotificationAlarmUpdater(alarmManager)\n\n        val useCase = StarEventAndNotifyUseCase(\n            FailingSessionAndUserEventRepository,\n            alarmUpdater,\n            coroutineRule.testDispatcher\n        )\n\n        val result = useCase(StarEventParameter(\"userIdTest\", TestData.userSession3))\n\n        assertTrue(result is Result.Error)\n    }\n\n    @Test\n    fun sessionIsStarredAndNotificationSet() = runTest {\n        val testUserEventRepository = DefaultSessionAndUserEventRepository(\n            TestUserEventDataSource(), DefaultSessionRepository(TestDataRepository)\n        )\n        val updater: StarReserveNotificationAlarmUpdater = mock {}\n\n        doNothing().whenever(updater).updateSession(any(), any())\n\n        val useCase = StarEventAndNotifyUseCase(\n            testUserEventRepository,\n            updater,\n            coroutineRule.testDispatcher\n        )\n\n        useCase(StarEventParameter(\"userIdTest\", TestData.userSession3))\n\n        verify(updater).updateSession(TestData.userSession3, false)\n    }\n}\n\nval FailingSessionAndUserEventRepository = object : SessionAndUserEventRepository {\n\n    override suspend fun starEvent(\n        userId: String,\n        userEvent: UserEvent\n    ): Result<StarUpdatedStatus> = Result.Error(Exception(\"Test\"))\n\n    override suspend fun recordFeedbackSent(userId: String, userEvent: UserEvent): Result<Unit> {\n        throw NotImplementedError()\n    }\n\n    override fun getObservableUserEvents(\n        userId: String?\n    ): Flow<Result<ObservableUserEvents>> {\n        throw NotImplementedError()\n    }\n\n    override fun getObservableUserEvent(\n        userId: String?,\n        eventId: SessionId\n    ): Flow<Result<LoadUserSessionUseCaseResult>> {\n        throw NotImplementedError()\n    }\n\n    override suspend fun changeReservation(\n        userId: String,\n        sessionId: SessionId,\n        action: ReservationRequestAction\n    ): Result<ReservationRequestAction> {\n        throw NotImplementedError()\n    }\n\n    override fun getUserEvents(userId: String?): List<UserEvent> {\n        throw NotImplementedError()\n    }\n\n    override suspend fun swapReservation(\n        userId: String,\n        fromId: String,\n        toId: String\n    ): Result<SwapRequestAction> {\n        throw NotImplementedError()\n    }\n\n    override fun getUserSession(userId: String, sessionId: SessionId): UserSession {\n        throw NotImplementedError()\n    }\n\n    override fun getConferenceDays(): List<ConferenceDay> {\n        throw NotImplementedError()\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/model/SessionTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport com.google.samples.apps.iosched.model.SessionType.CODELAB\nimport com.google.samples.apps.iosched.model.SessionType.SESSION\nimport com.google.samples.apps.iosched.model.SessionType.UNKNOWN\nimport com.google.samples.apps.iosched.test.data.TestData\nimport org.hamcrest.CoreMatchers.`is`\nimport org.hamcrest.CoreMatchers.equalTo\nimport org.hamcrest.MatcherAssert.assertThat\nimport org.hamcrest.core.Is\nimport org.junit.Test\nimport org.threeten.bp.Instant\nimport org.threeten.bp.ZoneId\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Unit tests for [Session].\n */\nclass SessionTest {\n\n    @Test\n    fun testIsOverlapping_bothHaveSameTime() {\n        testIsOverlapping(\n            eventStart = 1000L, eventEnd = 2000L,\n            sessionStart = 1000L, sessionEnd = 2000L, expected = true\n        )\n    }\n\n    @Test\n    fun testIsOverlapping_sessionEndInTheMiddle() {\n        testIsOverlapping(\n            eventStart = 1000L, eventEnd = 2000L,\n            sessionStart = 500L, sessionEnd = 1500L, expected = true\n        )\n    }\n\n    @Test\n    fun testIsOverlapping_sessionStartsBeforeAndEndsAfter() {\n        testIsOverlapping(\n            eventStart = 1000L, eventEnd = 2000L,\n            sessionStart = 500L, sessionEnd = 2500L, expected = true\n        )\n    }\n\n    @Test\n    fun testIsOverlapping_sessionStartsInTheMiddle() {\n        testIsOverlapping(\n            eventStart = 1000L, eventEnd = 2000L,\n            sessionStart = 1500, sessionEnd = 2500, expected = true\n        )\n    }\n\n    @Test\n    fun testIsOverlapping_sessionIsWithinSession() {\n        testIsOverlapping(\n            eventStart = 1000L, eventEnd = 2000L,\n            sessionStart = 1200L, sessionEnd = 1700L, expected = true\n        )\n    }\n\n    @Test\n    fun testIsNotOverlapping_sessionStartsFromSessionEnds() {\n        testIsOverlapping(\n            eventStart = 1000L, eventEnd = 2000L,\n            sessionStart = 2000L, sessionEnd = 3000L, expected = false\n        )\n    }\n\n    @Test\n    fun testIsNotOverlapping_sessionStartsAfterSessionEnds() {\n        testIsOverlapping(\n            eventStart = 1000L, eventEnd = 2000L,\n            sessionStart = 3000L, sessionEnd = 4000L, expected = false\n        )\n    }\n\n    @Test\n    fun testType_sessions() {\n        assertThat(TestData.session0.type, `is`(SESSION))\n    }\n\n    @Test\n    fun testType_codelabs() {\n        assertThat(TestData.session1.type, `is`(CODELAB))\n    }\n\n    @Test\n    fun testType_unknown() {\n        val session = TestData.session0.copy(tags = listOf())\n        assertThat(session.type, `is`(UNKNOWN))\n    }\n\n    @Test\n    fun testDescription() {\n        assertThat(\n            TestData.session0.getCalendarDescription(\"\\n\\n\", \", \"),\n            `is`(\n                equalTo(\n                    \"\"\"\n                This session is awesome\n\n                Troy McClure\n                    \"\"\".trimIndent()\n                )\n            )\n        )\n    }\n\n    private fun testIsOverlapping(\n        eventStart: Long,\n        eventEnd: Long,\n        sessionStart: Long,\n        sessionEnd: Long,\n        expected: Boolean\n    ) {\n        val baseSession = TestData.session0.copy(\n            startTime = toZonedTime(eventStart), endTime = toZonedTime(eventEnd)\n        )\n        val session = TestData.session0.copy(\n            startTime = toZonedTime(sessionStart), endTime = toZonedTime(sessionEnd)\n        )\n        assertThat(baseSession.isOverlapping(session), Is.`is`(expected))\n    }\n\n    private fun toZonedTime(sessionStart: Long): ZonedDateTime {\n        return ZonedDateTime.ofInstant(\n            Instant.ofEpochMilli(sessionStart), ZoneId.of(ZoneId.SHORT_IDS[\"JST\"])\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/model/SharedTestData.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.model\n\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataRepository\nimport com.google.samples.apps.iosched.shared.data.ConferenceDataSource\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.util.FakeAppDatabase\n\nobject TestDataSource : ConferenceDataSource {\n    override fun getRemoteConferenceData(): ConferenceData? {\n        return TestData.conferenceData\n    }\n\n    override fun getOfflineConferenceData(): ConferenceData? {\n        return TestData.conferenceData\n    }\n}\n\n/** ConferenceDataRepository for tests */\nobject TestDataRepository : ConferenceDataRepository(\n    TestDataSource,\n    TestDataSource,\n    FakeAppDatabase()\n) {\n    override fun getConferenceDays(): List<ConferenceDay> = TestData.TestConferenceDays\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/model/TagTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.model\n\nimport org.hamcrest.CoreMatchers.`is` as Is\nimport org.hamcrest.CoreMatchers.equalTo\nimport org.hamcrest.CoreMatchers.not\nimport org.junit.Assert.assertThat\nimport org.junit.Test\n\nclass TagTest {\n\n    val androidTagId1 = Tag(\"1\", \"TRACK\", \"track_android\", 0, \"Android\", 0xFFAED581.toInt())\n    val androidTagId2 = Tag(\"2\", \"TRACK\", \"track_android\", 0, \"Android\", 0xFFAED581.toInt())\n    val webTagId2 = Tag(\"2\", \"TRACK\", \"track_web\", 1, \"Web\", 0xFFFFF176.toInt())\n\n    @Test\n    fun tag_differentId_notEqual() {\n        assertThat(androidTagId1, Is(not(equalTo(webTagId2))))\n    }\n\n    @Test\n    fun tag_sameId_equal() {\n        assertThat(androidTagId2, Is(equalTo(webTagId2)))\n    }\n\n    @Test\n    fun tag_sameIdDifferentContent_equal() {\n        assertThat(androidTagId2, Is(equalTo(webTagId2)))\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/util/ColorUtilsTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.util\n\nimport java.lang.IllegalArgumentException\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\nclass ColorUtilsTest {\n\n    @Test\n    fun parseHexColor_withAlpha() {\n        assertEquals(0x8033b5e5L.toInt(), ColorUtils.parseHexColor(\"#8033b5e5\"))\n    }\n\n    @Test\n    fun parseHexColor_withoutAlpha() {\n        assertEquals(0xff33b5e5L.toInt(), ColorUtils.parseHexColor(\"#33b5e5\"))\n    }\n\n    @Test(expected = IllegalArgumentException::class)\n    fun parseHexColor_emptyString() {\n        ColorUtils.parseHexColor(\"\")\n    }\n\n    @Test(expected = IllegalArgumentException::class)\n    fun parseHexColor_noHashSymbol() {\n        ColorUtils.parseHexColor(\"000000\")\n    }\n\n    @Test(expected = NumberFormatException::class)\n    fun parseHexColor_invalidHex() {\n        ColorUtils.parseHexColor(\"#D0GF00D1\")\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/util/SpeakerUtilsTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.util\n\nimport com.google.samples.apps.iosched.model.Speaker\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\n\nclass SpeakerUtilsTest {\n    private lateinit var speaker1: Speaker\n    private lateinit var speaker2: Speaker\n    private lateinit var speaker3: Speaker\n\n    @Before\n    fun setup() {\n        speaker1 = Speaker(\n            id = \"1\", name = \"Troy McClure\", imageUrl = \"\",\n            company = \"\", biography = \"\"\n        )\n\n        speaker2 = Speaker(\n            id = \"2\", name = \"Ziggy Anderson\", imageUrl = \"\",\n            company = \"\", biography = \"\"\n        )\n\n        speaker3 = Speaker(\n            id = \"3\", name = \"Leah Hadley\", imageUrl = \"\",\n            company = \"\", biography = \"\"\n        )\n    }\n\n    @Test\n    fun alphabeticallyOrderedSpeakerListSortSpeakers() {\n        val speakerSet = linkedSetOf(speaker1, speaker2, speaker3)\n\n        val speakerList = SpeakerUtils.alphabeticallyOrderedSpeakerList(speakerSet)\n        val expectedSpeakerList = arrayListOf(speaker3, speaker1, speaker2)\n\n        Assert.assertEquals(expectedSpeakerList, speakerList)\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/shared/util/TimeUtilsTest.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.shared.util\n\nimport com.google.samples.apps.iosched.shared.util.TimeUtils.ConferenceDays\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.google.samples.apps.iosched.test.data.TestData.session0\nimport org.junit.Assert\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.threeten.bp.ZonedDateTime\n\nclass TimeUtilsTest {\n\n    private lateinit var time0800: ZonedDateTime\n    private lateinit var time1000: ZonedDateTime\n    private lateinit var time1300: ZonedDateTime\n\n    @Before\n    fun setup() {\n        time0800 = ZonedDateTime.parse(\"2018-05-08T08:00:00.000-08:00[America/Los_Angeles]\")\n        time1000 = ZonedDateTime.parse(\"2018-05-08T10:00:00.000-08:00[America/Los_Angeles]\")\n        time1300 = ZonedDateTime.parse(\"2018-05-08T13:00:00.000-08:00[America/Los_Angeles]\")\n    }\n\n    @Test\n    fun conferenceDay_contains() {\n        val inDay1 = session0.copy(\n            startTime = ConferenceDays.first().start,\n            endTime = ConferenceDays.first().end\n        )\n        assertTrue(ConferenceDays.first().contains(inDay1))\n\n        // Starts before DAY_1\n        val notInDay1 = session0.copy(\n            startTime = ConferenceDays.first().start.minusMinutes(1),\n            endTime = ConferenceDays.first().end\n        )\n        assertFalse(ConferenceDays.first().contains(notInDay1))\n\n        // Ends after DAY_1\n        val alsoNotInDay1 = session0.copy(\n            startTime = ConferenceDays.first().start,\n            endTime = ConferenceDays.first().end.plusMinutes(1)\n        )\n        assertFalse(ConferenceDays.first().contains(alsoNotInDay1))\n    }\n\n    @Test\n    fun getSessionState_unknown() {\n        Assert.assertEquals(\n            TimeUtils.SessionRelativeTimeState.UNKNOWN,\n            TimeUtils.getSessionState(null)\n        )\n        Assert.assertEquals(\n            TimeUtils.SessionRelativeTimeState.UNKNOWN,\n            TimeUtils.getSessionState(null, time0800)\n        )\n    }\n\n    @Test\n    fun getSessionState_before() {\n        val session = TestData.session0\n        Assert.assertEquals(\n            TimeUtils.SessionRelativeTimeState.BEFORE,\n            TimeUtils.getSessionState(session, session.startTime.minusHours(1L))\n        )\n    }\n\n    @Test\n    fun getSessionState_after() {\n        val session = TestData.session0\n        Assert.assertEquals(\n            TimeUtils.SessionRelativeTimeState.AFTER,\n            TimeUtils.getSessionState(session, session.endTime.plusHours(1L))\n        )\n    }\n\n    @Test\n    fun getSessionState_during() {\n        val session = TestData.session0\n        Assert.assertEquals(\n            TimeUtils.SessionRelativeTimeState.DURING,\n            TimeUtils.getSessionState(session, session.startTime)\n        )\n        Assert.assertEquals(\n            TimeUtils.SessionRelativeTimeState.DURING,\n            TimeUtils.getSessionState(session, session.startTime.plusMinutes(1L))\n        )\n        Assert.assertEquals(\n            TimeUtils.SessionRelativeTimeState.DURING,\n            TimeUtils.getSessionState(session, session.endTime)\n        )\n    }\n\n    @Test\n    fun abbreviatedTimeString() {\n        val a = ZonedDateTime.parse(\"2018-04-01T12:30:40Z[GMT]\")\n        Assert.assertEquals(TimeUtils.abbreviatedTimeString(a), \"Sun, Apr 1\")\n    }\n\n    @Test\n    fun timeString_sameMeridiem() {\n        Assert.assertEquals(\n            \"Tue, May 8, 10:00 - 11:00 AM\",\n            TimeUtils.timeString(time1000, time1000.plusHours(1))\n        )\n        Assert.assertEquals(\n            \"Tue, May 8, 1:00 - 2:00 PM\",\n            TimeUtils.timeString(time1300, time1300.plusHours(1))\n        )\n    }\n\n    @Test\n    fun timeString_differentMeridiem() {\n        Assert.assertEquals(\n            \"Tue, May 8, 10:00 AM - 12:00 PM\",\n            TimeUtils.timeString(time1000, time1000.plusHours(2))\n        )\n    }\n\n    @Test\n    fun timeString_omitsLeadingZeroInDate() {\n        Assert.assertEquals(\n            \"Tue, May 8, 8:00 - 9:00 AM\",\n            TimeUtils.timeString(time0800, time0800.plusHours(1))\n        )\n        val timeMay10 = ZonedDateTime.parse(\"2018-05-10T13:00:00.000-08:00[America/Los_Angeles]\")\n        Assert.assertEquals(\n            \"Thu, May 10, 1:00 - 2:00 PM\",\n            TimeUtils.timeString(timeMay10, timeMay10.plusHours(1))\n        )\n    }\n\n    @Test\n    fun timeString_omitsLeadingZeroInTime() {\n        Assert.assertEquals(\n            \"Tue, May 8, 8:00 - 9:00 AM\",\n            TimeUtils.timeString(time0800, time0800.plusHours(1))\n        )\n        Assert.assertEquals(\n            \"Tue, May 8, 8:00 - 10:00 AM\",\n            TimeUtils.timeString(time0800, time1000)\n        )\n        Assert.assertEquals(\n            \"Tue, May 8, 12:00 - 1:00 PM\",\n            TimeUtils.timeString(time1300.minusHours(1), time1300)\n        )\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/test/util/FakeAppDatabase.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util\n\nimport androidx.room.DatabaseConfiguration\nimport androidx.room.InvalidationTracker\nimport androidx.sqlite.db.SupportSQLiteOpenHelper\nimport com.google.samples.apps.iosched.shared.data.db.AppDatabase\nimport com.google.samples.apps.iosched.shared.data.db.CodelabFtsDao\nimport com.google.samples.apps.iosched.shared.data.db.CodelabFtsEntity\nimport com.google.samples.apps.iosched.shared.data.db.SessionFtsDao\nimport com.google.samples.apps.iosched.shared.data.db.SessionFtsEntity\nimport com.google.samples.apps.iosched.shared.data.db.SpeakerFtsDao\nimport com.google.samples.apps.iosched.shared.data.db.SpeakerFtsEntity\nimport com.google.samples.apps.iosched.test.data.TestData\nimport com.nhaarman.mockito_kotlin.mock\nimport org.mockito.Mockito\n\nclass FakeAppDatabase : AppDatabase() {\n    override fun sessionFtsDao(): SessionFtsDao {\n        return Mockito.mock(SessionFtsDao::class.java)\n    }\n\n    override fun speakerFtsDao(): SpeakerFtsDao {\n        return Mockito.mock(SpeakerFtsDao::class.java)\n    }\n\n    override fun codelabFtsDao(): CodelabFtsDao {\n        return Mockito.mock(CodelabFtsDao::class.java)\n    }\n\n    override fun createOpenHelper(config: DatabaseConfiguration?): SupportSQLiteOpenHelper {\n        return Mockito.mock(SupportSQLiteOpenHelper::class.java)\n    }\n\n    override fun createInvalidationTracker(): InvalidationTracker {\n        return Mockito.mock(InvalidationTracker::class.java)\n    }\n\n    override fun clearAllTables() {}\n}\n\n/**\n * A fake [AppDatabase] used in `SearchUseCaseTest`.\n */\nclass FakeSearchAppDatabase : AppDatabase() {\n    override fun sessionFtsDao(): SessionFtsDao {\n        return object : SessionFtsDao {\n            override fun insertAll(sessions: List<SessionFtsEntity>) { TODO(\"not implemented\") }\n\n            override fun searchAllSessions(query: String): List<String> {\n                return when (query) {\n                    QUERY_TITLE.toLowerCase(), QUERY_TITLE_WITH_TOKEN -> listOf(\n                        TestData.session0.id\n                    )\n                    QUERY_ABSTRACT.toLowerCase(), QUERY_ABSTRACT_WITH_TOKEN -> listOf(\n                        TestData.session0.id\n                    )\n                    QUERY_WITH_NO_MATCH.toLowerCase() -> emptyList()\n                    else -> emptyList()\n                }\n            }\n        }\n    }\n\n    override fun speakerFtsDao(): SpeakerFtsDao {\n        return object : SpeakerFtsDao {\n            override fun insertAll(speakers: List<SpeakerFtsEntity>) { TODO(\"not implemented\") }\n            override fun searchAllSpeakers(query: String): List<String> {\n                return emptyList()\n            }\n        }\n    }\n\n    override fun codelabFtsDao(): CodelabFtsDao {\n        return object : CodelabFtsDao {\n            override fun insertAll(codelabs: List<CodelabFtsEntity>) { TODO(\"not implemented\") }\n            override fun searchAllCodelabs(query: String): List<String> {\n                return emptyList()\n            }\n        }\n    }\n\n    override fun createOpenHelper(config: DatabaseConfiguration?): SupportSQLiteOpenHelper {\n        TODO(\"not implemented\")\n    }\n\n    override fun createInvalidationTracker(): InvalidationTracker {\n        // No-op\n        return mock {}\n    }\n\n    override fun clearAllTables() {\n        TODO(\"not implemented\")\n    }\n\n    companion object {\n        const val QUERY_TITLE = \"session 0\"\n        const val QUERY_ABSTRACT = \"Awesome\"\n        const val QUERY_WITH_NO_MATCH = \"Invalid search query\"\n        const val QUERY_ONLY_SPACES = \"  \"\n        const val QUERY_TITLE_WITH_TOKEN = \"session* AND 0*\"\n        const val QUERY_ABSTRACT_WITH_TOKEN = \"awesome*\"\n    }\n}\n"
  },
  {
    "path": "shared/src/test/java/com/google/samples/apps/iosched/test/util/FakePreferenceStorage.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.util\n\nimport com.google.samples.apps.iosched.shared.data.prefs.PreferenceStorage\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\n\nclass FakePreferenceStorage(\n    onboardingCompleted: Boolean = false,\n    notificationsPreferenceShown: Boolean = false,\n    preferToReceiveNotifications: Boolean = false,\n    myLocationOptedIn: Boolean = false,\n    preferConferenceTimeZone: Boolean = true,\n    sendUsageStatistics: Boolean = false,\n    selectedFilters: String = \"\",\n    selectedTheme: String = \"\",\n    codelabsInfoShown: Boolean = true,\n    var snackbarIsStopped: Boolean = false,\n    var scheduleUiHintsShown: Boolean = false,\n) : PreferenceStorage {\n    private val _onboardingCompleted = MutableStateFlow(onboardingCompleted)\n    override val onboardingCompleted: Flow<Boolean> = _onboardingCompleted\n\n    private val _notificationsPreferenceShown =\n        MutableStateFlow(notificationsPreferenceShown)\n    override val notificationsPreferenceShown = _notificationsPreferenceShown\n\n    private val _preferToReceiveNotifications =\n        MutableStateFlow(preferToReceiveNotifications)\n    override val preferToReceiveNotifications = _preferToReceiveNotifications\n\n    private val _myLocationOptedIn = MutableStateFlow(myLocationOptedIn)\n    override val myLocationOptedIn = _myLocationOptedIn\n\n    private val _sendUsageStatistics = MutableStateFlow(sendUsageStatistics)\n    override val sendUsageStatistics = _sendUsageStatistics\n\n    private val _preferConferenceTimeZone = MutableStateFlow(preferConferenceTimeZone)\n    override val preferConferenceTimeZone = _preferConferenceTimeZone\n\n    private val _selectedFilters = MutableStateFlow(selectedFilters)\n    override val selectedFilters = _selectedFilters\n\n    private val _selectedTheme = MutableStateFlow(selectedTheme)\n    override val selectedTheme = _selectedTheme\n\n    private val _codelabsInfoShown = MutableStateFlow(codelabsInfoShown)\n    override val codelabsInfoShown = _codelabsInfoShown\n\n    override suspend fun completeOnboarding(complete: Boolean) {\n        _onboardingCompleted.value = complete\n    }\n\n    override suspend fun areScheduleUiHintsShown() = scheduleUiHintsShown\n\n    override suspend fun showScheduleUiHints(show: Boolean) {\n        scheduleUiHintsShown = show\n    }\n\n    override suspend fun showNotificationsPreference(show: Boolean) {\n        _notificationsPreferenceShown.value = show\n    }\n\n    override suspend fun preferToReceiveNotifications(prefer: Boolean) {\n        _preferToReceiveNotifications.value = prefer\n    }\n\n    override suspend fun optInMyLocation(optIn: Boolean) {\n        _myLocationOptedIn.value = optIn\n    }\n\n    override suspend fun stopSnackbar(stop: Boolean) {\n        snackbarIsStopped = stop\n    }\n\n    override suspend fun isSnackbarStopped(): Boolean {\n        return snackbarIsStopped\n    }\n\n    override suspend fun sendUsageStatistics(send: Boolean) {\n        _sendUsageStatistics.value = send\n    }\n\n    override suspend fun preferConferenceTimeZone(preferConferenceTimeZone: Boolean) {\n        _preferConferenceTimeZone.value = preferConferenceTimeZone\n    }\n\n    override suspend fun selectFilters(filters: String) {\n        _selectedFilters.value = filters\n    }\n\n    override suspend fun selectTheme(theme: String) {\n        _selectedTheme.value = theme\n    }\n\n    override suspend fun showCodelabsInfo(show: Boolean) {\n        _codelabsInfoShown.value = show\n    }\n}\n"
  },
  {
    "path": "shared/src/test/resources/malformed_conference_data.json",
    "content": "// MALFORMED JSON\n{\n  \"object\": {}\n"
  },
  {
    "path": "shared/src/test/resources/test_conference_data1.json",
    "content": "{\n  \"version\": 42,\n  \"blocks\": [\n    {\n      \"title\": \"Breakfast\",\n      \"type\": \"meal\",\n      \"color\": \"#31E7B6\",\n      \"start\": \"2018-05-08T07:00-07:00\",\n      \"end\": \"2018-05-08T09:30-07:00\"\n    },\n    {\n      \"title\": \"Badge pick-up\",\n      \"type\": \"badge\",\n      \"color\": \"#E6E6E6\",\n      \"start\": \"2018-05-08T07:00-07:00\",\n      \"end\": \"2018-05-08T19:00-07:00\"\n    },\n    {\n      \"title\": \"Keynote\",\n      \"type\": \"keynote\",\n      \"color\": \"#FCD230\",\n      \"start\": \"2018-05-08T10:00-07:00\",\n      \"end\": \"2018-05-08T11:30-07:00\"\n    }\n  ],\n  \"map\": [\n    {\n      \"markers\": {\n        \"0\": [\n          {\n            \"id\": \"19b9264a-35c9-e511-ab0e-00155d5066d7\",\n            \"lat\": 37.42563,\n            \"lng\": -122.079707,\n            \"title\": \"Stage 1 - Hercules\",\n            \"type\": \"SESSION\"\n          },\n          {\n            \"id\": \"Stage 1\",\n            \"lat\": 37.425622,\n            \"lng\": -122.0796999,\n            \"title\": \"1 - Hercules\",\n            \"type\": \"LABEL\"\n          }\n        ]\n      },\n      \"tiles\": {\n        \"0\": {\n          \"filename\": \"floor0-2016-2.svg\",\n          \"url\": \"\"\n        }\n      }\n    }\n  ],\n  \"rooms\": [\n    {\n      \"id\": \"040f4750-2bf0-459b-9db2-e36b418ad7f5\",\n      \"capacity\": 0,\n      \"name\": \"Amphitheatre\",\n      \"filter\": true\n    },\n    {\n      \"id\": \"c82507f9-e904-49e3-a1ce-9b95a97e816d\",\n      \"capacity\": 0,\n      \"name\": \"Codelabs building\",\n      \"filter\": false\n    }\n  ],\n  \"sessions\": [\n    {\n      \"id\": \"03d28d6f-c417-4c1a-a0ab-e4aa5c72ad90\",\n      \"title\": \"[Session] Build real consumer devices with Android Things\",\n      \"description\": \"This talk will walk through the journey of building consumer devices like Smart Displays using Android Things, how platform features were ramped up to support product needs, and the vision to help OEM partners reduce time to market by leveraging Android Things.\",\n      \"type\": \"Sessions\",\n      \"contentLevels\": [\n        \"Intermediate\"\n      ],\n      \"tagNames\": [\n        \"topic_iot\",\n        \"type_sessions\",\n        \"level_intermediate\"\n      ],\n      \"startTimestamp\": 1525890600000,\n      \"endTimestamp\": 1525894200000,\n      \"livestream\": true,\n      \"youtubeUrl\": \"https://www.youtube.com/watch?v=Y2VF8tmLFHw\",\n      \"room\": \"9c37194e-fe72-4218-8e23-fd296eed747f\",\n      \"speakers\": [\n        \"0cf3da88-0678-4089-ab4f-04a501306214\",\n        \"d602581b-fd9a-4a1d-89f1-9d3d6ab0ca9b\"\n      ],\n      \"relatedSessions\": [\n        \"832f04cc-f4da-48bd-bd8f-8d6532fe4af7\",\n        \"49734f51-eb79-42e3-a148-e508db973bf0\"\n      ]\n    },\n    {\n      \"id\": \"040f4750-2bf0-459b-9db2-e36b418ad7f5\",\n      \"title\": \"[Session] Google Cloud Platform on a shoestring budget\",\n      \"description\": \"Sometimes you make technical decisions for performance. Sometimes you make them for simplicity, or even for \\\"coolness.\\\" And sometimes, you need to make decisions based on costs. This session throws out all other considerations and shows you how to accomplish the most common cloud tasks as cost-effectively as possible. If you're looking to store data, stream media, and secure your content on a showstring budget, this is the talk for you.\",\n      \"type\": \"Sessions\",\n      \"contentLevels\": [\n        \"Intermediate\"\n      ],\n      \"tagNames\": [\n        \"type_sessions\",\n        \"level_intermediate\",\n        \"topic_cloud\"\n      ],\n      \"startTimestamp\": 1525966200000,\n      \"endTimestamp\": 1525969800000,\n      \"livestream\": true,\n      \"youtubeUrl\": \"https://www.youtube.com/watch?v=Y2VF8tmLFHw\",\n      \"room\": \"040f4750-2bf0-459b-9db2-e36b418ad7f5\",\n      \"speakers\": [\n        \"c15067ba-9b7e-41af-96f2-02ff159db7c7\"\n      ],\n      \"relatedSessions\": [\n        \"10f0eaac-a040-45b2-b37c-b7c96d170592\",\n        \"b133aafb-c75e-44aa-9ee3-ddc3859e3e8c\",\n        \"fe21204a-8956-48b9-9a60-e42eb4607756\"\n      ]\n    },\n    {\n      \"id\": \"086cd75d-8f7a-45d7-99bb-69dd3709535a\",\n      \"title\": \"[Session] Code beautiful UI with Flutter and Material Design\",\n      \"description\": \"To stand out, apps need to have smooth, motion-rich, customized designs. Watch beautiful UIs come to life in record time with Flutter and the latest evolution of Material Design. Learn how Flutter’s layout and stateful hot reload can make UI development intuitive and fast, how to go beyond stock widgets to deliver customized interfaces, and how to add motion and animation for delightful user experiences. Best part: do this all with a single codebase that produces native apps on iOS and Android.\",\n      \"type\": \"Sessions\",\n      \"contentLevels\": [\n        \"Beginner\",\n        \"Intermediate\"\n      ],\n      \"tagNames\": [\n        \"topic_flutter\",\n        \"topic_design\",\n        \"level_beginner\",\n        \"type_sessions\",\n        \"level_intermediate\"\n      ],\n      \"startTimestamp\": 1525879800000,\n      \"endTimestamp\": 1525883400000,\n      \"livestream\": true,\n      \"youtubeUrl\": \"https://www.youtube.com/watch?v=Y2VF8tmLFHw\",\n      \"room\": \"3570bda2-0bc3-4b3b-a7c7-8514f8026ab3\",\n      \"speakers\": [\n        \"9ccd454d-1718-47c0-a543-67303a59df4b\",\n        \"7c4b4e96-d521-4952-b2f2-363c2095db35\"\n      ],\n      \"relatedSessions\": [\n        \"94f05260-0dfd-4867-8d04-399e96595035\",\n        \"dab2bf45-6e44-4605-a997-9d446f95ef38\"\n      ]\n    }\n  ],\n  \"speakers\": {\n    \"c15067ba-9b7e-41af-96f2-02ff159db7c7\": {\n      \"id\": \"c15067ba-9b7e-41af-96f2-02ff159db7c7\",\n      \"name\": \"\",\n      \"bio\": \"\",\n      \"company\": \"\",\n      \"thumbnailUrl\": \"\",\n      \"socialLinks\": {\n        \"github\": \"\",\n        \"website\": \"\",\n        \"twitter\": \"\",\n        \"linkedin\": \"\"\n      }\n    },\n    \"63e61007-fe4e-44a9-b7bd-5238fae42bbf\": {\n      \"id\": \"63e61007-fe4e-44a9-b7bd-5238fae42bbf\",\n      \"name\": \"\",\n      \"bio\": \"\",\n      \"company\": \"\",\n      \"thumbnailUrl\": \"\",\n      \"socialLinks\": {\n        \"github\": \"\",\n        \"website\": \"\",\n        \"twitter\": \"\",\n        \"linkedin\": \"\"\n      }\n    },\n    \"2d300b5f-0352-4e25-a4f8-8ae1fc6a0b9d\": {\n      \"id\": \"2d300b5f-0352-4e25-a4f8-8ae1fc6a0b9d\",\n      \"name\": \"\",\n      \"bio\": \"\",\n      \"company\": \"\",\n      \"thumbnailUrl\": \"\",\n      \"socialLinks\": {\n        \"github\": \"\",\n        \"website\": \"\",\n        \"twitter\": \"\",\n        \"linkedin\": \"\"\n      }\n    }\n  },\n  \"tags\": [\n    {\n      \"id\": \"0a87138f-6cf7-4a47-a749-0dafd0c84e9c\",\n      \"name\": \"Cloud\",\n      \"order_in_category\": 0,\n      \"category\": \"topic\",\n      \"tag\": \"topic_cloud\",\n      \"color\": \"#4768FD\",\n      \"fontColor\": \"#FFFFFF\"\n    },\n    {\n      \"id\": \"061c48b8-5655-4eb3-ae63-f3a535e74b26\",\n      \"name\": \"Ads\",\n      \"order_in_category\": 0,\n      \"category\": \"topic\",\n      \"tag\": \"topic_ads\",\n      \"color\": \"#574DDD\",\n      \"fontColor\": \"#FFFFFF\"\n    },\n    {\n      \"id\": \"920863b7-3ebb-498d-bb59-33e63244664f\",\n      \"name\": \"Flutter\",\n      \"order_in_category\": 0,\n      \"category\": \"topic\",\n      \"tag\": \"topic_flutter\",\n      \"color\": \"#31E7B6\",\n      \"fontColor\": \"#202124\"\n    }\n  ],\n  \"codelabs\": [\n    {\n      \"id\": \"codelab0\",\n      \"title\": \"Flutter is Cool\",\n      \"description\": \"Build a Flutter app in 5 minutes!\",\n      \"duration\": 5,\n      \"icon\": \"\",\n      \"link\": \"\",\n      \"priority\": \"1\",\n      \"tagNames\": [\n        \"topic_flutter\"\n      ]\n    },{\n      \"comment\": \"priority intentionally omitted for test\",\n      \"id\": \"codelab1\",\n      \"title\": \"Cloud frameworks\",\n      \"description\": \"Should you use Cirrus, Stratus, or Cumulonimbus for your new cloud service?\",\n      \"duration\": 37,\n      \"icon\": \"\",\n      \"link\": \"\",\n      \"tagNames\": [\n        \"topic_cloud\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "test-shared/build.gradle.kts",
    "content": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id(\"java-library\")\n    kotlin(\"jvm\")\n}\n\ndependencies {\n    api(platform(project(\":depconstraints\")))\n    implementation(project(\":model\"))\n    // Kotlin\n    implementation(Libs.KOTLIN_STDLIB)\n\n    // Test\n    implementation(Libs.JUNIT)\n    api(Libs.COROUTINES_TEST)\n\n    // ThreeTenBP for the shared module only. Date and time API for Java.\n    testImplementation(Libs.THREETENBP)\n    compileOnly(\"org.threeten:threetenbp:${Versions.THREETENBP}:no-tzdb\")\n}\n"
  },
  {
    "path": "test-shared/src/main/java/com/google/samples/apps/iosched/test/data/MainCoroutineRule.kt",
    "content": "/*\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.data\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.test.TestDispatcher\nimport kotlinx.coroutines.test.TestScope\nimport kotlinx.coroutines.test.UnconfinedTestDispatcher\nimport kotlinx.coroutines.test.resetMain\nimport kotlinx.coroutines.test.setMain\nimport org.junit.rules.TestWatcher\nimport org.junit.runner.Description\n\nclass MainCoroutineRule(\n    val testDispatcher: TestDispatcher = UnconfinedTestDispatcher()\n) : TestWatcher() {\n\n    override fun starting(description: Description?) {\n        super.starting(description)\n        Dispatchers.setMain(testDispatcher)\n    }\n\n    override fun finished(description: Description?) {\n        super.finished(description)\n        Dispatchers.resetMain()\n    }\n}\n\n/**\n * Creates a new [CoroutineScope] with the rule's testDispatcher\n */\nfun MainCoroutineRule.CoroutineScope(): CoroutineScope = TestScope(testDispatcher)\n"
  },
  {
    "path": "test-shared/src/main/java/com/google/samples/apps/iosched/test/data/TestData.kt",
    "content": "/*\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.google.samples.apps.iosched.test.data\n\nimport com.google.samples.apps.iosched.model.Announcement\nimport com.google.samples.apps.iosched.model.Block\nimport com.google.samples.apps.iosched.model.Codelab\nimport com.google.samples.apps.iosched.model.ConferenceData\nimport com.google.samples.apps.iosched.model.ConferenceDay\nimport com.google.samples.apps.iosched.model.Moment\nimport com.google.samples.apps.iosched.model.Room\nimport com.google.samples.apps.iosched.model.Session\nimport com.google.samples.apps.iosched.model.Speaker\nimport com.google.samples.apps.iosched.model.Tag\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_DENIED_CUTOFF\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_DENIED_UNKNOWN\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_SUCCEEDED\nimport com.google.samples.apps.iosched.model.reservations.ReservationRequestResult.ReservationRequestStatus.RESERVE_WAITLISTED\nimport com.google.samples.apps.iosched.model.userdata.UserEvent\nimport com.google.samples.apps.iosched.model.userdata.UserEvent.ReservationStatus.NONE\nimport com.google.samples.apps.iosched.model.userdata.UserSession\nimport org.threeten.bp.ZonedDateTime\n\n/**\n * Test data for unit tests.\n */\nobject TestData {\n\n    private const val CONFERENCE_DAY1_START = \"2019-05-07T07:00:00-07:00\"\n    private const val CONFERENCE_DAY1_END = \"2019-05-07T22:00:01-07:00\"\n    private const val CONFERENCE_DAY2_END = \"2019-05-08T22:00:01-07:00\"\n    private const val CONFERENCE_DAY2_START = \"2019-05-08T08:00:00-07:00\"\n    private const val CONFERENCE_DAY3_END = \"2019-05-09T22:00:00-07:00\"\n    private const val CONFERENCE_DAY3_START = \"2019-05-09T08:00:00-07:00\"\n\n    val TestConferenceDays = listOf(\n        ConferenceDay(\n            ZonedDateTime.parse(CONFERENCE_DAY1_START),\n            ZonedDateTime.parse(CONFERENCE_DAY1_END)\n        ),\n        ConferenceDay(\n            ZonedDateTime.parse(CONFERENCE_DAY2_START),\n            ZonedDateTime.parse(CONFERENCE_DAY2_END)\n        ),\n        ConferenceDay(\n            ZonedDateTime.parse(CONFERENCE_DAY3_START),\n            ZonedDateTime.parse(CONFERENCE_DAY3_END)\n        )\n    )\n    // region Declarations\n\n    val androidTag = Tag(\"1\", Tag.CATEGORY_TOPIC, \"track_android\", 0, \"Android\", 0xFFAED581.toInt())\n    val cloudTag = Tag(\"2\", Tag.CATEGORY_TOPIC, \"track_cloud\", 1, \"Cloud\", 0xFFFFF176.toInt())\n    val webTag = Tag(\"3\", Tag.CATEGORY_TOPIC, \"track_web\", 2, \"Web\", 0xFFFFF176.toInt())\n    val sessionsTag = Tag(\"101\", Tag.CATEGORY_TYPE, \"type_sessions\", 0, \"Sessions\", 0)\n    val codelabsTag = Tag(\"102\", Tag.CATEGORY_TYPE, \"type_codelabs\", 1, \"Codelabs\", 0)\n    val beginnerTag = Tag(\"201\", Tag.CATEGORY_LEVEL, \"level_beginner\", 0, \"Beginner\", 0)\n    val intermediateTag = Tag(\"202\", Tag.CATEGORY_LEVEL, \"level_intermediate\", 1, \"Intermediate\", 0)\n    val advancedTag = Tag(\"203\", Tag.CATEGORY_LEVEL, \"level_advanced\", 2, \"Advanced\", 0)\n    val themeTag = Tag(\"301\", Tag.CATEGORY_THEME, \"theme_future\", 0, \"THE FUTURE\", 0)\n\n    val tagsList = listOf(\n        androidTag, cloudTag, webTag, sessionsTag, codelabsTag, beginnerTag,\n        intermediateTag, advancedTag, themeTag\n    )\n\n    val speaker1 = Speaker(\n        id = \"1\",\n        name = \"Troy McClure\",\n        imageUrl = \"\",\n        company = \"\",\n        biography = \"\"\n    )\n\n    val speaker2 = Speaker(\n        id = \"2\",\n        name = \"Disco Stu\",\n        imageUrl = \"\",\n        company = \"\",\n        biography = \"\"\n    )\n\n    val speaker3 = Speaker(\n        id = \"3\",\n        name = \"Hans Moleman\",\n        imageUrl = \"\",\n        company = \"\",\n        biography = \"\"\n    )\n\n    val room = Room(id = \"1\", name = \"Tent 1\")\n\n    val session0 = Session(\n        id = \"0\", title = \"Session 0\", description = \"This session is awesome\",\n        startTime = TestConferenceDays[0].start, endTime = TestConferenceDays[0].end,\n        isLivestream = false,\n        room = room, sessionUrl = \"\", youTubeUrl = \"\", photoUrl = \"\", doryLink = \"\",\n        tags = listOf(androidTag, webTag, sessionsTag),\n        displayTags = listOf(androidTag, webTag),\n        speakers = setOf(speaker1), relatedSessions = emptySet()\n    )\n\n    val session1 = Session(\n        id = \"1\", title = \"Session 1\", description = \"\",\n        startTime = TestConferenceDays[0].start, endTime = TestConferenceDays[0].end,\n        isLivestream = false,\n        room = room, sessionUrl = \"\", youTubeUrl = \"\", photoUrl = \"\", doryLink = \"\",\n        tags = listOf(androidTag, cloudTag, codelabsTag),\n        displayTags = listOf(androidTag, webTag),\n        speakers = setOf(speaker2), relatedSessions = emptySet()\n    )\n\n    val session2 = Session(\n        id = \"2\", title = \"Session 2\", description = \"\",\n        startTime = TestConferenceDays[1].start, endTime = TestConferenceDays[1].end,\n        isLivestream = false,\n        room = room, sessionUrl = \"\", youTubeUrl = \"\", photoUrl = \"\", doryLink = \"\",\n        tags = listOf(androidTag, sessionsTag, beginnerTag), displayTags = listOf(androidTag),\n        speakers = setOf(speaker3), relatedSessions = emptySet()\n    )\n\n    val session3 = Session(\n        id = \"3\", title = \"Session 3\", description = \"\",\n        startTime = TestConferenceDays[2].start, endTime = TestConferenceDays[2].end,\n        isLivestream = false,\n        room = room, sessionUrl = \"\", youTubeUrl = \"\", photoUrl = \"\", doryLink = \"\",\n        tags = listOf(webTag, sessionsTag, intermediateTag), displayTags = listOf(webTag),\n        speakers = setOf(speaker1, speaker2), relatedSessions = emptySet()\n    )\n\n    val sessionWithYoutubeUrl = Session(\n        id = \"4\", title = \"Session 4\", description = \"\",\n        startTime = TestConferenceDays[2].start.plusMinutes(1),\n        endTime = TestConferenceDays[2].end,\n        isLivestream = true,\n        room = room, sessionUrl = \"\",\n        youTubeUrl = \"\\\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\\\"\", photoUrl = \"\",\n        doryLink = \"\",\n        tags = listOf(webTag, advancedTag), displayTags = listOf(webTag),\n        speakers = setOf(speaker1), relatedSessions = emptySet()\n    )\n\n    val sessionsList = listOf(session0, session1, session2, session3, sessionWithYoutubeUrl)\n\n    val sessionIDs = sessionsList.map { it.id }.toList()\n\n    val block1 = Block(\n        title = \"Keynote\",\n        type = \"keynote\",\n        color = 0xffff00ff.toInt(),\n        startTime = TestConferenceDays[0].start,\n        endTime = TestConferenceDays[0].start.plusHours(1L)\n    )\n\n    val block2 = Block(\n        title = \"Breakfast\",\n        type = \"meal\",\n        color = 0xffff00ff.toInt(),\n        startTime = TestConferenceDays[0].start.plusHours(1L),\n        endTime = TestConferenceDays[0].start.plusHours(2L)\n    )\n\n    val agenda = listOf(block1, block2)\n\n    private val userEvent0 = UserEvent(\n        sessionIDs[0],\n        isStarred = false,\n        isReviewed = false,\n        reservationStatus = UserEvent.ReservationStatus.RESERVED,\n        reservationRequestResult = ReservationRequestResult(\n            RESERVE_SUCCEEDED, \"123\", System.currentTimeMillis()\n        )\n    )\n    private val userEvent1 = UserEvent(\n        sessionIDs[1],\n        isStarred = true,\n        isReviewed = true,\n        reservationStatus = UserEvent.ReservationStatus.WAITLISTED,\n        reservationRequestResult = ReservationRequestResult(\n            RESERVE_WAITLISTED, \"123\", System.currentTimeMillis()\n        )\n    )\n    private val userEvent2 = UserEvent(\n        sessionIDs[2],\n        isStarred = true,\n        isReviewed = false,\n        reservationStatus = NONE,\n        reservationRequestResult = ReservationRequestResult(\n            RESERVE_DENIED_CUTOFF, \"123\", System.currentTimeMillis()\n        )\n    )\n    private val userEvent3 = UserEvent(\n        sessionIDs[3],\n        isStarred = false,\n        isReviewed = true,\n        reservationStatus = NONE,\n        reservationRequestResult = ReservationRequestResult(\n            RESERVE_DENIED_UNKNOWN, \"123\", System.currentTimeMillis()\n        )\n    )\n    private val userEvent4 = UserEvent(\n        sessionIDs[4],\n        isStarred = false,\n        isReviewed = true,\n        reservationRequest = null\n    )\n    val userSession0 = UserSession(session0, userEvent0)\n    val userSession1 = UserSession(session1, userEvent1)\n    val userSession2 = UserSession(session2, userEvent2)\n    val userSession3 = UserSession(session3, userEvent3)\n    val userSession4 = UserSession(sessionWithYoutubeUrl, userEvent4)\n\n    val userSessionList = listOf(\n        userSession0,\n        userSession1,\n        userSession2,\n        userSession3,\n        userSession4\n    )\n\n    val starredOrReservedSessions = listOf(\n        userSession0,\n        userSession1,\n        userSession2\n    )\n\n    val userEvents = listOf(userEvent0, userEvent1, userEvent2, userEvent3, userEvent4)\n\n    val codelab0 = Codelab(\n        id = \"codelab0\", title = \"Android is Cool\", description = \"Make Android apps in 5 minutes!\",\n        durationMinutes = 6, iconUrl = null, codelabUrl = \"\", sortPriority = 0,\n        tags = listOf(androidTag)\n    )\n\n    val codelab1 = Codelab(\n        id = \"codelab1\", title = \"HTML 6\", description = \"Webs aren't just for spiders anymore.\",\n        durationMinutes = 37, iconUrl = null, codelabUrl = \"\", sortPriority = 0,\n        tags = listOf(webTag)\n    )\n\n    val codelab2 = Codelab(\n        id = \"codelab2\", title = \"Martian Learning\", description = \"Machine Learning in Space\",\n        durationMinutes = 20, iconUrl = null, codelabUrl = \"\", sortPriority = 1,\n        tags = listOf(cloudTag)\n    )\n\n    val codelabs = listOf(codelab0, codelab1, codelab2)\n    val codelabsSorted = listOf(codelab2, codelab0, codelab1)\n\n    // endregion Declarations\n\n    val conferenceData = ConferenceData(\n        sessions = sessionsList,\n        speakers = listOf(speaker1, speaker2, speaker3),\n        rooms = listOf(room),\n        codelabs = codelabs,\n        tags = tagsList,\n        version = 42\n    )\n\n    val feedItem1 = Announcement(\n        id = \"0\", title = \"Item 1\", message = \"\", timestamp = TestConferenceDays[0].start,\n        imageUrl = \"\", color = 0, category = \"\", priority = true, emergency = true\n    )\n\n    val feedItem2 = Announcement(\n        id = \"1\", title = \"Item 2\", message = \"\", timestamp = TestConferenceDays[0].end,\n        imageUrl = \"\", color = 0, category = \"\", priority = true, emergency = false\n    )\n\n    val feedItem3 = Announcement(\n        id = \"2\", title = \"Item 3\", message = \"\", timestamp = TestConferenceDays[1].start,\n        imageUrl = \"\", color = 0, category = \"\", priority = false, emergency = false\n    )\n\n    val feedItem4 = Announcement(\n        id = \"3\", title = \"Item 4\", message = \"\", timestamp = TestConferenceDays[1].end,\n        imageUrl = \"\", color = 0, category = \"\", priority = false, emergency = false\n    )\n\n    val announcements = listOf(feedItem1, feedItem2, feedItem3, feedItem4)\n    val moment1 = Moment(\n        id = \"1\",\n        title = \"KeyNote: Day 1\",\n        streamUrl = \"https://www.youtube.com\",\n        startTime = TestConferenceDays[0].start,\n        endTime = TestConferenceDays[0].end,\n        textColor = 123,\n        ctaType = Moment.CTA_LIVE_STREAM,\n        imageUrl = \"\",\n        imageUrlDarkTheme = \"\",\n        attendeeRequired = false,\n        timeVisible = false,\n        featureId = \"\",\n        featureName = \"\"\n    )\n\n    val moments = listOf(moment1)\n}\n"
  },
  {
    "path": "tools/iosched-codestyle.xml",
    "content": "<code_scheme name=\"iosched\" version=\"173\">\n  <option name=\"RIGHT_MARGIN\" value=\"100\" />\n  <AndroidXmlCodeStyleSettings>\n    <option name=\"USE_CUSTOM_SETTINGS\" value=\"true\" />\n  </AndroidXmlCodeStyleSettings>\n  <JavaCodeStyleSettings>\n    <option name=\"FIELD_NAME_PREFIX\" value=\"m\" />\n    <option name=\"STATIC_FIELD_NAME_PREFIX\" value=\"s\" />\n    <option name=\"ANNOTATION_PARAMETER_WRAP\" value=\"1\" />\n    <option name=\"INSERT_INNER_CLASS_IMPORTS\" value=\"true\" />\n    <option name=\"CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND\" value=\"9999\" />\n    <option name=\"NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND\" value=\"9999\" />\n    <option name=\"IMPORT_LAYOUT_TABLE\">\n      <value>\n        <package name=\"android\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"com.android\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"dalvik\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"libcore\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"com\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"gov\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"junit\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"net\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"org\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"java\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"javax\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"\" withSubpackages=\"true\" static=\"true\" />\n        <emptyLine />\n        <package name=\"android\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"com.android\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"dalvik\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"libcore\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"com\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"gov\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"junit\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"net\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"org\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"java\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"javax\" withSubpackages=\"true\" static=\"false\" />\n        <emptyLine />\n        <package name=\"\" withSubpackages=\"true\" static=\"false\" />\n      </value>\n    </option>\n    <option name=\"JD_P_AT_EMPTY_LINES\" value=\"false\" />\n    <option name=\"JD_DO_NOT_WRAP_ONE_LINE_COMMENTS\" value=\"true\" />\n    <option name=\"JD_KEEP_EMPTY_PARAMETER\" value=\"false\" />\n    <option name=\"JD_KEEP_EMPTY_EXCEPTION\" value=\"false\" />\n    <option name=\"JD_KEEP_EMPTY_RETURN\" value=\"false\" />\n    <option name=\"JD_PRESERVE_LINE_FEEDS\" value=\"true\" />\n  </JavaCodeStyleSettings>\n  <JetCodeStyleSettings>\n    <option name=\"PACKAGES_TO_USE_STAR_IMPORTS\">\n      <value />\n    </option>\n    <option name=\"NAME_COUNT_TO_USE_STAR_IMPORT\" value=\"99\" />\n    <option name=\"NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS\" value=\"99\" />\n    <option name=\"IMPORT_NESTED_CLASSES\" value=\"true\" />\n    <option name=\"CONTINUATION_INDENT_IN_PARAMETER_LISTS\" value=\"false\" />\n    <option name=\"CONTINUATION_INDENT_IN_ARGUMENT_LISTS\" value=\"false\" />\n    <option name=\"CONTINUATION_INDENT_FOR_EXPRESSION_BODIES\" value=\"false\" />\n    <option name=\"CONTINUATION_INDENT_FOR_CHAINED_CALLS\" value=\"false\" />\n    <option name=\"CONTINUATION_INDENT_IN_SUPERTYPE_LISTS\" value=\"false\" />\n    <option name=\"CONTINUATION_INDENT_IN_IF_CONDITIONS\" value=\"false\" />\n    <option name=\"WRAP_EXPRESSION_BODY_FUNCTIONS\" value=\"1\" />\n    <option name=\"IF_RPAREN_ON_NEW_LINE\" value=\"true\" />\n  </JetCodeStyleSettings>\n  <Properties>\n    <option name=\"KEEP_BLANK_LINES\" value=\"true\" />\n  </Properties>\n  <XML>\n    <option name=\"XML_ATTRIBUTE_WRAP\" value=\"2\" />\n    <option name=\"XML_ALIGN_ATTRIBUTES\" value=\"false\" />\n    <option name=\"XML_SPACE_INSIDE_EMPTY_TAG\" value=\"true\" />\n    <option name=\"XML_LEGACY_SETTINGS_IMPORTED\" value=\"true\" />\n  </XML>\n  <ADDITIONAL_INDENT_OPTIONS fileType=\"java\">\n    <option name=\"TAB_SIZE\" value=\"8\" />\n  </ADDITIONAL_INDENT_OPTIONS>\n  <ADDITIONAL_INDENT_OPTIONS fileType=\"js\">\n    <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n  </ADDITIONAL_INDENT_OPTIONS>\n  <codeStyleSettings language=\"JAVA\">\n    <option name=\"ALIGN_MULTILINE_PARAMETERS\" value=\"false\" />\n    <option name=\"ALIGN_MULTILINE_FOR\" value=\"false\" />\n    <option name=\"CALL_PARAMETERS_WRAP\" value=\"1\" />\n    <option name=\"PREFER_PARAMETERS_WRAP\" value=\"true\" />\n    <option name=\"METHOD_PARAMETERS_WRAP\" value=\"1\" />\n    <option name=\"RESOURCE_LIST_WRAP\" value=\"1\" />\n    <option name=\"EXTENDS_LIST_WRAP\" value=\"1\" />\n    <option name=\"THROWS_LIST_WRAP\" value=\"1\" />\n    <option name=\"EXTENDS_KEYWORD_WRAP\" value=\"1\" />\n    <option name=\"THROWS_KEYWORD_WRAP\" value=\"1\" />\n    <option name=\"METHOD_CALL_CHAIN_WRAP\" value=\"1\" />\n    <option name=\"BINARY_OPERATION_WRAP\" value=\"1\" />\n    <option name=\"BINARY_OPERATION_SIGN_ON_NEXT_LINE\" value=\"true\" />\n    <option name=\"TERNARY_OPERATION_WRAP\" value=\"1\" />\n    <option name=\"TERNARY_OPERATION_SIGNS_ON_NEXT_LINE\" value=\"true\" />\n    <option name=\"FOR_STATEMENT_WRAP\" value=\"1\" />\n    <option name=\"ARRAY_INITIALIZER_WRAP\" value=\"1\" />\n    <option name=\"ASSIGNMENT_WRAP\" value=\"1\" />\n    <option name=\"IF_BRACE_FORCE\" value=\"3\" />\n    <option name=\"DOWHILE_BRACE_FORCE\" value=\"3\" />\n    <option name=\"WHILE_BRACE_FORCE\" value=\"3\" />\n    <option name=\"FOR_BRACE_FORCE\" value=\"3\" />\n    <option name=\"WRAP_LONG_LINES\" value=\"true\" />\n    <option name=\"PARAMETER_ANNOTATION_WRAP\" value=\"1\" />\n    <option name=\"VARIABLE_ANNOTATION_WRAP\" value=\"1\" />\n    <option name=\"ENUM_CONSTANTS_WRAP\" value=\"1\" />\n  </codeStyleSettings>\n  <codeStyleSettings language=\"JSON\">\n    <indentOptions>\n      <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n      <option name=\"TAB_SIZE\" value=\"2\" />\n    </indentOptions>\n  </codeStyleSettings>\n  <codeStyleSettings language=\"XML\">\n    <option name=\"FORCE_REARRANGE_MODE\" value=\"1\" />\n    <indentOptions>\n      <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n    </indentOptions>\n    <arrangement>\n      <rules>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>xmlns:android</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>^$</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>xmlns:.*</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>^$</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:id</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:name</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>name</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>^$</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>style</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>^$</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:layout_width</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:layout_height</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:layout_.*</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:width</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:height</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:viewportWidth</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:viewportHeight</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:layout_.*</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res-auto</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>http://schemas.android.com/apk/res-auto</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*:layout_.*</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>.*</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n        <section>\n          <rule>\n            <match>\n              <AND>\n                <NAME>.*</NAME>\n                <XML_ATTRIBUTE />\n                <XML_NAMESPACE>.*</XML_NAMESPACE>\n              </AND>\n            </match>\n            <order>BY_NAME</order>\n          </rule>\n        </section>\n      </rules>\n    </arrangement>\n  </codeStyleSettings>\n  <codeStyleSettings language=\"kotlin\">\n    <option name=\"KEEP_BLANK_LINES_IN_DECLARATIONS\" value=\"1\" />\n    <option name=\"KEEP_BLANK_LINES_IN_CODE\" value=\"1\" />\n    <option name=\"KEEP_BLANK_LINES_BEFORE_RBRACE\" value=\"0\" />\n    <option name=\"ALIGN_MULTILINE_PARAMETERS\" value=\"false\" />\n    <option name=\"CALL_PARAMETERS_WRAP\" value=\"1\" />\n    <option name=\"CALL_PARAMETERS_LPAREN_ON_NEXT_LINE\" value=\"true\" />\n    <option name=\"CALL_PARAMETERS_RPAREN_ON_NEXT_LINE\" value=\"true\" />\n    <option name=\"METHOD_PARAMETERS_WRAP\" value=\"5\" />\n    <option name=\"METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE\" value=\"true\" />\n    <option name=\"METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE\" value=\"true\" />\n    <option name=\"EXTENDS_LIST_WRAP\" value=\"1\" />\n    <option name=\"METHOD_CALL_CHAIN_WRAP\" value=\"1\" />\n    <option name=\"ASSIGNMENT_WRAP\" value=\"1\" />\n    <option name=\"FIELD_ANNOTATION_WRAP\" value=\"1\" />\n    <option name=\"PARAMETER_ANNOTATION_WRAP\" value=\"1\" />\n    <option name=\"VARIABLE_ANNOTATION_WRAP\" value=\"1\" />\n    <option name=\"ENUM_CONSTANTS_WRAP\" value=\"5\" />\n    <indentOptions>\n      <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n    </indentOptions>\n  </codeStyleSettings>\n</code_scheme>"
  },
  {
    "path": "tools/pre-push",
    "content": "#!/bin/bash\n#\n# Usage: Copy this file to your repository's .git/hooks directory. Name it\n# \"pre-push\" and set the executable bit.\n#\n# This hook aborts git push when the log message of any commits to be pushed\n# starts with \"WIP\" (work in progress) or \"stash\", if the remote ref begins\n# with \"refs/for/\". This prevents incomplete/unwanted commits from being\n# pushed to Gerrit instances.\n#\n# When pushing to Gerrit, this hook also runs a Gradle build similar to\n# Gerrit's presubmit, to help catch errors locally and reduce churn on CLs.\n#\n# Remaining comments are copied from .git/hooks/pre-push.sample.\n#\n# An example hook script to verify what is about to be pushed. Called by \"git\n# push\" after it has checked the remote status, but before anything has been\n# pushed. If this script exits with a non-zero status nothing will be pushed.\n#\n# This hook is called with the following parameters:\n#\n# $1 -- Name of the remote to which the push is being done\n# $2 -- URL to which the push is being done\n#\n# If pushing without using a named remote those arguments will be equal.\n#\n# Information about the commits which are being pushed is supplied as lines to\n# the standard input in the form:\n#\n#   <local ref> <local sha1> <remote ref> <remote sha1>\n\nremote=\"$1\"\nurl=\"$2\"\n\nz40=0000000000000000000000000000000000000000\n\nwhile read local_ref local_sha remote_ref remote_sha\ndo\n  # Handle delete\n  if [[ \"$local_sha\" = \"$z40\" ]]; then\n    echo \"$local_ref, $remote_ref\"\n    :\n  # Move along if we don't match refs/for/\n  elif [[ ! \"$remote_ref\" =~ ^refs/for/.+ ]]; then\n    echo \"$local_ref, $remote_ref\"\n    :\n  else\n    echo \"$local_ref, $local_sha, $remote_ref, $remote_sha\"\n    if [[ \"$remote_sha\" = \"$z40\" ]]; then\n      # New branch, examine all commits\n      branchname=\"${remote_ref#refs/for/}\"\n\n      if [[ \"$branchname\" =~ % ]]; then\n        # Gerrit allows various push-options by appending them to the remote\n        # using \"%<option>=<string>[,<option>=<string>...]\". Strip this off.\n        # TODO: '%' is a valid character in branch names, so this could mangle\n        # the branch name. We should find a way to workaround that.\n        echo \"NOTE: stripping Gerrit push-options beginning at '%'\"\n        branchname=${branchname%%\\%*}\n      fi\n\n      if git check-ref-format --allow-onelevel \"$branchname\"; then\n        range=\"${remote}/${branchname}..$local_sha\"\n      fi\n\n      if [[ -z \"$range\" ]]; then\n        range=\"$local_sha\"\n      fi\n    else\n      # Update to existing branch, examine new commits\n      range=\"$remote_sha..$local_sha\"\n    fi\n\n    echo \"Examining $range\"\n\n    # Check for WIP/stash commit\n    commit=`git rev-list -n 1 -i --grep '^WIP' --grep '^stash' \"$range\"`\n    if [[ -n \"$commit\" ]]; then\n      echo >&2 \"Found WIP/stash commit in $local_ref, not pushing ($commit)\"\n      exit 1\n    fi\n\n    # At least one ref is going to Gerrit, so we should run additional checks\n    run_checks=true\n  fi\ndone\n\nif [[ -n \"$run_checks\" ]]; then\n  # pre-push usually executes in the repository root, but just to be safe...\n  cd \"$(git rev-parse --show-toplevel)\"\n  ./gradlew build\n  exit $?\nfi\n\nexit 0\n"
  },
  {
    "path": "tools/setup.sh",
    "content": "#!/bin/bash\n\n# Copyright 2019 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nRED='\\033[0;1;31m'\nNC='\\033[0m' # No Color\n\nGIT_DIR=$(git rev-parse --git-dir 2> /dev/null)\nGIT_ROOT=$(git rev-parse --show-toplevel 2> /dev/null)\n\nif [[ ! \"$GIT_ROOT\" =~ /iosched$ ]]; then\n  echo -e \"${RED}ERROR:${NC} Please run this script from the cloned iosched directory.\"\n  exit 1\nfi\n\necho \"Installing git commit-message hook\"\necho\ncurl -sSLo \"${GIT_DIR}/hooks/commit-msg\" \\\n    \"https://gerrit-review.googlesource.com/tools/hooks/commit-msg\" \\\n  && chmod +x \"${GIT_DIR}/hooks/commit-msg\"\n\necho \"Installing git pre-push hook\"\necho\ncp \"${GIT_ROOT}/tools/pre-push\" \"${GIT_DIR}/hooks/pre-push\" \\\n  && chmod +x \"${GIT_DIR}/hooks/pre-push\"\n\ncat <<-EOF\nPlease import the code style settings in Android Studio:\n  * open Settings -> Editor -> Code Style\n  * click the gear icon and select \"Import Scheme...\"\n  * find the file ${GIT_ROOT}/tools/iosched-codestyle.xml\n\nAdditionally, checking the following settings helps avoid miscellaneous issues:\n  * Settings -> Editor -> General -> Strip trailing spaces on Save\n  * Settings -> Editor -> General -> Ensure line feed at end of file on Save\n  * Settings -> Editor -> General -> Auto Import -> Optimize imports on the fly\nEOF\n"
  }
]