[
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "\n<div align=\"center\">\n  <p> <img width=\"600\" src=\"https://user-images.githubusercontent.com/7745189/174275733-ff1ec56e-82ea-4c3b-86de-b2b07d258842.jpeg\"> </p>\n\n![license](https://img.shields.io/github/license/baidu/rubik.svg)\n![platform](https://img.shields.io/badge/platform-Android-red)\n![language](https://img.shields.io/github/languages/top/baidu/rubik)\n![last](https://img.shields.io/github/last-commit/baidu/rubik.svg)\n![release](https://img.shields.io/github/v/release/baidu/rubik?display_name=release)\n\n</div>\n\n<div align=\"center\">\n<a href=\"./README_en.md\">English Readme</a>\n</div>\n\n# Rubik\nRubik是一套解决Android平台组件化的综合方案，提供gradle project之间的路由通讯能力，以及对gradle project的组件定义、版本控制、maven发布、aar/jar与源码之间的切换以及组件的自由组合等能力。\n\nRubik由两部分组成：\n* Rubik Router ：提供组件之间的低耦合通讯能力，即Rubik的\"函数路由\"，与一般的页面路由不同，Rubik Router允许把Uri及参数，导航到工程内部，任意的一个公开的JVM语言（Java/Kotlin）函数的执行上，以便于更灵活的进行gradle project之间不基于代码调用的通讯。\n* Rubik 工具链 ：提供组件上下文的定义、版本控制、maven发布、aar/jar与源码之间的切换等能力，包括4个gradle plugin:\n    + rubik：\n        - 提供全局定义组件的能力，并根据全局定义自动启用rubik-context、rubik-shell等插件\n    + rubik-context：\n        - 提供task，自动生成接口中间代码，并把中间代码打包成context.jar ,按版本号发布到maven\n        - 提供task，把业务代码按flavor、版本号编译成aar (包括代码、资源、内置SDK)发布到maven\n        - 通过全局定义的组件，为组件所在子工程自动添加其他组件的context.jar的依赖\n    + rubik-shell：\n        - 给壳工程提供筛选组件能力，根据flavor、版本号筛选要打包进apk的业务组件\n        - 提供组件的源码工程和aar切换的能力\n    + rubik-test:\n        - 给工程提供单元测试环境\n\n## 快速开始\n### 1. 工程创建和组件声明：\n&ensp;&ensp;(1) 创建或使用已有的一个或多个android library module，作为\"组件工程\"（如demo代码中的demo_component_detail、demo_component_home等），用于开发真正的业务逻辑。\n\n&ensp;&ensp;(2) 在最外层工程（gradle root project)的build.gradle或gradle.properties文件中配置Rubik版本号等初始化参数，并在最外层工程中启用rubik插件：\n```groovy\next {\n    rubik_kapt_version = \"com.rubik:kapt:1.9.1.1-K1_5\"   \n    rubik_router_version = \"com.rubik:router:1.9.1.1-K1_5\"   \n    rubik_plugins_version = \"com.rubik:plugins:1.9.1.1-AGBT4-K1_5\"  \n} \n\napply plugin: 'rubik' // 启用rubik插件\n```\n\n&ensp;&ensp;(3) 在最外层工程的build.gradle文件或同级目录下的rubik-*.gradle文件中，配置组件信息：\n```groovy\nrubik {\n    component { // 第一个组件\n        uri \"app://com.myapp.home\"  // 组件的Uri\n        touching {    // 组件需要依赖的其他组件\n            uri (\"app://com.myapp.detail\" ) { \n                version \"0.1.1\"  // 依赖其他组件的版本\n            }\n            uri( … ) \n        }\n        source {    // 定义默认来源，如不需切换源码和aar，可以只声明project或maven\n            project (\":demo_component_home\") \n        }\n    }\n    component { … }  //继续配置第二个组件\n} \n```\n\n### 2. 让组件之间互相通信：\n&ensp;&ensp;(1). 在接口提供者工程内，通过注解定义路由路径，作为组件暴露给其他组件的通信接口：\n\n&ensp;&ensp;&ensp;&ensp;通过RFunction注解声明函数路由:\n```kotlin\n@RFunction(path = \"account/user\") \nfun getUser(id : Int, name : String) : User? { \n    …\n}\n```\n\n&ensp;&ensp;&ensp;&ensp;通过RPage注解声明页面路由:\n```kotlin\n@RPage(path = \"page/main\") \nclass HomeActivity : AppCompatActivity() {\n    … \n}\n```\n&ensp;&ensp;(2). 执行接口提供者工程对应的\"publishRubikXxxRContextLib\"任务，发布组件上下文到云端或本地maven仓库。\n\n&ensp;&ensp;(3). 执行接口提供者工程对应的\"publishRubikXxxRComponent\"任务，发布组件aar到云端或本地maven仓库。\n\n&ensp;&ensp;(4). 在接口调用者工程内，调用上述接口提供者所提供的接口，可以选择两种方式：\n\n&ensp;&ensp;&ensp;&ensp;通过Kotlin DSL：\n```kotlin\nnavigate {\n    uri = \"app://com.myapp.detail/account/user\"  // 请求的uri\n    query { // 请求的参数\n        \"id\" with 400\n        \"name\" with \"CuiVincent\" \n    }\n    result<User?> { user -> \n    // 通过泛型指定接收数据类型，多次异步返回时，可以用多个result接收\n        …\n    }\n} \n```\n\n&ensp;&ensp;&ensp;&ensp;通过自动生成的镜像函数：\n```kotlin\nDetailContext.Account.user(400, \"CuiVincent\" ) { user ->\n    … // 自动生成的镜像函数的参数类型、返回值类型都是明确的，比DSL方式更具有约束力\n}\n```\n\n### 3. 筛选要打包的组件\n&ensp;&ensp;(1). 创建或使用已有的android application project，作为\"壳工程\"（如demo代码中的demo_root_app），用于把组件组装并编译成Apk。\n\n&ensp;&ensp;(2). 在\"壳工程\"的的build.gradle文件或同级目录下的rubik-*.gradle文件中，指定\"壳工程\"最终要将哪些组件，以哪种方式引入，并打包到最终的编译产物之中：\n```groovy\nrubik {\t\n    packing {\n        projectMode { // projectMode，通过源码工程的方式引入组件\n            uri (\"app://com.myapp.home\")\n            uri (\"app://com.myapp.*\") // 支持通过*匹配任意字符\n        }\n        mavenMode { // mavenMode，通过maven上的aar的方式引入组件\n            uri (\"app://com.myapp.detail\") {\n                version \"0.2.0\" \n            }\n        }\n    }\n} \n```\n## 测试\n* 通过rubik-test插件，给当前工程的androidTest variant添加全部可pick组件的context.jar依赖，便于写测试用例。\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass RouterTestCase {\n    @Before\n    fun init() {\n        Rubik.init()\n    } // 初始化Rubik\n    @Test\n    fun usePerview() {\n        PerviewContext.preViewVideo(path) { success ->\n            log(\"preViewVideo success:${success}\")\n        } // 测试用例\n    }\n    … // 继续写测试用例\n }\n\n```\n\n## 如何贡献\n请用Kotlin语言编写，所有注明动机的合理改动提交都会被接收。\n"
  },
  {
    "path": "README_en.md",
    "content": "\n<div align=\"center\">\n  <p> <img width=\"600\" src=\"https://user-images.githubusercontent.com/7745189/174275733-ff1ec56e-82ea-4c3b-86de-b2b07d258842.jpeg\"> </p>\n\n![license](https://img.shields.io/github/license/baidu/rubik.svg)\n![platform](https://img.shields.io/badge/platform-Android-red)\n![language](https://img.shields.io/github/languages/top/baidu/rubik)\n![last](https://img.shields.io/github/last-commit/baidu/rubik.svg)\n![release](https://img.shields.io/github/v/release/baidu/rubik?display_name=release)\n\n</div>\n\n<div align=\"center\">\n<a href=\"./README.md\">中文 Readme</a>\n</div>\n\n# Rubik\nRubik is a comprehensive solution for Android platform componentized development. It provides the ability of routing communication between Gradle projects, as well as the ability of component definition, version control, Maven publishing, AAR/JAR and source code switching, and free composition of components.\n\nRubik consists of two parts:\n* Rubik Router ：Provide low coupling communication between components. The function level routing capability of Rubik. Unlike normal page router, Rubik Router allows the Uri and \n  parameters to be navigated to any execution of a public JVM language (Java/Kotlin) function . It allows for more flexible communication between Gradle Projects without code calls.\n* Rubik Tools link ：Provides component context definition, versioning, Maven publishing, AAR/JAR and source switching capabilities, including 4 Gradle Plugins:\n    + rubik：\n        - Provides the ability to define components globally, and automatically enables plugins such as rubik-context and rubik-shell based on the global definition\n    + rubik-context：\n        - Provide Task, automatically generate the intermediate code such as interface, and package the intermediate code into context.jar, release to Maven according to the version.\n        - Provides tasks to compile business codes into AAR (including code, resources, and built-in SDK) based on flavor and version. publish them to Maven.\n        - Automatically adds dependencies on other context.jars to subprojects where components reside\n    + rubik-shell：\n        - Provides the ability to picking components, picking components to be packaged into APK based on flavor and version.\n        - Provide component source code and AAR switching ability.\n    + rubik-test:\n        - Provide unit testing environment for projects\n\n## Quick start\n### 1. Project creation and component declaration：\n&ensp;&ensp;(1) Create or use one or more existing Android Library Modules as \"component projects\" (demo_component_detail, DEMO_component_home, etc. in Demo code) for developing real business logic.\n\n&ensp;&ensp;(2) Set Rubik initialization parameters such as the Rubik version in the build.gradle or gradle.properties file of the gradle root project. and enable the Rubik plugin in the gradle root project:\n```groovy\next {\n    rubik_kapt_version = \"com.rubik:kapt:1.9.1.1-K1_5\"   \n    rubik_router_version = \"com.rubik:router:1.9.1.1-K1_5\"   \n    rubik_plugins_version = \"com.rubik:plugins:1.9.1.1-AGBT4-K1_5\"  \n} \n\napply plugin: 'rubik' // enable the Rubik plugin\n```\n\n&ensp;&ensp;(3) In the build.gradle file of the outermost project ,or rubik-*.gradle file in its sibling directory, configure the component information:\n```groovy\nrubik {\n    component { // The first component\n        uri \"app://com.myapp.home\"  //   The Uri of component\n        touching {    // The component needs to depend on other components\n            uri (\"app://com.myapp.detail\" ) { \n                version \"0.1.1\"  // Versions that depend on other components\n            }\n            uri( … ) \n        }\n        source {    // Define the default source.\n            project (\":demo_component_home\") \n        }\n    }\n    component { … }  // Proceed to configure the second component\n} \n```\n\n### 2. Let components communicating to each other.：\n&ensp;&ensp;(1). In the interface provider project, defined  routing path by annotations, as a communication interface that a component exposes to other components:\n\n&ensp;&ensp;&ensp;&ensp;Declare function route with the RFunction annotation:\n```kotlin\n@RFunction(path = \"account/user\") \nfun getUser(id : Int, name : String) : User? { \n    …\n}\n```\n\n&ensp;&ensp;&ensp;&ensp;Declare page route with the RPage annotation:\n```kotlin\n@RPage(path = \"page/main\") \nclass HomeActivity : AppCompatActivity() {\n    … \n}\n```\n&ensp;&ensp;(2). Run \"publishRubikXxxRContextLib\" task in the interface provider project, release the component context to the cloud or local maven repository.\n\n&ensp;&ensp;(3). Run \"publishRubikXxxRComponent\" task in the interface provider project, release the component aar to the cloud or local maven repository.\n\n&ensp;&ensp;(4). In the interface caller project, there are two ways to call the interface provided by the above interface provider:\n\n&ensp;&ensp;&ensp;&ensp;Via Kotlin DSL:\n```kotlin\nnavigate {\n    uri = \"app://com.myapp.detail/account/user\"  // The request uri\n    query { // Parameters of the request\n        \"id\" with 400\n        \"name\" with \"CuiVincent\" \n    }\n    result<User?> { user -> \n    // The received data type is specified by generics, and multiple asynchronous returns can be received as multiple results\n        …\n    }\n} \n```\n\n&ensp;&ensp;&ensp;&ensp;Via automatically generated image functions:\n```kotlin\nDetailContext.Account.user(400, \"CuiVincent\" ) { user ->\n    … // The parameter type and return value type of the automatically generated image function are clear, which is more binding than the DSL\n}\n```\n\n### 3. Picking components to package\n&ensp;&ensp;(1). Create or use an existing Android Application Project as a \"shell project\" (demo_root_app in demo code) to assemble and compile components to Apk.\n\n&ensp;&ensp;(2).  In the build.gradle file of the shell project or rubik-*.gradle file in its sibling directory, specify which components the shell project will eventually bring in and how they will be packaged into the final build product:\n```groovy\nrubik {\t\n    packing {\n        projectMode { // projectMode，Introduce components through source code project\n            uri (\"app://com.myapp.home\")\n            uri (\"app://com.myapp.*\") // Support to match any character through *\n        }\n        mavenMode { // mavenMode，Introduce components through AAR on maven\n            uri (\"app://com.myapp.detail\") {\n                version \"0.2.0\" \n            }\n        }\n    }\n} \n```\n## Test\n* Through the rubik-test plugin, add all the context.jar dependencies of picked components to androidTest Variant of the current project, which is easy to write test cases.\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass RouterTestCase {\n    @Before\n    fun init() {\n        Rubik.init()\n    } // Initialize Rubik\n    @Test\n    fun usePerview() {\n        PerviewContext.preViewVideo(path) { success ->\n            log(\"preViewVideo success:${success}\")\n        } // Test case\n    }\n    … // Continue to write test cases\n}\n\n```\n\n## How to contribute\nPlease write in Kotlin, and all change commit with reasonable motivation will be accepted.\n\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\napply plugin: 'rubik'\n\nbuildscript {\n    ext {\n        rubik_tmp_lib_dir = uri('./rubik_libs_repository').path // default:./rubik_libs\n//        rubik_tmp_lib_dir_mode = false  // default: false\n\n        rubik_maven_repository = \"http://my.maven/repository/releases/\"\n        rubik_maven_username = \"admin\" // simple\n        rubik_maven_password = \"123\" // simple\n        rubik_maven_local_repository = uri('./rubik_maven_local_repository').path\n\n//        rubik_use_reset_compiler = false // default: true\n\n//        rubik_publish_context_lib_source = true // default: true\n\n//        rubik_kapt_version = \"com.rubik:kapt:xxx\"   //  @see version.gradle in this demo\n//        rubik_router_version = \"com.rubik:router:xxx\"   //  @see version.gradle in this demo\n//        rubik_plugins_version = \"com.rubik:plugins:xxx\"   //  @see version.gradle in this demo\n\n//        rubik_kapt_source_folder = \"generated/source/kaptKotlin\"\n\n//        rubik_clean_before_task = false  // default: true\n\n        rubik_auto_generate_aggregate = true   // default: false\n\n        rubik_generate_aggregate_in_build_dir = false  // default: true\n//                           only usable when rubik_auto_generate_aggregate = true\n\n        rubik_aggregate_kdoc_add_user_add_time = false   // default: true\n\n        rubik_auto_generate_component_id = true  // default: false\n\n        rubik_generate_router_context = true   // default: false\n\n//        rubik_extension_name = \"rk\"\n\n//        rubik_auto_apply_shell_plugin = false   // default: true\n\n        rubik_config_file_dirs = [uri('./demo').path]\n\n//        rubik_github_maven_repository = \"https://maven.pkg.github.com/baidu/rubik/\"\n//        rubik_github_maven_username = \"myname\"\n//        rubik_github_maven_password = \"123\"\n\n//        rubik_enable_check_router_version = true // default: false\n\n//        rubik_enable_check_context_version = true // default: false\n\n//        rubik_check_context_lib_tasks_state = false // default: true\n\n//        rubik_context_packing_compile_only = false // default: true\n\n//        rubik_auto_fill_flavor = false // default: true\n\n//        rubik_strict_touching_and_packing = false // default: true\n\n        rubik_except_component_build_types = ['debug']\n\n        rubik_except_component_flavors = ['company2']\n\n        rubik_remove_project_when_publish_context_libs = false // default: true\n\n        rubik_publication_record_files_dir = uri('./rubik_libs_repository').path\n\n//        rubik_auto_update_publication_record = false //  default: true\n//\n//        rubik_auto_use_publication_record = false //  default: true\n\n        rubik_publication_record_history_max_size = 15 // default: 10\n\n        rubik_on_route_method_max_size = 15 // default: 100\n\n//        rubik_sync_code_enable = false  //  default: true\n//\n//        rubik_auto_generate_settings = false  //  default: true\n\n        rubik_log_level = 1 // 1:all logs , 2:default , 3:least logs\n\n        rubik_write_log_to_file = false\n\n//        rubik_ignore_value_annotations = [\"com.google.gson.annotations.SerializedName\"]\n\n    }\n\n    apply from: 'version-adapter.gradle'\n    apply from: 'versions.gradle'\n\n    addRepos(repositories)\n\n    dependencies {\n        classpath \"com.android.tools.build:gradle:$agbt_version\"\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n        classpath rubik_plugins_version\n    }\n}\n\nallprojects {\n    addRepos(repositories)\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "demo/demo_component_detail/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n\n        consumerProguardFiles 'consumer-rules.pro'\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    flavorDimensions \"company\", \"channel\"\n\n    productFlavors {\n        company1 { dimension \"company\" }\n        company2 { dimension \"company\" }\n        channel1 { dimension \"channel\" }\n        channel2 { dimension \"channel\" }\n    }\n\n}\n\nandroidExtensions {\n    experimental = true\n}\n\nrubik {\n    aggregateSet uri('./src/main/ra').path\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.core:core-ktx:1.0.2'\n    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'\n    implementation 'com.google.code.gson:gson:2.8.5'\n\n//    implementation project(':demo:demo_until_library_a')\n}"
  },
  {
    "path": "demo/demo_component_detail/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "demo/demo_component_detail/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\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mars.component.detail\">\n    <application android:label=\"@string/app_name\">\n        <activity android:name=\".ui.FirstPageActivity\"/>\n        <activity android:name=\".ui.SecondPageActivity\"/>\n    </application>\n</manifest>\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/AipsInCompanion.kt",
    "content": "package com.mars.component.detail.api\n\nimport com.rubik.annotations.route.RRoute\n\nclass AipsInCompanion {\n    companion object DetailCompanion {\n        // Companion方法\n        @RRoute(path = \"doSthCompanion\")\n        fun doSthCompanion(i: Int, j: String, k: Long): String {\n            println(\" AP DBG DETAIL  doSthCompanion begin !!! i:$i j:$j k:$k\")\n            return \"result = i:$i j:$j k:$k\"\n        }\n\n        // Companion属性\n        @RRoute(path = \"property/companion\")\n        var propertyCompanion: String = \"bnm3\"\n\n        // Companion高阶函数\n        @RRoute(path = \"doSthHOFCompanion\")\n        val doSthHOFCompanion: (Int) -> Int = {\n            println(\" AP DBG DETAIL  doSthHOFCompanion begin !!!\")\n            it + 102\n        }\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/AipsInTop.kt",
    "content": "package com.mars.component.detail.api\n\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RRoute\n\n\n//顶层方法\n@RRoute(path = \"doSthTop\")\nfun doSthTop(\n    ints: Array<Int>,\n    li: List<Int?>,\n    strings: Array<String>,\n    ls: List<String>,\n    beans: Array<TestDataBean>,\n    lb: List<TestDataBean>\n): List<TestDataBean> {\n    println(\" AP DBG DETAIL  doSthTop begin beans:${ints[0]} li:${li[0]} ls:${ls[0]} strings:${strings[0]} beans:${beans[0]} lb:${lb[0]} !!!\")\n    return lb\n}\n\n//顶层高阶函数\n@RRoute(path = \"doSthHOFTop\")\nval doSthHOFTop: (Unit) -> Unit = {\n    println(\" AP DBG DETAIL  doSthHOFTop begin !!!\")\n}\n\n//顶层属性\n@RRoute(path = \"property/top\")\nvar propertyTop: String = \"bnm\"\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/ApiSerialization.kt",
    "content": "package com.mars.component.detail.api\n\nimport com.mars.component.detail.value.TestParcelizeBean\nimport com.mars.component.detail.value.TestSerializableBean\nimport com.rubik.annotations.route.function.RFunction\n\nclass ApiSerialization {\n    @RFunction(path = \"api/serialization/parcel-bean\")\n    fun doSthParcelBean(parcelBean: TestParcelizeBean?): TestParcelizeBean {\n        println(\" AP DBG DETAIL  doSthParcelBean begin parcelBean:${parcelBean?.d2}!!!\")\n        return TestParcelizeBean(430,\"from detail!\")\n    }\n\n    @RFunction(path = \"api/serialization/parcel-array\")\n    fun doSthParcelArray(parcels: Array<TestParcelizeBean>): Array<TestParcelizeBean> {\n        println(\" AP DBG DETAIL  doSthParcelArray begin parcels:${parcels.size}!!!\")\n        println(\" AP DBG DETAIL  doSthParcelArray begin parcels 0 :${parcels[0].d2}!!!\")\n        return arrayOf(\n            TestParcelizeBean(430, \"from detail 11!\"),\n            TestParcelizeBean(430, \"from detail 22!\"),\n            TestParcelizeBean(430, \"from detail 33!\")\n        )\n    }\n\n    @RFunction(path = \"api/serialization/parcel-list\")\n    fun doSthParcelList(parcels: List<TestParcelizeBean>): List<TestParcelizeBean> {\n        println(\" AP DBG DETAIL  doSthParcelList begin parcels:${parcels.size}!!!\")\n        println(\" AP DBG DETAIL  doSthParcelList begin parcels 0 :${parcels[0].d2}!!!\")\n        return listOf(\n            TestParcelizeBean(430, \"from detail 22!\"),\n            TestParcelizeBean(430, \"from detail 33!\"),\n            TestParcelizeBean(430, \"from detail 44!\")\n        )\n    }\n\n\n    @RFunction(path = \"api/serialization/Serializable-bean\")\n    fun doSthSerializableBean(serializableBean: TestSerializableBean): TestSerializableBean {\n        println(\" AP DBG DETAIL  doSthSerializableBean begin serializableBean:${serializableBean.d2}!!!!!!\")\n        return TestSerializableBean(530,\"from detail!\")\n    }\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/Apis.kt",
    "content": "package com.mars.component.detail.api\n\nimport android.app.Activity\nimport android.content.Context\nimport android.view.View\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.ViewModelStoreOwner\nimport com.mars.component.detail.value.TestDataBean\nimport com.mars.component.detail.value.TestListBean\nimport com.mars.component.detail.value.mapping.TestDataMappingBean\nimport com.mars.component.detail.value.mapping.TestNestDataMappingBean\nimport com.rubik.annotations.route.RRoute\n\ntypealias AliasHof =  (String?) -> String?\ntypealias AigcChatHybridActionCreator = (\n    activity: Activity,\n    owner: ViewModelStoreOwner,\n    lifecycleOwner: LifecycleOwner,\n    hybridActionBuilder: LifecycleOwner?,\n    baseView: LifecycleOwner?\n) -> LifecycleOwner?\n\nclass Apis {\n    // 无参无返回值\n    @RRoute(path = \"do-sth\")\n    fun doSth() {\n        println(\" AP DBG DETAIL  doSth  begin !!!\")\n    }\n\n    // 高阶函数\n    @RRoute(path = \"do-sth-hof\", forResult = true, version = \"2.0\")\n    val doSthHOF: (Int, String, TestDataBean) -> Int = { a, b, c ->\n        println(\" AP DBG DETAIL  doSthHOF begin b:$b c:$c!!!\")\n        a + 102\n    }\n\n    // 属性\n    @RRoute(path = \"property/property\", version = \"1.0\")\n    val property: String = \"vbn\"\n\n\n    // 返回View\n    @RRoute(path = \"view/get\")\n    fun getView(context: Context): View? {\n        println(\" AP DBG DETAIL  getView begin !!!\")\n        return View(context)\n    }\n\n    // uri传递参数\n    @RRoute(path = \"sth/{id}/a-{name}?code1={code1}&code2={code2}\")\n    fun getSth(id: String, name: String, code1: String, code2: String): String {\n        println(\" AP DBG DETAIL  getSth begin id:$id name:$name code1:$code1 code2:$code2 !!!\")\n        return \"$id => $name => $code1 => $code2\"\n    }\n\n    // navigationOnly\n    @RRoute(path = \"sth-navigation-only/{uri}\", navigationOnly = true)\n    fun getSthNavigationOnly(uri: String): String {\n        println(\" AP DBG DETAIL  getSthNavigationOnly begin uri:$uri  !!!\")\n        return \"$uri  !\"\n    }\n\n    // 变长参数\n    @RRoute(path = \"doSthVararg\")\n    fun doSthVararg(no: Int, vararg varargString: String) {\n        println(\"  AP DBG DETAIL  doSthVararg begin strings:${varargString.getOrNull(0)}!!!\")\n    }\n\n\n    @RRoute(path = \"doSthVarargHof\")\n    fun doSthVarargHof(no: Int, vararg varargString: AigcChatHybridActionCreator) {\n        println(\"  AP DBG DETAIL  doSthVarargHof begin strings:${varargString.getOrNull(0)}!!!\")\n    }\n\n    // Bean参数返回值\n    @RRoute(path = \"doSthBean\")\n    fun doSthBean(a1: TestDataBean): TestListBean {\n        println(\" AP DBG DETAIL  doSthBean begin a1:${a1.d1}!!!\")\n        return TestListBean(55)\n    }\n\n//    // BeanList参数返回值\n//    @RRoute(context = \"com.mars.rubik-test.detail\", path = \"doSthBean\")\n//    fun doSthBeanList(a1: List<TestDataNotRValueBean>?): List<TestDataNotRValueBean>? {\n//        println(\" AP DBG DETAIL  doSthBean begin a1:${a1?.getOrNull(0)}!!!\")\n//        return listOf(TestDataNotRValueBean(66, \"\"))\n//    }\n\n\n    // uri冲突\n//    @RRoute(path = \"doSthUriCrash\")\n//    fun doSthUriCrash1(name: String, code: String) {\n//    }\n//\n//    @RRoute(path = \"doSthUriCrash\")\n//    fun doSthUriCrash2(name: String, code: String, version: String) {\n//    }\n\n    @RRoute(path = \"do-sth-uri-crash\")\n    fun doSthUriCrash3(name: String, code: String) {\n    }\n\n    @RRoute(path = \"do-sth-uri-crash\")\n    fun doSthUriCrash4(name: String, code: String, version: String) {\n    }\n\n//    @RRoute(path = \"do-sth-uri-crash\")\n//    fun doSthUriCrash5(name: String, code: String, version: String) {\n//    }\n\n    // Bean mapping参数返回值\n    @RRoute(path = \"doSthMappingBean\")\n    fun doSthMappingBean(a1: TestDataMappingBean): TestDataMappingBean {\n        println(\" AP DBG DETAIL  doSthMappingBean  a1:${a1.d1}!!!\")\n        return TestDataMappingBean(655, \"sdfa\")\n    }\n\n    // Bean mapping参数返回值\n    @RRoute(path = \"doSthTestNestDataMappingBean\")\n    fun doSthTestNestDataMappingBean(bean: TestNestDataMappingBean): TestNestDataMappingBean {\n        println(\" AP DBG DETAIL  doSthTestNestDataMappingBean ${bean.d1?.d2} ${bean.d2?.d2} ${bean.d3?.d2} ${bean.d4} ${bean.d5}!!!\")\n        return TestNestDataMappingBean(\n            TestDataBean(23, \"11sdsd\"),\n            TestDataMappingBean(55, \"11sdsd\"),\n            TestNestDataMappingBean(\n                TestDataBean(4423, \"22sdsd\"),\n                TestDataMappingBean(4455, \"22sdsd\"),\n                null,\n                listOf(TestDataBean(4423, \"22sdsd\")),\n                listOf(TestDataMappingBean(4455, \"22sdsd\"))\n            ),\n            listOf(TestDataBean(23, \"11sdsd\")),\n            listOf(TestDataMappingBean(55, \"11sdsd\"))\n        )\n    }\n\n}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/ApisAsyncReturn.kt",
    "content": "package com.mars.component.detail.api\n\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RResult\nimport com.rubik.annotations.route.RRoute\n\nclass ApisAsyncReturn {\n\n    // 高阶函数异步返回\n    @RRoute(path = \"doSthAsyncHOF\")\n    fun doSthAsyncHOF(@RResult hof: (String, TestDataBean) -> Unit) {\n        println(\" AP DBG DETAIL  doSthAsyncHOF begin !!!\")\n        hof(\"dfg\", TestDataBean(101, \"xxx\"))\n    }\n\n    // 高阶函数异步返回\n    @RRoute(path = \"doSthAsyncHOFNullable\")\n    fun doSthAsyncHOFNullable(\n        @RResult hofx1res: ((String, TestDataBean) -> Unit)?,\n        hof2xx: ((String, TestDataBean) -> Unit)?,\n//        @RResult hofx3res: ((String, Int, TestDataBean) -> TestDataBean)?,\n        hof4xx: ((String, Int, TestDataBean) -> TestDataBean?)?\n    ) {\n        println(\" AP DBG DETAIL  doSthAsyncHOFNullable begin !!!\")\n        hofx1res?.invoke(\"dfg\", TestDataBean(101, \"xxx\"))\n    }\n\n    @RRoute(path = \"doSthAsync2HOF\")\n    fun doSthAsyncHOF(\n        @RResult hof: (String, Int) -> Unit,\n        @RResult hof2: (String, Int) -> Unit\n    ) {\n        println(\" AP DBG DETAIL  doSthAsyncHOF begin !!!\")\n        hof(\"dfg\", 22)\n        hof2(\"dfg2\", 222)\n    }\n\n    // 接口异步返回\n    @RRoute(path = \"doSthAsyncOpen\")\n    fun doSthAsyncOpen(uri: String, @RResult results: Callback?) {\n        println(\" AP DBG DETAIL  doSthAsyncOpen begin uri:$uri !!!\")\n        results?.onCall(\"zxc\", 33)\n    }\n\n    @RRoute(path = \"do-sth-async-interface\")\n    fun doSthAsyncInterface(@RResult onResult: Callbackable) {\n        println(\" AP DBG DETAIL  doSthAsyncInterface begin !!!\")\n        onResult.onCall(\"zxc\", 33)\n    }\n\n    @RRoute(path = \"do-sth-async-3-interface\")\n    fun doSthAsync2Interface(\n        @RResult onResult: Callbackable?,\n        @RResult onResult2: Callbackable,\n        @RResult onResult3: BeanCallbackable\n//        @RResult onResult4: BeanReturnCallbackable,\n//        func5: BeanReturnCallbackable\n    ) {\n        println(\" AP DBG DETAIL  doSthAsyncInterface begin !!!\")\n        onResult?.onCall(\"zxc\", 33)\n        onResult2.onCall(\"zxc2\", 332)\n        onResult3.onCall(TestDataBean(0, \"abd\"))\n    }\n\n    @RRoute(path = \"do-sth-async-interface-multi-func\")\n    fun doSthAsyncInterfaceMultiFunc(@RResult onResult: MultiCallback) {\n        println(\" AP DBG DETAIL  doSthAsyncInterface begin !!!\")\n        onResult.start(\"start1\", 55)\n        onResult.data(TestDataBean(1, \"dfg\"))\n        onResult.stop(\"stop2\", 66)\n    }\n}\n\nopen class Callback {\n    open fun onCallNone(v1: String?, v2: Int) {\n        // nothing\n    }\n\n    @RResult\n    open fun onCall(v1: String?, v2: Int) {\n        // nothing\n    }\n}\n\ninterface Callbackable {\n    fun onCall(v1: String?, v2: Int)\n}\n\ninterface BeanCallbackable {\n    fun onCall(v: TestDataBean?)\n}\n\ninterface MultiCallback {\n    @RResult\n    fun start(v1: String?, v2: Int)\n\n    @RResult\n    fun data(v: TestDataBean?)\n\n    @RResult\n    fun stop(v1: String?, v2: Int)\n}\n\ninterface BeanReturnCallbackable {\n    fun onCall(v: TestDataBean?):TestDataBean\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/ApisBadCase.kt",
    "content": "package com.mars.component.detail.api\n\nimport android.content.Context\nimport androidx.lifecycle.LiveData\nimport com.rubik.annotations.route.RResult\nimport com.rubik.annotations.route.RRoute\n\nclass ApisBadCase {\n\n    @RRoute(path = \"getFilesMeta\")\n    fun getFilesMeta(context: Context?, path: String?, @RResult callback: GetFileMetaCallback) {\n    }\n\n    @RRoute(path = \"enterprise/business/allocateTicket\")\n    fun allocateTicket(context: Context, shareId: Long, count: Int, packetType: Int): LiveData<List<String>>? {\n        return null\n    }\n\n//    @RRoute(path = \"get/TestClassB\")\n//    fun allocateTicket( count: Int): LiveData<TestClassB>? {\n//        return null\n//    }\n\n//    @RFunction(path = \"shareObject/createGroupLinkShareController\")\n//    fun createGroupLinkShareController(\n//        activity: Activity?,\n//        shareOption: String?,\n//        image: ByteArray?,\n//        handler: Handler?,\n//        type: String?\n//    ): GetFileMetaCallback? {\n//        return null\n//    }\n//\n//    @RFunction(path = \"shareObject/createGroupLinkShareController\")\n//    fun createGroupLinkShareController(\n//        activity: Activity?,\n//        shareOption: String?,\n//        handler: Handler?,\n//        type: String?,\n//        @RResult shareHelper: GetFileMetaCallback?\n//    ): GetFileMetaCallback? {\n//        return null\n//    }\n}\n\ninterface GetFileMetaCallback {\n    /**\n     * 文件恢复结果通知\n     */\n    @RResult\n    fun onResult(fsid: Long, path: String?)\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/ApisBigData.kt",
    "content": "package com.mars.component.detail.api\n\nimport com.mars.component.detail.value.TestDataBean\nimport com.mars.component.detail.value.TestParcelizeBean\nimport com.rubik.annotations.route.function.RFunction\n\nclass ApisBigData {\n\n    private val testArraySize = 200001\n    private val testListSize = 200001\n\n    @RFunction(path = \"api/bigdata/json-array\")\n    fun getBigJsonArray(array: Array<TestDataBean>): Array<TestDataBean> {\n        println(\" AP DBG DETAIL  getBigJsonArray begin array:${array.size}!!!\")\n        return Array(testArraySize) {\n            TestDataBean(it, \"from detail! array:$it\")\n        }\n    }\n\n    @RFunction(path = \"api/bigdata/parcel-array\")\n    fun getBigParcelArray(array: Array<TestParcelizeBean>): Array<TestParcelizeBean> {\n        println(\"  AP DBG DETAIL  getBigJsonArray begin array:${array.size}!!!\")\n        return  Array(testArraySize) {\n            TestParcelizeBean(it, \"from detail! array:$it\")\n        }\n    }\n\n    @RFunction(path = \"api/bigdata/lib-array\")\n    fun getBigLibArray(array: Array<TestDataBean>): Array<TestDataBean> {\n        println(\" AP DBG DETAIL  getBigJsonArray begin array:${array.size}!!!\")\n        return Array(testArraySize) {\n            TestDataBean(it, \"from detail! array:$it\")\n        } // TestLibDataBean\n    }\n\n    @RFunction(path = \"api/bigdata/json-list\")\n    fun getBigJsonList(list: List<TestDataBean>): List<TestDataBean> {\n        println(\" AP DBG DETAIL  getBigJsonList begin list:${list.size}!!!\")\n        return MutableList(testListSize){\n            TestDataBean(it, \"from detail! list:$it\")\n        }\n    }\n\n    @RFunction(path = \"api/bigdata/parcel-list\")\n    fun getBigParcelList(list: List<TestParcelizeBean>): List<TestParcelizeBean> {\n        println(\" AP DBG DETAIL  getBigJsonList begin list:${list.size}!!!\")\n        return MutableList(testListSize){\n            TestParcelizeBean(it, \"from detail! list:$it\")\n        }\n    }\n\n//    @RFunction(path = \"api/bigdata/lib-list\")\n//    fun getBigLibList(list: List<TestLibDataBean>): List<TestLibDataBean> {\n//        println(\" AP DBG DETAIL  getBigJsonList begin list:${list.size}!!!\")\n//        return List(testListSize){\n//            TestLibDataBean(it, \"from detail! list:$it\")\n//        }\n//    }\n\n    @RFunction(path = \"api/bigdata/lib-list\")\n    fun getBigLibList(list: List<TestDataBean>): List<TestDataBean> {\n        println(\" AP DBG DETAIL  getBigJsonList begin list:${list.size}!!!\")\n        return List(testListSize){\n            TestDataBean(it, \"from detail! list:$it\")\n        }\n    }\n\n    @RFunction(path = \"api/bigdata/parcel-arraylist\")\n    fun getBigParcelArrayList(list: List<TestParcelizeBean>): MutableList<TestParcelizeBean> {\n        println(\" AP DBG DETAIL  getBigJsonList begin arraylist:${list.size}!!!\")\n        return MutableList(testListSize){\n            TestParcelizeBean(it, \"from detail! arraylist:$it\")\n        }\n    }\n\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/ApisExt.kt",
    "content": "package com.mars.component.detail.api\n\nimport com.rubik.annotations.route.RExtend\nimport com.rubik.annotations.route.RRoute\n\n// 扩展函数\n@RRoute(path = \"do-sth-ext\")\nfun doSthExt(s: String, @RExtend i: Int): Int {\n    println(\" AP DBG DETAIL  doSthExt i:$i !!!\")\n    return i\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/ApisProvideInstance.kt",
    "content": "package com.mars.component.detail.api\n\n\nimport com.rubik.annotations.route.RInstance\nimport com.rubik.annotations.route.RRoute\nimport com.rubik.annotations.route.instance.RRouteInstance\n\nclass Task @RInstance(\n    provideForPath = \"do-sth-provide-instance-by-constructor\"\n) constructor(val value: String) {\n    // 通过assist提供实例\n    @RRoute(path = \"do-sth-provide-instance-by-func\")\n    fun doSthProvideObject() {\n        println(\" AP DBG DETAIL  doSthProvideObject begin value:$value!!!\")\n    }\n\n    @RRoute(path = \"do-sth-provide-instance-by-func2\")\n    fun doSthProvideObject2() {\n        println(\" AP DBG DETAIL  doSthProvideObject begin value:$value!!!\")\n    }\n\n    @RRoute(path = \"do-sth-provide-instance-by-parameter-func\")\n    fun doSthProvideObject2(v1: String, v2: Int?, v3: Int?) {\n        println(\" AP DBG DETAIL  doSthProvideObjectByParameterFunction begin value:$value v1:$v1 v2:$v2 v3:$v3 :!!!\")\n    }\n\n    @RRoute(path = \"do-sth-provide-instance-by-constructor\")\n    fun doSthProvideObject3(v1: String, v2: Int?, v3: Int?) {\n        println(\" AP DBG DETAIL  doSthProvideObjectByConstructor begin value:$value v1:$v1 v2:$v2 v3:$v3 :!!!\")\n    }\n}\n\n@RInstance(provideForPath = \"do-sth-provide-instance-by-func\")\n@RInstance(provideForPath = \"do-sth-provide-instance-by-func2\")\nfun provideTask(): Task {\n    println(\" AP DBG DETAIL  provideTask begin !!!\")\n    return Task(\"TTT-CREATE BY FUNC\")\n}\n\n@RInstance(provideForPath = \"do-sth-provide-instance-by-parameter-func\")\nfun provideTask2(value: String, v0: Int?): Task {\n    println(\" AP DBG DETAIL  provideTask2 begin v0:$v0!!!\")\n    return Task(value)\n}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/ApisWithLiveData.kt",
    "content": "package com.mars.component.detail.api\n\nimport android.os.Handler\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport com.mars.component.detail.value.TestDataBean\nimport com.mars.component.detail.value.TestListBean\nimport com.rubik.annotations.route.RRoute\n\nclass ApisWithLiveData {\n    // 传递LiveData\n    @RRoute(path = \"live-data/get\")\n    fun getSthLiveData(): LiveData<String> {\n        return MutableLiveData<String>().apply {\n            this.postValue(\"i am from A\")\n            Handler().postDelayed({\n                this.value = \"i am also from A\"\n            }, 1000L)\n        }\n    }\n\n    @RRoute(path = \"live-data-bean/get\")\n    fun getSthLiveDataBean(): LiveData<TestDataBean> {\n        return MutableLiveData<TestDataBean>().apply {\n            this.value = TestDataBean(122334, \"A1q2w3e\")\n        }\n    }\n\n    @RRoute(path = \"live-data-bean-list/get\")\n    fun getSthLiveDataBeanList(): LiveData<List<TestListBean?>> {\n        return MutableLiveData<List<TestListBean?>>().apply {\n            this.value = listOf(\n                TestListBean(45566778, listOf(\"A2QQQ\", \"A2WWW\", \"A2EEE\")),\n                TestListBean(67788990, listOf(\"A2AAA\", \"A2SSS\", \"A2DDD\"))\n            )\n        }\n    }\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/api/ApisWithResultReceiver.kt",
    "content": "package com.mars.component.detail.api\n\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.ResultReceiver\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RRoute\nimport com.rubik.route.mapping.query\nimport com.rubik.router.bundleQueries\nimport com.rubik.router.property\n\nclass ApisWithResultReceiver {\n    // 传递ResultReceiver\n    @RRoute(path = \"doSthResultReceiver\")\n    fun doSthResultReceiver(result: ResultReceiver): ResultReceiver {\n        result.send(100, bundleQueries {\n            \"fromA\" with \" this is A \"\n            \"BEAN_fromA\" with TestDataBean(555,\"A5r5r5r\")\n        })\n        return object : ResultReceiver(Handler()) {\n            override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {\n                super.onReceiveResult(resultCode, resultData)\n                println(\n                    \" AP DBG DETAIL  doSthResultReceiver begin resultCode:$resultCode  \" +\n                            \"resultData1:${resultData?.property<String>(\"fromB\"\n                    )} resultData2:${resultData?.property<TestDataBean>(\n                        \"BEAN_fromB\"\n                    )?.d2} !!!\"\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/callback/CallbackTestDefault.kt",
    "content": "package com.mars.component.detail.callback\n\n\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RCallback\n\n@RCallback\ninterface CallbackTestDefault {\n\n    fun callbackDefault1(int1: Int)\n\n    fun callbackDefault2(bean:TestDataBean?)\n}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/callback/CallbackTestInterface.kt",
    "content": "package com.mars.component.detail.callback\n\n\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RCallback\nimport com.rubik.annotations.route.RRoute\n\n@RCallback\ninterface CallbackTestInterface {\n    @RCallback\n    fun callbackInt(i:Int)\n\n    @RCallback\n    fun callbackBean(bean:TestDataBean)\n\n    @RCallback\n    fun callbackBeanReBean(bean:TestDataBean?)\n}\n\n@RRoute(path = \"do-sth-callback-object\")\nfun doSthCallbackObject(callback: CallbackTestInterface) {\n    println(\" AP DBG DETAIL  doSthCallbackObject begin this:${callback.hashCode()} !!!\")\n    callback.callbackInt(11)\n    callback.callbackBean(TestDataBean(23, \"sdsd\"))\n    callback.callbackBeanReBean(TestDataBean(24, \"dfdf\"))\n}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/event/Events.kt",
    "content": "package com.mars.component.detail.event\n\nimport android.content.Context\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.context.REvent\nimport com.rubik.annotations.route.RInstance\nimport com.rubik.annotations.route.RResult\nimport com.rubik.context.LifeCycleEvent\n\ndata class EventsWithLambda(\n    @REvent(msg = LifeCycleEvent.INIT)\n    val init: () -> Unit = {\n        println(\" CT DBG init DETAIL EventsWithLambda begin !!! !!!\")\n        initSdk()\n    },\n    @REvent(msg = LifeCycleEvent.DESTROY)\n    val destroy: () -> Unit = {\n        println(\" CT DBG destroy DETAIL EventsWithLambda begin !!!\")\n    }\n)\n\nclass Events {\n    @REvent(msg = LifeCycleEvent.INIT)\n    fun onInit(context: Context, parameter1: String) {\n        println(\" CT DBG init DETAIL Events begin :${context.hashCode()} parameter1:$parameter1!!!\")\n        initSdk()\n    }\n\n    @REvent(msg = LifeCycleEvent.DESTROY)\n    fun onDestroy(context: Context, parameter1: String) {\n        println(\" CT DBG destroy DETAIL Events begin :${context.hashCode()} parameter1:$parameter1!!!\")\n    }\n}\n\nclass EventsByInstance {\n    @REvent(msg = \"MY_INIT\", tag = \"events-by-instance\")\n    fun onInit(arg1: Any, arg2: Any, arg3: Any) {\n        println(\" CT DBG MY_INIT DETAIL:${hashCode()}  arg1:$arg1 arg2:$arg2 arg3:$arg3 EventsByInstance begin !!!\")\n        initSdk()\n    }\n\n    @REvent(msg = \"MY_DESTROY\", tag = \"events-by-instance\")\n    fun onDestroy(arg1: Any, arg2: Any, arg3: Any) {\n        println(\" CT DBG MY_DESTROY DETAIL:${hashCode()}  arg1:$arg1 arg2:$arg2 arg3:$arg3  EventsByInstance begin !!!\")\n    }\n\n    @REvent(msg = \"MY_CALLBACK_RES\", tag = \"events-by-instance\")\n    fun onCallbackRes(arg1: Any, @RResult result: (Int) -> Unit) {\n        println(\" CT DBG MY_CALLBACK DETAIL:${hashCode()}  arg1:$arg1 result:$result EventsByInstance begin !!!\")\n    }\n\n    @REvent(msg = \"MY_CALLBACK_RES_BEAN\", tag = \"events-by-instance\")\n    fun onCallbackResBean(arg1: Any, @RResult result: (TestDataBean) -> Unit) {\n        println(\" CT DBG MY_CALLBACK_RES_BEAN DETAIL:${hashCode()}  arg1:$arg1 result:$result EventsByInstance begin !!!\")\n    }\n\n    @REvent(msg = \"MY_CALLBACK_BEAN\", tag = \"events-by-instance\")\n    fun onCallbackBean(arg1: Any, bean: TestDataBean) {\n        println(\" CT DBG MY_CALLBACK_BEAN DETAIL:${hashCode()}  arg1:$arg1 result:$bean EventsByInstance begin !!!\")\n    }\n}\n\nfun initSdk() {\n    println(\" CT DBG initSdk begin !!!\")\n}\n\nprivate val life = EventsByInstance()\n\n@RInstance(provideForTag = \"events-by-instance\")\n@RInstance(provideForTag = \"events-by-instance\")\nfun provideEventsInstance(bool: Boolean) = life"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/objekt/ObjectTest.kt",
    "content": "package com.mars.component.detail.objekt\n\n\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RObject\nimport com.rubik.annotations.route.RRoute\nimport com.rubik.annotations.route.function.RFunction\n\n@RObject\nclass ObjectTest(val value: String) {\n\n    @RRoute(path = \"do-sth-in-common-instance\")\n    fun doSthInObject(): TestDataBean {\n        println(\" AP DBG DETAIL  doSthProvideObject begin this:${this.hashCode()} value:$value!!!\")\n        return TestDataBean(645, \"ahr\")\n    }\n\n    @RRoute(path = \"do-sth-in-common-instance-parameter\")\n    fun doSthInObject2(v1: String, v2: Int?, v3: Int?) {\n        println(\" AP DBG DETAIL  doSthProvideObject2 begin this:${this.hashCode()} value:$value \" +\n                \"v1:$v1 v2:$v2 v3:$v3 :!!!\")\n    }\n\n    @RFunction(path = \"object/get/do-sth-in-common-ins\")\n    fun doSthInObject3(v1: String, v2: Int?, v3: Int?) {\n        println(\" AP DBG DETAIL  doSthProvideObject3 begin this:${this.hashCode()} value:$value \" +\n                \"v1:$v1 v2:$v2 v3:$v3 :!!!\")\n    }\n\n}\n\n\n// get and send\n\n@RRoute(path = \"get-a-other-common-instance\")\nfun getAOtherObjectTest(i: Int) :ObjectTest= ObjectTest(\"x1x\").apply {\n    println(\" AP DBG DETAIL  getAOtherObjectTestDa ${hashCode()} value:$value\")\n}\n\n@RRoute(path = \"send-back-common-instance\")\nfun senBackObjectTest(obj: ObjectTest) {\n    println(\" AP DBG DETAIL  senBackObjectTest ${obj.hashCode()} value:${obj?.value}\")\n}\n\n@RFunction(path = \"get-a-lot-of-common-instance\")\nfun getALotOfObjectTest(i: Int):List<ObjectTest> = mutableListOf(\n    ObjectTest(\"yy1\").apply {\n        println(\" AP DBG DETAIL  getALotOfObjectTest 1 ${hashCode()} value:$value\")\n    },\n    ObjectTest(\"yy2\").apply {\n        println(\" AP DBG DETAIL  getALotOfObjectTest 2 ${hashCode()} value:$value\")\n    },\n    ObjectTest(\"yy3\").apply {\n        println(\" AP DBG DETAIL  getALotOfObjectTest 3 ${hashCode()} value:$value\")\n    })\n\n@RFunction(path = \"send-back-a-lot-of-common-instance\")\nfun senBackALotOfObjectTest(objs: Map<String, ObjectTest>) {\n    objs.forEach { (key, value) ->\n        println(\" AP DBG DETAIL  senBackALotOfObjectTest ${value.hashCode()} value:${value?.value} key:$key\")\n    }\n}\n\n\n@RRoute(path = \"get-a-other-common-instance-null\")\nfun getAOtherObjectTestNull(i: Int) :ObjectTest?= ObjectTest(\"x1x\").apply {\n    println(\" AP DBG DETAIL  getAOtherObjectTestNull ${hashCode()} value:$value\")\n}\n\n@RRoute(path = \"send-back-common-instance-null\")\nfun senBackObjectTestNull(obj: ObjectTest?) {\n    println(\" AP DBG DETAIL  senBackObjectTestNull ${obj.hashCode()} value:${obj?.value}\")\n}\n\n@RFunction(path = \"get-a-lot-of-common-instance-null\")\nfun getALotOfObjectTestNull(i: Int):List<ObjectTest?>? = mutableListOf(\n    ObjectTest(\"yy1\").apply {\n        println(\" AP DBG DETAIL  getALotOfObjectTestNull 0 ${hashCode()} value:$value\")\n    },\n    ObjectTest(\"yy2\").apply {\n        println(\" AP DBG DETAIL  getALotOfObjectTestNull 1 ${hashCode()} value:$value\")\n    },\n    ObjectTest(\"yy3\").apply {\n        println(\" AP DBG DETAIL  getALotOfObjectTestNull 2 ${hashCode()} value:$value\")\n    })\n\n@RFunction(path = \"send-back-a-lot-of-common-instance-null\")\nfun senBackALotOfObjectTesNull(objs: Map<String?, ObjectTest?>?) {\n    objs?.forEach { (key, value) ->\n        println(\" AP DBG DETAIL  senBackALotOfObjectTesNull ${value.hashCode()} value:${value?.value} key:$key\")\n    }\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/objekt/ObjectTestCteate.kt",
    "content": "package com.mars.component.detail.objekt\n\n\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RObject\nimport com.rubik.annotations.route.RRoute\n\nclass ObjectTestCreate\n@RObject\nconstructor(\n    val v1: Int, val v2: String\n) {\n\n    @RObject\n    constructor(\n        v1: Int,\n        v2: Int,\n        v3: Int,\n        v4: Int\n    ) : this(v1, v1.toString())\n\n    @RRoute(path = \"do-sth-create-common-instance\")\n    fun doSthInCreateObject(): TestDataBean {\n        println(\" AP DBG DETAIL  doSthInCreateObject begin this:${this.hashCode()} value:$v2!!!\")\n        return TestDataBean(985, \"gds\")\n    }\n\n}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/test/TestDataTypeTask.kt",
    "content": "package com.mars.component.detail.test\n\nimport android.content.Context\nimport com.mars.component.detail.value.TestNullableBean\nimport com.rubik.annotations.route.RResult\nimport com.rubik.annotations.route.RRoute\n\nclass TestDataTypeTask {\n    @RRoute(path = \"doTestDataType1\", forResult = true)\n    fun doTestDataType1(data: Context?): Context? {\n        println(\" AP DBG doTestDataType1 Context !!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType2\", forResult = true)\n    fun doTestDataType2(data: Int?): Int? {\n        println(\" AP DBG doTestDataType2 Int !!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType3\", forResult = true)\n    fun doTestDataType3(data: String?): String? {\n        println(\" AP DBG doTestDataType3 String !!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType4\", forResult = true)\n    fun doTestDataType4(data: TestNullableBean?): TestNullableBean? {\n        println(\" AP DBG doTestDataType4 A1Bean!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType5\", forResult = true)\n    fun doTestDataType5(data: List<String>?): List<String>? {\n        println(\" AP DBG doTestDataType5 List<String>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType6\", forResult = true)\n    fun doTestDataType6(data: Array<Long>?): Array<Long>? {\n        println(\" AP DBG doTestDataType7 Array<Long> !!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType7\", forResult = true)\n    fun doTestDataType7(data: LongArray?): LongArray? {\n        println(\" AP DBG doTestDataType6 LongArray !!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType8\", forResult = true)\n    fun doTestDataType8(data: IntArray?): IntArray? {\n        println(\" AP DBG doTestDataType8 IntArray !!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType9\", forResult = true)\n    fun doTestDataType9(data: BooleanArray?): BooleanArray? {\n        println(\" AP DBG doTestDataType9 BooleanArray !!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType10\")\n    fun doTestDataType10(resultSuccess: (Int) -> Unit, resultSuccess2: (String) -> Unit) {\n        println(\" AP DBG HOF doTestDataType10 C1Bean HOF !!\")\n        resultSuccess.invoke(300)\n        resultSuccess2.invoke(\"res-sus-10\")\n    }\n\n    @RRoute(path = \"doTestDataType11\")\n    fun doTestDataType11(\n        @RResult resultSuccess: (Int, TestNullableBean) -> Unit,\n        @RResult resultSuccess2: (TestNullableBean?) -> Unit\n    ) {\n        println(\" AP DBG HOF doTestDataType11 C1Bean HOF !!\")\n        resultSuccess.invoke(400, TestNullableBean(null, \"res-sus-11\"))\n        Thread().run {\n            Thread.sleep(500)\n            resultSuccess2.invoke(null)\n        }\n    }\n\n    @RRoute(path = \"doTestDataType13\", forResult = true)\n    fun doTestDataType13(data: List<Int?>): List<Int?> {\n        println(\" AP DBG doTestDataType13 List<Int?>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType14\", forResult = true)\n    fun doTestDataType14(data: ArrayList<Int?>): ArrayList<Int?> {\n        println(\" AP DBG doTestDataType14 ArrayList<Int?>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType15\", forResult = true)\n    fun doTestDataType15(data: List<TestNullableBean?>): List<TestNullableBean?> {\n        println(\" AP DBG doTestDataType15 List<C1Bean?>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType16\", forResult = true)\n    fun doTestDataType16(data: ArrayList<TestNullableBean?>): ArrayList<TestNullableBean?> {\n        println(\" AP DBG doTestDataType16 ArrayList<C1Bean?>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType17\", forResult = true)\n    fun doTestDataType17(data: List<String?>): List<String?> {\n        println(\" AP DBG doTestDataType17 List<String?>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType18\", forResult = true)\n    fun doTestDataType18(data: ArrayList<String?>): ArrayList<String?> {\n        println(\" AP DBG doTestDataType18 ArrayList<String?>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType19\", forResult = true)\n    fun doTestDataType19(data: ArrayList<Pair<String?, Int?>>): ArrayList<Pair<String?, Int?>> {\n        println(\" AP DBG doTestDataType19 ArrayList<Pair<String?,Int?>>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType20\", forResult = true)\n    fun doTestDataType20(media: Pair<Long?, String?>): List<String>?{\n        return  null\n    }\n\n    @RRoute(path = \"doTestDataType21\", forResult = true)\n    fun doTestDataType21(data: List<TestNullableBean>): List<TestNullableBean> {\n        println(\" AP DBG doTestDataType21  List<TestNullableBean>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType22\", forResult = true)\n    fun doTestDataType22(data: MutableList<TestNullableBean>): MutableList<TestNullableBean> {\n        println(\" AP DBG doTestDataType22 MutableList<TestNullableBean>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType23\", forResult = true)\n    fun doTestDataType23(data: Array<TestNullableBean>): Array<TestNullableBean> {\n        println(\" AP DBG doTestDataType23 Array<TestNullableBean>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType24\", forResult = true)\n    fun doTestDataType24(data: Map<String, TestNullableBean>): Map<String, TestNullableBean> {\n        println(\" AP DBG doTestDataType24 Map<String, TestNullableBean>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType25\", forResult = true)\n    fun doTestDataType25(data: MutableMap<String, TestNullableBean>): MutableMap<String, TestNullableBean> {\n        println(\" AP DBG doTestDataType25  MutableMap<String, TestNullableBean>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType26\", forResult = true)\n    fun doTestDataType26(data: Set<TestNullableBean>): Set<TestNullableBean> {\n        println(\" AP DBG doTestDataType26 ASet<TestNullableBean>!!!\")\n        return data\n    }\n\n    @RRoute(path = \"doTestDataType27\", forResult = true)\n    fun doTestDataType27(data: MutableSet<TestNullableBean>): MutableSet<TestNullableBean> {\n        println(\" AP DBG doTestDataType27 MutableSet<TestNullableBean>!!!\")\n        return data\n    }\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/test/TestDefaultPathTask.kt",
    "content": "package com.mars.component.detail.test\n\nimport android.app.Activity\nimport com.rubik.annotations.route.RRoute\nimport com.rubik.annotations.route.function.RFunction\nimport kotlin.reflect.jvm.internal.impl.load.kotlin.JvmType\n\nclass TestDefaultPathTask {\n\n    @RFunction\n    fun testName(){\n\n    }\n\n    @RFunction\n    fun TEST_NAME_UP(){\n\n    }\n\n    @RFunction\n    val testNameString = \"\"\n\n    @RRoute(forResult = false,resultType = Any::class)\n    constructor()\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/test/TestGenericityTask.kt",
    "content": "package com.mars.component.detail.test\n\nimport androidx.lifecycle.LiveData\nimport com.mars.component.detail.value.TestNullableBean\nimport com.rubik.annotations.route.RRoute\n\n@RRoute(path = \"doTestGenericity1\", forResult = true)\nfun doTestGenericity1(data: List<TestNullableBean?>?): List<TestNullableBean?>? {\n    println(\" AP DBG doTestGenericity1 Context !!!\")\n    return data\n}\n\n@RRoute(path = \"doTestGenericity2\", forResult = true)\nfun doTestGenericity2(data: LiveData<TestNullableBean?>?): LiveData<TestNullableBean?>? {\n    println(\" AP DBG doTestGenericity2 Context !!!\")\n    return data\n}\n\n@RRoute(path = \"doTestGenericity3\", forResult = true)\nfun doTestGenericity3(data: Map<String, Long?>): Map<String, Long?> {\n    println(\" AP DBG doTestGenericity3 Context !!!\")\n    return data\n}\n\nclass TestGenericityTask {\n    @RRoute(path = \"testGenericity4\", forResult = true)\n    val testGenericity4: List<String?> = listOf()\n\n    @RRoute(path = \"testGenericity5\", forResult = true)\n    val testGenericity5: (List<String?>?) -> List<String?>? = {\n        println(\" AP DBG testGenericity5 Context !!!\")\n        it\n    }\n\n    @RRoute(path = \"doTestGenericity6\", forResult = true)\n    fun doTestGenericity6(data: Array<TestNullableBean?>?): Array<TestNullableBean?>? {\n        println(\" AP DBG doTestGenericity6 Context !!!\")\n        return data\n    }\n\n    companion object {\n        @RRoute(path = \"doTestGenericity7\", forResult = true)\n        fun doTestGenericity7(data: Array<Long?>?): Array<Long?>? {\n            println(\" AP DBG doTestGenericity7 Context !!!\")\n            return data\n        }\n    }\n}\n\n@RRoute(path = \"doTestGenericity8\")\nfun doTestGenericity8(resultSuccess: (ArrayList<String>) -> Unit){\n    println(\" AP DBG doTestGenericity8 Context !!!\")\n\n}\n\n@RRoute(path = \"doTestGenericity9\")\nfun doTestGenericity9(resultSuccess: (List<String>) -> Unit){\n    println(\" AP DBG doTestGenericity9 Context !!\")\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/ui/FirstPageActivity.kt",
    "content": "package com.mars.component.detail.ui\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mars.component.detail.R\nimport com.mars.component.detail.value.TestCompanionBean\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RProperty\nimport com.rubik.annotations.route.page.RPage\nimport com.rubik.router.property\nimport kotlinx.android.synthetic.main.activity_a1.*\n\n@RPage(path = \"activity/page1\")\n@RPage(path = \"activity/page1_from_home\")\n@RPage(path = \"activity/page1_from_detail\")\nclass FirstPageActivity : AppCompatActivity() {\n\n    @RProperty(name = \"key_int_for_home\", forPath = [\"activity/page1_from_home\"])\n    private var intForA1b: Int? = null\n        get() = property(\"key_int_for_home\")\n\n    @RProperty(name = \"key_int_for_detail\", forPath =  [\"activity/page1_from_detail\"])\n    private var intForA1c: Int? = null\n        get() = property(\"key_int_for_detail\")\n\n    @RProperty(name = \"key_int_for_all\", forPath = [\"activity/page1_from_home\", \"activity/page1_from_detail\"])\n    private var intForAll: Int? = null\n        get() = property(\"key_int_for_all\")\n\n    @get:RProperty(name = \"key_3_int\")\n    private val inta: Int\n        get() = property(\"key_3_int\") ?: -1\n\n    @get:RProperty(name = \"uri\")\n    private val str: String?\n        get() = property(\"uri\")\n\n    @get:RProperty(name = \"key_4_strs\", extra = \"serializable\")\n    private val strs: List<String>?\n        get() = property(\"key_4_strs\")\n\n    @get:RProperty(name = \"key_a_ints\")\n    private val ints: List<Int>?\n        get() = property(\"key_a_ints\")\n\n    private var aints: ArrayList<Int>? = null\n        get() = property(\"key_a_ints\")\n\n    @RProperty(name = \"key_5_bean\")\n    private var bean: TestDataBean? = null\n        get() = property(\"key_5_bean\")\n\n    @RProperty(name = \"key_1_pa\")\n    private var pa: TestCompanionBean? = null\n        get() = property(\"key_1_pa\")\n\n    @RProperty(name = \"key_2_pa_ar\")\n    private var paAr: Array<TestCompanionBean>? = null\n        get() = property(\"key_2_pa_ar\")\n\n    @RProperty(name = \"key_c_pa_li\")\n    private var paLi: List<TestCompanionBean>? = null\n        get() = property(\"key_c_pa_li\")\n\n//    @RProperty(name = \"key_pa_p\")\n//    private var paP: A3Bean? = null\n//        get() = parcelableProperties(\"key_pa_p\")\n//\n//    @RProperty(name = \"key_pa_ar_p\")\n//    private var paArP: Array<A3Bean>? = null\n//        get() = parcelableArrayProperties(\"key_pa_ar_p\")\n//\n//    @RProperty(name = \"key_pa_li_p\")\n//    private var paLiP: List<A3Bean>? = null\n//        get() = parcelableListProperties(\"key_pa_li_p\")\n//\n//    @RProperty(name = \"key_ser\")\n//    private var ser: A4Bean? = null\n//        get() = serializablProperties(\"key_ser\")\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        println(\" CT DBG TEST FirstPageActivity onCreate   !!!\")\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_a1)\n        val msg = \"Hello FirstPageActivity !!\\n\" +\n                    \"$inta\\n\" +\n                    \"$str\\n\" +\n                    \"$strs\\n\" +\n                    \"$ints\\n\" +\n                    \"$aints\\n\" +\n                    \"${bean?.d1}\\n\" +\n                    \"${pa?.d1}\\n\" +\n                    \"${paAr?.get(0)?.d1}\\n\" +\n                    \"${paLi?.get(0)?.d1}\\n\"\n//                    \"$ser\\n\"\n//                    \"${paP?.b1}\\n\" +\n//                    \"${paArP?.get(0)?.b1}\\n\" +\n//                    \"${paLiP?.get(0)?.b1}\\n\"\n        text_hello.text = msg\n\n\n    }\n}\n\n//@RRoute(path = \"notActivity2\")\n//class NotActivity(val b :TestClassB){\n//}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/ui/FirstPageFragment.kt",
    "content": "package com.mars.component.detail.ui\n\nimport androidx.fragment.app.Fragment\nimport com.rubik.annotations.route.RRoute\nimport com.rubik.annotations.route.function.RFunction\n\nclass FirstPageFragment\n@RFunction(\n    path = \"fragment/page1\",\n    resultType = Fragment::class\n)\nconstructor() : Fragment() {\n    val name = \"FirstPageFragment\"\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/ui/SecondPageActivity.kt",
    "content": "package com.mars.component.detail.ui\n\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mars.component.detail.R\nimport com.rubik.annotations.route.RProperty\nimport com.rubik.annotations.route.RRoute\nimport com.rubik.annotations.route.page.RPage\nimport com.rubik.router.property\nimport kotlinx.android.synthetic.main.activity_a1.*\n\n@RPage(path = \"activity/page2/{key_str1}/{key_str2}/{key_str3}\")\nclass SecondPageActivity : AppCompatActivity() {\n\n    @RProperty(name = \"key_str1\")\n    private var str1: String? = null\n        get() =  property(\"key_str1\")\n\n    @RProperty(name = \"key_str2\")\n    private var str2: String? = null\n        get() =  property(\"key_str2\")\n\n    @RProperty(name = \"key_str3\")\n    private var str3: String? = null\n        get() =  property(\"key_str3\")\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        println(\" CT DBG TEST SecondPageActivity  onCreate  !!!\")\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_a1)\n\n        val msg = \"Hello SecondPageActivity !!\\n\" +\n                \"$str1\\n\" +\n                \"$str2\\n\" +\n                \"$str3\\n\"\n        text_hello.text = msg\n        setResult(200, Intent().apply { putExtra(\"data\", \"data from A2\") })\n\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestCompanionBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport com.rubik.annotations.route.RValue\n\n@RValue\ndata class TestCompanionBean(val d1: Int, val d2: String)  {\n    companion object {\n        const val C1 = 33\n        const val C2 = \"CONST_COMP\"\n        const val C3: Float = 0.1F\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestCreateBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport com.google.gson.annotations.SerializedName\nimport com.rubik.annotations.route.RRoute\nimport com.rubik.annotations.route.RValue\n\n@RValue\ndata class TestCreateBean @RRoute(\n    path = \"test-bean/create\"\n) constructor(\n    @SerializedName(\"data1\")\n    val d1: Int?,\n    @SerializedName(\"data2\")\n    val d2: String?\n)\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestDataBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport com.rubik.annotations.route.RValue\nimport com.google.gson.annotations.SerializedName\n\n@RValue\ndata class TestDataBean(@SerializedName(\"data1\") val d1: Int?, @SerializedName(\"data2\") val d2: String?)"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestDataNotRValueBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport com.rubik.annotations.route.RValue\nimport com.google.gson.annotations.SerializedName\n\ndata class TestDataNotRValueBean(@SerializedName(\"data1\") val d1: Int?, @SerializedName(\"data2\") val d2: String?)"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestListBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport com.rubik.annotations.route.RValue\nimport com.google.gson.annotations.SerializedName\n\n@RValue\ndata class TestListBean(@SerializedName(\"data1\") val d1: Int, val d2: List<String>?) {\n    constructor(b1: Int) : this(b1, listOf())\n}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestNullableBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport com.google.gson.annotations.SerializedName\nimport com.rubik.annotations.route.RValue\n\n@RValue\ndata class TestNullableBean(@SerializedName(\"ddd111\") val d1: Int?, @SerializedName(\"ddd222\") val d2: String?)"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestOriginalBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport java.io.Serializable\nimport com.rubik.annotations.source.ROriginalValue\n\n@ROriginalValue\ndata class TestOriginalBean (val d1:Int, val d2:String): Serializable"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestParcelizeBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport android.os.Parcel\nimport android.os.Parcelable\nimport com.google.gson.annotations.SerializedName\nimport com.rubik.annotations.route.RValue\nimport kotlinx.android.parcel.Parcelize\n\n@RValue\n@Parcelize\ndata class TestParcelizeBean(\n    val d1: Int?,\n    val d2: String?\n) : Parcelable\n//{\n//    constructor(parcel: Parcel) : this(\n//        parcel.readInt(),\n//        parcel.readString()\n//    )\n//    override fun describeContents(): Int {\n//        return 0\n//    }\n//\n//    override fun writeToParcel(dest: Parcel?, flags: Int) {\n//        dest?.writeInt(d1 ?: -1)\n//        dest?.writeString(d2)\n//    }\n//\n//    companion object CREATOR : Parcelable.Creator<TestParcelizeBean> {\n//        override fun createFromParcel(parcel: Parcel): TestParcelizeBean {\n//            return TestParcelizeBean(parcel)\n//        }\n//\n//        override fun newArray(size: Int): Array<TestParcelizeBean?> {\n//            return arrayOfNulls(size)\n//        }\n//    }\n//}"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/TestSerializableBean.kt",
    "content": "package com.mars.component.detail.value\n\nimport com.google.gson.annotations.SerializedName\nimport com.rubik.annotations.route.RValue\nimport java.io.Serializable\n\n@RValue\ndata class TestSerializableBean(\n    @SerializedName(\"data1\") val d1: Int?,\n    @SerializedName(\"data2\") val d2: String?\n):Serializable"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/mapping/TestDataMappingBean.kt",
    "content": "package com.mars.component.detail.value.mapping\n\nimport com.google.gson.annotations.SerializedName\nimport com.rubik.annotations.route.RValue\n\n\ndata class TestDataMappingBean @RValue constructor(\n    @SerializedName(\"data1\") val d1: Int?,\n    @SerializedName(\"data2\")\n    val d2: String?\n)"
  },
  {
    "path": "demo/demo_component_detail/src/main/java/com/mars/component/detail/value/mapping/TestNestDataMappingBean.kt",
    "content": "package com.mars.component.detail.value.mapping\n\nimport com.mars.component.detail.value.TestDataBean\nimport com.rubik.annotations.route.RValue\n\n\ndata class TestNestDataMappingBean @RValue constructor(\n    val d1: TestDataBean?,\n    val d2: TestDataMappingBean?,\n    val d3: TestNestDataMappingBean?,\n    val d4: List<TestDataBean>?,\n    val d5: List<TestDataMappingBean>?\n)"
  },
  {
    "path": "demo/demo_component_detail/src/main/ra/rubik/generate/aggregate/demo_com_mars_rubik_test_detail/DetailAggregate.kt",
    "content": "package rubik.generate.aggregate.demo_com_mars_rubik_test_detail\n\nimport android.app.Activity\nimport android.content.Context\nimport android.os.ResultReceiver\nimport android.view.View\nimport androidx.annotation.Keep\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModelStoreOwner\nimport com.mars.component.detail.api.AipsInCompanion\nimport com.mars.component.detail.api.ApiSerialization\nimport com.mars.component.detail.api.Apis\nimport com.mars.component.detail.api.ApisAsyncReturn\nimport com.mars.component.detail.api.ApisBadCase\nimport com.mars.component.detail.api.ApisBigData\nimport com.mars.component.detail.api.ApisWithLiveData\nimport com.mars.component.detail.api.ApisWithResultReceiver\nimport com.mars.component.detail.api.BeanCallbackable\nimport com.mars.component.detail.api.Callback\nimport com.mars.component.detail.api.Callbackable\nimport com.mars.component.detail.api.GetFileMetaCallback\nimport com.mars.component.detail.api.MultiCallback\nimport com.mars.component.detail.api.Task\nimport com.mars.component.detail.event.Events\nimport com.mars.component.detail.event.EventsWithLambda\nimport com.mars.component.detail.test.TestDataTypeTask\nimport com.mars.component.detail.test.TestDefaultPathTask\nimport com.mars.component.detail.test.TestGenericityTask\nimport com.mars.component.detail.ui.FirstPageActivity\nimport com.mars.component.detail.ui.FirstPageFragment\nimport com.mars.component.detail.ui.SecondPageActivity\nimport com.rubik.annotations.source.RAggregate\nimport com.rubik.annotations.source.RGenerated\nimport com.rubik.context.Aggregatable\nimport com.rubik.context.AggregateFactory\nimport com.rubik.identity.RAggregateId\nimport com.rubik.route.mapping.castToTypeOfT\nimport com.rubik.route.mapping.mapToType\nimport com.rubik.route.mapping.toTypeOfT\nimport kotlin.Any\nimport kotlin.Array\nimport kotlin.BooleanArray\nimport kotlin.Function0\nimport kotlin.Function1\nimport kotlin.Function2\nimport kotlin.Function3\nimport kotlin.Function5\nimport kotlin.Int\nimport kotlin.IntArray\nimport kotlin.Long\nimport kotlin.LongArray\nimport kotlin.Pair\nimport kotlin.String\nimport kotlin.Unit\nimport kotlin.collections.ArrayList\nimport kotlin.collections.List\nimport kotlin.collections.Map\nimport kotlin.collections.Set\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toCallbackTestInterfaceOrgMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toNullableObjectTestCtxMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toNullableObjectTestOrgMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toNullableTestDataMappingBeanCtxMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toNullableTestDataMappingBeanOrgMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toNullableTestNestDataMappingBeanCtxMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toNullableTestNestDataMappingBeanOrgMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toObjectTestCreateCtxMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toObjectTestCreateOrgMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toObjectTestCtxMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toObjectTestOrgMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toTestDataMappingBeanCtxMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toTestDataMappingBeanOrgMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toTestNestDataMappingBeanCtxMapping\nimport rubik.generate.aggregate.demo_com_mars_rubik_test_detail.DetailAggregate.Mappings.toTestNestDataMappingBeanOrgMapping\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailRouteActions\nimport com.mars.component.detail.callback.CallbackTestDefault as CallbackTestDefaultOrg\nimport com.mars.component.detail.callback.CallbackTestInterface as CallbackTestInterfaceOrg\nimport com.mars.component.detail.objekt.ObjectTestCreate as ObjectTestCreateOrg\nimport com.mars.component.detail.objekt.ObjectTest as ObjectTestOrg\nimport com.mars.component.detail.value.TestCompanionBean as TestCompanionBeanOrg\nimport com.mars.component.detail.value.TestCreateBean as TestCreateBeanOrg\nimport com.mars.component.detail.value.TestDataBean as TestDataBeanOrg\nimport com.mars.component.detail.value.TestListBean as TestListBeanOrg\nimport com.mars.component.detail.value.TestNullableBean as TestNullableBeanOrg\nimport com.mars.component.detail.value.TestParcelizeBean as TestParcelizeBeanOrg\nimport com.mars.component.detail.value.TestSerializableBean as TestSerializableBeanOrg\nimport com.mars.component.detail.value.mapping.TestDataMappingBean as TestDataMappingBeanOrg\nimport com.mars.component.detail.value.mapping.TestNestDataMappingBean as TestNestDataMappingBeanOrg\nimport com.rubik.activity.Launcher as RubikLauncher\nimport com.rubik.route.Queries as RubikQueries\nimport com.rubik.route.ResultGroups as RubikResultGroups\nimport com.rubik.route.Result as RubikResult\nimport com.rubik.router.uri.Path as RubikPath\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestCompanionBean as TestCompanionBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestCreateBean as TestCreateBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean as TestDataBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataMappingBean as TestDataMappingBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestListBean as TestListBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestNestDataMappingBean as TestNestDataMappingBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean as TestNullableBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean as TestParcelizeBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestSerializableBean as TestSerializableBeanCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.callback.CallbackTestDefault as CallbackTestDefaultCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.callback.CallbackTestInterface as CallbackTestInterfaceCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTestCreate as ObjectTestCreateCtx\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTest as ObjectTestCtx\n\n/**\n * aggregate router function and router event of Rubik Context.\n *\n * uri: [demo://com.mars.rubik-test.detail] \n * version: 0.0.1-DEV\n */\n@RGenerated(\n  kind = \"aggregate\",\n  by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n  version = \"0.0.1-DEV\"\n)\n@Keep\nclass DetailAggregate : Aggregatable, DetailRouteActions {\n  override fun onEvent(msg: String, queries: RubikQueries) {\n    when (msg){\n      \"MY_INIT\" ->  {\n        // com.mars.component.detail.event.EventsByInstance.onInit\n        // - parameters:\n        // --- arg1 : kotlin.Any\n        // --- arg2 : kotlin.Any\n        // --- arg3 : kotlin.Any\n        // - resultType:\n        // --- null\n        val rubikInstanceBool = queries.value(0, null)\n        val arg1 = queries.value(1, null)\n        val arg2 = queries.value(2, null)\n        val arg3 = queries.value(3, null)\n        com.mars.component.detail.event.provideEventsInstance(\n          rubikInstanceBool.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Boolean] */ \n        ) /* -> NO NEED TO MAPPING :[com.mars.component.detail.event.EventsByInstance] */ .onInit(\n          arg1.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ ,\n          arg2.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ ,\n          arg3.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ \n        )}\n      \"MY_DESTROY\" ->  {\n        // com.mars.component.detail.event.EventsByInstance.onDestroy\n        // - parameters:\n        // --- arg1 : kotlin.Any\n        // --- arg2 : kotlin.Any\n        // --- arg3 : kotlin.Any\n        // - resultType:\n        // --- null\n        val rubikInstanceBool = queries.value(0, null)\n        val arg1 = queries.value(1, null)\n        val arg2 = queries.value(2, null)\n        val arg3 = queries.value(3, null)\n        com.mars.component.detail.event.provideEventsInstance(\n          rubikInstanceBool.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Boolean] */ \n        ) /* -> NO NEED TO MAPPING :[com.mars.component.detail.event.EventsByInstance] */ .onDestroy(\n          arg1.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ ,\n          arg2.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ ,\n          arg3.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ \n        )}\n      \"MY_CALLBACK_RES\" ->  {\n        // com.mars.component.detail.event.EventsByInstance.onCallbackRes\n        // - parameters:\n        // --- arg1 : kotlin.Any\n        // --- result : kotlin.Function1<kotlin.Int, kotlin.Unit>\n        // - resultType:\n        // --- null\n        val rubikInstanceBool = queries.value(0, null)\n        val arg1 = queries.value(1, null)\n        val resultCallback = queries.value(2, null)\n        com.mars.component.detail.event.provideEventsInstance(\n          rubikInstanceBool.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Boolean] */ \n        ) /* -> NO NEED TO MAPPING :[com.mars.component.detail.event.EventsByInstance] */ .onCallbackRes(\n          arg1.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ ,\n          resultCallback.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Function1<kotlin.Int, kotlin.Unit>] */ \n        )}\n      \"MY_CALLBACK_RES_BEAN\" ->  {\n        // com.mars.component.detail.event.EventsByInstance.onCallbackResBean\n        // - parameters:\n        // --- arg1 : kotlin.Any\n        // --- result : kotlin.Function1<com.mars.component.detail.value.TestDataBean, kotlin.Unit>\n        // - resultType:\n        // --- null\n        val rubikInstanceBool = queries.value(0, null)\n        val arg1 = queries.value(1, null)\n        val resultCallback = queries.value(2, null).castToTypeOfT<Function1<TestDataBeanCtx, Unit>>()\n        val resultCallbackCallbackTransformer: (Any?) -> Unit = { lambdaArg0 -> \n          resultCallback(\n            lambdaArg0.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean] */ \n          )}\n        com.mars.component.detail.event.provideEventsInstance(\n          rubikInstanceBool.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Boolean] */ \n        ) /* -> NO NEED TO MAPPING :[com.mars.component.detail.event.EventsByInstance] */ .onCallbackResBean(\n          arg1.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ ,\n          resultCallbackCallbackTransformer.castToTypeOfT()\n        )}\n      \"MY_CALLBACK_BEAN\" ->  {\n        // com.mars.component.detail.event.EventsByInstance.onCallbackBean\n        // - parameters:\n        // --- arg1 : kotlin.Any\n        // --- bean : com.mars.component.detail.value.TestDataBean\n        // - resultType:\n        // --- null\n        val rubikInstanceBool = queries.value(0, null)\n        val arg1 = queries.value(1, null)\n        val bean = queries.value(2, null)\n        com.mars.component.detail.event.provideEventsInstance(\n          rubikInstanceBool.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Boolean] */ \n        ) /* -> NO NEED TO MAPPING :[com.mars.component.detail.event.EventsByInstance] */ .onCallbackBean(\n          arg1.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Any] */ ,\n          bean.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.TestDataBean] */ \n        )}\n      \"LifeCycleEvent_Init\" ->  {\n        // com.mars.component.detail.event.EventsWithLambda.init\n        // - resultType:\n        // --- kotlin.Unit\n        EventsWithLambda().init() /* -> NO NEED TO MAPPING :[kotlin.Unit] */ // com.mars.component.detail.event.Events.onInit\n        // - parameters:\n        // --- context : android.content.Context\n        // --- parameter1 : kotlin.String\n        // - resultType:\n        // --- null\n        val context = queries.value(0, null)\n        val parameter1 = queries.value(1, null)\n        Events().onInit(\n          context.castToTypeOfT() /* -> NO NEED TO MAPPING :[android.content.Context] */ ,\n          parameter1.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.String] */ \n        )}\n      \"LifeCycleEvent_Destroy\" ->  {\n        // com.mars.component.detail.event.EventsWithLambda.destroy\n        // - resultType:\n        // --- kotlin.Unit\n        EventsWithLambda().destroy() /* -> NO NEED TO MAPPING :[kotlin.Unit] */ // com.mars.component.detail.event.Events.onDestroy\n        // - parameters:\n        // --- context : android.content.Context\n        // --- parameter1 : kotlin.String\n        // - resultType:\n        // --- null\n        val context = queries.value(0, null)\n        val parameter1 = queries.value(1, null)\n        Events().onDestroy(\n          context.castToTypeOfT() /* -> NO NEED TO MAPPING :[android.content.Context] */ ,\n          parameter1.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.String] */ \n        )}\n      else -> { }\n    }\n  }\n\n  override fun onRoute(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"doTestGenericity7\" == path ->  {\n        val data = queries.value(0, null)\n        doTestGenericity7(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"testGenericity4\" == path ->  {\n        testGenericity4().apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"testGenericity5\" == path ->  {\n        val lambdaArg0 = queries.value(0, \"lambdaArg0\")\n        testGenericity5(lambdaArg0.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestGenericity6\" == path ->  {\n        val data = queries.value(0, null)\n        doTestGenericity6(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestGenericity1\" == path ->  {\n        val data = queries.value(0, null)\n        doTestGenericity1(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestGenericity2\" == path ->  {\n        val data = queries.value(0, null)\n        doTestGenericity2(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestGenericity3\" == path ->  {\n        val data = queries.value(0, null)\n        doTestGenericity3(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestGenericity8\" == path ->  {\n        val resultSuccessCallback = queries.value(0, null)\n        doTestGenericity8(resultSuccessCallback.castToTypeOfT())\n      }\n      \"doTestGenericity9\" == path ->  {\n        val resultSuccessCallback = queries.value(0, null)\n        doTestGenericity9(resultSuccessCallback.castToTypeOfT())\n      }\n      \"create-test-default-path-task-instance\" == path ->  {\n        val routeResultTransformer: (Any) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        createTestDefaultPathTaskInstance(routeResultTransformer)\n      }\n      \"doTestDataType1\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType1(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType2\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType2(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType3\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType3(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType4\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType4(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType5\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType5(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      else -> { onRouteExt1(path, queries, results) }\n    }\n  }\n\n  private fun onRouteExt1(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"doTestDataType6\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType6(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType7\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType7(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType8\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType8(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType9\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType9(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType10\" == path ->  {\n        val resultSuccessCallback = queries.value(0, null)\n        val resultSuccess2Callback = queries.value(1, null)\n        doTestDataType10(resultSuccessCallback.castToTypeOfT(), resultSuccess2Callback.castToTypeOfT())\n      }\n      \"doTestDataType11\" == path ->  {\n        val resultSuccessCallback: (Int, TestNullableBeanCtx) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        val resultSuccess2Callback: (TestNullableBeanCtx?) -> Unit = { lambdaArg0 ->\n          results.set(1, RubikResult(lambdaArg0))\n        }\n        doTestDataType11(resultSuccessCallback, resultSuccess2Callback)\n      }\n      \"doTestDataType13\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType13(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType14\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType14(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType15\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType15(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType16\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType16(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType17\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType17(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType18\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType18(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType19\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType19(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType20\" == path ->  {\n        val media = queries.value(0, null)\n        doTestDataType20(media.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType21\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType21(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      else -> { onRouteExt2(path, queries, results) }\n    }\n  }\n\n  private fun onRouteExt2(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"doTestDataType22\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType22(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType23\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType23(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType24\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType24(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType25\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType25(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType26\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType26(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType27\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType27(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"test-bean/create\" == path ->  {\n        val d1 = queries.value(0, null)\n        val d2 = queries.value(1, null)\n        val routeResultTransformer: (TestCreateBeanCtx) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        testBeanCreate(d1.castToTypeOfT(), d2.castToTypeOfT(), routeResultTransformer)\n      }\n      \"do-sth-in-common-instance\" == path ->  {\n        val objectInstance = queries.value(0, null)\n        val routeResultTransformer: (TestDataBeanCtx) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthInCommonInstance(objectInstance.castToTypeOfT(), routeResultTransformer)\n      }\n      \"do-sth-in-common-instance-parameter\" == path ->  {\n        val objectInstance = queries.value(0, null)\n        val v1 = queries.value(1, null)\n        val v2 = queries.value(2, null)\n        val v3 = queries.value(3, null)\n        doSthInCommonInstanceParameter(objectInstance.castToTypeOfT(), v1.castToTypeOfT(), v2.castToTypeOfT(), v3.castToTypeOfT())\n      }\n      \"do-sth-create-common-instance\" == path ->  {\n        val objectInstance = queries.value(0, null)\n        val routeResultTransformer: (TestDataBeanCtx) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthCreateCommonInstance(objectInstance.castToTypeOfT(), routeResultTransformer)\n      }\n      \"get-a-other-common-instance\" == path ->  {\n        val i = queries.value(0, null)\n        val routeResultTransformer: (ObjectTestCtx) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        getAOtherCommonInstance(i.castToTypeOfT(), routeResultTransformer)\n      }\n      \"send-back-common-instance\" == path ->  {\n        val obj = queries.value(0, null)\n        sendBackCommonInstance(obj.castToTypeOfT())\n      }\n      \"get-a-other-common-instance-null\" == path ->  {\n        val i = queries.value(0, null)\n        val routeResultTransformer: ((ObjectTestCtx?) -> Unit)? = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        getAOtherCommonInstanceNull(i.castToTypeOfT(), routeResultTransformer)\n      }\n      \"send-back-common-instance-null\" == path ->  {\n        val obj = queries.value(0, null)\n        sendBackCommonInstanceNull(obj.castToTypeOfT())\n      }\n      \"do-sth-ext\" == path ->  {\n        val i = queries.value(0, null)\n        val s = queries.value(1, null)\n        val routeResultTransformer: (Int) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthExt(i.castToTypeOfT(), s.castToTypeOfT(), routeResultTransformer)\n      }\n      else -> { onRouteExt3(path, queries, results) }\n    }\n  }\n\n  private fun onRouteExt3(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"doSthCompanion\" == path ->  {\n        val i = queries.value(0, null)\n        val j = queries.value(1, null)\n        val k = queries.value(2, null)\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthCompanion(i.castToTypeOfT(), j.castToTypeOfT(), k.castToTypeOfT(), routeResultTransformer)\n      }\n      \"property/companion\" == path ->  {\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        propertyCompanion(routeResultTransformer)\n      }\n      \"doSthHOFCompanion\" == path ->  {\n        val lambdaArg0 = queries.value(0, \"lambdaArg0\")\n        val routeResultTransformer: (Int) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthHOFCompanion(lambdaArg0.castToTypeOfT(), routeResultTransformer)\n      }\n      \"2.0/do-sth-hof\" == path ->  {\n        val lambdaArg0 = queries.value(0, \"lambdaArg0\")\n        val lambdaArg1 = queries.value(1, \"lambdaArg1\")\n        val lambdaArg2 = queries.value(2, \"lambdaArg2\")\n        doSthHof(lambdaArg0.castToTypeOfT(), lambdaArg1.castToTypeOfT(), lambdaArg2.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"1.0/property/property\" == path ->  {\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        propertyProperty(routeResultTransformer)\n      }\n      \"do-sth\" == path ->  {\n        doSth()\n      }\n      \"view/get\" == path ->  {\n        val context = queries.value(0, null)\n        val routeResultTransformer: ((View?) -> Unit)? = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        viewGet(context.castToTypeOfT(), routeResultTransformer)\n      }\n      RubikPath(\"sth/{id}/a-{name}?code1={code1}&code2={code2}\").matching(path) ->  {\n        queries.addAll(RubikPath(\"sth/{id}/a-{name}?code1={code1}&code2={code2}\").getParameters(path))\n        val id = queries.value(0, null)\n        val name = queries.value(1, null)\n        val code1 = queries.value(2, null)\n        val code2 = queries.value(3, null)\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        sthIdAName(id.castToTypeOfT(), name.castToTypeOfT(), code1.castToTypeOfT(), code2.castToTypeOfT(), routeResultTransformer)\n      }\n      RubikPath(\"sth-navigation-only/{uri}\").matching(path) ->  {\n        queries.addAll(RubikPath(\"sth-navigation-only/{uri}\").getParameters(path))\n        val uriParameter = queries.value(0, null)\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        sthNavigationOnlyUri(uriParameter.castToTypeOfT(), routeResultTransformer)\n      }\n      \"doSthVararg\" == path ->  {\n        val no = queries.value(0, null)\n        val varargString = queries.value(1, null)\n        doSthVararg(no.castToTypeOfT(), *varargString.castToTypeOfT())\n      }\n      \"doSthVarargHof\" == path ->  {\n        val no = queries.value(0, null)\n        val varargString = queries.value(1, null)\n        doSthVarargHof(no.castToTypeOfT(), *varargString.castToTypeOfT())\n      }\n      \"doSthBean\" == path ->  {\n        val a1 = queries.value(0, null)\n        val routeResultTransformer: (TestListBeanCtx) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthBean(a1.castToTypeOfT(), routeResultTransformer)\n      }\n      \"do-sth-uri-crash\" == path ->  {\n        val name = queries.value(0, null)\n        val code = queries.value(1, null)\n        doSthUriCrash(name.castToTypeOfT(), code.castToTypeOfT())\n      }\n      \"do-sth-uri-crash-by-name-code-version\" == path ->  {\n        val name = queries.value(0, null)\n        val code = queries.value(1, null)\n        val version = queries.value(2, null)\n        doSthUriCrashByNameCodeVersion(name.castToTypeOfT(), code.castToTypeOfT(), version.castToTypeOfT())\n      }\n      \"doSthMappingBean\" == path ->  {\n        val a1 = queries.value(0, null)\n        val routeResultTransformer: (TestDataMappingBeanCtx) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthMappingBean(a1.castToTypeOfT(), routeResultTransformer)\n      }\n      else -> { onRouteExt4(path, queries, results) }\n    }\n  }\n\n  private fun onRouteExt4(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"doSthTestNestDataMappingBean\" == path ->  {\n        val bean = queries.value(0, null)\n        val routeResultTransformer: (TestNestDataMappingBeanCtx) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthTestNestDataMappingBean(bean.castToTypeOfT(), routeResultTransformer)\n      }\n      \"doSthAsyncHOF\" == path ->  {\n        val hofCallback: (String, TestDataBeanCtx) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        doSthAsyncHOF(hofCallback)\n      }\n      \"doSthAsyncHOFNullable\" == path ->  {\n        val hof2xxCallback = queries.value(0, null)\n        val hof4xxCallback = queries.value(1, null)\n        val hofx1resCallback: ((String, TestDataBeanCtx) -> Unit)? = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        doSthAsyncHOFNullable(hof2xxCallback.castToTypeOfT(), hof4xxCallback.castToTypeOfT(), hofx1resCallback)\n      }\n      \"doSthAsync2HOF\" == path ->  {\n        val hofCallback: (String, Int) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        val hof2Callback: (String, Int) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(1, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        doSthAsync2HOF(hofCallback, hof2Callback)\n      }\n      \"doSthAsyncOpen\" == path ->  {\n        val uriParameter = queries.value(0, null)\n        val onCallCallback: ((String?, Int) -> Unit)? = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        doSthAsyncOpen(uriParameter.castToTypeOfT(), onCallCallback)\n      }\n      \"do-sth-async-interface\" == path ->  {\n        val onCallCallback: (String?, Int) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        doSthAsyncInterface(onCallCallback)\n      }\n      \"do-sth-async-3-interface\" == path ->  {\n        val onCallCallback: ((String?, Int) -> Unit)? = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        val onCall1Callback: (String?, Int) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(1, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        val onCall2Callback: (TestDataBeanCtx?) -> Unit = { lambdaArg0 ->\n          results.set(2, RubikResult(lambdaArg0))\n        }\n        doSthAsync3Interface(onCallCallback, onCall1Callback, onCall2Callback)\n      }\n      \"do-sth-async-interface-multi-func\" == path ->  {\n        val startCallback: (String?, Int) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        val dataCallback: (TestDataBeanCtx?) -> Unit = { lambdaArg0 ->\n          results.set(1, RubikResult(lambdaArg0))\n        }\n        val stopCallback: (String?, Int) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(2, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        doSthAsyncInterfaceMultiFunc(startCallback, dataCallback, stopCallback)\n      }\n      \"doSthHOFTop\" == path ->  {\n        val lambdaArg0 = queries.value(0, \"lambdaArg0\")\n        val routeResultTransformer: (Unit) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthHOFTop(lambdaArg0.castToTypeOfT(), routeResultTransformer)\n      }\n      \"property/top\" == path ->  {\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        propertyTop(routeResultTransformer)\n      }\n      \"doSthTop\" == path ->  {\n        val ints = queries.value(0, null)\n        val li = queries.value(1, null)\n        val strings = queries.value(2, null)\n        val ls = queries.value(3, null)\n        val beans = queries.value(4, null)\n        val lb = queries.value(5, null)\n        val routeResultTransformer: (List<TestDataBeanCtx>) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthTop(ints.castToTypeOfT(), li.castToTypeOfT(), strings.castToTypeOfT(), ls.castToTypeOfT(), beans.castToTypeOfT(), lb.castToTypeOfT(), routeResultTransformer)\n      }\n      \"getFilesMeta\" == path ->  {\n        val context = queries.value(0, null)\n        val pathParameter = queries.value(1, null)\n        val onResultCallback: (Long, String?) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        getFilesMeta(context.castToTypeOfT(), pathParameter.castToTypeOfT(), onResultCallback)\n      }\n      \"enterprise/business/allocateTicket\" == path ->  {\n        val context = queries.value(0, null)\n        val shareId = queries.value(1, null)\n        val count = queries.value(2, null)\n        val packetType = queries.value(3, null)\n        val routeResultTransformer: ((LiveData<List<String>>?) -> Unit)? = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        enterpriseBusinessAllocateTicket(context.castToTypeOfT(), shareId.castToTypeOfT(), count.castToTypeOfT(), packetType.castToTypeOfT(), routeResultTransformer)\n      }\n      \"do-sth-provide-instance-by-func\" == path ->  {\n        doSthProvideInstanceByFunc()\n      }\n      \"do-sth-provide-instance-by-func2\" == path ->  {\n        doSthProvideInstanceByFunc2()\n      }\n      else -> { onRouteExt5(path, queries, results) }\n    }\n  }\n\n  private fun onRouteExt5(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"do-sth-provide-instance-by-parameter-func\" == path ->  {\n        val rubikInstanceValue = queries.value(0, null)\n        val rubikInstanceV0 = queries.value(1, null)\n        val v1 = queries.value(2, null)\n        val v2 = queries.value(3, null)\n        val v3 = queries.value(4, null)\n        doSthProvideInstanceByParameterFunc(rubikInstanceValue.castToTypeOfT(), rubikInstanceV0.castToTypeOfT(), v1.castToTypeOfT(), v2.castToTypeOfT(), v3.castToTypeOfT())\n      }\n      \"do-sth-provide-instance-by-constructor\" == path ->  {\n        val rubikInstanceValue = queries.value(0, null)\n        val v1 = queries.value(1, null)\n        val v2 = queries.value(2, null)\n        val v3 = queries.value(3, null)\n        doSthProvideInstanceByConstructor(rubikInstanceValue.castToTypeOfT(), v1.castToTypeOfT(), v2.castToTypeOfT(), v3.castToTypeOfT())\n      }\n      \"doSthResultReceiver\" == path ->  {\n        val resultParameter = queries.value(0, null)\n        val routeResultTransformer: (ResultReceiver) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthResultReceiver(resultParameter.castToTypeOfT(), routeResultTransformer)\n      }\n      \"live-data/get\" == path ->  {\n        val routeResultTransformer: (LiveData<String>) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        liveDataGet(routeResultTransformer)\n      }\n      \"live-data-bean/get\" == path ->  {\n        val routeResultTransformer: (LiveData<TestDataBeanCtx>) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        liveDataBeanGet(routeResultTransformer)\n      }\n      \"live-data-bean-list/get\" == path ->  {\n        val routeResultTransformer: (LiveData<List<TestListBeanCtx?>>) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        liveDataBeanListGet(routeResultTransformer)\n      }\n      \"do-sth-callback-object\" == path ->  {\n        val callback = queries.value(0, null)\n        doSthCallbackObject(callback.castToTypeOfT())\n      }\n      \"fragment/page1\" == path ->  {\n        fragmentPage1().apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"test-name-string\" == path ->  {\n        testNameString().apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"test-name\" == path ->  {\n        testName()\n      }\n      \"test_name_up\" == path ->  {\n        testNameUp()\n      }\n      \"object/get/do-sth-in-common-ins\" == path ->  {\n        val objectInstance = queries.value(0, null)\n        val v1 = queries.value(1, null)\n        val v2 = queries.value(2, null)\n        val v3 = queries.value(3, null)\n        objectGetDoSthInCommonIns(objectInstance.castToTypeOfT(), v1.castToTypeOfT(), v2.castToTypeOfT(), v3.castToTypeOfT())\n      }\n      \"get-a-lot-of-common-instance\" == path ->  {\n        val i = queries.value(0, null)\n        getALotOfCommonInstance(i.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"send-back-a-lot-of-common-instance\" == path ->  {\n        val objs = queries.value(0, null)\n        sendBackALotOfCommonInstance(objs.castToTypeOfT())\n      }\n      \"get-a-lot-of-common-instance-null\" == path ->  {\n        val i = queries.value(0, null)\n        getALotOfCommonInstanceNull(i.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      else -> { onRouteExt6(path, queries, results) }\n    }\n  }\n\n  private fun onRouteExt6(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"send-back-a-lot-of-common-instance-null\" == path ->  {\n        val objs = queries.value(0, null)\n        sendBackALotOfCommonInstanceNull(objs.castToTypeOfT())\n      }\n      \"api/bigdata/json-array\" == path ->  {\n        val array = queries.value(0, null)\n        apiBigdataJsonArray(array.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/bigdata/parcel-array\" == path ->  {\n        val array = queries.value(0, null)\n        apiBigdataParcelArray(array.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/bigdata/lib-array\" == path ->  {\n        val array = queries.value(0, null)\n        apiBigdataLibArray(array.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/bigdata/json-list\" == path ->  {\n        val list = queries.value(0, null)\n        apiBigdataJsonList(list.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/bigdata/parcel-list\" == path ->  {\n        val list = queries.value(0, null)\n        apiBigdataParcelList(list.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/bigdata/lib-list\" == path ->  {\n        val list = queries.value(0, null)\n        apiBigdataLibList(list.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/bigdata/parcel-arraylist\" == path ->  {\n        val list = queries.value(0, null)\n        apiBigdataParcelArraylist(list.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/serialization/parcel-bean\" == path ->  {\n        val parcelBean = queries.value(0, null)\n        apiSerializationParcelBean(parcelBean.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/serialization/parcel-array\" == path ->  {\n        val parcels = queries.value(0, null)\n        apiSerializationParcelArray(parcels.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/serialization/parcel-list\" == path ->  {\n        val parcels = queries.value(0, null)\n        apiSerializationParcelList(parcels.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"api/serialization/Serializable-bean\" == path ->  {\n        val serializableBean = queries.value(0, null)\n        apiSerializationSerializableBean(serializableBean.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"create-object-test-instance\" == path ->  {\n        val value = queries.value(0, null)\n        createObjectTestInstance(value.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"create-object-test-create-instance\" == path ->  {\n        val v1 = queries.value(0, null)\n        val v2 = queries.value(1, null)\n        createObjectTestCreateInstance(v1.castToTypeOfT(), v2.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"create-object-test-create-instance-by-v1-v2-v3-v4\" == path ->  {\n        val v1 = queries.value(0, null)\n        val v2 = queries.value(1, null)\n        val v3 = queries.value(2, null)\n        val v4 = queries.value(3, null)\n        createObjectTestCreateInstanceByV1V2V3V4(v1.castToTypeOfT(), v2.castToTypeOfT(), v3.castToTypeOfT(), v4.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      else -> { onRouteExt7(path, queries, results) }\n    }\n  }\n\n  private fun onRouteExt7(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      RubikPath(\"activity/page2/{key_str1}/{key_str2}/{key_str3}\").matching(path) ->  {\n        // com.mars.component.detail.ui.SecondPageActivity\n        // - parameters:\n        // --- key_str1 : kotlin.String?\n        // --- key_str2 : kotlin.String?\n        // --- key_str3 : kotlin.String?\n        RubikLauncher().launch(SecondPageActivity::class.java, queries, RubikPath(\"activity/page2/{key_str1}/{key_str2}/{key_str3}\").getParameters(path), results)\n      }\n      \"activity/page1_from_detail\" == path ->  {\n        // com.mars.component.detail.ui.FirstPageActivity\n        // - parameters:\n        // --- key_1_pa : com.mars.component.detail.value.TestCompanionBean?\n        // --- key_2_pa_ar : kotlin.Array<com.mars.component.detail.value.TestCompanionBean>?\n        // --- key_3_int : kotlin.Int\n        // --- key_4_strs : kotlin.collections.List<kotlin.String>?\n        // --- key_5_bean : com.mars.component.detail.value.TestDataBean?\n        // --- key_a_ints : kotlin.collections.List<kotlin.Int>?\n        // --- key_c_pa_li : kotlin.collections.List<com.mars.component.detail.value.TestCompanionBean>?\n        // --- key_int_for_all : kotlin.Int?\n        // --- key_int_for_detail : kotlin.Int?\n        // --- uri : kotlin.String?\n        RubikLauncher().launch(FirstPageActivity::class.java, queries, null, results)\n      }\n      \"activity/page1_from_home\" == path ->  {\n        // com.mars.component.detail.ui.FirstPageActivity\n        // - parameters:\n        // --- key_1_pa : com.mars.component.detail.value.TestCompanionBean?\n        // --- key_2_pa_ar : kotlin.Array<com.mars.component.detail.value.TestCompanionBean>?\n        // --- key_3_int : kotlin.Int\n        // --- key_4_strs : kotlin.collections.List<kotlin.String>?\n        // --- key_5_bean : com.mars.component.detail.value.TestDataBean?\n        // --- key_a_ints : kotlin.collections.List<kotlin.Int>?\n        // --- key_c_pa_li : kotlin.collections.List<com.mars.component.detail.value.TestCompanionBean>?\n        // --- key_int_for_all : kotlin.Int?\n        // --- key_int_for_home : kotlin.Int?\n        // --- uri : kotlin.String?\n        RubikLauncher().launch(FirstPageActivity::class.java, queries, null, results)\n      }\n      \"activity/page1\" == path ->  {\n        // com.mars.component.detail.ui.FirstPageActivity\n        // - parameters:\n        // --- key_1_pa : com.mars.component.detail.value.TestCompanionBean?\n        // --- key_2_pa_ar : kotlin.Array<com.mars.component.detail.value.TestCompanionBean>?\n        // --- key_3_int : kotlin.Int\n        // --- key_4_strs : kotlin.collections.List<kotlin.String>?\n        // --- key_5_bean : com.mars.component.detail.value.TestDataBean?\n        // --- key_a_ints : kotlin.collections.List<kotlin.Int>?\n        // --- key_c_pa_li : kotlin.collections.List<com.mars.component.detail.value.TestCompanionBean>?\n        // --- uri : kotlin.String?\n        RubikLauncher().launch(FirstPageActivity::class.java, queries, null, results)\n      }\n      else -> { throw com.rubik.route.exception.BadPathOrVersionException(path) }\n    }\n  }\n\n  override fun doTestGenericity7(data: Array<Long?>?): Array<Long?>? {\n    // com.mars.component.detail.test.TestGenericityTask.Companion.doTestGenericity7\n    // - parameters:\n    // --- data : kotlin.Array<kotlin.Long?>?\n    // - resultType:\n    // --- kotlin.Array<kotlin.Long?>?\n    return TestGenericityTask.Companion.doTestGenericity7(\n      data /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.Long?>?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.Long?>?] */ \n  }\n\n  override fun testGenericity4(): List<String?>? {\n    // com.mars.component.detail.test.TestGenericityTask.testGenericity4\n    // - resultType:\n    // --- kotlin.collections.List<kotlin.String?>\n    return TestGenericityTask().testGenericity4 /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String?>] */ \n  }\n\n  override fun testGenericity5(lambdaArg0: List<String?>?): List<String?>? {\n    // com.mars.component.detail.test.TestGenericityTask.testGenericity5\n    // - parameters:\n    // --- lambdaArg0 : kotlin.collections.List<kotlin.String?>?\n    // - resultType:\n    // --- kotlin.collections.List<kotlin.String?>?\n    return TestGenericityTask().testGenericity5(\n      lambdaArg0 /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String?>?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String?>?] */ \n  }\n\n  override fun doTestGenericity6(data: Array<TestNullableBeanCtx?>?): Array<TestNullableBeanCtx?>? {\n    // com.mars.component.detail.test.TestGenericityTask.doTestGenericity6\n    // - parameters:\n    // --- data : kotlin.Array<com.mars.component.detail.value.TestNullableBean?>?\n    // - resultType:\n    // --- kotlin.Array<com.mars.component.detail.value.TestNullableBean?>?\n    return TestGenericityTask().doTestGenericity6(\n      data?.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.Array<com.mars.component.detail.value.TestNullableBean?>?] */ \n    )?.toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.Array<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean?>?] */ \n  }\n\n  override fun doTestGenericity1(data: List<TestNullableBeanCtx?>?): List<TestNullableBeanCtx?>? {\n    // com.mars.component.detail.test.TestGenericityTaskKt.doTestGenericity1\n    // - parameters:\n    // --- data : kotlin.collections.List<com.mars.component.detail.value.TestNullableBean?>?\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestNullableBean?>?\n    return com.mars.component.detail.test.doTestGenericity1(\n      data?.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestNullableBean?>?] */ \n    )?.toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean?>?] */ \n  }\n\n  override fun doTestGenericity2(data: LiveData<TestNullableBeanCtx?>?):\n      LiveData<TestNullableBeanCtx?>? {\n    // com.mars.component.detail.test.TestGenericityTaskKt.doTestGenericity2\n    // - parameters:\n    // --- data : androidx.lifecycle.LiveData<com.mars.component.detail.value.TestNullableBean?>?\n    // - resultType:\n    // --- androidx.lifecycle.LiveData<com.mars.component.detail.value.TestNullableBean?>?\n    return com.mars.component.detail.test.doTestGenericity2(\n      data?.toTypeOfT() /* -> TO ORIGINAL TYPE :[androidx.lifecycle.LiveData<com.mars.component.detail.value.TestNullableBean?>?] */ \n    )?.toTypeOfT() /* -> TO CONTEXT TYPE :[androidx.lifecycle.LiveData<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean?>?] */ \n  }\n\n  override fun doTestGenericity3(data: Map<String, Long?>): Map<String, Long?>? {\n    // com.mars.component.detail.test.TestGenericityTaskKt.doTestGenericity3\n    // - parameters:\n    // --- data : kotlin.collections.Map<kotlin.String, kotlin.Long?>\n    // - resultType:\n    // --- kotlin.collections.Map<kotlin.String, kotlin.Long?>\n    return com.mars.component.detail.test.doTestGenericity3(\n      data /* -> NO NEED TO MAPPING :[kotlin.collections.Map<kotlin.String, kotlin.Long?>] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.Map<kotlin.String, kotlin.Long?>] */ \n  }\n\n  override fun doTestGenericity8(resultSuccessCallback: Function1<ArrayList<String>, Unit>) {\n    // com.mars.component.detail.test.TestGenericityTaskKt.doTestGenericity8\n    // - parameters:\n    // --- resultSuccess : kotlin.Function1<kotlin.collections.ArrayList<kotlin.String>, kotlin.Unit>\n    // - resultType:\n    // --- null\n    com.mars.component.detail.test.doTestGenericity8(\n      resultSuccessCallback /* -> NO NEED TO MAPPING :[kotlin.Function1<kotlin.collections.ArrayList<kotlin.String>, kotlin.Unit>] */ \n    )\n  }\n\n  override fun doTestGenericity9(resultSuccessCallback: Function1<List<String>, Unit>) {\n    // com.mars.component.detail.test.TestGenericityTaskKt.doTestGenericity9\n    // - parameters:\n    // --- resultSuccess : kotlin.Function1<kotlin.collections.List<kotlin.String>, kotlin.Unit>\n    // - resultType:\n    // --- null\n    com.mars.component.detail.test.doTestGenericity9(\n      resultSuccessCallback /* -> NO NEED TO MAPPING :[kotlin.Function1<kotlin.collections.List<kotlin.String>, kotlin.Unit>] */ \n    )\n  }\n\n  override fun createTestDefaultPathTaskInstance(routeResultTransformer: (Any) -> Unit) {\n    // com.mars.component.detail.test.TestDefaultPathTask\n    // - resultType:\n    // --- com.mars.component.detail.test.TestDefaultPathTask\n    routeResultTransformer(TestDefaultPathTask() /* -> NO NEED TO MAPPING :[com.mars.component.detail.test.TestDefaultPathTask] */ )\n  }\n\n  override fun doTestDataType1(data: Context?): Context? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType1\n    // - parameters:\n    // --- data : android.content.Context?\n    // - resultType:\n    // --- android.content.Context?\n    return TestDataTypeTask().doTestDataType1(\n      data /* -> NO NEED TO MAPPING :[android.content.Context?] */ \n    ) /* -> NO NEED TO MAPPING :[android.content.Context?] */ \n  }\n\n  override fun doTestDataType2(data: Int?): Int? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType2\n    // - parameters:\n    // --- data : kotlin.Int?\n    // - resultType:\n    // --- kotlin.Int?\n    return TestDataTypeTask().doTestDataType2(\n      data /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n  }\n\n  override fun doTestDataType3(data: String?): String? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType3\n    // - parameters:\n    // --- data : kotlin.String?\n    // - resultType:\n    // --- kotlin.String?\n    return TestDataTypeTask().doTestDataType3(\n      data /* -> NO NEED TO MAPPING :[kotlin.String?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.String?] */ \n  }\n\n  override fun doTestDataType4(data: TestNullableBeanCtx?): TestNullableBeanCtx? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType4\n    // - parameters:\n    // --- data : com.mars.component.detail.value.TestNullableBean?\n    // - resultType:\n    // --- com.mars.component.detail.value.TestNullableBean?\n    return TestDataTypeTask().doTestDataType4(\n      data?.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.TestNullableBean?] */ \n    )?.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean?] */ \n  }\n\n  override fun doTestDataType5(data: List<String>?): List<String>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType5\n    // - parameters:\n    // --- data : kotlin.collections.List<kotlin.String>?\n    // - resultType:\n    // --- kotlin.collections.List<kotlin.String>?\n    return TestDataTypeTask().doTestDataType5(\n      data /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String>?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String>?] */ \n  }\n\n  override fun doTestDataType6(data: Array<Long>?): Array<Long>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType6\n    // - parameters:\n    // --- data : kotlin.Array<kotlin.Long>?\n    // - resultType:\n    // --- kotlin.Array<kotlin.Long>?\n    return TestDataTypeTask().doTestDataType6(\n      data /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.Long>?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.Long>?] */ \n  }\n\n  override fun doTestDataType7(data: LongArray?): LongArray? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType7\n    // - parameters:\n    // --- data : kotlin.LongArray?\n    // - resultType:\n    // --- kotlin.LongArray?\n    return TestDataTypeTask().doTestDataType7(\n      data /* -> NO NEED TO MAPPING :[kotlin.LongArray?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.LongArray?] */ \n  }\n\n  override fun doTestDataType8(data: IntArray?): IntArray? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType8\n    // - parameters:\n    // --- data : kotlin.IntArray?\n    // - resultType:\n    // --- kotlin.IntArray?\n    return TestDataTypeTask().doTestDataType8(\n      data /* -> NO NEED TO MAPPING :[kotlin.IntArray?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.IntArray?] */ \n  }\n\n  override fun doTestDataType9(data: BooleanArray?): BooleanArray? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType9\n    // - parameters:\n    // --- data : kotlin.BooleanArray?\n    // - resultType:\n    // --- kotlin.BooleanArray?\n    return TestDataTypeTask().doTestDataType9(\n      data /* -> NO NEED TO MAPPING :[kotlin.BooleanArray?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.BooleanArray?] */ \n  }\n\n  override fun doTestDataType10(resultSuccessCallback: Function1<Int, Unit>,\n      resultSuccess2Callback: Function1<String, Unit>) {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType10\n    // - parameters:\n    // --- resultSuccess : kotlin.Function1<kotlin.Int, kotlin.Unit>\n    // --- resultSuccess2 : kotlin.Function1<kotlin.String, kotlin.Unit>\n    // - resultType:\n    // --- null\n    TestDataTypeTask().doTestDataType10(\n      resultSuccessCallback /* -> NO NEED TO MAPPING :[kotlin.Function1<kotlin.Int, kotlin.Unit>] */ ,\n      resultSuccess2Callback /* -> NO NEED TO MAPPING :[kotlin.Function1<kotlin.String, kotlin.Unit>] */ \n    )\n  }\n\n  override fun doTestDataType11(resultSuccessCallback: (Int, TestNullableBeanCtx) -> Unit,\n      resultSuccess2Callback: (TestNullableBeanCtx?) -> Unit) {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType11\n    // - parameters:\n    // --- resultSuccess : kotlin.Function2<kotlin.Int, com.mars.component.detail.value.TestNullableBean, kotlin.Unit>\n    // --- resultSuccess2 : kotlin.Function1<com.mars.component.detail.value.TestNullableBean?, kotlin.Unit>\n    // - resultType:\n    // --- null\n    val resultSuccessCallbackCallbackTransformer: (Any?, Any?) -> Unit = { lambdaArg0, lambdaArg1 -> \n      resultSuccessCallback(\n        lambdaArg0.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n        lambdaArg1.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean] */ \n      )}\n    val resultSuccess2CallbackCallbackTransformer: (Any?) -> Unit = { lambdaArg0 -> \n      resultSuccess2Callback(\n        lambdaArg0?.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean?] */ \n      )}\n    TestDataTypeTask().doTestDataType11(\n      resultSuccessCallbackCallbackTransformer,\n      resultSuccess2CallbackCallbackTransformer\n    )\n  }\n\n  override fun doTestDataType13(data: List<Int?>): List<Int?>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType13\n    // - parameters:\n    // --- data : kotlin.collections.List<kotlin.Int?>\n    // - resultType:\n    // --- kotlin.collections.List<kotlin.Int?>\n    return TestDataTypeTask().doTestDataType13(\n      data /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.Int?>] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.Int?>] */ \n  }\n\n  override fun doTestDataType14(data: ArrayList<Int?>): ArrayList<Int?>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType14\n    // - parameters:\n    // --- data : kotlin.collections.ArrayList<kotlin.Int?>\n    // - resultType:\n    // --- kotlin.collections.ArrayList<kotlin.Int?>\n    return TestDataTypeTask().doTestDataType14(\n      data /* -> NO NEED TO MAPPING :[kotlin.collections.ArrayList<kotlin.Int?>] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.ArrayList<kotlin.Int?>] */ \n  }\n\n  override fun doTestDataType15(data: List<TestNullableBeanCtx?>): List<TestNullableBeanCtx?>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType15\n    // - parameters:\n    // --- data : kotlin.collections.List<com.mars.component.detail.value.TestNullableBean?>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestNullableBean?>\n    return TestDataTypeTask().doTestDataType15(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestNullableBean?>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean?>] */ \n  }\n\n  override fun doTestDataType16(data: ArrayList<TestNullableBeanCtx?>):\n      ArrayList<TestNullableBeanCtx?>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType16\n    // - parameters:\n    // --- data : kotlin.collections.ArrayList<com.mars.component.detail.value.TestNullableBean?>\n    // - resultType:\n    // --- kotlin.collections.ArrayList<com.mars.component.detail.value.TestNullableBean?>\n    return TestDataTypeTask().doTestDataType16(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.ArrayList<com.mars.component.detail.value.TestNullableBean?>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.ArrayList<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean?>] */ \n  }\n\n  override fun doTestDataType17(data: List<String?>): List<String?>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType17\n    // - parameters:\n    // --- data : kotlin.collections.List<kotlin.String?>\n    // - resultType:\n    // --- kotlin.collections.List<kotlin.String?>\n    return TestDataTypeTask().doTestDataType17(\n      data /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String?>] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String?>] */ \n  }\n\n  override fun doTestDataType18(data: ArrayList<String?>): ArrayList<String?>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType18\n    // - parameters:\n    // --- data : kotlin.collections.ArrayList<kotlin.String?>\n    // - resultType:\n    // --- kotlin.collections.ArrayList<kotlin.String?>\n    return TestDataTypeTask().doTestDataType18(\n      data /* -> NO NEED TO MAPPING :[kotlin.collections.ArrayList<kotlin.String?>] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.ArrayList<kotlin.String?>] */ \n  }\n\n  override fun doTestDataType19(data: ArrayList<Pair<String?, Int?>>): ArrayList<Pair<String?,\n      Int?>>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType19\n    // - parameters:\n    // --- data : kotlin.collections.ArrayList<kotlin.Pair<kotlin.String?, kotlin.Int?>>\n    // - resultType:\n    // --- kotlin.collections.ArrayList<kotlin.Pair<kotlin.String?, kotlin.Int?>>\n    return TestDataTypeTask().doTestDataType19(\n      data /* -> NO NEED TO MAPPING :[kotlin.collections.ArrayList<kotlin.Pair<kotlin.String?, kotlin.Int?>>] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.ArrayList<kotlin.Pair<kotlin.String?, kotlin.Int?>>] */ \n  }\n\n  override fun doTestDataType20(media: Pair<Long?, String?>): List<String>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType20\n    // - parameters:\n    // --- media : kotlin.Pair<kotlin.Long?, kotlin.String?>\n    // - resultType:\n    // --- kotlin.collections.List<kotlin.String>?\n    return TestDataTypeTask().doTestDataType20(\n      media /* -> NO NEED TO MAPPING :[kotlin.Pair<kotlin.Long?, kotlin.String?>] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String>?] */ \n  }\n\n  override fun doTestDataType21(data: List<TestNullableBeanCtx>): List<TestNullableBeanCtx>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType21\n    // - parameters:\n    // --- data : kotlin.collections.List<com.mars.component.detail.value.TestNullableBean>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestNullableBean>\n    return TestDataTypeTask().doTestDataType21(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestNullableBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean>] */ \n  }\n\n  override fun doTestDataType22(data: List<TestNullableBeanCtx>): List<TestNullableBeanCtx>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType22\n    // - parameters:\n    // --- data : kotlin.collections.List<com.mars.component.detail.value.TestNullableBean>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestNullableBean>\n    return TestDataTypeTask().doTestDataType22(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestNullableBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean>] */ \n  }\n\n  override fun doTestDataType23(data: Array<TestNullableBeanCtx>): Array<TestNullableBeanCtx>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType23\n    // - parameters:\n    // --- data : kotlin.Array<com.mars.component.detail.value.TestNullableBean>\n    // - resultType:\n    // --- kotlin.Array<com.mars.component.detail.value.TestNullableBean>\n    return TestDataTypeTask().doTestDataType23(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.Array<com.mars.component.detail.value.TestNullableBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.Array<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean>] */ \n  }\n\n  override fun doTestDataType24(data: Map<String, TestNullableBeanCtx>): Map<String,\n      TestNullableBeanCtx>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType24\n    // - parameters:\n    // --- data : kotlin.collections.Map<kotlin.String, com.mars.component.detail.value.TestNullableBean>\n    // - resultType:\n    // --- kotlin.collections.Map<kotlin.String, com.mars.component.detail.value.TestNullableBean>\n    return TestDataTypeTask().doTestDataType24(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.Map<kotlin.String, com.mars.component.detail.value.TestNullableBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.Map<kotlin.String, rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean>] */ \n  }\n\n  override fun doTestDataType25(data: Map<String, TestNullableBeanCtx>): Map<String,\n      TestNullableBeanCtx>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType25\n    // - parameters:\n    // --- data : kotlin.collections.Map<kotlin.String, com.mars.component.detail.value.TestNullableBean>\n    // - resultType:\n    // --- kotlin.collections.Map<kotlin.String, com.mars.component.detail.value.TestNullableBean>\n    return TestDataTypeTask().doTestDataType25(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.Map<kotlin.String, com.mars.component.detail.value.TestNullableBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.Map<kotlin.String, rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean>] */ \n  }\n\n  override fun doTestDataType26(data: Set<TestNullableBeanCtx>): Set<TestNullableBeanCtx>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType26\n    // - parameters:\n    // --- data : kotlin.collections.Set<com.mars.component.detail.value.TestNullableBean>\n    // - resultType:\n    // --- kotlin.collections.Set<com.mars.component.detail.value.TestNullableBean>\n    return TestDataTypeTask().doTestDataType26(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.Set<com.mars.component.detail.value.TestNullableBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.Set<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean>] */ \n  }\n\n  override fun doTestDataType27(data: Set<TestNullableBeanCtx>): Set<TestNullableBeanCtx>? {\n    // com.mars.component.detail.test.TestDataTypeTask.doTestDataType27\n    // - parameters:\n    // --- data : kotlin.collections.Set<com.mars.component.detail.value.TestNullableBean>\n    // - resultType:\n    // --- kotlin.collections.Set<com.mars.component.detail.value.TestNullableBean>\n    return TestDataTypeTask().doTestDataType27(\n      data.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.Set<com.mars.component.detail.value.TestNullableBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.Set<rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean>] */ \n  }\n\n  override fun testBeanCreate(\n    d1: Int?,\n    d2: String?,\n    routeResultTransformer: (TestCreateBeanCtx) -> Unit\n  ) {\n    // com.mars.component.detail.value.TestCreateBean\n    // - parameters:\n    // --- d1 : kotlin.Int?\n    // --- d2 : kotlin.String?\n    // - resultType:\n    // --- com.mars.component.detail.value.TestCreateBean\n    routeResultTransformer(TestCreateBeanOrg(\n      d1 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ ,\n      d2 /* -> NO NEED TO MAPPING :[kotlin.String?] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestCreateBean] */ )\n  }\n\n  override fun doSthInCommonInstance(objectInstance: ObjectTestCtx,\n      routeResultTransformer: (TestDataBeanCtx) -> Unit) {\n    // com.mars.component.detail.objekt.ObjectTest.doSthInObject\n    // - resultType:\n    // --- com.mars.component.detail.value.TestDataBean\n    routeResultTransformer(objectInstance.mapToType(toObjectTestOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.objekt.ObjectTest] */ .doSthInObject().toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean] */ )\n  }\n\n  override fun doSthInCommonInstanceParameter(\n    objectInstance: ObjectTestCtx,\n    v1: String,\n    v2: Int?,\n    v3: Int?\n  ) {\n    // com.mars.component.detail.objekt.ObjectTest.doSthInObject2\n    // - parameters:\n    // --- v1 : kotlin.String\n    // --- v2 : kotlin.Int?\n    // --- v3 : kotlin.Int?\n    // - resultType:\n    // --- null\n    objectInstance.mapToType(toObjectTestOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.objekt.ObjectTest] */ .doSthInObject2(\n      v1 /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      v2 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ ,\n      v3 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n    )\n  }\n\n  override fun doSthCreateCommonInstance(objectInstance: ObjectTestCreateCtx,\n      routeResultTransformer: (TestDataBeanCtx) -> Unit) {\n    // com.mars.component.detail.objekt.ObjectTestCreate.doSthInCreateObject\n    // - resultType:\n    // --- com.mars.component.detail.value.TestDataBean\n    routeResultTransformer(objectInstance.mapToType(toObjectTestCreateOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.objekt.ObjectTestCreate] */ .doSthInCreateObject().toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean] */ )\n  }\n\n  override fun getAOtherCommonInstance(i: Int, routeResultTransformer: (ObjectTestCtx) -> Unit) {\n    // com.mars.component.detail.objekt.ObjectTestKt.getAOtherObjectTest\n    // - parameters:\n    // --- i : kotlin.Int\n    // - resultType:\n    // --- com.mars.component.detail.objekt.ObjectTest\n    routeResultTransformer(com.mars.component.detail.objekt.getAOtherObjectTest(\n      i /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n    ).mapToType(toObjectTestCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTest] */ )\n  }\n\n  override fun sendBackCommonInstance(obj: ObjectTestCtx) {\n    // com.mars.component.detail.objekt.ObjectTestKt.senBackObjectTest\n    // - parameters:\n    // --- obj : com.mars.component.detail.objekt.ObjectTest\n    // - resultType:\n    // --- null\n    com.mars.component.detail.objekt.senBackObjectTest(\n      obj.mapToType(toObjectTestOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.objekt.ObjectTest] */ \n    )\n  }\n\n  override fun getAOtherCommonInstanceNull(i: Int, routeResultTransformer: ((ObjectTestCtx?) ->\n      Unit)?) {\n    // com.mars.component.detail.objekt.ObjectTestKt.getAOtherObjectTestNull\n    // - parameters:\n    // --- i : kotlin.Int\n    // - resultType:\n    // --- com.mars.component.detail.objekt.ObjectTest?\n    if (null != routeResultTransformer) {\n      routeResultTransformer(com.mars.component.detail.objekt.getAOtherObjectTestNull(\n        i /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n      )?.mapToType(toNullableObjectTestCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTest?] */ )}\n  }\n\n  override fun sendBackCommonInstanceNull(obj: ObjectTestCtx?) {\n    // com.mars.component.detail.objekt.ObjectTestKt.senBackObjectTestNull\n    // - parameters:\n    // --- obj : com.mars.component.detail.objekt.ObjectTest?\n    // - resultType:\n    // --- null\n    com.mars.component.detail.objekt.senBackObjectTestNull(\n      obj?.mapToType(toNullableObjectTestOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.objekt.ObjectTest?] */ \n    )\n  }\n\n  override fun doSthExt(\n    i: Int,\n    s: String,\n    routeResultTransformer: (Int) -> Unit\n  ) {\n    // com.mars.component.detail.api.ApisExtKt.doSthExt\n    // - parameters:\n    // --- s : kotlin.String\n    // --- i : kotlin.Int\n    // - resultType:\n    // --- kotlin.Int\n    routeResultTransformer(com.mars.component.detail.api.doSthExt(\n      s /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      i /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Int] */ )\n  }\n\n  override fun doSthCompanion(\n    i: Int,\n    j: String,\n    k: Long,\n    routeResultTransformer: (String) -> Unit\n  ) {\n    // com.mars.component.detail.api.AipsInCompanion.DetailCompanion.doSthCompanion\n    // - parameters:\n    // --- i : kotlin.Int\n    // --- j : kotlin.String\n    // --- k : kotlin.Long\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(AipsInCompanion.DetailCompanion.doSthCompanion(\n      i /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      j /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      k /* -> NO NEED TO MAPPING :[kotlin.Long] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun propertyCompanion(routeResultTransformer: (String) -> Unit) {\n    // com.mars.component.detail.api.AipsInCompanion.propertyCompanion\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(com.mars.component.detail.api.AipsInCompanion.propertyCompanion /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun doSthHOFCompanion(lambdaArg0: Int, routeResultTransformer: (Int) -> Unit) {\n    // com.mars.component.detail.api.AipsInCompanion.doSthHOFCompanion\n    // - parameters:\n    // --- lambdaArg0 : kotlin.Int\n    // - resultType:\n    // --- kotlin.Int\n    routeResultTransformer(com.mars.component.detail.api.AipsInCompanion.doSthHOFCompanion(\n      lambdaArg0 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Int] */ )\n  }\n\n  override fun doSthHof(\n    lambdaArg0: Int,\n    lambdaArg1: String,\n    lambdaArg2: TestDataBeanCtx\n  ): Int? {\n    // com.mars.component.detail.api.Apis.doSthHOF\n    // - parameters:\n    // --- lambdaArg0 : kotlin.Int\n    // --- lambdaArg1 : kotlin.String\n    // --- lambdaArg2 : com.mars.component.detail.value.TestDataBean\n    // - resultType:\n    // --- kotlin.Int\n    return Apis().doSthHOF(\n      lambdaArg0 /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      lambdaArg1 /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      lambdaArg2.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.TestDataBean] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n  }\n\n  override fun propertyProperty(routeResultTransformer: (String) -> Unit) {\n    // com.mars.component.detail.api.Apis.property\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(Apis().property /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun doSth() {\n    // com.mars.component.detail.api.Apis.doSth\n    // - resultType:\n    // --- null\n    Apis().doSth()\n  }\n\n  override fun viewGet(context: Context, routeResultTransformer: ((View?) -> Unit)?) {\n    // com.mars.component.detail.api.Apis.getView\n    // - parameters:\n    // --- context : android.content.Context\n    // - resultType:\n    // --- android.view.View?\n    if (null != routeResultTransformer) {\n      routeResultTransformer(Apis().getView(\n        context /* -> NO NEED TO MAPPING :[android.content.Context] */ \n      ) /* -> NO NEED TO MAPPING :[android.view.View?] */ )}\n  }\n\n  override fun sthIdAName(\n    id: String,\n    name: String,\n    code1: String,\n    code2: String,\n    routeResultTransformer: (String) -> Unit\n  ) {\n    // com.mars.component.detail.api.Apis.getSth\n    // - parameters:\n    // --- id : kotlin.String\n    // --- name : kotlin.String\n    // --- code1 : kotlin.String\n    // --- code2 : kotlin.String\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(Apis().getSth(\n      id /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      name /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      code1 /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      code2 /* -> NO NEED TO MAPPING :[kotlin.String] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun doSthVararg(no: Int, vararg varargString: String) {\n    // com.mars.component.detail.api.Apis.doSthVararg\n    // - parameters:\n    // --- no : kotlin.Int\n    // --- varargString : vararg kotlin.Array<kotlin.String>\n    // - resultType:\n    // --- null\n    Apis().doSthVararg(\n      no /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      *varargString /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.String>] */ \n    )\n  }\n\n  override fun doSthVarargHof(no: Int, vararg varargString: Function5<Activity, ViewModelStoreOwner,\n      LifecycleOwner, LifecycleOwner?, LifecycleOwner?, LifecycleOwner?>) {\n    // com.mars.component.detail.api.Apis.doSthVarargHof\n    // - parameters:\n    // --- no : kotlin.Int\n    // --- varargString : vararg kotlin.Array<kotlin.Function5<android.app.Activity, androidx.lifecycle.ViewModelStoreOwner, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.LifecycleOwner?, androidx.lifecycle.LifecycleOwner?, androidx.lifecycle.LifecycleOwner?>>\n    // - resultType:\n    // --- null\n    Apis().doSthVarargHof(\n      no /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      *varargString /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.Function5<android.app.Activity, androidx.lifecycle.ViewModelStoreOwner, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.LifecycleOwner?, androidx.lifecycle.LifecycleOwner?, androidx.lifecycle.LifecycleOwner?>>] */ \n    )\n  }\n\n  override fun doSthBean(a1: TestDataBeanCtx, routeResultTransformer: (TestListBeanCtx) -> Unit) {\n    // com.mars.component.detail.api.Apis.doSthBean\n    // - parameters:\n    // --- a1 : com.mars.component.detail.value.TestDataBean\n    // - resultType:\n    // --- com.mars.component.detail.value.TestListBean\n    routeResultTransformer(Apis().doSthBean(\n      a1.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.TestDataBean] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestListBean] */ )\n  }\n\n  override fun doSthUriCrash(name: String, code: String) {\n    // com.mars.component.detail.api.Apis.doSthUriCrash3\n    // - parameters:\n    // --- name : kotlin.String\n    // --- code : kotlin.String\n    // - resultType:\n    // --- null\n    Apis().doSthUriCrash3(\n      name /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      code /* -> NO NEED TO MAPPING :[kotlin.String] */ \n    )\n  }\n\n  override fun doSthUriCrashByNameCodeVersion(\n    name: String,\n    code: String,\n    version: String\n  ) {\n    // com.mars.component.detail.api.Apis.doSthUriCrash4\n    // - parameters:\n    // --- name : kotlin.String\n    // --- code : kotlin.String\n    // --- version : kotlin.String\n    // - resultType:\n    // --- null\n    Apis().doSthUriCrash4(\n      name /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      code /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      version /* -> NO NEED TO MAPPING :[kotlin.String] */ \n    )\n  }\n\n  override fun doSthMappingBean(a1: TestDataMappingBeanCtx,\n      routeResultTransformer: (TestDataMappingBeanCtx) -> Unit) {\n    // com.mars.component.detail.api.Apis.doSthMappingBean\n    // - parameters:\n    // --- a1 : com.mars.component.detail.value.mapping.TestDataMappingBean\n    // - resultType:\n    // --- com.mars.component.detail.value.mapping.TestDataMappingBean\n    routeResultTransformer(Apis().doSthMappingBean(\n      a1.mapToType(toTestDataMappingBeanOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.mapping.TestDataMappingBean] */ \n    ).mapToType(toTestDataMappingBeanCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataMappingBean] */ )\n  }\n\n  override fun doSthTestNestDataMappingBean(bean: TestNestDataMappingBeanCtx,\n      routeResultTransformer: (TestNestDataMappingBeanCtx) -> Unit) {\n    // com.mars.component.detail.api.Apis.doSthTestNestDataMappingBean\n    // - parameters:\n    // --- bean : com.mars.component.detail.value.mapping.TestNestDataMappingBean\n    // - resultType:\n    // --- com.mars.component.detail.value.mapping.TestNestDataMappingBean\n    routeResultTransformer(Apis().doSthTestNestDataMappingBean(\n      bean.mapToType(toTestNestDataMappingBeanOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.mapping.TestNestDataMappingBean] */ \n    ).mapToType(toTestNestDataMappingBeanCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestNestDataMappingBean] */ )\n  }\n\n  override fun doSthAsyncHOF(hofCallback: (String, TestDataBeanCtx) -> Unit) {\n    // com.mars.component.detail.api.ApisAsyncReturn.doSthAsyncHOF\n    // - parameters:\n    // --- hof : kotlin.Function2<kotlin.String, com.mars.component.detail.value.TestDataBean, kotlin.Unit>\n    // - resultType:\n    // --- null\n    val hofCallbackCallbackTransformer: (Any?, Any?) -> Unit = { lambdaArg0, lambdaArg1 -> \n      hofCallback(\n        lambdaArg0.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n        lambdaArg1.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean] */ \n      )}\n    ApisAsyncReturn().doSthAsyncHOF(\n      hofCallbackCallbackTransformer\n    )\n  }\n\n  override fun doSthAsyncHOFNullable(\n    hof2xxCallback: Function2<String, TestDataBeanCtx, Unit>?,\n    hof4xxCallback: Function3<String, Int, TestDataBeanCtx, TestDataBeanCtx?>?,\n    hofx1resCallback: ((String, TestDataBeanCtx) -> Unit)?\n  ) {\n    // com.mars.component.detail.api.ApisAsyncReturn.doSthAsyncHOFNullable\n    // - parameters:\n    // --- hofx1res : kotlin.Function2<kotlin.String, com.mars.component.detail.value.TestDataBean, kotlin.Unit>?\n    // --- hof2xx : kotlin.Function2<kotlin.String, com.mars.component.detail.value.TestDataBean, kotlin.Unit>?\n    // --- hof4xx : kotlin.Function3<kotlin.String, kotlin.Int, com.mars.component.detail.value.TestDataBean, com.mars.component.detail.value.TestDataBean?>?\n    // - resultType:\n    // --- null\n    val hofx1resCallbackCallbackTransformer: (Any?, Any?) -> Unit = { lambdaArg0, lambdaArg1 -> \n      hofx1resCallback?.invoke(\n        lambdaArg0.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n        lambdaArg1.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean] */ \n      )}\n    val hof2xxCallbackCallbackTransformer: (Any?, Any?) -> Unit = { lambdaArg0, lambdaArg1 -> \n      hof2xxCallback?.invoke(\n        lambdaArg0.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n        lambdaArg1.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean] */ \n      )}\n    val hof4xxCallbackCallbackTransformer: (Any?, Any?, Any?) -> TestDataBeanOrg? = { lambdaArg0, lambdaArg1, lambdaArg2 -> \n      hof4xxCallback?.invoke(\n        lambdaArg0.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n        lambdaArg1.castToTypeOfT() /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n        lambdaArg2.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean] */ \n      )?.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.TestDataBean?] */ }\n    ApisAsyncReturn().doSthAsyncHOFNullable(\n      hofx1resCallbackCallbackTransformer,\n      hof2xxCallbackCallbackTransformer,\n      hof4xxCallbackCallbackTransformer\n    )\n  }\n\n  override fun doSthAsync2HOF(hofCallback: (String, Int) -> Unit, hof2Callback: (String, Int) ->\n      Unit) {\n    // com.mars.component.detail.api.ApisAsyncReturn.doSthAsyncHOF\n    // - parameters:\n    // --- hof : kotlin.Function2<kotlin.String, kotlin.Int, kotlin.Unit>\n    // --- hof2 : kotlin.Function2<kotlin.String, kotlin.Int, kotlin.Unit>\n    // - resultType:\n    // --- null\n    ApisAsyncReturn().doSthAsyncHOF(\n      hofCallback /* -> NO NEED TO MAPPING :[kotlin.Function2<kotlin.String, kotlin.Int, kotlin.Unit>] */ ,\n      hof2Callback /* -> NO NEED TO MAPPING :[kotlin.Function2<kotlin.String, kotlin.Int, kotlin.Unit>] */ \n    )\n  }\n\n  override fun doSthAsyncOpen(uriParameter: String, onCallCallback: ((String?, Int) -> Unit)?) {\n    // com.mars.component.detail.api.ApisAsyncReturn.doSthAsyncOpen\n    // - parameters:\n    // --- uri : kotlin.String\n    // --- results : com.mars.component.detail.api.Callback?\n    // - resultType:\n    // --- null\n    val resultsParameterCallbackTransformer = object : Callback() {\n      override fun onCall(v1: String?, v2: Int) {\n        onCallCallback?.invoke(\n          v1 /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n          v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n        )}\n    }\n    ApisAsyncReturn().doSthAsyncOpen(\n      uriParameter /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      resultsParameterCallbackTransformer\n    )\n  }\n\n  override fun doSthAsyncInterface(onCallCallback: (String?, Int) -> Unit) {\n    // com.mars.component.detail.api.ApisAsyncReturn.doSthAsyncInterface\n    // - parameters:\n    // --- onResult : com.mars.component.detail.api.Callbackable\n    // - resultType:\n    // --- null\n    val onResultCallbackTransformer = object : Callbackable {\n      override fun onCall(v1: String?, v2: Int) {\n        onCallCallback(\n          v1 /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n          v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n        )}\n    }\n    ApisAsyncReturn().doSthAsyncInterface(\n      onResultCallbackTransformer\n    )\n  }\n\n  override fun doSthAsync3Interface(\n    onCallCallback: ((String?, Int) -> Unit)?,\n    onCall1Callback: (String?, Int) -> Unit,\n    onCall2Callback: (TestDataBeanCtx?) -> Unit\n  ) {\n    // com.mars.component.detail.api.ApisAsyncReturn.doSthAsync2Interface\n    // - parameters:\n    // --- onResult : com.mars.component.detail.api.Callbackable?\n    // --- onResult2 : com.mars.component.detail.api.Callbackable\n    // --- onResult3 : com.mars.component.detail.api.BeanCallbackable\n    // - resultType:\n    // --- null\n    val onResultCallbackTransformer = object : Callbackable {\n      override fun onCall(v1: String?, v2: Int) {\n        onCallCallback?.invoke(\n          v1 /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n          v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n        )}\n    }\n    val onResult2CallbackTransformer = object : Callbackable {\n      override fun onCall(v1: String?, v2: Int) {\n        onCall1Callback(\n          v1 /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n          v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n        )}\n    }\n    val onResult3CallbackTransformer = object : BeanCallbackable {\n      override fun onCall(v: TestDataBeanOrg?) {\n        onCall2Callback(\n          v?.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean?] */ \n        )}\n    }\n    ApisAsyncReturn().doSthAsync2Interface(\n      onResultCallbackTransformer,\n      onResult2CallbackTransformer,\n      onResult3CallbackTransformer\n    )\n  }\n\n  override fun doSthAsyncInterfaceMultiFunc(\n    startCallback: (String?, Int) -> Unit,\n    dataCallback: (TestDataBeanCtx?) -> Unit,\n    stopCallback: (String?, Int) -> Unit\n  ) {\n    // com.mars.component.detail.api.ApisAsyncReturn.doSthAsyncInterfaceMultiFunc\n    // - parameters:\n    // --- onResult : com.mars.component.detail.api.MultiCallback\n    // - resultType:\n    // --- null\n    val onResultCallbackTransformer = object : MultiCallback {\n      override fun start(v1: String?, v2: Int) {\n        startCallback(\n          v1 /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n          v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n        )}\n      override fun data(v: TestDataBeanOrg?) {\n        dataCallback(\n          v?.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean?] */ \n        )}\n      override fun stop(v1: String?, v2: Int) {\n        stopCallback(\n          v1 /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n          v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n        )}\n    }\n    ApisAsyncReturn().doSthAsyncInterfaceMultiFunc(\n      onResultCallbackTransformer\n    )\n  }\n\n  override fun doSthHOFTop(lambdaArg0: Unit, routeResultTransformer: (Unit) -> Unit) {\n    // com.mars.component.detail.api.AipsInTopKt.doSthHOFTop\n    // - parameters:\n    // --- lambdaArg0 : kotlin.Unit\n    // - resultType:\n    // --- kotlin.Unit\n    routeResultTransformer(com.mars.component.detail.api.doSthHOFTop(\n      lambdaArg0 /* -> NO NEED TO MAPPING :[kotlin.Unit] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Unit] */ )\n  }\n\n  override fun propertyTop(routeResultTransformer: (String) -> Unit) {\n    // com.mars.component.detail.api.AipsInTopKt.propertyTop\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(com.mars.component.detail.api.propertyTop /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun doSthTop(\n    ints: Array<Int>,\n    li: List<Int?>,\n    strings: Array<String>,\n    ls: List<String>,\n    beans: Array<TestDataBeanCtx>,\n    lb: List<TestDataBeanCtx>,\n    routeResultTransformer: (List<TestDataBeanCtx>) -> Unit\n  ) {\n    // com.mars.component.detail.api.AipsInTopKt.doSthTop\n    // - parameters:\n    // --- ints : kotlin.Array<kotlin.Int>\n    // --- li : kotlin.collections.List<kotlin.Int?>\n    // --- strings : kotlin.Array<kotlin.String>\n    // --- ls : kotlin.collections.List<kotlin.String>\n    // --- beans : kotlin.Array<com.mars.component.detail.value.TestDataBean>\n    // --- lb : kotlin.collections.List<com.mars.component.detail.value.TestDataBean>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestDataBean>\n    routeResultTransformer(com.mars.component.detail.api.doSthTop(\n      ints /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.Int>] */ ,\n      li /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.Int?>] */ ,\n      strings /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.String>] */ ,\n      ls /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String>] */ ,\n      beans.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.Array<com.mars.component.detail.value.TestDataBean>] */ ,\n      lb.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestDataBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean>] */ )\n  }\n\n  override fun getFilesMeta(\n    context: Context?,\n    pathParameter: String?,\n    onResultCallback: (Long, String?) -> Unit\n  ) {\n    // com.mars.component.detail.api.ApisBadCase.getFilesMeta\n    // - parameters:\n    // --- context : android.content.Context?\n    // --- path : kotlin.String?\n    // --- callback : com.mars.component.detail.api.GetFileMetaCallback\n    // - resultType:\n    // --- null\n    val callbackCallbackTransformer = object : GetFileMetaCallback {\n      override fun onResult(fsid: Long, pathParameter: String?) {\n        onResultCallback(\n          fsid /* -> NO NEED TO MAPPING :[kotlin.Long] */ ,\n          pathParameter /* -> NO NEED TO MAPPING :[kotlin.String?] */ \n        )}\n    }\n    ApisBadCase().getFilesMeta(\n      context /* -> NO NEED TO MAPPING :[android.content.Context?] */ ,\n      pathParameter /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n      callbackCallbackTransformer\n    )\n  }\n\n  override fun enterpriseBusinessAllocateTicket(\n    context: Context,\n    shareId: Long,\n    count: Int,\n    packetType: Int,\n    routeResultTransformer: ((LiveData<List<String>>?) -> Unit)?\n  ) {\n    // com.mars.component.detail.api.ApisBadCase.allocateTicket\n    // - parameters:\n    // --- context : android.content.Context\n    // --- shareId : kotlin.Long\n    // --- count : kotlin.Int\n    // --- packetType : kotlin.Int\n    // - resultType:\n    // --- androidx.lifecycle.LiveData<kotlin.collections.List<kotlin.String>>?\n    if (null != routeResultTransformer) {\n      routeResultTransformer(ApisBadCase().allocateTicket(\n        context /* -> NO NEED TO MAPPING :[android.content.Context] */ ,\n        shareId /* -> NO NEED TO MAPPING :[kotlin.Long] */ ,\n        count /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n        packetType /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n      ) /* -> NO NEED TO MAPPING :[androidx.lifecycle.LiveData<kotlin.collections.List<kotlin.String>>?] */ )}\n  }\n\n  override fun doSthProvideInstanceByFunc() {\n    // com.mars.component.detail.api.Task.doSthProvideObject\n    // - resultType:\n    // --- null\n    com.mars.component.detail.api.provideTask() /* -> NO NEED TO MAPPING :[com.mars.component.detail.api.Task] */ .doSthProvideObject()\n  }\n\n  override fun doSthProvideInstanceByFunc2() {\n    // com.mars.component.detail.api.Task.doSthProvideObject2\n    // - resultType:\n    // --- null\n    com.mars.component.detail.api.provideTask() /* -> NO NEED TO MAPPING :[com.mars.component.detail.api.Task] */ .doSthProvideObject2()\n  }\n\n  override fun doSthProvideInstanceByParameterFunc(\n    rubikInstanceValue: String,\n    rubikInstanceV0: Int?,\n    v1: String,\n    v2: Int?,\n    v3: Int?\n  ) {\n    // com.mars.component.detail.api.Task.doSthProvideObject2\n    // - parameters:\n    // --- v1 : kotlin.String\n    // --- v2 : kotlin.Int?\n    // --- v3 : kotlin.Int?\n    // - resultType:\n    // --- null\n    com.mars.component.detail.api.provideTask2(\n      rubikInstanceValue /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      rubikInstanceV0 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n    ) /* -> NO NEED TO MAPPING :[com.mars.component.detail.api.Task] */ .doSthProvideObject2(\n      v1 /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      v2 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ ,\n      v3 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n    )\n  }\n\n  override fun doSthProvideInstanceByConstructor(\n    rubikInstanceValue: String,\n    v1: String,\n    v2: Int?,\n    v3: Int?\n  ) {\n    // com.mars.component.detail.api.Task.doSthProvideObject3\n    // - parameters:\n    // --- v1 : kotlin.String\n    // --- v2 : kotlin.Int?\n    // --- v3 : kotlin.Int?\n    // - resultType:\n    // --- null\n    Task(\n      rubikInstanceValue /* -> NO NEED TO MAPPING :[kotlin.String] */ \n    ) /* -> NO NEED TO MAPPING :[com.mars.component.detail.api.Task] */ .doSthProvideObject3(\n      v1 /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      v2 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ ,\n      v3 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n    )\n  }\n\n  override fun doSthResultReceiver(resultParameter: ResultReceiver,\n      routeResultTransformer: (ResultReceiver) -> Unit) {\n    // com.mars.component.detail.api.ApisWithResultReceiver.doSthResultReceiver\n    // - parameters:\n    // --- result : android.os.ResultReceiver\n    // - resultType:\n    // --- android.os.ResultReceiver\n    routeResultTransformer(ApisWithResultReceiver().doSthResultReceiver(\n      resultParameter /* -> NO NEED TO MAPPING :[android.os.ResultReceiver] */ \n    ) /* -> NO NEED TO MAPPING :[android.os.ResultReceiver] */ )\n  }\n\n  override fun liveDataGet(routeResultTransformer: (LiveData<String>) -> Unit) {\n    // com.mars.component.detail.api.ApisWithLiveData.getSthLiveData\n    // - resultType:\n    // --- androidx.lifecycle.LiveData<kotlin.String>\n    routeResultTransformer(ApisWithLiveData().getSthLiveData() /* -> NO NEED TO MAPPING :[androidx.lifecycle.LiveData<kotlin.String>] */ )\n  }\n\n  override fun liveDataBeanGet(routeResultTransformer: (LiveData<TestDataBeanCtx>) -> Unit) {\n    // com.mars.component.detail.api.ApisWithLiveData.getSthLiveDataBean\n    // - resultType:\n    // --- androidx.lifecycle.LiveData<com.mars.component.detail.value.TestDataBean>\n    routeResultTransformer(ApisWithLiveData().getSthLiveDataBean().toTypeOfT() /* -> TO CONTEXT TYPE :[androidx.lifecycle.LiveData<rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean>] */ )\n  }\n\n  override fun liveDataBeanListGet(routeResultTransformer: (LiveData<List<TestListBeanCtx?>>) ->\n      Unit) {\n    // com.mars.component.detail.api.ApisWithLiveData.getSthLiveDataBeanList\n    // - resultType:\n    // --- androidx.lifecycle.LiveData<kotlin.collections.List<com.mars.component.detail.value.TestListBean?>>\n    routeResultTransformer(ApisWithLiveData().getSthLiveDataBeanList().toTypeOfT() /* -> TO CONTEXT TYPE :[androidx.lifecycle.LiveData<kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestListBean?>>] */ )\n  }\n\n  override fun doSthCallbackObject(callback: CallbackTestInterfaceCtx) {\n    // com.mars.component.detail.callback.CallbackTestInterfaceKt.doSthCallbackObject\n    // - parameters:\n    // --- callback : com.mars.component.detail.callback.CallbackTestInterface\n    // - resultType:\n    // --- null\n    com.mars.component.detail.callback.doSthCallbackObject(\n      callback.mapToType(toCallbackTestInterfaceOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.callback.CallbackTestInterface] */ \n    )\n  }\n\n  override fun testNameString(): String? {\n    // com.mars.component.detail.test.TestDefaultPathTask.testNameString\n    // - resultType:\n    // --- kotlin.String\n    return TestDefaultPathTask().testNameString /* -> NO NEED TO MAPPING :[kotlin.String] */ \n  }\n\n  override fun testName() {\n    // com.mars.component.detail.test.TestDefaultPathTask.testName\n    // - resultType:\n    // --- null\n    TestDefaultPathTask().testName()\n  }\n\n  override fun testNameUp() {\n    // com.mars.component.detail.test.TestDefaultPathTask.TEST_NAME_UP\n    // - resultType:\n    // --- null\n    TestDefaultPathTask().TEST_NAME_UP()\n  }\n\n  override fun getALotOfCommonInstance(i: Int): List<ObjectTestCtx>? {\n    // com.mars.component.detail.objekt.ObjectTestKt.getALotOfObjectTest\n    // - parameters:\n    // --- i : kotlin.Int\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.objekt.ObjectTest>\n    return com.mars.component.detail.objekt.getALotOfObjectTest(\n      i /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n    ).mapToType(toObjectTestCtxMapping) /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTest>] */ \n  }\n\n  override fun sendBackALotOfCommonInstance(objs: Map<String, ObjectTestCtx>) {\n    // com.mars.component.detail.objekt.ObjectTestKt.senBackALotOfObjectTest\n    // - parameters:\n    // --- objs : kotlin.collections.Map<kotlin.String, com.mars.component.detail.objekt.ObjectTest>\n    // - resultType:\n    // --- null\n    com.mars.component.detail.objekt.senBackALotOfObjectTest(\n      objs.mapToType(toObjectTestOrgMapping) /* -> TO ORIGINAL TYPE :[kotlin.collections.Map<kotlin.String, com.mars.component.detail.objekt.ObjectTest>] */ \n    )\n  }\n\n  override fun getALotOfCommonInstanceNull(i: Int): List<ObjectTestCtx?>? {\n    // com.mars.component.detail.objekt.ObjectTestKt.getALotOfObjectTestNull\n    // - parameters:\n    // --- i : kotlin.Int\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.objekt.ObjectTest?>?\n    return com.mars.component.detail.objekt.getALotOfObjectTestNull(\n      i /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n    )?.mapToType(toNullableObjectTestCtxMapping) /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTest?>?] */ \n  }\n\n  override fun sendBackALotOfCommonInstanceNull(objs: Map<String?, ObjectTestCtx?>?) {\n    // com.mars.component.detail.objekt.ObjectTestKt.senBackALotOfObjectTesNull\n    // - parameters:\n    // --- objs : kotlin.collections.Map<kotlin.String?, com.mars.component.detail.objekt.ObjectTest?>?\n    // - resultType:\n    // --- null\n    com.mars.component.detail.objekt.senBackALotOfObjectTesNull(\n      objs?.mapToType(toNullableObjectTestOrgMapping) /* -> TO ORIGINAL TYPE :[kotlin.collections.Map<kotlin.String?, com.mars.component.detail.objekt.ObjectTest?>?] */ \n    )\n  }\n\n  override fun fragmentPage1(): Fragment? {\n    // com.mars.component.detail.ui.FirstPageFragment\n    // - resultType:\n    // --- com.mars.component.detail.ui.FirstPageFragment\n    return FirstPageFragment() /* -> NO NEED TO MAPPING :[com.mars.component.detail.ui.FirstPageFragment] */ \n  }\n\n  override fun objectGetDoSthInCommonIns(\n    objectInstance: ObjectTestCtx,\n    v1: String,\n    v2: Int?,\n    v3: Int?\n  ) {\n    // com.mars.component.detail.objekt.ObjectTest.doSthInObject3\n    // - parameters:\n    // --- v1 : kotlin.String\n    // --- v2 : kotlin.Int?\n    // --- v3 : kotlin.Int?\n    // - resultType:\n    // --- null\n    objectInstance.mapToType(toObjectTestOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.objekt.ObjectTest] */ .doSthInObject3(\n      v1 /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      v2 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ ,\n      v3 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n    )\n  }\n\n  override fun apiBigdataJsonArray(array: Array<TestDataBeanCtx>): Array<TestDataBeanCtx>? {\n    // com.mars.component.detail.api.ApisBigData.getBigJsonArray\n    // - parameters:\n    // --- array : kotlin.Array<com.mars.component.detail.value.TestDataBean>\n    // - resultType:\n    // --- kotlin.Array<com.mars.component.detail.value.TestDataBean>\n    return ApisBigData().getBigJsonArray(\n      array.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.Array<com.mars.component.detail.value.TestDataBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.Array<rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean>] */ \n  }\n\n  override fun apiBigdataParcelArray(array: Array<TestParcelizeBeanCtx>):\n      Array<TestParcelizeBeanCtx>? {\n    // com.mars.component.detail.api.ApisBigData.getBigParcelArray\n    // - parameters:\n    // --- array : kotlin.Array<com.mars.component.detail.value.TestParcelizeBean>\n    // - resultType:\n    // --- kotlin.Array<com.mars.component.detail.value.TestParcelizeBean>\n    return ApisBigData().getBigParcelArray(\n      array.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.Array<com.mars.component.detail.value.TestParcelizeBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.Array<rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean>] */ \n  }\n\n  override fun apiBigdataLibArray(array: Array<TestDataBeanCtx>): Array<TestDataBeanCtx>? {\n    // com.mars.component.detail.api.ApisBigData.getBigLibArray\n    // - parameters:\n    // --- array : kotlin.Array<com.mars.component.detail.value.TestDataBean>\n    // - resultType:\n    // --- kotlin.Array<com.mars.component.detail.value.TestDataBean>\n    return ApisBigData().getBigLibArray(\n      array.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.Array<com.mars.component.detail.value.TestDataBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.Array<rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean>] */ \n  }\n\n  override fun apiBigdataJsonList(list: List<TestDataBeanCtx>): List<TestDataBeanCtx>? {\n    // com.mars.component.detail.api.ApisBigData.getBigJsonList\n    // - parameters:\n    // --- list : kotlin.collections.List<com.mars.component.detail.value.TestDataBean>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestDataBean>\n    return ApisBigData().getBigJsonList(\n      list.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestDataBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean>] */ \n  }\n\n  override fun apiBigdataParcelList(list: List<TestParcelizeBeanCtx>): List<TestParcelizeBeanCtx>? {\n    // com.mars.component.detail.api.ApisBigData.getBigParcelList\n    // - parameters:\n    // --- list : kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>\n    return ApisBigData().getBigParcelList(\n      list.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean>] */ \n  }\n\n  override fun apiBigdataLibList(list: List<TestDataBeanCtx>): List<TestDataBeanCtx>? {\n    // com.mars.component.detail.api.ApisBigData.getBigLibList\n    // - parameters:\n    // --- list : kotlin.collections.List<com.mars.component.detail.value.TestDataBean>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestDataBean>\n    return ApisBigData().getBigLibList(\n      list.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestDataBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean>] */ \n  }\n\n  override fun apiBigdataParcelArraylist(list: List<TestParcelizeBeanCtx>):\n      List<TestParcelizeBeanCtx>? {\n    // com.mars.component.detail.api.ApisBigData.getBigParcelArrayList\n    // - parameters:\n    // --- list : kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>\n    return ApisBigData().getBigParcelArrayList(\n      list.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean>] */ \n  }\n\n  override fun apiSerializationParcelBean(parcelBean: TestParcelizeBeanCtx?):\n      TestParcelizeBeanCtx? {\n    // com.mars.component.detail.api.ApiSerialization.doSthParcelBean\n    // - parameters:\n    // --- parcelBean : com.mars.component.detail.value.TestParcelizeBean?\n    // - resultType:\n    // --- com.mars.component.detail.value.TestParcelizeBean\n    return ApiSerialization().doSthParcelBean(\n      parcelBean?.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.TestParcelizeBean?] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean] */ \n  }\n\n  override fun apiSerializationParcelArray(parcels: Array<TestParcelizeBeanCtx>):\n      Array<TestParcelizeBeanCtx>? {\n    // com.mars.component.detail.api.ApiSerialization.doSthParcelArray\n    // - parameters:\n    // --- parcels : kotlin.Array<com.mars.component.detail.value.TestParcelizeBean>\n    // - resultType:\n    // --- kotlin.Array<com.mars.component.detail.value.TestParcelizeBean>\n    return ApiSerialization().doSthParcelArray(\n      parcels.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.Array<com.mars.component.detail.value.TestParcelizeBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.Array<rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean>] */ \n  }\n\n  override fun apiSerializationParcelList(parcels: List<TestParcelizeBeanCtx>):\n      List<TestParcelizeBeanCtx>? {\n    // com.mars.component.detail.api.ApiSerialization.doSthParcelList\n    // - parameters:\n    // --- parcels : kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>\n    // - resultType:\n    // --- kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>\n    return ApiSerialization().doSthParcelList(\n      parcels.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestParcelizeBean>] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean>] */ \n  }\n\n  override fun apiSerializationSerializableBean(serializableBean: TestSerializableBeanCtx):\n      TestSerializableBeanCtx? {\n    // com.mars.component.detail.api.ApiSerialization.doSthSerializableBean\n    // - parameters:\n    // --- serializableBean : com.mars.component.detail.value.TestSerializableBean\n    // - resultType:\n    // --- com.mars.component.detail.value.TestSerializableBean\n    return ApiSerialization().doSthSerializableBean(\n      serializableBean.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.TestSerializableBean] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestSerializableBean] */ \n  }\n\n  override fun sthNavigationOnlyUri(uriParameter: String, routeResultTransformer: (String) ->\n      Unit) {\n    // com.mars.component.detail.api.Apis.getSthNavigationOnly\n    // - parameters:\n    // --- uri : kotlin.String\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(Apis().getSthNavigationOnly(\n      uriParameter /* -> NO NEED TO MAPPING :[kotlin.String] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun createObjectTestInstance(value: String): ObjectTestCtx? {\n    // com.mars.component.detail.objekt.ObjectTest\n    // - parameters:\n    // --- value : kotlin.String\n    // - resultType:\n    // --- com.mars.component.detail.objekt.ObjectTest\n    return ObjectTestOrg(\n      value /* -> NO NEED TO MAPPING :[kotlin.String] */ \n    ).mapToType(toObjectTestCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTest] */ \n  }\n\n  override fun createObjectTestCreateInstance(v1: Int, v2: String): ObjectTestCreateCtx? {\n    // com.mars.component.detail.objekt.ObjectTestCreate\n    // - parameters:\n    // --- v1 : kotlin.Int\n    // --- v2 : kotlin.String\n    // - resultType:\n    // --- com.mars.component.detail.objekt.ObjectTestCreate\n    return ObjectTestCreateOrg(\n      v1 /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      v2 /* -> NO NEED TO MAPPING :[kotlin.String] */ \n    ).mapToType(toObjectTestCreateCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTestCreate] */ \n  }\n\n  override fun createObjectTestCreateInstanceByV1V2V3V4(\n    v1: Int,\n    v2: Int,\n    v3: Int,\n    v4: Int\n  ): ObjectTestCreateCtx? {\n    // com.mars.component.detail.objekt.ObjectTestCreate\n    // - parameters:\n    // --- v1 : kotlin.Int\n    // --- v2 : kotlin.Int\n    // --- v3 : kotlin.Int\n    // --- v4 : kotlin.Int\n    // - resultType:\n    // --- com.mars.component.detail.objekt.ObjectTestCreate\n    return ObjectTestCreateOrg(\n      v1 /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      v3 /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      v4 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n    ).mapToType(toObjectTestCreateCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTestCreate] */ \n  }\n\n  @RGenerated(\n    kind = \"aggregate_mappings\",\n    by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n    version = \"0.0.1-DEV\"\n  )\n  @Keep\n  object Mappings {\n    /**\n     *  Mapping between :\n     *  com.mars.component.detail.objekt.ObjectTest < --- > rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTest \n     */\n    val toObjectTestCtxMapping: ObjectTestOrg.() -> ObjectTestCtx\n      get() = { ObjectTestCtx.create(this) }\n\n    val toObjectTestOrgMapping: ObjectTestCtx.() -> ObjectTestOrg\n      get() = { this.originalObject.castToTypeOfT() }\n\n    val toNullableObjectTestCtxMapping: ObjectTestOrg?.() -> ObjectTestCtx?\n      get() = { this?.toObjectTestCtxMapping() }\n\n    val toNullableObjectTestOrgMapping: ObjectTestCtx?.() -> ObjectTestOrg?\n      get() = { this?.toObjectTestOrgMapping() }\n\n    /**\n     *  Mapping between :\n     *  com.mars.component.detail.objekt.ObjectTestCreate < --- > rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTestCreate \n     */\n    val toObjectTestCreateCtxMapping: ObjectTestCreateOrg.() -> ObjectTestCreateCtx\n      get() = { ObjectTestCreateCtx.create(this) }\n\n    val toObjectTestCreateOrgMapping: ObjectTestCreateCtx.() -> ObjectTestCreateOrg\n      get() = { this.originalObject.castToTypeOfT() }\n\n    /**\n     *  Mapping between :\n     *  com.mars.component.detail.callback.CallbackTestInterface < --- > rubik.generate.context.demo_com_mars_rubik_test_detail.callback.CallbackTestInterface \n     */\n    val toCallbackTestInterfaceOrgMapping: CallbackTestInterfaceCtx.() -> CallbackTestInterfaceOrg\n      get() =  {\n        val mappingTarget = this\n        object : CallbackTestInterfaceOrg {\n          override fun callbackInt(i: Int) {\n            mappingTarget.callbackInt(\n              i /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n            )}\n          override fun callbackBean(bean: TestDataBeanOrg) {\n            mappingTarget.callbackBean(\n              bean.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean] */ \n            )}\n          override fun callbackBeanReBean(bean: TestDataBeanOrg?) {\n            mappingTarget.callbackBeanReBean(\n              bean?.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean?] */ \n            )}\n        }\n      }\n\n    /**\n     *  Mapping between :\n     *  com.mars.component.detail.value.mapping.TestNestDataMappingBean < --- > rubik.generate.context.demo_com_mars_rubik_test_detail.TestNestDataMappingBean \n     */\n    val toTestNestDataMappingBeanCtxMapping: TestNestDataMappingBeanOrg.() ->\n        TestNestDataMappingBeanCtx\n      get() = { TestNestDataMappingBeanCtx(\n        d1?.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean?] */ ,\n        d2?.mapToType(toNullableTestDataMappingBeanCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataMappingBean?] */ ,\n        d3?.mapToType(toNullableTestNestDataMappingBeanCtxMapping) /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail.TestNestDataMappingBean?] */ ,\n        d4?.toTypeOfT() /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean>?] */ ,\n        d5?.mapToType(toTestDataMappingBeanCtxMapping) /* -> TO CONTEXT TYPE :[kotlin.collections.List<rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataMappingBean>?] */ \n      ) }\n\n    val toTestNestDataMappingBeanOrgMapping: TestNestDataMappingBeanCtx.() ->\n        TestNestDataMappingBeanOrg\n      get() = { TestNestDataMappingBeanOrg(\n        d1?.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.TestDataBean?] */ ,\n        d2?.mapToType(toNullableTestDataMappingBeanOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.mapping.TestDataMappingBean?] */ ,\n        d3?.mapToType(toNullableTestNestDataMappingBeanOrgMapping) /* -> TO ORIGINAL TYPE :[com.mars.component.detail.value.mapping.TestNestDataMappingBean?] */ ,\n        d4?.toTypeOfT() /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.TestDataBean>?] */ ,\n        d5?.mapToType(toTestDataMappingBeanOrgMapping) /* -> TO ORIGINAL TYPE :[kotlin.collections.List<com.mars.component.detail.value.mapping.TestDataMappingBean>?] */ \n      ) }\n\n    val toNullableTestNestDataMappingBeanCtxMapping: TestNestDataMappingBeanOrg?.() ->\n        TestNestDataMappingBeanCtx?\n      get() = { this?.toTestNestDataMappingBeanCtxMapping() }\n\n    val toNullableTestNestDataMappingBeanOrgMapping: TestNestDataMappingBeanCtx?.() ->\n        TestNestDataMappingBeanOrg?\n      get() = { this?.toTestNestDataMappingBeanOrgMapping() }\n\n    /**\n     *  Mapping between :\n     *  com.mars.component.detail.value.mapping.TestDataMappingBean < --- > rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataMappingBean \n     */\n    val toTestDataMappingBeanCtxMapping: TestDataMappingBeanOrg.() -> TestDataMappingBeanCtx\n      get() = { TestDataMappingBeanCtx(\n        d1 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ ,\n        d2 /* -> NO NEED TO MAPPING :[kotlin.String?] */ \n      ) }\n\n    val toTestDataMappingBeanOrgMapping: TestDataMappingBeanCtx.() -> TestDataMappingBeanOrg\n      get() = { TestDataMappingBeanOrg(\n        d1 /* -> NO NEED TO MAPPING :[kotlin.Int?] */ ,\n        d2 /* -> NO NEED TO MAPPING :[kotlin.String?] */ \n      ) }\n\n    val toNullableTestDataMappingBeanCtxMapping: TestDataMappingBeanOrg?.() ->\n        TestDataMappingBeanCtx?\n      get() = { this?.toTestDataMappingBeanCtxMapping() }\n\n    val toNullableTestDataMappingBeanOrgMapping: TestDataMappingBeanCtx?.() ->\n        TestDataMappingBeanOrg?\n      get() = { this?.toTestDataMappingBeanOrgMapping() }\n  }\n\n  @RGenerated(\n    kind = \"aggregate_companion\",\n    by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n    version = \"0.0.1-DEV\"\n  )\n  @Keep\n  companion object : AggregateFactory() {\n    override val URI: String = \"demo://com.mars.rubik-test.detail\"\n\n    override val EVENT_MSGS: List<String> = listOf(\n        \"MY_INIT\",\n        \"MY_DESTROY\",\n        \"MY_CALLBACK_RES\",\n        \"MY_CALLBACK_RES_BEAN\",\n        \"MY_CALLBACK_BEAN\",\n        \"LifeCycleEvent_Init\",\n        \"LifeCycleEvent_Destroy\"\n        )\n\n    override val CREATOR: Function0<Aggregatable> = {DetailAggregate()}\n  }\n}\n\n/**\n * generated Rubik AggregateId.\n *\n * uri: [demo://com.mars.rubik-test.detail] \n * originalToken: \n * [API]api/bigdata/json-array|N|F|T|T|[IVO]getBigJsonArray|F|N|[QUY]array|Array<TestDataBean>|F|F|F[<]|[RST]B|Array<TestDataBean>[<]|ApisBigData|F[<][<]\n * [API]api/bigdata/json-list|N|F|T|T|[IVO]getBigJsonList|F|N|[QUY]list|List<TestDataBean>|F|F|F[<]|[RST]B|List<TestDataBean>[<]|ApisBigData|F[<][<]\n * [API]api/bigdata/lib-array|N|F|T|T|[IVO]getBigLibArray|F|N|[QUY]array|Array<TestDataBean>|F|F|F[<]|[RST]B|Array<TestDataBean>[<]|ApisBigData|F[<][<]\n * [API]api/bigdata/lib-list|N|F|T|T|[IVO]getBigLibList|F|N|[QUY]list|List<TestDataBean>|F|F|F[<]|[RST]B|List<TestDataBean>[<]|ApisBigData|F[<][<]\n * [API]api/bigdata/parcel-array|N|F|T|T|[IVO]getBigParcelArray|F|N|[QUY]array|Array<TestParcelizeBean>|F|F|F[<]|[RST]B|Array<TestParcelizeBean>[<]|ApisBigData|F[<][<]\n * [API]api/bigdata/parcel-arraylist|N|F|T|T|[IVO]getBigParcelArrayList|F|N|[QUY]list|List<TestParcelizeBean>|F|F|F[<]|[RST]B|List<TestParcelizeBean>[<]|ApisBigData|F[<][<]\n * [API]api/bigdata/parcel-list|N|F|T|T|[IVO]getBigParcelList|F|N|[QUY]list|List<TestParcelizeBean>|F|F|F[<]|[RST]B|List<TestParcelizeBean>[<]|ApisBigData|F[<][<]\n * [API]api/serialization/Serializable-bean|N|F|T|T|[IVO]doSthSerializableBean|F|N|[QUY]serializableBean|com.mars.component.detail.value.TestSerializableBean|F|F|F[<]|[RST]B|com.mars.component.detail.value.TestSerializableBean[<]|com.mars.component.detail.api.ApiSerialization|F[<][<]\n * [API]api/serialization/parcel-array|N|F|T|T|[IVO]doSthParcelArray|F|N|[QUY]parcels|Array<TestParcelizeBean>|F|F|F[<]|[RST]B|Array<TestParcelizeBean>[<]|com.mars.component.detail.api.ApiSerialization|F[<][<]\n * [API]api/serialization/parcel-bean|N|F|T|T|[IVO]doSthParcelBean|F|N|[QUY]parcelBean|TestParcelizeBean?|F|F|F[<]|[RST]B|TestParcelizeBean[<]|com.mars.component.detail.api.ApiSerialization|F[<][<]\n * [API]api/serialization/parcel-list|N|F|T|T|[IVO]doSthParcelList|F|N|[QUY]parcels|List<TestParcelizeBean>|F|F|F[<]|[RST]B|List<TestParcelizeBean>[<]|com.mars.component.detail.api.ApiSerialization|F[<][<]\n * [API]create-object-test-create-instance|N|T|T|T|[IVO]ObjectTestCreate|F|N|[QUY]v1|Int|F|F|F[<]|[QUY]v2|String|F|F|F[<]|[RST]B|ObjectTestCreate[<]|ObjectTestCreate|F[<][<]\n * [API]create-object-test-create-instance-by-v1-v2-v3-v4|N|T|T|T|[IVO]ObjectTestCreate|F|N|[QUY]v1|Int|F|F|F[<]|[QUY]v2|Int|F|F|F[<]|[QUY]v3|Int|F|F|F[<]|[QUY]v4|Int|F|F|F[<]|[RST]B|ObjectTestCreate[<]|ObjectTestCreate|F[<][<]\n * [API]create-obj2|N|T|T|T|[IVO]ObjectTest|F|N|[QUY]value|String|F|F|F[<]|[RST]B|ObjectTest[<]|ObjectTest|F[<][<]\n * [API]create-test-default-path-task-instance|java.lang.Object|F|F|F|[IVO]TestDefaultPathTask|F|N|E|[RST]B|TestDefaultPathTask[<]|TestDefaultPathTask|F[<][<]\n * [API]do-sth|N|F|F|F|[IVO]doSth|F|N|E|N|Apis|F[<][<]\n * [API]do-sth-async-3-interface|N|F|F|F|[IVO]doSthAsync2Interface|F|N|[QUY]onResult|com.mars.component.detail.api.Callbackable?|F|F|T[<]|[QUY]onResult2|com.mars.component.detail.api.Callbackable|F|F|T[<]|[QUY]onResult3|com.mars.component.detail.api.BeanCallbackable|F|F|T[<]|N|ApisAsyncReturn|F[<][<]\n * [API]do-sth-async-interface|N|F|F|F|[IVO]doSthAsyncInterface|F|N|[QUY]onResult|com.mars.component.detail.api.Callbackable|F|F|T[<]|N|ApisAsyncReturn|F[<][<]\n * [API]do-sth-async-interface-multi-func|N|F|F|F|[IVO]doSthAsyncInterfaceMultiFunc|F|N|[QUY]onResult|com.mars.component.detail.api.MultiCallback|F|F|T[<]|N|ApisAsyncReturn|F[<][<]\n * [API]do-sth-callback-object|N|F|F|F|[IVO]doSthCallbackObject|T|N|[QUY]callback|com.mars.component.detail.callback.CallbackTestInterface|F|F|F[<]|N|com.mars.component.detail.callback.CallbackTestInterfaceKt|F[<][<]\n * [API]do-sth-create-common-instance|N|F|F|F|[IVO]doSthInCreateObject|F|[OBJ]ObjectTestCreate|create-object-test-create-instance|create-object-test-create-instance-by-v1-v2-v3-v4|do-sth-create-common-instance[<]|[QUY]objectInstance|ObjectTestCreate|F|F|F[<]|[RST]B|TestDataBean[<]|ObjectTestCreate|F[<][<]\n * [API]do-sth-ext|N|F|F|F|[IVO]doSthExt|T|N|[QUY]s|String|F|F|F[<]|[QUY]i|Int|T|F|F[<]|[RST]B|Int[<]|com.mars.component.detail.api.ApisExtKt|F[<][<]\n * [API]2.0/do-sth-hof|N|F|T|F|[IVO]doSthHOF|F|N|[QUY]lambdaArg0|Int|F|F|F[<]|[QUY]lambdaArg1|String|F|F|F[<]|[QUY]lambdaArg2|TestDataBean|F|F|F[<]|[RST]B|Int[<]|Apis|F[<][<]\n * [API]do-sth-in-|N|F|F|F|[IVO]doSthInObject|F|[OBJ]ObjectTest|create-obj2|do-sth-in-|do-sth-in-1|object/get[<]|[QUY]objectInstance|ObjectTest|F|F|F[<]|[RST]B|TestDataBean[<]|ObjectTest|F[<][<]\n * [API]do-sth-in-1|N|F|F|F|[IVO]doSthInObject2|F|[OBJ]ObjectTest|create-obj2|do-sth-in-|do-sth-in-1|object/get[<]|[QUY]objectInstance|ObjectTest|F|F|F[<]|[QUY]v1|String|F|F|F[<]|[QUY]v2|Int?|F|F|F[<]|[QUY]v3|Int?|F|F|F[<]|N|ObjectTest|F[<][<]\n * [API]do-sth-provide-instance-by-constructor|N|F|F|F|[IVO]doSthProvideObject3|F|[AIN]do-sth-provide-instance-by-constructor|[IVO]Task|F|N|[QUY]rubikInstanceValue|String|F|F|F[<]|[RST]B|Task[<]|Task|F[<][<]|[QUY]rubikInstanceValue|String|F|F|F[<]|[QUY]v1|String|F|F|F[<]|[QUY]v2|Int?|F|F|F[<]|[QUY]v3|Int?|F|F|F[<]|N|Task|F[<][<]\n * [API]do-sth-provide-instance-by-func|N|F|F|F|[IVO]doSthProvideObject|F|[AIN]do-sth-provide-instance-by-func|[IVO]provideTask|T|N|E|[RST]B|Task[<]|com.mars.component.detail.api.ApisProvideInstanceKt|F[<][<]|E|N|Task|F[<][<]\n * [API]do-sth-provide-instance-by-func2|N|F|F|F|[IVO]doSthProvideObject2|F|[AIN]do-sth-provide-instance-by-func2|[IVO]provideTask|T|N|E|[RST]B|Task[<]|com.mars.component.detail.api.ApisProvideInstanceKt|F[<][<]|E|N|Task|F[<][<]\n * [API]do-sth-provide-instance-by-parameter-func|N|F|F|F|[IVO]doSthProvideObject2|F|[AIN]do-sth-provide-instance-by-parameter-func|[IVO]provideTask2|T|N|[QUY]rubikInstanceValue|String|F|F|F[<]|[QUY]rubikInstanceV0|Int?|F|F|F[<]|[RST]B|Task[<]|com.mars.component.detail.api.ApisProvideInstanceKt|F[<][<]|[QUY]rubikInstanceValue|String|F|F|F[<]|[QUY]rubikInstanceV0|Int?|F|F|F[<]|[QUY]v1|String|F|F|F[<]|[QUY]v2|Int?|F|F|F[<]|[QUY]v3|Int?|F|F|F[<]|N|Task|F[<][<]\n * [API]do-sth-uri-crash|N|F|F|F|[IVO]doSthUriCrash3|F|N|[QUY]name|String|F|F|F[<]|[QUY]code|String|F|F|F[<]|N|Apis|F[<][<]\n * [API]do-sth-uri-crash-by-name-code-version|N|F|F|F|[IVO]doSthUriCrash4|F|N|[QUY]name|String|F|F|F[<]|[QUY]code|String|F|F|F[<]|[QUY]version|String|F|F|F[<]|N|Apis|F[<][<]\n * [API]doSthAsync2HOF|N|F|F|F|[IVO]doSthAsyncHOF|F|N|[QUY]hof|Function2<String,Int,Unit>|F|F|T[<]|[QUY]hof2|Function2<String,Int,Unit>|F|F|T[<]|N|ApisAsyncReturn|F[<][<]\n * [API]doSthAsyncHOF|N|F|F|F|[IVO]doSthAsyncHOF|F|N|[QUY]hof|Function2<String,TestDataBean,Unit>|F|F|T[<]|N|ApisAsyncReturn|F[<][<]\n * [API]doSthAsyncHOFNullable|N|F|F|F|[IVO]doSthAsyncHOFNullable|F|N|[QUY]hofx1res|Function2<String,TestDataBean,Unit>?|F|F|T[<]|[QUY]hof2xx|Function2<String,TestDataBean,Unit>?|F|F|F[<]|[QUY]hof4xx|kotlin.Function3<String,Int,TestDataBean,TestDataBean?>?|F|F|F[<]|N|ApisAsyncReturn|F[<][<]\n * [API]doSthAsyncOpen|N|F|F|F|[IVO]doSthAsyncOpen|F|N|[QUY]uri|String|F|F|F[<]|[QUY]results|com.mars.component.detail.api.Callback?|F|F|T[<]|N|ApisAsyncReturn|F[<][<]\n * [API]doSthBean|N|F|F|F|[IVO]doSthBean|F|N|[QUY]a1|TestDataBean|F|F|F[<]|[RST]B|com.mars.component.detail.value.TestListBean[<]|Apis|F[<][<]\n * [API]doSthCompanion|N|F|F|F|[IVO]doSthCompanion|F|N|[QUY]i|Int|F|F|F[<]|[QUY]j|String|F|F|F[<]|[QUY]k|Long|F|F|F[<]|[RST]B|String[<]|com.mars.component.detail.api.AipsInCompanion.DetailCompanion|T[<][<]\n * [API]doSthHOFCompanion|N|F|F|F|[IVO]doSthHOFCompanion|T|N|[QUY]lambdaArg0|Int|F|F|F[<]|[RST]B|Int[<]|com.mars.component.detail.api.AipsInCompanion|F[<][<]\n * [API]doSthHOFTop|N|F|F|F|[IVO]doSthHOFTop|T|N|[QUY]lambdaArg0|Unit|F|F|F[<]|[RST]B|Unit[<]|com.mars.component.detail.api.AipsInTopKt|F[<][<]\n * [API]doSthMappingBean|N|F|F|F|[IVO]doSthMappingBean|F|N|[QUY]a1|TestDataMappingBean|F|F|F[<]|[RST]B|TestDataMappingBean[<]|Apis|F[<][<]\n * [API]doSthResultReceiver|N|F|F|F|[IVO]doSthResultReceiver|F|N|[QUY]result|android.os.ResultReceiver|F|F|F[<]|[RST]B|android.os.ResultReceiver[<]|com.mars.component.detail.api.ApisWithResultReceiver|F[<][<]\n * [API]doSthTestNestDataMappingBean|N|F|F|F|[IVO]doSthTestNestDataMappingBean|F|N|[QUY]bean|com.mars.component.detail.value.mapping.TestNestDataMappingBean|F|F|F[<]|[RST]B|com.mars.component.detail.value.mapping.TestNestDataMappingBean[<]|Apis|F[<][<]\n * [API]doSthTop|N|F|F|F|[IVO]doSthTop|T|N|[QUY]ints|Array<Int>|F|F|F[<]|[QUY]li|List<Int?>|F|F|F[<]|[QUY]strings|Array<String>|F|F|F[<]|[QUY]ls|List<String>|F|F|F[<]|[QUY]beans|Array<TestDataBean>|F|F|F[<]|[QUY]lb|List<TestDataBean>|F|F|F[<]|[RST]B|List<TestDataBean>[<]|com.mars.component.detail.api.AipsInTopKt|F[<][<]\n * [API]doSthVararg|N|F|F|F|[IVO]doSthVararg|F|N|[QUY]no|Int|F|F|F[<]|[QUY]varargString|*Array<String>|F|T|F[<]|N|Apis|F[<][<]\n * [API]doSthVarargHof|N|F|F|F|[IVO]doSthVarargHof|F|N|[QUY]no|Int|F|F|F[<]|[QUY]varargString|*Array<kotlin.Function5<android.app.Activity,androidx.lifecycle.ViewModelStoreOwner,androidx.lifecycle.LifecycleOwner,androidx.lifecycle.LifecycleOwner?,androidx.lifecycle.LifecycleOwner?,androidx.lifecycle.LifecycleOwner?>>|F|T|F[<]|N|Apis|F[<][<]\n * [API]doTestDataType1|N|F|T|F|[IVO]doTestDataType1|F|N|[QUY]data|Context?|F|F|F[<]|[RST]B|Context?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType10|N|F|F|F|[IVO]doTestDataType10|F|N|[QUY]resultSuccess|Function1<Int,Unit>|F|F|F[<]|[QUY]resultSuccess2|Function1<String,Unit>|F|F|F[<]|N|TestDataTypeTask|F[<][<]\n * [API]doTestDataType11|N|F|F|F|[IVO]doTestDataType11|F|N|[QUY]resultSuccess|Function2<Int,TestNullableBean,Unit>|F|F|T[<]|[QUY]resultSuccess2|Function1<TestNullableBean?,Unit>|F|F|T[<]|N|TestDataTypeTask|F[<][<]\n * [API]doTestDataType13|N|F|T|F|[IVO]doTestDataType13|F|N|[QUY]data|List<Int?>|F|F|F[<]|[RST]B|List<Int?>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType14|N|F|T|F|[IVO]doTestDataType14|F|N|[QUY]data|ArrayList<Int?>|F|F|F[<]|[RST]B|ArrayList<Int?>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType15|N|F|T|F|[IVO]doTestDataType15|F|N|[QUY]data|List<TestNullableBean?>|F|F|F[<]|[RST]B|List<TestNullableBean?>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType16|N|F|T|F|[IVO]doTestDataType16|F|N|[QUY]data|ArrayList<TestNullableBean?>|F|F|F[<]|[RST]B|ArrayList<TestNullableBean?>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType17|N|F|T|F|[IVO]doTestDataType17|F|N|[QUY]data|List<String?>|F|F|F[<]|[RST]B|List<String?>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType18|N|F|T|F|[IVO]doTestDataType18|F|N|[QUY]data|ArrayList<String?>|F|F|F[<]|[RST]B|ArrayList<String?>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType19|N|F|T|F|[IVO]doTestDataType19|F|N|[QUY]data|ArrayList<kotlin.Pair<String?,Int?>>|F|F|F[<]|[RST]B|ArrayList<kotlin.Pair<String?,Int?>>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType2|N|F|T|F|[IVO]doTestDataType2|F|N|[QUY]data|Int?|F|F|F[<]|[RST]B|Int?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType20|N|F|T|F|[IVO]doTestDataType20|F|N|[QUY]media|kotlin.Pair<Long?,String?>|F|F|F[<]|[RST]B|List<String>?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType21|N|F|T|F|[IVO]doTestDataType21|F|N|[QUY]data|List<TestNullableBean>|F|F|F[<]|[RST]B|List<TestNullableBean>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType22|N|F|T|F|[IVO]doTestDataType22|F|N|[QUY]data|List<TestNullableBean>|F|F|F[<]|[RST]B|List<TestNullableBean>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType23|N|F|T|F|[IVO]doTestDataType23|F|N|[QUY]data|Array<TestNullableBean>|F|F|F[<]|[RST]B|Array<TestNullableBean>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType24|N|F|T|F|[IVO]doTestDataType24|F|N|[QUY]data|Map<String,TestNullableBean>|F|F|F[<]|[RST]B|Map<String,TestNullableBean>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType25|N|F|T|F|[IVO]doTestDataType25|F|N|[QUY]data|Map<String,TestNullableBean>|F|F|F[<]|[RST]B|Map<String,TestNullableBean>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType26|N|F|T|F|[IVO]doTestDataType26|F|N|[QUY]data|kotlin.collections.Set<TestNullableBean>|F|F|F[<]|[RST]B|kotlin.collections.Set<TestNullableBean>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType27|N|F|T|F|[IVO]doTestDataType27|F|N|[QUY]data|kotlin.collections.Set<TestNullableBean>|F|F|F[<]|[RST]B|kotlin.collections.Set<TestNullableBean>[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType3|N|F|T|F|[IVO]doTestDataType3|F|N|[QUY]data|String?|F|F|F[<]|[RST]B|String?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType4|N|F|T|F|[IVO]doTestDataType4|F|N|[QUY]data|TestNullableBean?|F|F|F[<]|[RST]B|TestNullableBean?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType5|N|F|T|F|[IVO]doTestDataType5|F|N|[QUY]data|List<String>?|F|F|F[<]|[RST]B|List<String>?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType6|N|F|T|F|[IVO]doTestDataType6|F|N|[QUY]data|Array<Long>?|F|F|F[<]|[RST]B|Array<Long>?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType7|N|F|T|F|[IVO]doTestDataType7|F|N|[QUY]data|kotlin.LongArray?|F|F|F[<]|[RST]B|kotlin.LongArray?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType8|N|F|T|F|[IVO]doTestDataType8|F|N|[QUY]data|kotlin.IntArray?|F|F|F[<]|[RST]B|kotlin.IntArray?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestDataType9|N|F|T|F|[IVO]doTestDataType9|F|N|[QUY]data|kotlin.BooleanArray?|F|F|F[<]|[RST]B|kotlin.BooleanArray?[<]|TestDataTypeTask|F[<][<]\n * [API]doTestGenericity1|N|F|T|F|[IVO]doTestGenericity1|T|N|[QUY]data|List<TestNullableBean?>?|F|F|F[<]|[RST]B|List<TestNullableBean?>?[<]|TestGenericityTaskKt|F[<][<]\n * [API]doTestGenericity2|N|F|T|F|[IVO]doTestGenericity2|T|N|[QUY]data|LiveData<TestNullableBean?>?|F|F|F[<]|[RST]B|LiveData<TestNullableBean?>?[<]|TestGenericityTaskKt|F[<][<]\n * [API]doTestGenericity3|N|F|T|F|[IVO]doTestGenericity3|T|N|[QUY]data|Map<String,Long?>|F|F|F[<]|[RST]B|Map<String,Long?>[<]|TestGenericityTaskKt|F[<][<]\n * [API]doTestGenericity6|N|F|T|F|[IVO]doTestGenericity6|F|N|[QUY]data|Array<TestNullableBean?>?|F|F|F[<]|[RST]B|Array<TestNullableBean?>?[<]|com.mars.component.detail.test.TestGenericityTask|F[<][<]\n * [API]doTestGenericity7|N|F|T|F|[IVO]doTestGenericity7|F|N|[QUY]data|Array<Long?>?|F|F|F[<]|[RST]B|Array<Long?>?[<]|com.mars.component.detail.test.TestGenericityTask.Companion|T[<][<]\n * [API]doTestGenericity8|N|F|F|F|[IVO]doTestGenericity8|T|N|[QUY]resultSuccess|Function1<ArrayList<String>,Unit>|F|F|F[<]|N|TestGenericityTaskKt|F[<][<]\n * [API]doTestGenericity9|N|F|F|F|[IVO]doTestGenericity9|T|N|[QUY]resultSuccess|Function1<List<String>,Unit>|F|F|F[<]|N|TestGenericityTaskKt|F[<][<]\n * [API]enterprise/business/allocateTicket|N|F|F|F|[IVO]allocateTicket|F|N|[QUY]context|Context|F|F|F[<]|[QUY]shareId|Long|F|F|F[<]|[QUY]count|Int|F|F|F[<]|[QUY]packetType|Int|F|F|F[<]|[RST]B|LiveData<List<String>>?[<]|com.mars.component.detail.api.ApisBadCase|F[<][<]\n * [API]fragment/page1|androidx.fragment.app.Fragment|F|T|T|[IVO]com.mars.component.detail.ui.FirstPageFragment|F|N|E|[RST]B|com.mars.component.detail.ui.FirstPageFragment[<]|com.mars.component.detail.ui.FirstPageFragment|F[<][<]\n * [API]get-a-lot-of-common-instance|N|F|T|T|[IVO]getALotOfObjectTest|T|N|[QUY]i|Int|F|F|F[<]|[RST]B|List<ObjectTest>[<]|ObjectTestKt|F[<][<]\n * [API]get-a-lot-of-common-instance-null|N|F|T|T|[IVO]getALotOfObjectTestNull|T|N|[QUY]i|Int|F|F|F[<]|[RST]B|List<ObjectTest?>?[<]|ObjectTestKt|F[<][<]\n * [API]get-a-other-common-instance|N|F|F|F|[IVO]getAOtherObjectTest|T|N|[QUY]i|Int|F|F|F[<]|[RST]B|ObjectTest[<]|ObjectTestKt|F[<][<]\n * [API]get-a-other-common-instance-null|N|F|F|F|[IVO]getAOtherObjectTestNull|T|N|[QUY]i|Int|F|F|F[<]|[RST]B|ObjectTest?[<]|ObjectTestKt|F[<][<]\n * [API]getFilesMeta|N|F|F|F|[IVO]getFilesMeta|F|N|[QUY]context|Context?|F|F|F[<]|[QUY]path|String?|F|F|F[<]|[QUY]callback|com.mars.component.detail.api.GetFileMetaCallback|F|F|T[<]|N|com.mars.component.detail.api.ApisBadCase|F[<][<]\n * [API]live-data-bean-list/get|N|F|F|F|[IVO]getSthLiveDataBeanList|F|N|E|[RST]B|LiveData<List<com.mars.component.detail.value.TestListBean?>>[<]|com.mars.component.detail.api.ApisWithLiveData|F[<][<]\n * [API]live-data-bean/get|N|F|F|F|[IVO]getSthLiveDataBean|F|N|E|[RST]B|LiveData<TestDataBean>[<]|com.mars.component.detail.api.ApisWithLiveData|F[<][<]\n * [API]live-data/get|N|F|F|F|[IVO]getSthLiveData|F|N|E|[RST]B|LiveData<String>[<]|com.mars.component.detail.api.ApisWithLiveData|F[<][<]\n * [API]object/get|N|F|T|T|[IVO]doSthInObject3|F|[OBJ]ObjectTest|create-obj2|do-sth-in-|do-sth-in-1|object/get[<]|[QUY]objectInstance|ObjectTest|F|F|F[<]|[QUY]v1|String|F|F|F[<]|[QUY]v2|Int?|F|F|F[<]|[QUY]v3|Int?|F|F|F[<]|N|ObjectTest|F[<][<]\n * [API]property/companion|N|F|F|F|[IVO]propertyCompanion|T|N|E|[RST]B|String[<]|com.mars.component.detail.api.AipsInCompanion|F[<][<]\n * [API]1.0/property/property|N|F|F|F|[IVO]property|F|N|E|[RST]B|String[<]|Apis|F[<][<]\n * [API]property/top|N|F|F|F|[IVO]propertyTop|T|N|E|[RST]B|String[<]|com.mars.component.detail.api.AipsInTopKt|F[<][<]\n * [API]send-back-a-lot-of-common-instance|N|F|T|T|[IVO]senBackALotOfObjectTest|T|N|[QUY]objs|Map<String,ObjectTest>|F|F|F[<]|N|ObjectTestKt|F[<][<]\n * [API]send-back-a-lot-of-common-instance-null|N|F|T|T|[IVO]senBackALotOfObjectTesNull|T|N|[QUY]objs|Map<String?,ObjectTest?>?|F|F|F[<]|N|ObjectTestKt|F[<][<]\n * [API]send-back-common-instance|N|F|F|F|[IVO]senBackObjectTest|T|N|[QUY]obj|ObjectTest|F|F|F[<]|N|ObjectTestKt|F[<][<]\n * [API]send-back-common-instance-null|N|F|F|F|[IVO]senBackObjectTestNull|T|N|[QUY]obj|ObjectTest?|F|F|F[<]|N|ObjectTestKt|F[<][<]\n * [API]sth-navigation-only/{uri}|N|T|F|F|[IVO]getSthNavigationOnly|F|N|[QUY]uri|String|F|F|F[<]|[RST]B|String[<]|Apis|F[<][<]\n * [API]sth/{id}/a-{name}?code1={code1}&code2={code2}|N|F|F|F|[IVO]getSth|F|N|[QUY]id|String|F|F|F[<]|[QUY]name|String|F|F|F[<]|[QUY]code1|String|F|F|F[<]|[QUY]code2|String|F|F|F[<]|[RST]B|String[<]|Apis|F[<][<]\n * [API]test-bean/create|N|F|F|F|[IVO]com.mars.component.detail.value.TestCreateBean|F|N|[QUY]d1|Int?|F|F|F[<]|[QUY]d2|String?|F|F|F[<]|[RST]B|com.mars.component.detail.value.TestCreateBean[<]|com.mars.component.detail.value.TestCreateBean|F[<][<]\n * [API]test-name|N|F|T|T|[IVO]testName|F|N|E|N|TestDefaultPathTask|F[<][<]\n * [API]test-name-string|N|F|T|T|[IVO]testNameString|F|N|E|[RST]B|String[<]|TestDefaultPathTask|F[<][<]\n * [API]testGenericity4|N|F|T|F|[IVO]testGenericity4|F|N|E|[RST]B|List<String?>[<]|com.mars.component.detail.test.TestGenericityTask|F[<][<]\n * [API]testGenericity5|N|F|T|F|[IVO]testGenericity5|F|N|[QUY]lambdaArg0|List<String?>?|F|F|F[<]|[RST]B|List<String?>?[<]|com.mars.component.detail.test.TestGenericityTask|F[<][<]\n * [API]test_name_up|N|F|T|T|[IVO]TEST_NAME_UP|F|N|E|N|TestDefaultPathTask|F[<][<]\n * [API]view/get|N|F|F|F|[IVO]getView|F|N|[QUY]context|Context|F|F|F[<]|[RST]B|android.view.View?[<]|Apis|F[<][<]\n * [ACT]activity/page1|B|F|T|com.mars.component.detail.ui.FirstPageActivity|[PRT]key_5_bean|N|TestDataBean?[<]|[PRT]key_1_pa|N|TestCompanionBean?[<]|[PRT]key_2_pa_ar|N|Array<TestCompanionBean>?[<]|[PRT]key_c_pa_li|N|List<TestCompanionBean>?[<]|[PRT]key_3_int|N|Int[<]|[PRT]uri|N|String?[<]|[PRT]key_4_strs|serializable|List<String>?[<]|[PRT]key_a_ints|N|List<Int>?[<][<]\n * [ACT]activity/page1_from_detail|B|F|T|com.mars.component.detail.ui.FirstPageActivity|[PRT]key_5_bean|N|TestDataBean?[<]|[PRT]key_int_for_detail|N|Int?[<]|[PRT]key_int_for_all|N|Int?[<]|[PRT]key_1_pa|N|TestCompanionBean?[<]|[PRT]key_2_pa_ar|N|Array<TestCompanionBean>?[<]|[PRT]key_c_pa_li|N|List<TestCompanionBean>?[<]|[PRT]key_3_int|N|Int[<]|[PRT]uri|N|String?[<]|[PRT]key_4_strs|serializable|List<String>?[<]|[PRT]key_a_ints|N|List<Int>?[<][<]\n * [ACT]activity/page1_from_home|B|F|T|com.mars.component.detail.ui.FirstPageActivity|[PRT]key_5_bean|N|TestDataBean?[<]|[PRT]key_int_for_home|N|Int?[<]|[PRT]key_int_for_all|N|Int?[<]|[PRT]key_1_pa|N|TestCompanionBean?[<]|[PRT]key_2_pa_ar|N|Array<TestCompanionBean>?[<]|[PRT]key_c_pa_li|N|List<TestCompanionBean>?[<]|[PRT]key_3_int|N|Int[<]|[PRT]uri|N|String?[<]|[PRT]key_4_strs|serializable|List<String>?[<]|[PRT]key_a_ints|N|List<Int>?[<][<]\n * [ACT]activity/page2/{key_str1}/{key_str2}/{key_str3}|B|F|T|com.mars.component.detail.ui.SecondPageActivity|[PRT]key_str1|N|String?[<]|[PRT]key_str2|N|String?[<]|[PRT]key_str3|N|String?[<][<]\n * [EVT]LifeCycleEvent_Destroy|B|[IVO]destroy|F|N|E|[RST]B|Unit[<]|com.mars.component.detail.event.EventsWithLambda|F[<][<]\n * [EVT]LifeCycleEvent_Destroy|B|[IVO]onDestroy|F|N|[QUY]context|Context|F|F|F[<]|[QUY]parameter1|String|F|F|F[<]|N|com.mars.component.detail.event.Events|F[<][<]\n * [EVT]LifeCycleEvent_Init|B|[IVO]init|F|N|E|[RST]B|Unit[<]|com.mars.component.detail.event.EventsWithLambda|F[<][<]\n * [EVT]LifeCycleEvent_Init|B|[IVO]onInit|F|N|[QUY]context|Context|F|F|F[<]|[QUY]parameter1|String|F|F|F[<]|N|com.mars.component.detail.event.Events|F[<][<]\n * [EVT]MY_CALLBACK_BEAN|events-by-instance|[IVO]onCallbackBean|F|[EIN]events-by-instance|[IVO]provideEve|T|N|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[RST]B|EventsByInstance[<]|EventsKt|F[<][<]|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[QUY]arg1|Any|F|F|F[<]|[QUY]bean|TestDataBean|F|F|F[<]|N|EventsByInstance|F[<][<]\n * [EVT]MY_CALLBACK_RES|events-by-instance|[IVO]onCallbackRes|F|[EIN]events-by-instance|[IVO]provideEve|T|N|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[RST]B|EventsByInstance[<]|EventsKt|F[<][<]|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[QUY]arg1|Any|F|F|F[<]|[QUY]result|Function1<Int,Unit>|F|F|T[<]|N|EventsByInstance|F[<][<]\n * [EVT]MY_CALLBACK_RES_BEAN|events-by-instance|[IVO]onCallbackResBean|F|[EIN]events-by-instance|[IVO]provideEve|T|N|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[RST]B|EventsByInstance[<]|EventsKt|F[<][<]|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[QUY]arg1|Any|F|F|F[<]|[QUY]result|Function1<TestDataBean,Unit>|F|F|T[<]|N|EventsByInstance|F[<][<]\n * [EVT]MY_DESTROY|events-by-instance|[IVO]onDestroy|F|[EIN]events-by-instance|[IVO]provideEve|T|N|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[RST]B|EventsByInstance[<]|EventsKt|F[<][<]|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[QUY]arg1|Any|F|F|F[<]|[QUY]arg2|Any|F|F|F[<]|[QUY]arg3|Any|F|F|F[<]|N|EventsByInstance|F[<][<]\n * [EVT]MY_INIT|events-by-instance|[IVO]onInit|F|[EIN]events-by-instance|[IVO]provideEve|T|N|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[RST]B|EventsByInstance[<]|EventsKt|F[<][<]|[QUY]rubikInstanceBool|Boolean|F|F|F[<]|[QUY]arg1|Any|F|F|F[<]|[QUY]arg2|Any|F|F|F[<]|[QUY]arg3|Any|F|F|F[<]|N|EventsByInstance|F[<][<]\n * [VLE]TestCompanionBean|E|E|[FLD]Int|E|0|F[<]|[FLD]String|E|N|F[<]|[FLD]Int|E|33|T[<]|[FLD]String|E|\"CONST_COMP\"|T[<]|[FLD]kotlin.Float|E|0.1F|T[<][<]\n * [VLE]com.mars.component.detail.value.TestCreateBean|E|E|[FLD]Int?|[ANT]SerializedName|value = \"data1\"[<]|N|F[<]|[FLD]String?|[ANT]SerializedName|value = \"data2\"[<]|N|F[<][<]\n * [VLE]TestDataBean|E|E|[FLD]Int?|[ANT]SerializedName|value = \"data1\"[<]|N|F[<]|[FLD]String?|[ANT]SerializedName|value = \"data2\"[<]|N|F[<][<]\n * [VLE]com.mars.component.detail.value.TestListBean|E|E|[FLD]Int|[ANT]SerializedName|value = \"data1\"[<]|0|F[<]|[FLD]List<String>?|E|N|F[<][<]\n * [VLE]TestNullableBean|E|E|[FLD]Int?|[ANT]SerializedName|value = \"ddd111\"[<]|N|F[<]|[FLD]String?|[ANT]SerializedName|value = \"ddd222\"[<]|N|F[<][<]\n * [VLE]TestParcelizeBean|android.os.Parcelable|[ANT]kotlinx.android.parcel.Parcelize|E[<]|[FLD]Int?|E|N|F[<]|[FLD]String?|E|N|F[<][<]\n * [VLE]com.mars.component.detail.value.TestSerializableBean|E|E|[FLD]Int?|[ANT]SerializedName|value = \"data1\"[<]|N|F[<]|[FLD]String?|[ANT]SerializedName|value = \"data2\"[<]|N|F[<][<]\n * [VLE]TestDataMappingBean|E|E|[FLD]Int?|E|N|F[<]|[FLD]String?|E|N|F[<][<]\n * [VLE]com.mars.component.detail.value.mapping.TestNestDataMappingBean|E|E|[FLD]TestDataBean?|E|N|F[<]|[FLD]TestDataMappingBean?|E|N|F[<]|[FLD]com.mars.component.detail.value.mapping.TestNestDataMappingBean?|E|N|F[<]|[FLD]List<TestDataBean>?|E|N|F[<]|[FLD]List<TestDataMappingBean>?|E|N|F[<][<]\n * [OBJ]ObjectTest|create-obj2|do-sth-in-|do-sth-in-1|object/get[<]\n * [OBJ]ObjectTestCreate|create-object-test-create-instance|create-object-test-create-instance-by-v1-v2-v3-v4|do-sth-create-common-instance[<]\n * [CBO]com.mars.component.detail.callback.CallbackTestDefault|[IVF]callbackDefault1|[QUY]int1|Int|F|F|F[<]|N|F[<]|[IVF]callbackDefault2|[QUY]bean|TestDataBean?|F|F|F[<]|N|F[<][<]\n * [CBO]com.mars.component.detail.callback.CallbackTestInterface|[IVF]callbackInt|[QUY]i|Int|F|F|F[<]|N|F[<]|[IVF]callbackBean|[QUY]bean|TestDataBean|F|F|F[<]|N|F[<]|[IVF]callbackBeanReBean|[QUY]bean|TestDataBean?|F|F|F[<]|N|F[<][<]\n * [MAP]Any->kotlin.Any[<]\n * [MAP]Apis->com.mars.component.detail.api.Apis[<]\n * [MAP]ApisAsyncReturn->com.mars.component.detail.api.ApisAsyncReturn[<]\n * [MAP]ApisBigData->com.mars.component.detail.api.ApisBigData[<]\n * [MAP]Array->kotlin.Array[<]\n * [MAP]ArrayList->kotlin.collections.ArrayList[<]\n * [MAP]Boolean->kotlin.Boolean[<]\n * [MAP]Context->android.content.Context[<]\n * [MAP]EventsByInstance->com.mars.component.detail.event.EventsByInstance[<]\n * [MAP]EventsKt->com.mars.component.detail.event.EventsKt[<]\n * [MAP]Function1->kotlin.Function1[<]\n * [MAP]Function2->kotlin.Function2[<]\n * [MAP]Int->kotlin.Int[<]\n * [MAP]List->kotlin.collections.List[<]\n * [MAP]LiveData->androidx.lifecycle.LiveData[<]\n * [MAP]Long->kotlin.Long[<]\n * [MAP]Map->kotlin.collections.Map[<]\n * [MAP]ObjectTest->com.mars.component.detail.objekt.ObjectTest[<]\n * [MAP]ObjectTestCreate->com.mars.component.detail.objekt.ObjectTestCreate[<]\n * [MAP]ObjectTestKt->com.mars.component.detail.objekt.ObjectTestKt[<]\n * [MAP]SerializedName->com.google.gson.annotations.SerializedName[<]\n * [MAP]String->kotlin.String[<]\n * [MAP]Task->com.mars.component.detail.api.Task[<]\n * [MAP]TestCompanionBean->com.mars.component.detail.value.TestCompanionBean[<]\n * [MAP]TestDataBean->com.mars.component.detail.value.TestDataBean[<]\n * [MAP]TestDataMappingBean->com.mars.component.detail.value.mapping.TestDataMappingBean[<]\n * [MAP]TestDataTypeTask->com.mars.component.detail.test.TestDataTypeTask[<]\n * [MAP]TestDefaultPathTask->com.mars.component.detail.test.TestDefaultPathTask[<]\n * [MAP]TestGenericityTaskKt->com.mars.component.detail.test.TestGenericityTaskKt[<]\n * [MAP]TestNullableBean->com.mars.component.detail.value.TestNullableBean[<]\n * [MAP]TestParcelizeBean->com.mars.component.detail.value.TestParcelizeBean[<]\n * [MAP]Unit->kotlin.Unit[<]\n * [MAP]create-obj2->create-object-test-instance[<]\n * [MAP]do-sth-in-->do-sth-in-common-instance[<]\n * [MAP]do-sth-in-1->do-sth-in-common-instance-parameter[<]\n * [MAP]object/get->object/get/do-sth-in-common-ins[<]\n * [MAP]provideEve->provideEventsInstance[<] \n * version: 0.0.1-DEV\n */\n@RGenerated(\n  kind = \"aggregate_Id\",\n  by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n  version = \"0.0.1-DEV\"\n)\n@RAggregate(\n  uri = \"demo://com.mars.rubik-test.detail\",\n  version = \"0.0.1-DEV\",\n  token = \"23234bceab3ea7b3508a03d64e91cf41\"\n)\n@Keep\nclass DetailAggregateId :\n    RAggregateId(uri = \"demo://com.mars.rubik-test.detail\", version = \"0.0.1-DEV\", token = \"23234bceab3ea7b3508a03d64e91cf41\")\n"
  },
  {
    "path": "demo/demo_component_detail/src/main/res/layout/activity_a1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout 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    <TextView\n        android:id=\"@+id/text_hello\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\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\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "demo/demo_component_detail/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">ComponentA</string>\n</resources>\n"
  },
  {
    "path": "demo/demo_component_detail_java/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n\n        consumerProguardFiles 'consumer-rules.pro'\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\n\nandroidExtensions {\n    experimental = true\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.core:core-ktx:1.0.2'\n    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'\n    implementation 'com.google.code.gson:gson:2.8.5'\n\n    implementation project(':demo:demo_until_library_a')\n}\n\n//rubik{\n//    component {\n//        uri 'demo://com.mars.rubik-test.detail-java1'\n//    }\n//}"
  },
  {
    "path": "demo/demo_component_detail_java/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "demo/demo_component_detail_java/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": "demo/demo_component_detail_java/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mars.component.detail.java\">\n    <application android:label=\"@string/app_name\">\n        <activity android:name=\".ui.FirstPageActivity\"/>\n        <activity android:name=\".ui.SecondActivity\"/>\n    </application>\n</manifest>"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/aggregate/rubik/generate/aggregate/demo_com_mars_rubik_test_detail_java/DetailJavaAggregate.kt",
    "content": "package rubik.generate.aggregate.demo_com_mars_rubik_test_detail_java\n\nimport android.content.Context\nimport androidx.annotation.Keep\nimport com.mars.component.detail.java.api.Apis\nimport com.mars.component.detail.java.api.ApisAsyncReturn\nimport com.mars.component.detail.java.api.ApisForInstance\nimport com.mars.component.detail.java.api.callback.Callback\nimport com.mars.component.detail.java.api.callback.Callbackable\nimport com.mars.component.detail.java.test.TestJavaDataType\nimport com.mars.component.detail.java.ui.FirstPageActivity\nimport com.mars.component.detail.java.ui.SecondActivity\nimport com.rubik.annotations.source.RAggregate\nimport com.rubik.annotations.source.RGenerated\nimport com.rubik.context.Aggregatable\nimport com.rubik.context.AggregateFactory\nimport com.rubik.identity.RAggregateId\nimport com.rubik.route.mapping.castToTypeOfT\nimport com.rubik.route.mapping.mapToType\nimport com.rubik.route.mapping.toTypeOfT\nimport kotlin.Array\nimport kotlin.Function0\nimport kotlin.Int\nimport kotlin.Long\nimport kotlin.LongArray\nimport kotlin.String\nimport kotlin.Unit\nimport kotlin.collections.List\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.DetailJavaRouteActions\nimport com.mars.component.detail.java.value.TestJavaBean as TestJavaBeanOrg\nimport com.rubik.activity.Launcher as RubikLauncher\nimport com.rubik.route.Queries as RubikQueries\nimport com.rubik.route.ResultGroups as RubikResultGroups\nimport com.rubik.route.Result as RubikResult\nimport com.rubik.router.uri.Path as RubikPath\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.TestJavaBean as TestJavaBeanCtx\n\n/**\n * aggregate router function and router event of Rubik Context.\n *\n * uri: [demo://com.mars.rubik-test.detail-java] \n * version: 0.0.1-DEV\n */\n@RGenerated(\n  kind = \"aggregate\",\n  by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n  version = \"0.0.1-DEV\"\n)\n@Keep\nclass DetailJavaAggregate : Aggregatable, DetailJavaRouteActions {\n  override fun onEvent(msg: String, queries: RubikQueries) {\n    when (msg){\n      else -> { }\n    }\n  }\n\n  override fun onRoute(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"doTestDataType1\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType1(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType1-2\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType12(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType2\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType2(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType2-2\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType22(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType3\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType3(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType4\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType4(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType5\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType5(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType6\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType6(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"doTestDataType7\" == path ->  {\n        val data = queries.value(0, null)\n        doTestDataType7(data.castToTypeOfT()).apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"do-sth-bean-provide-instance-by-func\" == path ->  {\n        val rubikInstanceValue = queries.value(0, null)\n        val d1 = queries.value(1, null)\n        val routeResultTransformer: (TestJavaBeanCtx) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthBeanProvideInstanceByFunc(rubikInstanceValue.castToTypeOfT(), d1.castToTypeOfT(), routeResultTransformer)\n      }\n      \"doSth\" == path ->  {\n        doSth()\n      }\n      \"1.0/property/property\" == path ->  {\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        propertyProperty(routeResultTransformer)\n      }\n      \"doSthStatic\" == path ->  {\n        val i = queries.value(0, null)\n        val j = queries.value(1, null)\n        val k = queries.value(2, null)\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        doSthStatic(i.castToTypeOfT(), j.castToTypeOfT(), k.castToTypeOfT(), routeResultTransformer)\n      }\n      \"property/static\" == path ->  {\n        val routeResultTransformer: (String) -> Unit = { lambdaArg0 ->\n          results.set(0, RubikResult(lambdaArg0))\n        }\n        propertyStatic(routeResultTransformer)\n      }\n      \"do-sth-async-open\" == path ->  {\n        val onCallCallback: (String?, Int) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        doSthAsyncOpen(onCallCallback)\n      }\n      else -> { onRouteExt1(path, queries, results) }\n    }\n  }\n\n  private fun onRouteExt1(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"do-sth-async-interface\" == path ->  {\n        val onCallCallback: (String?, Int) -> Unit = { lambdaArg0, lambdaArg1 ->\n          results.set(0, RubikResult(lambdaArg0),RubikResult(lambdaArg1))\n        }\n        doSthAsyncInterface(onCallCallback)\n      }\n      \"activity/java_page1\" == path ->  {\n        // com.mars.component.detail.java.ui.FirstPageActivity\n        // - parameters:\n        // --- key_str4 : kotlin.collections.List<kotlin.String>?\n        // --- key_str5 : kotlin.collections.List<com.mars.component.detail.java.value.TestJavaBean>?\n        // --- key_str6 : kotlin.Array<com.mars.component.detail.java.value.TestJavaBean>?\n        RubikLauncher().launch(FirstPageActivity::class.java, queries, null, results)\n      }\n      RubikPath(\"activity/java_page2/{key_str1}/{key_str2}/{key_str3}\").matching(path) ->  {\n        // com.mars.component.detail.java.ui.SecondActivity\n        // - parameters:\n        // --- key_str1 : kotlin.String?\n        // --- key_str2 : kotlin.String?\n        // --- key_str3 : kotlin.Int?\n        RubikLauncher().launch(SecondActivity::class.java, queries, RubikPath(\"activity/java_page2/{key_str1}/{key_str2}/{key_str3}\").getParameters(path), results)\n      }\n      else -> { throw com.rubik.route.exception.BadPathOrVersionException(path) }\n    }\n  }\n\n  override fun doTestDataType1(data: Context): Context? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType1\n    // - parameters:\n    // --- data : android.content.Context\n    // - resultType:\n    // --- android.content.Context\n    return TestJavaDataType().doTestDataType1(\n      data /* -> NO NEED TO MAPPING :[android.content.Context] */ \n    ) /* -> NO NEED TO MAPPING :[android.content.Context] */ \n  }\n\n  override fun doTestDataType12(data: Context?): Context? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType1_2\n    // - parameters:\n    // --- data : android.content.Context?\n    // - resultType:\n    // --- android.content.Context?\n    return TestJavaDataType().doTestDataType1_2(\n      data /* -> NO NEED TO MAPPING :[android.content.Context?] */ \n    ) /* -> NO NEED TO MAPPING :[android.content.Context?] */ \n  }\n\n  override fun doTestDataType2(data: Int?): Int? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType2\n    // - parameters:\n    // --- data : kotlin.Int?\n    // - resultType:\n    // --- kotlin.Int?\n    return TestJavaDataType().doTestDataType2(\n      data /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Int?] */ \n  }\n\n  override fun doTestDataType22(data: Int): Int? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType2_2\n    // - parameters:\n    // --- data : kotlin.Int\n    // - resultType:\n    // --- kotlin.Int\n    return TestJavaDataType().doTestDataType2_2(\n      data /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n  }\n\n  override fun doTestDataType3(data: String?): String? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType3\n    // - parameters:\n    // --- data : kotlin.String?\n    // - resultType:\n    // --- kotlin.String?\n    return TestJavaDataType().doTestDataType3(\n      data /* -> NO NEED TO MAPPING :[kotlin.String?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.String?] */ \n  }\n\n  override fun doTestDataType4(data: TestJavaBeanCtx?): TestJavaBeanCtx? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType4\n    // - parameters:\n    // --- data : com.mars.component.detail.java.value.TestJavaBean?\n    // - resultType:\n    // --- com.mars.component.detail.java.value.TestJavaBean?\n    return TestJavaDataType().doTestDataType4(\n      data?.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.java.value.TestJavaBean?] */ \n    )?.toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail_java.TestJavaBean?] */ \n  }\n\n  override fun doTestDataType5(data: List<String>?): List<String>? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType5\n    // - parameters:\n    // --- data : kotlin.collections.List<kotlin.String>?\n    // - resultType:\n    // --- kotlin.collections.List<kotlin.String>?\n    return TestJavaDataType().doTestDataType5(\n      data /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String>?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.collections.List<kotlin.String>?] */ \n  }\n\n  override fun doTestDataType6(data: Array<Long>?): Array<Long>? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType6\n    // - parameters:\n    // --- data : kotlin.Array<kotlin.Long>?\n    // - resultType:\n    // --- kotlin.Array<kotlin.Long>?\n    return TestJavaDataType().doTestDataType6(\n      data /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.Long>?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.Array<kotlin.Long>?] */ \n  }\n\n  override fun doTestDataType7(data: LongArray?): LongArray? {\n    // com.mars.component.detail.java.test.TestJavaDataType.doTestDataType7\n    // - parameters:\n    // --- data : kotlin.LongArray?\n    // - resultType:\n    // --- kotlin.LongArray?\n    return TestJavaDataType().doTestDataType7(\n      data /* -> NO NEED TO MAPPING :[kotlin.LongArray?] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.LongArray?] */ \n  }\n\n  override fun doSthBeanProvideInstanceByFunc(\n    rubikInstanceValue: String,\n    d1: TestJavaBeanCtx,\n    routeResultTransformer: (TestJavaBeanCtx) -> Unit\n  ) {\n    // com.mars.component.detail.java.api.ApisForInstance.doSthBean\n    // - parameters:\n    // --- d1 : com.mars.component.detail.java.value.TestJavaBean\n    // - resultType:\n    // --- com.mars.component.detail.java.value.TestJavaBean\n    routeResultTransformer(ApisForInstance(\n      rubikInstanceValue /* -> NO NEED TO MAPPING :[kotlin.String] */ \n    ) /* -> NO NEED TO MAPPING :[com.mars.component.detail.java.api.ApisForInstance] */ .doSthBean(\n      d1.toTypeOfT() /* -> TO ORIGINAL TYPE :[com.mars.component.detail.java.value.TestJavaBean] */ \n    ).toTypeOfT() /* -> TO CONTEXT TYPE :[rubik.generate.context.demo_com_mars_rubik_test_detail_java.TestJavaBean] */ )\n  }\n\n  override fun doSth() {\n    // com.mars.component.detail.java.api.Apis.doSth\n    // - resultType:\n    // --- null\n    Apis().doSth()\n  }\n\n  override fun propertyProperty(routeResultTransformer: (String) -> Unit) {\n    // com.mars.component.detail.java.api.Apis.property\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(Apis().property /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun doSthStatic(\n    i: Int,\n    j: String,\n    k: Long,\n    routeResultTransformer: (String) -> Unit\n  ) {\n    // com.mars.component.detail.java.api.Apis.doSthCompanion\n    // - parameters:\n    // --- i : kotlin.Int\n    // --- j : kotlin.String\n    // --- k : kotlin.Long\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(com.mars.component.detail.java.api.Apis.doSthCompanion(\n      i /* -> NO NEED TO MAPPING :[kotlin.Int] */ ,\n      j /* -> NO NEED TO MAPPING :[kotlin.String] */ ,\n      k /* -> NO NEED TO MAPPING :[kotlin.Long] */ \n    ) /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun propertyStatic(routeResultTransformer: (String) -> Unit) {\n    // com.mars.component.detail.java.api.Apis.propertyCompanion\n    // - resultType:\n    // --- kotlin.String\n    routeResultTransformer(com.mars.component.detail.java.api.Apis.propertyCompanion /* -> NO NEED TO MAPPING :[kotlin.String] */ )\n  }\n\n  override fun doSthAsyncOpen(onCallCallback: (String?, Int) -> Unit) {\n    // com.mars.component.detail.java.api.ApisAsyncReturn.doSthAsyncOpen\n    // - parameters:\n    // --- onResult : com.mars.component.detail.java.api.callback.Callback\n    // - resultType:\n    // --- null\n    val onResultCallbackTransformer = object : Callback() {\n      override fun onCall(v1: String?, v2: Int) {\n        onCallCallback(\n          v1 /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n          v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n        )}\n    }\n    ApisAsyncReturn().doSthAsyncOpen(\n      onResultCallbackTransformer\n    )\n  }\n\n  override fun doSthAsyncInterface(onCallCallback: (String?, Int) -> Unit) {\n    // com.mars.component.detail.java.api.ApisAsyncReturn.doSthAsyncInterface\n    // - parameters:\n    // --- onResult : com.mars.component.detail.java.api.callback.Callbackable\n    // - resultType:\n    // --- null\n    val onResultCallbackTransformer = object : Callbackable {\n      override fun onCall(v1: String?, v2: Int) {\n        onCallCallback(\n          v1 /* -> NO NEED TO MAPPING :[kotlin.String?] */ ,\n          v2 /* -> NO NEED TO MAPPING :[kotlin.Int] */ \n        )}\n    }\n    ApisAsyncReturn().doSthAsyncInterface(\n      onResultCallbackTransformer\n    )\n  }\n\n  @RGenerated(\n    kind = \"aggregate_companion\",\n    by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n    version = \"0.0.1-DEV\"\n  )\n  @Keep\n  companion object : AggregateFactory() {\n    override val URI: String = \"demo://com.mars.rubik-test.detail-java\"\n\n    override val EVENT_MSGS: List<String> = listOf()\n\n    override val CREATOR: Function0<Aggregatable> = {DetailJavaAggregate()}\n  }\n}\n\n/**\n * generated Rubik AggregateId.\n *\n * uri: [demo://com.mars.rubik-test.detail-java] \n * originalToken: \n * [API]do-sth-async-interface|N|F|F|F|[IVO]doSthAsyncInterface|F|N|[QUY]onResult|com.mars.component.detail.java.api.callback.Callbackable|F|F|T[<]|N|com.mars.component.detail.java.api.ApisAsyncReturn|F[<][<]\n * [API]do-sth-async-open|N|F|F|F|[IVO]doSthAsyncOpen|F|N|[QUY]onResult|com.mars.component.detail.java.api.callback.Callback|F|F|T[<]|N|com.mars.component.detail.java.api.ApisAsyncReturn|F[<][<]\n * [API]do-sth-bean-provide-instance-by-func|N|F|F|F|[IVO]doSthBean|F|[AIN]do-sth-bean-provide-instance-by-func|[IVO]com.mars.component.detail.java.api.ApisForInstance|F|N|[QUY]rubikInstanceValue|String|F|F|F[<]|[RST]B|com.mars.component.detail.java.api.ApisForInstance[<]|com.mars.component.detail.java.api.ApisForInstance|F[<][<]|[QUY]rubikInstanceValue|String|F|F|F[<]|[QUY]d1|TestJavaBean|F|F|F[<]|[RST]B|TestJavaBean[<]|com.mars.component.detail.java.api.ApisForInstance|F[<][<]\n * [API]doSth|N|F|F|F|[IVO]doSth|F|N|E|N|com.mars.component.detail.java.api.Apis|F[<][<]\n * [API]doSthStatic|N|F|F|F|[IVO]doSthCompanion|T|N|[QUY]i|Int|F|F|F[<]|[QUY]j|String|F|F|F[<]|[QUY]k|kotlin.Long|F|F|F[<]|[RST]B|String[<]|com.mars.component.detail.java.api.Apis|F[<][<]\n * [API]doTestDataType1|N|F|T|F|[IVO]doTestDataType1|F|N|[QUY]data|android.content.Context|F|F|F[<]|[RST]B|android.content.Context[<]|TestJavaDataType|F[<][<]\n * [API]doTestDataType1-2|N|F|T|F|[IVO]doTestDataType1_2|F|N|[QUY]data|android.content.Context?|F|F|F[<]|[RST]B|android.content.Context?[<]|TestJavaDataType|F[<][<]\n * [API]doTestDataType2|N|F|T|F|[IVO]doTestDataType2|F|N|[QUY]data|Int?|F|F|F[<]|[RST]B|Int?[<]|TestJavaDataType|F[<][<]\n * [API]doTestDataType2-2|N|F|T|F|[IVO]doTestDataType2_2|F|N|[QUY]data|Int|F|F|F[<]|[RST]B|Int[<]|TestJavaDataType|F[<][<]\n * [API]doTestDataType3|N|F|T|F|[IVO]doTestDataType3|F|N|[QUY]data|String?|F|F|F[<]|[RST]B|String?[<]|TestJavaDataType|F[<][<]\n * [API]doTestDataType4|N|F|T|F|[IVO]doTestDataType4|F|N|[QUY]data|TestJavaBean?|F|F|F[<]|[RST]B|TestJavaBean?[<]|TestJavaDataType|F[<][<]\n * [API]doTestDataType5|N|F|T|F|[IVO]doTestDataType5|F|N|[QUY]data|kotlin.collections.List<String>?|F|F|F[<]|[RST]B|kotlin.collections.List<String>?[<]|TestJavaDataType|F[<][<]\n * [API]doTestDataType6|N|F|T|F|[IVO]doTestDataType6|F|N|[QUY]data|kotlin.Array<kotlin.Long>?|F|F|F[<]|[RST]B|kotlin.Array<kotlin.Long>?[<]|TestJavaDataType|F[<][<]\n * [API]doTestDataType7|N|F|T|F|[IVO]doTestDataType7|F|N|[QUY]data|kotlin.LongArray?|F|F|F[<]|[RST]B|kotlin.LongArray?[<]|TestJavaDataType|F[<][<]\n * [API]1.0/property/property|N|F|F|F|[IVO]property|F|N|E|[RST]B|String[<]|com.mars.component.detail.java.api.Apis|F[<][<]\n * [API]property/static|N|F|F|F|[IVO]propertyCompanion|T|N|E|[RST]B|String[<]|com.mars.component.detail.java.api.Apis|F[<][<]\n * [ACT]activity/java_page1|B|F|T|com.mars.component.detail.java.ui.FirstPageActivity|[PRT]key_str4|serializable|kotlin.collections.List<String>?[<]|[PRT]key_str5|value|kotlin.collections.List<TestJavaBean>?[<]|[PRT]key_str6|value|kotlin.Array<TestJavaBean>?[<][<]\n * [ACT]activity/java_page2/{key_str1}/{key_str2}/{key_str3}|B|F|T|com.mars.component.detail.java.ui.SecondActivity|[PRT]key_str1|N|String?[<]|[PRT]key_str2|N|String?[<]|[PRT]key_str3|N|Int?[<][<]\n * [VLE]TestJavaBean|E|E|[FLD]Int|[ANT]com.google.gson.annotations.SerializedName|value = \"ddd111\"[<]|N|F[<]|[FLD]String?|[ANT]com.google.gson.annotations.SerializedName|value = \"ddd222\"[<]|[ANT]androidx.annotation.Nullable|E[<]|N|F[<][<]\n * [MAP]Int->kotlin.Int[<]\n * [MAP]String->kotlin.String[<]\n * [MAP]TestJavaBean->com.mars.component.detail.java.value.TestJavaBean[<]\n * [MAP]TestJavaDataType->com.mars.component.detail.java.test.TestJavaDataType[<] \n * version: 0.0.1-DEV\n */\n@RGenerated(\n  kind = \"aggregate_Id\",\n  by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n  version = \"0.0.1-DEV\"\n)\n@RAggregate(\n  uri = \"demo://com.mars.rubik-test.detail-java\",\n  version = \"0.0.1-DEV\",\n  token = \"7c5174bb8aaea699e6ab6eec60230bf7\"\n)\n@Keep\nclass DetailJavaAggregateId :\n    RAggregateId(uri = \"demo://com.mars.rubik-test.detail-java\", version = \"0.0.1-DEV\", token = \"7c5174bb8aaea699e6ab6eec60230bf7\")\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/api/Apis.java",
    "content": "package com.mars.component.detail.java.api;\n\nimport com.rubik.annotations.route.RRoute;\n\npublic class Apis extends BaseApis {\n\n    // 无参无返回值\n    @RRoute(path = \"doSth\")\n    public void doSth() {\n        println(\" AP DBG JAVA doSth  begin !!!\");\n    }\n\n    // 属性\n    @RRoute(path = \"property/property\", version = \"1.0\")\n    public String property = \"vbn\";\n\n\n\n    // static方法\n    @RRoute(path = \"doSthStatic\")\n    public static String doSthCompanion(int i, String j, Long k) {\n        println(\" AP DBG JAVA doSthCompanion begin !!! i:\" + i + \" j:\" + j + \" k:\" + k);\n        return \"result = i:\" + i + \" j:\" + j + \" k:\" + k;\n    }\n\n    /**\n     * static属性\n     */\n    @RRoute(path = \"property/static\")\n    public static String propertyCompanion = \"bnm3\";\n\n}\n\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/api/ApisAsyncReturn.java",
    "content": "package com.mars.component.detail.java.api;\n\nimport com.mars.component.detail.java.api.callback.Callback;\nimport com.mars.component.detail.java.api.callback.Callbackable;\nimport com.rubik.annotations.route.RResult;\nimport com.rubik.annotations.route.RRoute;\n\npublic class ApisAsyncReturn extends BaseApis {\n    // 接口异步返回\n    @RRoute(path = \"do-sth-async-open\")\n    public void doSthAsyncOpen(@RResult Callback onResult) {\n        println(\" AP DBG JAVA doSthAsyncOpen begin !!!\");\n        onResult.onCall(\"zxc\", 33);\n    }\n\n    @RRoute(path = \"do-sth-async-interface\")\n    public void doSthAsyncInterface(@RResult Callbackable onResult) {\n        println(\" AP DBG JAVA doSthAsyncInterface begin !!!\");\n        onResult.onCall(\"zxc\", 33);\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/api/ApisForInstance.java",
    "content": "package com.mars.component.detail.java.api;\n\nimport com.mars.component.detail.java.value.TestJavaBean;\nimport com.rubik.annotations.route.RRoute;\nimport com.rubik.annotations.route.instance.RRouteInstance;\n\npublic class ApisForInstance extends BaseApis {\n\n    private final String value;\n\n    @RRouteInstance(provideForPath = \"do-sth-bean-provide-instance-by-func\")\n    public ApisForInstance(String value) {\n        this.value = value;\n    }\n\n    // Bean参数返回值\n    @RRoute(path = \"do-sth-bean-provide-instance-by-func\")\n    public TestJavaBean doSthBean(TestJavaBean d1) {\n        println(\" AP DBG doSthBean value \" + value + \" begin d1:\" + d1.d1 + \"!!!\");\n        return new TestJavaBean(55, \"dd\");\n    }\n}"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/api/BaseApis.java",
    "content": "package com.mars.component.detail.java.api;\n\npublic class BaseApis {\n    public static void println(String msg) {\n        System.out.println(msg);\n    }\n}\n\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/api/callback/Callback.java",
    "content": "package com.mars.component.detail.java.api.callback;\n\nimport androidx.annotation.Nullable;\n\nimport com.rubik.annotations.route.RResult;\n\npublic class Callback {\n    public void onCallNone(String v1, int v2) {\n        // nothing\n    }\n\n    @RResult\n    public void onCall(@Nullable String v1, int v2) {\n        // nothing\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/api/callback/Callbackable.java",
    "content": "package com.mars.component.detail.java.api.callback;\n\nimport androidx.annotation.Nullable;\n\npublic interface Callbackable {\n    void onCall(@Nullable String v1, int v2);\n}\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/test/TestJavaDataType.java",
    "content": "package com.mars.component.detail.java.test;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.mars.component.detail.java.value.TestJavaBean;\nimport com.rubik.annotations.route.RRoute;\n\nimport java.util.List;\n\npublic class TestJavaDataType {\n    private static void println(String msg) {\n        System.out.println(msg);\n    }\n\n    @RRoute(path = \"doTestDataType1\", forResult = true)\n    @NonNull\n    public Context doTestDataType1(@NonNull Context data) {\n        println(\" AP DBG JAVA doTestDataType1 Context !!!\");\n        return data;\n    }\n\n    @RRoute(path = \"doTestDataType1-2\", forResult = true)\n    @Nullable\n    public Context doTestDataType1_2(@Nullable Context data) {\n        println(\" AP DBG JAVA doTestDataType1 Context !!!\");\n        return data;\n    }\n\n    @RRoute(path = \"doTestDataType2\", forResult = true)\n    @Nullable\n    public Integer doTestDataType2(@Nullable Integer data) {\n        println(\" AP DBG JAVA doTestDataType2 Int !!!\");\n        return data;\n    }\n\n    @RRoute(path = \"doTestDataType2-2\", forResult = true)\n    public int doTestDataType2_2(int data) {\n        println(\" AP DBG JAVA doTestDataType2 Int !!!\");\n        return data;\n    }\n\n    @RRoute(path = \"doTestDataType3\", forResult = true)\n    @Nullable\n    public String doTestDataType3(@Nullable String data) {\n        println(\" AP DBG JAVA doTestDataType3 String !!!\");\n        return data;\n    }\n\n    @RRoute(path = \"doTestDataType4\", forResult = true)\n    @Nullable\n    public TestJavaBean doTestDataType4(@Nullable TestJavaBean data) {\n        println(\" AP DBG JAVA doTestDataType4 A1Bean!!!\");\n        return data;\n    }\n\n    @RRoute(path = \"doTestDataType5\", forResult = true)\n    @Nullable\n    public List<String> doTestDataType5( @Nullable List<String> data){\n        println(\" AP DBG JAVA doTestDataType5 List<String>!!!\");\n        return data;\n    }\n\n    @RRoute(path = \"doTestDataType6\", forResult = true)\n    @Nullable\n    public Long[] doTestDataType6(@Nullable Long[] data) {\n        println(\" AP DBG JAVA doTestDataType6 Long[] !!!\");\n        return data;\n    }\n\n    @RRoute(path = \"doTestDataType7\", forResult = true)\n    @Nullable\n    public long[] doTestDataType7(@Nullable long[] data) {\n        println(\" AP DBG JAVA doTestDataType7long[] !!!\");\n        return data;\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/ui/FirstPageActivity.java",
    "content": "package com.mars.component.detail.java.ui;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport android.os.Bundle;\nimport android.widget.TextView;\n\nimport com.google.gson.reflect.TypeToken;\nimport com.mars.component.detail.java.R;\nimport com.mars.component.detail.java.value.TestJavaBean;\nimport com.rubik.annotations.route.RProperty;\nimport com.rubik.annotations.route.page.RPage;\nimport com.rubik.router.Router;\n\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AppCompatActivity;\n\n//import com.mars.util_library.TestClassB;\n\n@RPage(path = \"activity/java_page1\")\npublic class FirstPageActivity extends AppCompatActivity {\n\n    @Nullable\n    @RProperty(name = \"key_str4\", extra = \"serializable\")\n    private List<String> str4;\n\n    @Nullable\n    @RProperty(name = \"key_str5\", extra = \"value\")\n    private List<TestJavaBean> str5;\n\n    @Nullable\n    @RProperty(name = \"key_str6\", extra = \"value\")\n    private TestJavaBean[] str6;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_d1);\n        str4 = (ArrayList<String>) getIntent().getExtras().get(\"key_str4\");\n        str5 = Router.valueProperty(getIntent(), \"key_str5\", new TypeToken<List<TestJavaBean>>() { } . getType());\n        str6 = Router.valueProperty(getIntent(), \"key_str6\", new TypeToken<TestJavaBean[]>() { } . getType());\n\n        ((TextView) findViewById(R.id.text_hello)).setText(\"Hello D1 !!\\n\" + str4.get(0) + \"\\n\" + str5.get(0).d1 + \"\\n\" + str6[0].d1 + \"\\n\");\n\n//        ((TextView) findViewById(R.id.text_modules)).setText(\"A : \"+ new TestClassA().getTestTag() +\"\\n\" + \"B : \"+ new TestClassB().getTestTag() + \"\\n\" );\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/ui/SecondActivity.java",
    "content": "package com.mars.component.detail.java.ui;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.widget.TextView;\n\nimport com.mars.component.detail.java.R;\nimport com.rubik.annotations.route.RProperty;\nimport com.rubik.annotations.route.page.RPage;\n\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AppCompatActivity;\n\n@RPage(path = \"activity/java_page2/{key_str1}/{key_str2}/{key_str3}\")\npublic class SecondActivity extends AppCompatActivity {\n\n    @Nullable\n    @RProperty(name = \"key_str1\")\n    private String str1;\n\n    @Nullable\n    @RProperty(name = \"key_str2\")\n    private String str2;\n\n    @Nullable\n    @RProperty(name = \"key_str3\")\n    private int str3;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_d1);\n        str1 = getIntent().getStringExtra(\"key_str1\");\n        str2 = getIntent().getStringExtra(\"key_str2\");\n        String str3_3 = getIntent().getExtras().get(\"key_str3\") + \"\";\n\n        ((TextView) findViewById(R.id.text_hello)).setText(\"Hello D2 !!\\n\" +\n                str1 + \"\\n\" +\n                str2 + \"\\n\" +\n                str3_3 + \"\\n\");\n\n        Intent intent = new Intent();\n        intent.putExtra(\"data\", \"data from D2\");\n        setResult(200, intent);\n\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/java/com/mars/component/detail/java/value/TestJavaBean.java",
    "content": "package com.mars.component.detail.java.value;\n\nimport androidx.annotation.Nullable;\n\nimport com.google.gson.annotations.SerializedName;\nimport com.rubik.annotations.route.RValue;\n\n@RValue\npublic class TestJavaBean {\n    public TestJavaBean(int d1, String d2) {\n        this.d1 = d1;\n        this.d2 = d2;\n    }\n\n    @SerializedName(\"ddd111\")\n    public int d1;\n    @SerializedName(\"ddd222\")\n    @Nullable\n    private String d2;\n}\n"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/res/layout/activity_d1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"vertical\">\n\n    <TextView\n      android:id=\"@+id/text_hello\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\" />\n\n    <TextView\n      android:id=\"@+id/text_modules\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\" />\n\n</LinearLayout>"
  },
  {
    "path": "demo/demo_component_detail_java/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">ComponentD</string>\n</resources>\n"
  },
  {
    "path": "demo/demo_component_home/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n\n        consumerProguardFiles 'consumer-rules.pro'\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\n\nandroidExtensions {\n    experimental = true\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.core:core-ktx:1.0.2'\n    api 'com.google.code.gson:gson:2.8.5'\n\n    implementation project(path: ':demo:demo_until_library_a')\n\n}\n"
  },
  {
    "path": "demo/demo_component_home/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "demo/demo_component_home/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\n"
  },
  {
    "path": "demo/demo_component_home/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mars.component.home\" >\n    <application android:label=\"@string/app_name\">\n        <activity android:name=\".ui.HomeActivity\"/>\n        <activity android:name=\".ui.java.JavaHomeActivity\"/>\n    </application>\n</manifest>"
  },
  {
    "path": "demo/demo_component_home/src/main/aggregate/rubik/generate/aggregate/demo_com_mars_rubik_test_home/HomeAggregate.kt",
    "content": "package rubik.generate.aggregate.demo_com_mars_rubik_test_home\n\nimport androidx.annotation.Keep\nimport com.mars.component.home.api.TestOne\nimport com.mars.component.home.event.Events\nimport com.rubik.annotations.source.RAggregate\nimport com.rubik.annotations.source.RGenerated\nimport com.rubik.context.Aggregatable\nimport com.rubik.context.AggregateFactory\nimport com.rubik.identity.RAggregateId\nimport com.rubik.route.mapping.castToTypeOfT\nimport com.rubik.route.mapping.mapToType\nimport com.rubik.route.mapping.toTypeOfT\nimport kotlin.Function0\nimport kotlin.String\nimport kotlin.collections.List\nimport rubik.generate.context.demo_com_mars_rubik_test_home.HomeRouteActions\nimport com.rubik.activity.Launcher as RubikLauncher\nimport com.rubik.route.Queries as RubikQueries\nimport com.rubik.route.ResultGroups as RubikResultGroups\nimport com.rubik.route.Result as RubikResult\nimport com.rubik.router.uri.Path as RubikPath\n\n/**\n * aggregate router function and router event of Rubik Context.\n *\n * uri: [demo://com.mars.rubik-test.home] \n * version: 0.0.2\n */\n@RGenerated(\n  kind = \"aggregate\",\n  by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n  version = \"0.0.2\"\n)\n@Keep\nclass HomeAggregate : Aggregatable, HomeRouteActions {\n  override fun onEvent(msg: String, queries: RubikQueries) {\n    when (msg){\n      \"LifeCycleEvent_Init\" ->  {\n        // com.mars.component.home.event.Events.myInit\n        // - resultType:\n        // --- null\n        Events().myInit()}\n      \"MY\" ->  {\n        // com.mars.component.home.event.Events.myDestory\n        // - resultType:\n        // --- null\n        Events().myDestory()}\n      \"LifeCycleEvent_Destroy\" ->  {\n        // com.mars.component.home.event.Events.myDestory\n        // - resultType:\n        // --- null\n        Events().myDestory()}\n      else -> { }\n    }\n  }\n\n  override fun onRoute(\n    path: String,\n    queries: RubikQueries,\n    results: RubikResultGroups\n  ) {\n    when {\n      \"getName\" == path ->  {\n        getName().apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      \"getName1\" == path ->  {\n        getName1().apply {\n          results.set(0, RubikResult(this))\n        }\n      }\n      else -> { throw com.rubik.route.exception.BadPathOrVersionException(path) }\n    }\n  }\n\n  override fun getName(): String? {\n    // com.mars.component.home.api.TestOne.getName\n    // - resultType:\n    // --- kotlin.String\n    return TestOne().getName() /* -> NO NEED TO MAPPING :[kotlin.String] */ \n  }\n\n  override fun getName1(): String? {\n    // com.mars.component.home.api.TestOne.getName1\n    // - resultType:\n    // --- kotlin.String\n    return TestOne().getName1() /* -> NO NEED TO MAPPING :[kotlin.String] */ \n  }\n\n  @RGenerated(\n    kind = \"aggregate_companion\",\n    by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n    version = \"0.0.2\"\n  )\n  @Keep\n  companion object : AggregateFactory() {\n    override val URI: String = \"demo://com.mars.rubik-test.home\"\n\n    override val EVENT_MSGS: List<String> = listOf(\n        \"LifeCycleEvent_Init\",\n        \"MY\",\n        \"LifeCycleEvent_Destroy\"\n        )\n\n    override val CREATOR: Function0<Aggregatable> = {HomeAggregate()}\n  }\n}\n\n/**\n * generated Rubik AggregateId.\n *\n * uri: [demo://com.mars.rubik-test.home] \n * originalToken: \n * [API]getName|N|F|T|T|[IVO]getName|F|N|E|[RST]B|kotlin.String[<]|com.mars.component.home.api.TestOne|F[<][<]\n * [API]getName1|N|F|T|T|[IVO]getName1|F|N|E|[RST]B|kotlin.String[<]|com.mars.component.home.api.TestOne|F[<][<]\n * [EVT]LifeCycleEvent_Destroy|B|[IVO]myDestory|F|N|E|N|com.mars.component.home.event.Events|F[<][<]\n * [EVT]LifeCycleEvent_Init|B|[IVO]myInit|F|N|E|N|com.mars.component.home.event.Events|F[<][<]\n * [EVT]MY|B|[IVO]myDestory|F|N|E|N|com.mars.component.home.event.Events|F[<][<] \n * version: 0.0.2\n */\n@RGenerated(\n  kind = \"aggregate_Id\",\n  by = \"rubik-kapt:1.10.0.0-K1_5-LOCAL\",\n  version = \"0.0.2\"\n)\n@RAggregate(\n  uri = \"demo://com.mars.rubik-test.home\",\n  version = \"0.0.2\",\n  token = \"271a57ab84a08d315a9eb178127a6776\"\n)\n@Keep\nclass HomeAggregateId :\n    RAggregateId(uri = \"demo://com.mars.rubik-test.home\", version = \"0.0.2\", token = \"271a57ab84a08d315a9eb178127a6776\")\n"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/api/TestOne.kt",
    "content": "package com.mars.component.home.api\n\nimport com.rubik.annotations.route.function.RFunction\n\nclass TestOne {\n    @RFunction(path = \"getName\")\n    fun getName() = \"name\"\n\n    @RFunction(path = \"getName1\")\n    fun getName1() = \"name1\"\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/event/Events.kt",
    "content": "package com.mars.component.home.event\n\nimport com.rubik.annotations.context.REvent\nimport com.rubik.context.LifeCycleEvent\n\nclass Events {\n    @REvent(msg = LifeCycleEvent.INIT)\n    fun myInit(){\n        println(\" CT DBG init HOME begin  !!!\")\n    }\n\n    @REvent(msg = LifeCycleEvent.DESTROY)\n    @REvent(msg = \"MY\")\n    fun myDestory(){\n        println(\" CT DBG destroy HOME begin !!!\")\n    }\n\n}\n"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/java/TestJavaInvokeBuilderTask.java",
    "content": "package com.mars.component.home.test.java;\n\nimport android.content.Context;\n\nimport com.rubik.router.Router;\n\nimport kotlin.Unit;\nimport kotlin.jvm.functions.Function1;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestListBean;\n\npublic class TestJavaInvokeBuilderTask {\n    public void invoke(Context context, Function1<String, Unit> onFinish) {\n        String tag = \" B JAVA BUILDER TASK \";\n\n        Router.touch(DetailContext.URI, () -> {\n            onFinish.invoke(\" XX DBG B touch AContext.URI：touch!!!\");\n            return null;\n        }).miss(() -> {\n            onFinish.invoke(\" XX DBG B touch AContext.URI：miss!!!\");\n            return null;\n        });\n\n        Router.touch(\"yyyyy\", () -> {\n            onFinish.invoke(\" XX DBG B touch yyyyy：touch!!!\");\n            return null;\n        }).miss(() -> {\n            onFinish.invoke(\" XX DBG B touch yyyyy：miss!!!\");\n            return null;\n        });\n\n        Object results1 = Router.builder()\n                .uri(DetailContext.Uris.DO_STH_HOF)\n                .with(\"a0\", 10)\n                .with(\"a1\", \"889\")\n                .with(\"a2\", new TestDataBean(2, \"567\"))\n                .build()\n                .routeForResult(Integer.TYPE);\n        onFinish.invoke(tag + \" NA DBG doSthHOF doSthHOFResult1:\" + results1);\n\n        Router.builder()\n                .uri(DetailContext.Uris.DO_STH_BEAN)\n                .with(\"a1\", new TestDataBean(33, \"xxx\"))\n                .result(value -> {\n                    onFinish.invoke(tag + \" NA DBG doSthBean value:\" + ((TestListBean) value).getD1());\n                    return null;\n                })\n                .build()\n                .route();\n\n\n    }\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/java/TestJavaInvokeFunctionTask.java",
    "content": "package com.mars.component.home.test.java;\n\nimport android.content.Context;\n\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.Fragment;\nimport kotlin.Unit;\nimport kotlin.jvm.functions.Function1;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean;\n\npublic class TestJavaInvokeFunctionTask {\n    public void invoke(Context context, Function1<String, Unit> onFinish) {\n        // 无参无返回值\n\n        String tag = \" B JAVA FUNCTION TASK \";\n\n        DetailContext.touch(() -> {\n            onFinish.invoke(\" XX DBG B touch AContext.URI：touch!!!\");\n            return null;\n        }).miss(() -> {\n            onFinish.invoke(\" XX DBG B touch AContext.URI：miss!!!\");\n            return null;\n        });\n\n        DetailContext.doSth();\n\n        // 高阶函数\n        @Nullable\n        Integer doSthHOFResult = DetailContext.doSthHof(3, \"123\", new TestDataBean(1, \"456\"));\n\n        onFinish.invoke(tag+\" NA DBG doSthHOF doSthHOFResult:\"+doSthHOFResult);\n\n        // 属性\n        DetailContext.propertyProperty(value -> {\n            onFinish.invoke(tag+\" NA DBG propertyProperty value:\"+value);\n            return null;\n        });\n\n        // 高阶函数异步返回\n        DetailContext.doSthAsync2HOF((v1, v2) -> {\n            onFinish.invoke(tag + \" NA DBG doSthAsyncHOF 1 value:\" + v1 + \",\" + v2);\n            return null;\n        },(v1, v2) -> {\n            onFinish.invoke(tag + \" NA DBG doSthAsyncHOF 2 value:\" + v1 + \",\" + v2);\n            return null;\n        });\n\n        // 接口异步返回\n        DetailContext.doSthAsyncOpen(\"textUri\", (v1, v2) -> {\n            onFinish.invoke(tag + \" NA DBG doSthAsyncOpen value:\" + v1 + \",\" + v2);\n            return null;\n        });\n\n        DetailContext.doSthAsyncInterface ((v1, v2) -> {\n            onFinish.invoke(tag + \" NA DBG doSthAsyncInterface value:\" + v1 + \",\" + v2);\n            return null;\n        });\n\n        // 返回View\n        DetailContext.viewGet(context, view -> {\n            onFinish.invoke(tag + \" NA DBG getView value:\" + view);\n            return null;\n        });\n\n        // Companion方法\n        DetailContext.doSthCompanion(8, \"asd\", 22L, value -> {\n            onFinish.invoke(tag + \" NA DBG doSthCompanion value:\" + value);\n            return null;\n        });\n\n        // Companion属性\n        DetailContext.propertyCompanion(value -> {\n            onFinish.invoke(tag + \" NA DBG propertyCompanion value:\" + value);\n            return null;\n        });\n\n        // Companion高阶函数\n        DetailContext.doSthHOFCompanion(6, value -> {\n            onFinish.invoke(tag + \" NA DBG doSthHOFCompanion value:\" + value);\n            return null;\n        });\n\n        // Bean参数返回值\n        DetailContext.doSthBean(new TestDataBean(8, null), value -> {\n            onFinish.invoke(tag + \" NA DBG doSthBean:\" + value.getD1());\n            return null;\n        });\n\n        // 指定返回类型\n        Fragment result = DetailContext.Fragment.page1();\n\n        onFinish.invoke(tag + \" NA DBG makeApiFragment value:\" + result);\n    }\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/java/TestJavaInvokeJavaFunctionTask.java",
    "content": "package com.mars.component.home.test.java;\n\nimport android.content.Context;\n\nimport kotlin.Unit;\nimport kotlin.jvm.functions.Function1;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.DetailJavaContext;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.TestJavaBean;\n\npublic class TestJavaInvokeJavaFunctionTask {\n    public void invoke(Context context, Function1<String, Unit> onFinish) {\n        // 无参无返回值\n\n        String tag = \" B JAVA FUNCTION TASK \";\n\n        DetailJavaContext.touch(() -> {\n            onFinish.invoke(\" XX DBG B touch DJavaContext.URI：touch!!!\");\n            return null;\n        }).miss(() -> {\n            onFinish.invoke(\" XX DBG B touch DJavaContext.URI：miss!!!\");\n            return null;\n        });\n\n        // 无参无返回值\n        DetailJavaContext.doSth();\n\n        // 属性\n        DetailJavaContext.propertyProperty(value -> {\n            onFinish.invoke(tag+\" NA DBG JAVA propertyProperty value:\"+value);\n            return null;\n        });\n\n        // 接口异步返回\n        DetailJavaContext.doSthAsyncOpen((v1, v2) -> {\n            onFinish.invoke(tag + \" NA DBG JAVA doSthAsyncOpen value:\" + v1 + \",\" + v2);\n            return null;\n        });\n\n        DetailJavaContext.doSthAsyncInterface ((v1, v2) -> {\n            onFinish.invoke(tag + \" NA DBG JAVA doSthAsyncInterface value:\" + v1 + \",\" + v2);\n            return null;\n        });\n\n        // Companion方法\n        DetailJavaContext.doSthStatic(8, \"asd\", 22L, value -> {\n            onFinish.invoke(tag + \" NA DBG JAVA doSthCompanion value:\" + value);\n            return null;\n        });\n\n        // Companion属性\n        DetailJavaContext.propertyStatic(value -> {\n            onFinish.invoke(tag + \" NA DBG JAVA propertyCompanion value:\" + value);\n            return null;\n        });\n\n        // Bean参数返回值\n        DetailJavaContext.doSthBeanProvideInstanceByFunc(\"msg from HOME\", new TestJavaBean(8, null), value -> {\n            onFinish.invoke(tag + \" NA DBG JAVA doSthBean:\" + value.getD1());\n            return null;\n        });\n    }\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/kotlin/TestBigData.kt",
    "content": "package com.mars.component.home.test.kotlin\n\nimport android.content.Context\nimport com.ktnail.x.Logger\nimport com.mars.util_library.TestLibDataBean\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean\n\n\nclass TestBigData {\n    fun invoke(context: Context, onFinish: (String) -> Unit) {\n        // 无参无返回值\n        val tag = \" B FUNCTION TASK \"\n\n        val testArraySize = 199999\n        val testListSize = 199999\n\n        val startTimeAL = System.currentTimeMillis()\n        val resultAL = DetailContext.Api.Bigdata.libArray(Array(testArraySize){\n            TestDataBean(it, \"from home! array:$it\")\n        })\n        val alCost = System.currentTimeMillis() - startTimeAL\n        \"$tag TestBigData ARRAY LIB size:${resultAL?.size} cost:$alCost \".let { log->\n            Logger.d(log)\n            onFinish(log)\n        }\n\n        val startTimeAP = System.currentTimeMillis()\n        val resultAP =DetailContext.Api.Bigdata.parcelArray(Array(testArraySize){\n            TestParcelizeBean(it, \"from home! array:$it\")\n        })\n        val apCost = System.currentTimeMillis() - startTimeAP\n        \"$tag TestBigData ARRAY PARCEL size:${resultAP?.size} cost:$apCost \".let { log->\n            Logger.d(log)\n            onFinish(log)\n        }\n\n        val startTimeAJ = System.currentTimeMillis()\n        val resultAJ = DetailContext.Api.Bigdata.jsonArray(Array(testArraySize){\n            TestDataBean(it, \"from home! array:$it\")\n        })\n        val ajCost = System.currentTimeMillis() - startTimeAJ\n        \"$tag TestBigData ARRAY JSON size:${resultAJ?.size} cost:$ajCost \".let { log->\n            Logger.d(log)\n            onFinish(log)\n        }\n\n\n        val startTimeLL = System.currentTimeMillis()\n        val resultLL = DetailContext.Api.Bigdata.libList(MutableList(testListSize){\n            TestDataBean(it, \"from home! list:$it\")\n        })\n        val llCost = System.currentTimeMillis() - startTimeLL\n        \"$tag TestBigData List LIB size:${resultLL?.size} cost:$llCost \".let { log->\n            Logger.d(log)\n            onFinish(log)\n        }\n\n        val startTimeLP = System.currentTimeMillis()\n        val resultLP = DetailContext.Api.Bigdata.parcelList(List(testListSize){\n            TestParcelizeBean(it, \"from home! list:$it\")\n        })\n        val lpCost = System.currentTimeMillis() - startTimeLP\n        \"$tag TestBigData List PARCEL size:${resultLP?.size} cost:$lpCost \".let { log->\n            Logger.d(log)\n            onFinish(log)\n        }\n\n        val startTimeALP = System.currentTimeMillis()\n        val resultALP = DetailContext.Api.Bigdata.parcelArraylist(MutableList(testListSize){\n            TestParcelizeBean(it, \"from home! arrayList:$it\")\n        })\n        val alpCost = System.currentTimeMillis() - startTimeALP\n        \"$tag TestBigData ArrayList PARCEL size:${resultALP?.size} cost:$alpCost \".let { log->\n            Logger.d(log)\n            onFinish(log)\n        }\n\n        val startTimeLJ = System.currentTimeMillis()\n        val resultLJ = DetailContext.Api.Bigdata.jsonList(List(testListSize){\n            TestDataBean(it, \"from home! list:$it\")\n        })\n        val ljCost = System.currentTimeMillis() - startTimeLJ\n        \"$tag TestBigData List JSON size:${resultLJ?.size} cost:$ljCost \".let { log->\n            Logger.d(log)\n            onFinish(log)\n        }\n\n\n\n    }\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/kotlin/TestDataType.kt",
    "content": "package com.mars.component.home.test.kotlin\n\nimport android.content.Context\nimport com.rubik.logger.Logger\nimport com.rubik.router.navigate\nimport com.rubik.router.navigateForResult\nimport com.rubik.router.result\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestNullableBean\n\nfun invokeDataType(context: Context) {\n\n    Logger.d(\" AP DBG doTestDataType1 result: ${DetailContext.doTestDataType1(null)}\")\n    Logger.d(\" AP DBG doTestDataType2 result: ${DetailContext.doTestDataType2(null)}\")\n    Logger.d(\" AP DBG doTestDataType3 result: ${DetailContext.doTestDataType3(null)}\")\n    Logger.d(\" AP DBG doTestDataType4 result: ${DetailContext.doTestDataType4(null)}\")\n    Logger.d(\" AP DBG doTestDataType5 result: ${DetailContext.doTestDataType5(null)}\")\n    Logger.d(\" AP DBG doTestDataType6 result: ${DetailContext.doTestDataType6(null)}\")\n    Logger.d(\" AP DBG doTestDataType7 result: ${DetailContext.doTestDataType7(null)}\")\n    Logger.d(\" AP DBG doTestDataType8 result: ${DetailContext.doTestDataType8(null)}\")\n    Logger.d(\" AP DBG doTestDataType9 result: ${DetailContext.doTestDataType9(null)}\")\n\n    Logger.d(\" AP DBG doTestDataType1 result: ${DetailContext.doTestDataType1(context)}\")\n    Logger.d(\" AP DBG doTestDataType2 result: ${DetailContext.doTestDataType2(101)}\")\n    Logger.d(\" AP DBG doTestDataType3 result: ${DetailContext.doTestDataType3(\"102\")}\")\n    Logger.d(\" AP DBG doTestDataType4 result: ${DetailContext.doTestDataType4(TestNullableBean(202, \"203\"))}\")\n    Logger.d(\n        \" AP DBG doTestDataType5 result: ${DetailContext.doTestDataType5(\n            mutableListOf(\n                \"AA11\",\n                \"BB22\"\n            )\n        )}\"\n    )\n    Logger.d(\" AP DBG doTestDataType6 result: ${DetailContext.doTestDataType6(arrayOf(111L, 222L))}\")\n    Logger.d(\" AP DBG doTestDataType7 result: ${DetailContext.doTestDataType7(longArrayOf(111L, 222L))}\")\n    Logger.d(\" AP DBG doTestDataType7-2 result: ${navigateForResult<LongArray> {\n        uri = DetailContext.Uris.DO_TEST_DATA_TYPE7\n        query {\n            \"data\" with longArrayOf(111L, 222L)\n        }\n    }}\")\n    Logger.d(\" AP DBG doTestDataType8 result: ${DetailContext.doTestDataType8(intArrayOf(11, 22))}\")\n    Logger.d(\n        \" AP DBG doTestDataType9 result: ${DetailContext.doTestDataType9(\n            booleanArrayOf(\n                true,\n                false\n            )\n        )}\"\n    )\n\n    navigate {\n        uri=DetailContext.Uris.DO_TEST_DATA_TYPE10\n        query {\n            \"1\" with object : Function1<Int, Unit> {\n                override fun invoke(p1: Int) {\n                    Logger.d(\" AP DBG HOF doTestDataType10_1 result: $p1  dsl!! \")\n                }\n            }\n            \"2\" with object : Function1<String, Unit> {\n                override fun invoke(p1: String) {\n                    Logger.d(\" AP DBG HOF doTestDataType10_2 result: $p1  dsl!! \")\n                }\n            }\n        }\n    }\n\n    DetailContext.doTestDataType10 ({\n        Logger.d(\" AP DBG HOF doTestDataType10_1 result: $it  !! \")\n    },{\n        Logger.d(\" AP DBG HOF doTestDataType10_2 result: $it  !! \")\n    })\n\n    navigate {\n        uri = DetailContext.Uris.DO_TEST_DATA_TYPE11\n        result<Int, TestNullableBean> { d1, d2 ->\n            Logger.d(\" AP DBG HOF doTestDataType11_1 result: $d1  ${d2.d2}  dsl!! \")\n        }\n        result<TestNullableBean?> {\n            Logger.d(\" AP DBG HOF doTestDataType11_1 result: ${it?.d2}  dsl!! \")\n        }\n    }\n\n    DetailContext.doTestDataType11({ d1, d2 ->\n        Logger.d(\" AP DBG HOF doTestDataType11_1 result: $d1  ${d2.d2} !! \")\n    }, {\n        Logger.d(\" AP DBG HOF doTestDataType11_1 result: ${it?.d2}  !! \")\n    })\n    \n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/kotlin/TestKotlinInvokeActionFunctionJavaTask.kt",
    "content": "package com.mars.component.home.test.kotlin\n\nimport android.content.Context\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.DetailJavaContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.TestJavaBean\n\nclass TestKotlinInvokeActionFunctionJavaTask {\n    fun invoke(context: Context, onFinish: (String) -> Unit) {\n\n        val tag = \" B FUNCTION TASK \"\n\n        DetailJavaContext.touch {\n            onFinish(\" XX DBG B touch DetailJavaContext.URI：touch!!!\")\n        }.miss {\n            onFinish(\" XX DBG B touch DetailJavaContext.URI：miss!!!\")\n        }\n\n        // 无参无返回值\n        DetailJavaContext.doSth()\n\n        // 属性\n        DetailJavaContext.propertyProperty { value -> onFinish(\"$tag NA DBG JAVA propertyProperty value:$value\") }\n\n        // 接口异步返回\n        DetailJavaContext.doSthAsyncOpen {  v1, v2 ->\n            onFinish(\"$tag NA DBG JAVA doSthAsyncOpen value:$v1,$v2\")\n        }\n\n        DetailJavaContext.doSthAsyncInterface {  v1, v2 ->\n            onFinish(\"$tag NA DBG JAVA doSthAsyncInterface value:$v1,$v2\")\n        }\n\n        // Companion方法\n        DetailJavaContext.doSthStatic(8,\"asd\",22L){value ->\n            onFinish(\"$tag NA DBG JAVA doSthCompanion value:$value\")\n        }\n\n        // Companion属性\n        DetailJavaContext.propertyStatic { value -> onFinish(\"$tag NA DBG JAVA propertyCompanion value:$value\") }\n\n        // Bean参数返回值\n        DetailJavaContext.doSthBeanProvideInstanceByFunc(\"msg from HOME\", TestJavaBean(8, null)) { value ->\n            onFinish(\"$tag NA DBG JAVA doSthBean value:${value.d1}\")\n        }\n\n    }\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/kotlin/TestKotlinInvokeActionFunctionTask.kt",
    "content": "package com.mars.component.home.test.kotlin\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.ResultReceiver\nimport com.rubik.router.bundleQueries\nimport com.rubik.router.property\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.*\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext.Companion.doSthExt\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.callback.CallbackTestInterface\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.objekt.ObjectTest\n\nclass TestKotlinInvokeActionFunctionTask {\n    fun invoke(context: Context, onFinish: (String) -> Unit) {\n        // 无参无返回值\n\n        val tag = \" B FUNCTION TASK \"\n\n        DetailContext.touch {\n            onFinish(\" XX DBG B touch DetailContext：touch!!!\")\n        }.miss {\n            onFinish(\" XX DBG B touch DetailContext：miss!!!\")\n        }\n\n        DetailContext.doSth()\n\n        // 高阶函数\n        val doSthHOFResult = DetailContext.doSthHof(3, \"123\", TestDataBean(1, \"456\"))\n\n        onFinish(\"$tag NA DBG doSthHOF doSthHOFResult:$doSthHOFResult\")\n\n        // 属性\n        DetailContext.propertyProperty { value -> onFinish(\"$tag NA DBG propertyProperty value:$value\") }\n\n        // 高阶函数异步返回\n        DetailContext.doSthAsync2HOF({ v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncHOF 1 value:$v1,$v2\")\n        }, { v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncHOF 2 value:$v1,$v2\")\n        })\n\n        // 接口异步返回\n        DetailContext.doSthAsyncOpen(\"textUri\") { v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncOpen value:$v1,$v2\")\n        }\n\n        DetailContext.doSthAsyncInterface { v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncInterface value:$v1,$v2\")\n        }\n\n        // 返回View\n        DetailContext.viewGet(context) { view ->\n            onFinish(\"$tag NA DBG getView value:$view\")\n        }\n\n        // Companion方法\n        DetailContext.doSthCompanion(8, \"asd\", 22L) { value ->\n            onFinish(\"$tag NA DBG doSthCompanion value:$value\")\n        }\n\n        // Companion属性\n        DetailContext.propertyCompanion { value -> onFinish(\"$tag NA DBG propertyCompanion value:$value\") }\n\n        // Companion高阶函数\n        DetailContext.doSthHOFCompanion(6) { value ->\n            onFinish(\"$tag NA DBG doSthHOFCompanion value:$value\")\n        }\n\n        // 顶层方法\n        DetailContext.doSthTop(\n            arrayOf(1),\n            listOf(2, 3),\n            arrayOf(\"asd\"),\n            listOf(\"ghj\", \"zxc\"),\n            arrayOf(TestDataBean(100, \"101\")),\n            listOf(TestDataBean(101, \"102\"), TestDataBean(103, \"104\"))\n        ) { list ->\n            list.forEach {\n                onFinish(\"$tag NA DBG doSthTop d1:${it.d1} d1:${it.d2}\")\n            }\n        }\n\n        // 顶层高阶函数\n        DetailContext.doSthHOFTop(Unit) {\n\n        }\n\n        // 顶层属性\n        DetailContext.propertyTop { value ->\n            onFinish(\"$tag NA DBG propertyTop value:$value\")\n        }\n\n        // 通过assist获取实例\n        DetailContext.doSthProvideInstanceByFunc()\n\n        DetailContext.doSthProvideInstanceByParameterFunc(\n            \"2 value_ST 2\",\n            null,\n            v1 = \"2 value_ST- 2\",\n            v2 = 2888,\n            v3 = 2999\n        )\n\n        DetailContext.doSthProvideInstanceByConstructor(\n            \"2 value_ST 3\",\n            v1 = \"2 value_ST- 3\",\n            v2 = 3888,\n            v3 = 3999\n        )\n\n        // Bean参数返回值\n        DetailContext.doSthBean(TestDataBean(8, null)) { value ->\n            onFinish(\"$tag NA DBG doSthBean value:${value.d1}\")\n        }\n\n        // 调用构造函数\n        DetailContext.testBeanCreate(55, \"ggghhh\") { value ->\n            onFinish(\"$tag NA DBG makeApiBean value:(${value.d1},${value.d2})\")\n        }\n\n        // 指定返回类型\n        val result = DetailContext.Fragment.page1()\n        onFinish(\"$tag NA DBG makeApiFragment value:$result\")\n\n        // uri传递参数\n        DetailContext.sthIdAName(\"vbn\", \"ghj\", \"yui\", \"987\") { value ->\n            onFinish(\"$tag NA DBG getSth value:$value\")\n        }\n\n        //扩展函数\n        100.doSthExt(\"tmp\") {\n            onFinish(\"$tag NA DBG doSthExt value:$it\")\n        }\n\n        // 传递ResultReceiver\n        DetailContext.doSthResultReceiver(\n            object : ResultReceiver(Handler()) {\n                override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {\n                    super.onReceiveResult(resultCode, resultData)\n                    onFinish(\n                        \"$tag NA DBG doSthResultReceiver resultCode:$resultCode resultData1:${\n                            resultData?.property<String>(\n                                \"fromA\"\n                            )\n                        } resultData2:${\n                            resultData?.property<TestDataBean>(\n                                \"BEAN_fromA\"\n                            )?.d2\n                        }\"\n                    )\n                }\n            }\n        ) { value ->\n            value.send(1010, bundleQueries {\n                \"fromB\" with \" this is B \"\n                \"BEAN_fromB\" with TestDataBean(333, \"B3w3w3w\")\n            })\n            onFinish(\"$tag NA DBG doSthResultReceiver value:$value\")\n        }\n\n        // 变长参数\n        DetailContext.doSthVararg(1, \"qwe111\", \"asd2\")\n\n        val parcelizeBean =\n            DetailContext.Api.Serialization.parcelBean(TestParcelizeBean(1, \"from home!\"))\n        onFinish(\"$tag NA DBG Serialization value:${parcelizeBean?.d2}\")\n\n\n        //        // 原始value\n//        DetailContext.doKeepOriginalValue(A4Bean(135,\"135X\")){\n//            onFinish(\"$tag NA DBG doKeepOriginalValue d1:${it.d1} d2:${it.d2}\")\n//        }\n\n        // 传递实例\n\n        val commonInstance = ObjectTest(\"asd\")\n        onFinish(\"$tag NA DBG getCommonInstance commonInstance:${commonInstance?.originalObject.hashCode()} \")\n        commonInstance?.doSthInCommonInstance { bean->\n            onFinish(\"$tag NA DBG doSthInCommonInstance bean:${bean.d1}  ${bean.d2}\")\n\n        }\n\n        commonInstance?.let {\n            DetailContext.sendBackCommonInstance(commonInstance)\n            onFinish(\"$tag NA DBG sendBackCommonInstance commonInstance:${commonInstance.originalObject.hashCode()}\")\n        }\n\n        DetailContext.getAOtherCommonInstance(425) { instance ->\n            onFinish(\"$tag NA DBG getAOtherCommonInstance  instance:${instance.originalObject.hashCode()} \")\n            DetailContext.sendBackCommonInstance(instance)\n            onFinish(\"$tag NA DBG sendBackCommonInstance instance:${instance.originalObject.hashCode()}\")\n\n\n            instance.doSthInCommonInstanceParameter(\"xx\", 123, 345)\n            instance.doSthInCommonInstanceParameter(\"xx\", 123, 345)\n\n        }\n\n        val commonInstanceList = DetailContext.getALotOfCommonInstance(523)\n        onFinish(\n            \"$tag NA DBG getALotOfCommonInstance commonInstance:${\n                commonInstanceList?.joinToString(\"~\") { ins ->\n                    ins.originalObject.hashCode().toString()\n                }\n            }\"\n        )\n\n        DetailContext.sendBackALotOfCommonInstance(mutableMapOf<String, ObjectTest>().apply {\n            commonInstanceList?.forEachIndexed { index, value ->\n                put(\"xxz${index}\", value)\n            }\n        })\n\n\n        DetailContext.getAOtherCommonInstanceNull(23425) { instance ->\n            onFinish(\"$tag NA DBG getAOtherCommonInstanceNull  instance:${instance?.originalObject.hashCode()} \")\n            instance?.let {\n                DetailContext.sendBackCommonInstanceNull(null)\n                onFinish(\"$tag NA DBG sendBackCommonInstanceNull instance:${instance.originalObject.hashCode()}\")\n            }\n        }\n\n        val commonInstanceListNull = DetailContext.getALotOfCommonInstanceNull(523)\n        onFinish(\n            \"$tag NA DBG getALotOfCommonInstanceNull commonInstance:${\n                commonInstanceListNull?.joinToString(\"~\") { ins ->\n                    ins?.originalObject.hashCode().toString()\n                }\n            }\"\n        )\n\n        DetailContext.sendBackALotOfCommonInstanceNull(mutableMapOf<String?, ObjectTest?>().apply {\n            commonInstanceList?.forEachIndexed { index, value ->\n                put(\"wd${index}\", if (index == 1) null else value)\n            }\n        })\n\n\n\n        // 传递callback\n        DetailContext.doSthCallbackObject(object : CallbackTestInterface {\n            override fun callbackBean(bean: TestDataBean) {\n                onFinish(\n                    \"$tag NA DBG doSthCallbackObject callbackBean:${bean.d1} ${bean.d2}\"\n                )\n\n            }\n\n            override fun callbackBeanReBean(bean: TestDataBean?) {\n                onFinish(\n                    \"$tag NA DBG doSthCallbackObject callbackBeanReBean:${bean?.d1} ${bean?.d2}\"\n                )\n            }\n\n            override fun callbackInt(i: Int) {\n                onFinish(\n                    \"$tag NA DBG doSthCallbackObject callbackInt:${i}\"\n                )\n            }\n\n        })\n\n        // 传递mapping value\n        DetailContext.doSthMappingBean(TestDataMappingBean(555,\"asd\")) { bean->\n            onFinish(\n                \"$tag NA DBG doSthMappingBean :${bean.d1} ${bean.d2}\"\n            )\n        }\n\n        DetailContext.doSthTestNestDataMappingBean(\n            TestNestDataMappingBean(\n                TestDataBean(123, \"AAsdsd\"),\n                TestDataMappingBean(155, \"AAsdsd\"),\n                TestNestDataMappingBean(\n                    TestDataBean(2223, \"BBsdsd\"),\n                    TestDataMappingBean(2255, \"BBsdsd\"),\n                    null,\n                    listOf(TestDataBean(2223, \"BBsdsd\")),\n                    listOf(TestDataMappingBean(2255, \"BBsdsd\"))\n                ),\n                listOf(TestDataBean(123, \"AAsdsd\")),\n                listOf(TestDataMappingBean(155, \"AAsdsd\"))\n\n            )\n        ) { bean ->\n            onFinish(\n                \"$tag NA DBG doSthTestNestDataMappingBean :${bean.d1?.d2} ${bean.d2?.d2} ${bean.d3?.d2} ${bean.d4} ${bean.d5}\"\n            )\n        }\n\n    }\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/kotlin/TestKotlinInvokeDSLTask.kt",
    "content": "package com.mars.component.home.test.kotlin\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.ResultReceiver\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport com.rubik.route.mapping.query\nimport com.rubik.router.*\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.*\n\nclass TestKotlinInvokeDSLTask {\n    fun invoke(context: Context, onFinish: (String) -> Unit) {\n        val tag = \" HOME DSL TASK \"\n\n        touch(uri = DetailContext.URI) {\n            onFinish(\" XX DBG HOME touch DetailContext.URI：touch!!!\")\n        }.miss {\n            onFinish(\" XX DBG HOME touch DetailContext.URI：miss!!!\")\n        }\n\n        touch(\"xxx\")  {\n            onFinish(\" XX DBG HOME touch xxx：touch!!!\")\n        }.miss {\n            onFinish(\" XX DBG HOME touch xxx：miss!!!\")\n        }\n\n        // 无参无返回值\n        navigate {\n            uri = DetailContext.Uris.DO_STH\n        }\n\n        // 高阶函数\n        navigate {\n            uri = DetailContext.Uris.DO_STH_HOF\n            query {\n                \"a0\" with  4\n                \"a1\" with \"123\"\n                \"a2\" with TestDataBean(1, \"456\")\n            }\n            result<Int> { value ->\n                onFinish(\"$tag NA DBG doSthHOF value:$value\")\n            }\n        }\n\n        // 同步调用\n        val doSthHOFResult1: Int? = navigateForResult {\n            uri = DetailContext.Uris.DO_STH_HOF\n            query {\n                \"a0\" with 9\n                \"a1\" with \"456\"\n                \"a2\" with TestDataBean(2, \"567\")\n            }\n        }\n\n        val doSthHOFResult2 = navigateForResult<Int> {\n            uri = DetailContext.Uris.DO_STH_HOF\n            query {\n                \"a0\" with  9\n                \"a1\" with \"456\"\n                \"a2\" with TestDataBean(2, \"567\")\n            }\n        }\n\n        onFinish(\"$tag NA DBG doSthHOF doSthHOFResult1:$doSthHOFResult1 doSthHOFResult2:$doSthHOFResult2\")\n\n        // 属性\n        navigate {\n            uri = DetailContext.Uris.PROPERTY_PROPERTY\n            result<String> { value ->\n                onFinish(\"$tag NA DBG propertyProperty value:$value\")\n            }\n        }\n\n        // 高阶函数异步返回\n        navigate {\n            uri = DetailContext.Uris.DO_STH_ASYNC_HOF\n            result<String, TestDataBean> { v1, v2 ->\n                onFinish(\"$tag NA DBG doSthAsyncHOF value:$v1,${v2.d2}\")\n            }\n        }\n\n        // 接口异步返回\n        navigate {\n            uri = DetailContext.Uris.DO_STH_ASYNC_OPEN\n            query {\n                \"uri\" with \"textUri\"\n            }\n            result<String, Int> { v1, v2 ->\n                onFinish(\"$tag NA DBG doSthAsyncOpen value:$v1,$v2\")\n            }\n        }\n\n\n        navigate {\n            uri = DetailContext.Uris.DO_STH_ASYNC_INTERFACE\n            result<String, Int> { v1, v2 ->\n                onFinish(\"$tag NA DBG doSthAsyncInterface value:$v1,$v2\")\n            }\n        }\n\n        // 返回View\n        navigate {\n            uri = DetailContext.Uris.VIEW_GET\n            query { \"context\" with context }\n            result<View?> { view ->\n                onFinish(\"$tag NA DBG getView value:$view\")\n            }\n        }\n\n        // Companion方法\n        navigate {\n            uri = DetailContext.Uris.DO_STH_COMPANION\n            query {\n                \"i\" with 5\n                \"j\" with \"abcdef\"\n                \"k\" with 99L\n            }\n            result<String> { value ->\n                onFinish(\"$tag NA DBG doSthCompanion value:$value\")\n            }\n        }\n\n        // Companion属性\n        navigate {\n            uri = DetailContext.Uris.PROPERTY_COMPANION\n            result<String> { value ->\n                onFinish(\"$tag NA DBG propertyCompanion value:$value\")\n            }\n        }\n\n        // Companion高阶函数\n        navigate {\n            uri = DetailContext.Uris.DO_STH_HOF_COMPANION\n            query { \"tmp\" with 4 }\n            result<Int> { value ->\n                onFinish(\"$tag NA DBG doSthHOFCompanion value:$value\")\n            }\n        }\n\n        // 顶层方法\n        navigate {\n            uri = DetailContext.Uris.DO_STH_TOP\n            query {\n                \"1\" with arrayOf(1)\n                \"2\" with listOf(2, 3)\n                \"3\" with arrayOf(\"asd\")\n                \"4\" with listOf(\"ghj\", \"zxc\")\n                \"5\" with arrayOf(TestDataBean(100, \"101\"))\n                \"6\" with listOf(TestDataBean(101, \"102\"), TestDataBean(103, \"104\"))\n            }\n            result<List<TestDataBean>> { list ->\n                list.forEach {\n                    onFinish(\"$tag NA DBG doSthTop b1:${it.d1} d1:${it.d2}\")\n                }\n\n            }\n        }\n\n        // 顶层高阶函数\n        navigate {\n            uri = DetailContext.Uris.DO_STH_HOF_TOP\n            query { \"tmp\" with Unit }\n        }\n\n        // 顶层属性\n        navigate {\n            uri = DetailContext.Uris.PROPERTY_TOP\n            result<String> { value ->\n                onFinish(\"$tag NA DBG propertyTop value:$value\")\n            }\n        }\n\n        // 通过assist获取实例\n        navigate {\n            uri = DetailContext.Uris.DO_STH_PROVIDE_INSTANCE_BY_FUNC\n        }\n\n        navigate {\n            uri = DetailContext.Uris.DO_STH_PROVIDE_INSTANCE_BY_PARAMETER_FUNC\n            query {\n                \"value\" with \"value_ST 2\"\n                \"v0\" with 255\n                \"v1\" with \"value_ST- 2\"\n                \"v2\" with 266\n                \"v3\" with 277\n            }\n        }\n\n        navigate {\n            uri = DetailContext.Uris.DO_STH_PROVIDE_INSTANCE_BY_CONSTRUCTOR\n            query {\n                \"value\" with \"value_ST 3\"\n                \"v1\" with \"value_ST- 3\"\n                \"v2\" with 366\n                \"v3\" with 377\n            }\n        }\n\n        // Bean参数返回值\n        navigate {\n            uri = DetailContext.Uris.DO_STH_BEAN\n            query { \"a1\" with TestDataBean(99, \"asd\") }\n            result<TestListBean> { value ->\n                onFinish(\"$tag NA DBG doSthBean value:${value.d1}\")\n            }\n        }\n\n        // 调用构造函数\n        navigate {\n            uri = DetailContext.Uris.TEST_BEAN_CREATE\n            query {\n                \"a\" with 55\n                \"b\" with \"dddfff\"\n            }\n            result<TestCreateBean> { value ->\n                onFinish(\"$tag NA DBG makeApiBean value:(${value.d1},${value.d2})\")\n            }\n        }\n\n        // 指定返回类型\n        navigate {\n            uri = DetailContext.Uris.Fragment.PAGE1\n            result<Fragment> { value ->\n                onFinish(\"$tag NA DBG makeApiFragment value:$value\")\n            }\n        }\n\n        // uri传递参数\n        navigate {\n            uri = DetailContext.Uris.STH_ID_A_NAME(\"123\", \"456\", \"qwe\", \"asd\", \"zxc\", \"tyu\")\n            result<String> { value ->\n                onFinish(\"$tag NA DBG getSth value:$value\")\n            }\n        }\n\n        //扩展函数\n        navigate {\n            uri = DetailContext.Uris.DO_STH_EXT\n            query {\n                \"i\" with 99\n                \"s\" with \"tmp\"\n            }\n            result<Int> { value ->\n                onFinish(\"$tag NA DBG doSthExt value:$value\")\n            }\n        }\n\n//        navigate {\n//            uri = \"app://com.kc.a/sth/234/a-567?code1=wer&code2=sdf\"\n//            result<String> { value ->\n//                onFinish(\"$tag NA DBG getSth value:$value\")\n//            }\n//        }\n//\n//        // navigateOnly\n//        navigate {\n//            uri = \"app://com.kc.a/sthNavigationOnly/9090\"\n//            result<String> { value ->\n//                onFinish(\"$tag NA DBG getSth value:$value\")\n//            }\n//        }\n\n        // 传递ResultReceiver\n        navigate {\n            uri = DetailContext.Uris.DO_STH_RESULT_RECEIVER\n            query {\n                \"result\" with object : ResultReceiver(Handler()) {\n                    override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {\n                        super.onReceiveResult(resultCode, resultData)\n                        onFinish(\n                            \"$tag NA DBG doSthResultReceiver resultCode:$resultCode \" + \"resultData:${resultData?.property<String>(\n                                \"fromA\"\n                            )} resultData2:${resultData?.property<TestDataBean>(\n                                \"BEAN_fromA\"\n                            )?.d2}\"\n                        )\n                    }\n                }\n            }\n            result<ResultReceiver> { value ->\n                value.send(1010, bundleQueries {\n                    \"fromB\" with \" this is HOME \"\n                    \"BEAN_fromB\" with TestDataBean(777,\"B7y7y7y\")\n\n                })\n                onFinish(\"$tag NA DBG doSthResultReceiver value:$value\")\n            }\n        }\n\n        // 变长参数\n        navigate {\n            uri = DetailContext.Uris.DO_STH_VARARG\n            query {\n                \"no\" with 2\n                \"strings\" with arrayOf(\"qwe3\", \"asd4\")\n            }\n        }\n\n        // 序列化\n\n        navigate {\n            uri = DetailContext.Uris.Api.Serialization.SERIALIZABLE_BEAN\n            query {\n                \"bean\" with  TestSerializableBean(2, \"from home!\")\n            }\n            result<TestSerializableBean> { value ->\n                onFinish(\"$tag NA DBG SERIALIZABLE_BEAN value:${value.d2}\")\n            }\n        }\n\n        navigate {\n            uri = DetailContext.Uris.Api.Serialization.PARCEL_BEAN\n            query {\n                \"bean\" with  TestParcelizeBean(1, \"from home!\")\n            }\n            result<TestParcelizeBean?> { value ->\n                onFinish(\"$tag NA DBG PARCEL_BEAN value:${value?.d2}\")\n            }\n        }\n\n        navigate {\n            uri = DetailContext.Uris.Api.Serialization.PARCEL_ARRAY\n            query {\n                \"array\" with  arrayOf(TestParcelizeBean(1, \"from home!\"))\n            }\n            result<Array<TestParcelizeBean>?> { value ->\n                onFinish(\"$tag NA DBG PARCEL_ARRAY value size:${value?.size} 0 :${value?.getOrNull(0)?.d2}\")\n            }\n        }\n\n        navigate {\n            uri = DetailContext.Uris.Api.Serialization.PARCEL_LIST\n            query {\n                \"list\" with  listOf(TestParcelizeBean(1, \"from home!\"))\n            }\n            result<List<TestParcelizeBean>?> { value ->\n                onFinish(\"$tag NA DBG PARCEL_LIST value size:${value?.size} 0 :${value?.getOrNull(0)?.d2}\")\n            }\n        }\n\n\n\n//        // 原始value\n//        navigate {\n//            uri = DetailContext.Uris.DO_KEEP_ORIGINAL_VALUE\n//            query {\n//                \"value \" with A4Bean(135, \"135X\")\n//            }\n//            result<A4Bean> {\n//                onFinish(\"$tag NA DBG doKeepOriginalValue d1:${it.d1} d2:${it.d2}\")\n//            }\n//        }\n\n    }\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/test/kotlin/TestKotlinInvokeRouteFunctionTask.kt",
    "content": "package com.mars.component.home.test.kotlin\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.ResultReceiver\nimport com.rubik.router.bundleQueries\nimport com.rubik.router.property\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailRouteContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailRouteContext.Companion.doSthExt\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestParcelizeBean\n\nclass TestKotlinInvokeRouteFunctionTask {\n    fun invoke(context: Context, onFinish: (String) -> Unit) {\n        // 无参无返回值\n\n        val tag = \" B FUNCTION TASK \"\n\n        DetailContext.touch {\n            onFinish(\" XX DBG B touch DetailContext：touch!!!\")\n        }.miss {\n            onFinish(\" XX DBG B touch DetailContext：miss!!!\")\n        }\n\n        DetailRouteContext.doSth()\n\n        // 高阶函数\n        val doSthHOFResult = DetailRouteContext.doSthHof(3, \"123\", TestDataBean(1, \"456\"))\n\n        onFinish(\"$tag NA DBG doSthHOF doSthHOFResult:$doSthHOFResult\")\n\n        // 属性\n        DetailRouteContext.propertyProperty { value -> onFinish(\"$tag NA DBG propertyProperty value:$value\") }\n\n        // 高阶函数异步返回\n        DetailRouteContext.doSthAsync2HOF({ v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncHOF 1 value:$v1,$v2\")\n        }, { v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncHOF 2 value:$v1,$v2\")\n        })\n\n        // 接口异步返回\n        DetailRouteContext.doSthAsyncOpen(\"textUri\") {  v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncOpen value:$v1,$v2\")\n        }\n\n        DetailRouteContext.doSthAsyncInterface {  v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncInterface value:$v1,$v2\")\n        }\n\n        DetailContext.doSthAsync3Interface({ v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsync3Interface value:$v1,$v2\")\n        }, { v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsync3Interface value:$v1,$v2\")\n        }, { data ->\n            onFinish(\"$tag NA DBG doSthAsync3Interface value:${data?.d1},${data?.d2}\")\n        })\n\n        DetailContext.doSthAsyncInterfaceMultiFunc({ v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncInterfaceMultiFunc value:$v1,$v2\")\n        }, { data ->\n            onFinish(\"$tag NA DBG doSthAsyncInterfaceMultiFunc data:${data?.d1},${data?.d2}\")\n        }, { v1, v2 ->\n            onFinish(\"$tag NA DBG doSthAsyncInterfaceMultiFunc value:${v1},${v2}\")\n        })\n\n\n        // 返回View\n        DetailRouteContext.viewGet(context) { view ->\n            onFinish(\"$tag NA DBG getView value:$view\")\n        }\n\n        // Companion方法\n        DetailRouteContext.doSthCompanion(8,\"asd\",22L){value ->\n            onFinish(\"$tag NA DBG doSthCompanion value:$value\")\n        }\n\n        // Companion属性\n        DetailRouteContext.propertyCompanion { value ->  onFinish(\"$tag NA DBG propertyCompanion value:$value\")}\n\n        // Companion高阶函数\n        DetailRouteContext.doSthHOFCompanion(6){ value ->\n            onFinish(\"$tag NA DBG doSthHOFCompanion value:$value\")\n        }\n\n        // 顶层方法\n        DetailRouteContext.doSthTop(\n            arrayOf(1),\n            listOf(2, 3),\n            arrayOf(\"asd\"),\n            listOf(\"ghj\", \"zxc\"),\n            arrayOf(TestDataBean(100, \"101\")),\n            listOf(TestDataBean(101, \"102\"),TestDataBean(103, \"104\"))\n        ) { list ->\n            list.forEach {\n                onFinish(\"$tag NA DBG doSthTop d1:${it.d1} d1:${it.d2}\")\n            }\n        }\n\n        // 顶层高阶函数\n        DetailRouteContext.doSthHOFTop(Unit) {\n\n        }\n\n        // 顶层属性\n        DetailRouteContext.propertyTop { value ->\n            onFinish(\"$tag NA DBG propertyTop value:$value\")\n        }\n\n        // 通过assist获取实例\n        DetailRouteContext.doSthProvideInstanceByFunc()\n\n        DetailRouteContext.doSthProvideInstanceByParameterFunc(\"2 value_ST 2\", null, v1 = \"2 value_ST- 2\", v2 = 2888, v3 = 2999)\n\n        DetailRouteContext.doSthProvideInstanceByConstructor(\"2 value_ST 3\", v1 = \"2 value_ST- 3\", v2 = 3888, v3 = 3999)\n\n        // Bean参数返回值\n        DetailRouteContext.doSthBean(TestDataBean(8, null)) { value ->\n            onFinish(\"$tag NA DBG doSthBean value:${value.d1}\")\n        }\n\n        // 调用构造函数\n        DetailRouteContext.testBeanCreate(55, \"ggghhh\") { value ->\n            onFinish(\"$tag NA DBG makeApiBean value:(${value.d1},${value.d2})\")\n        }\n\n        // 指定返回类型\n        val result = DetailRouteContext.Fragment.page1()\n        onFinish(\"$tag NA DBG makeApiFragment value:$result\")\n\n        // uri传递参数\n        DetailRouteContext.sthIdAName(\"vbn\", \"ghj\", \"yui\", \"987\") { value ->\n            onFinish(\"$tag NA DBG getSth value:$value\")\n        }\n\n        //扩展函数\n        100.doSthExt(\"tmp\"){\n            onFinish(\"$tag NA DBG doSthExt value:$it\")\n        }\n\n        // 传递ResultReceiver\n        DetailRouteContext.doSthResultReceiver(\n            object : ResultReceiver(Handler()) {\n                override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {\n                    super.onReceiveResult(resultCode, resultData)\n                    onFinish(\"$tag NA DBG doSthResultReceiver resultCode:$resultCode resultData1:${resultData?.property<String>(\n                        \"fromA\"\n                    )} resultData2:${resultData?.property<TestDataBean>(\n                        \"BEAN_fromA\"\n                    )?.d2}\")\n                }\n            }\n        ) { value ->\n            value.send(1010, bundleQueries {\n                \"fromB\" with \" this is B \"\n                \"BEAN_fromB\" with TestDataBean(333,\"B3w3w3w\")\n            })\n            onFinish(\"$tag NA DBG doSthResultReceiver value:$value\")\n        }\n\n        // 变长参数\n        DetailRouteContext.doSthVararg(1, \"qwe111\", \"asd2\")\n\n       val parcelizeBean = DetailRouteContext.Api.Serialization.parcelBean(TestParcelizeBean(1, \"from home!\"))\n        onFinish(\"$tag NA DBG Serialization value:${parcelizeBean?.d2}\")\n\n\n\n    //        // 原始value\n//        DetailContext.doKeepOriginalValue(A4Bean(135,\"135X\")){\n//            onFinish(\"$tag NA DBG doKeepOriginalValue d1:${it.d1} d2:${it.d2}\")\n//        }\n    }\n}"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/ui/HomeActivity.kt",
    "content": "package com.mars.component.home.ui\n\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.Observer\nimport com.mars.component.home.R\nimport com.mars.component.home.test.kotlin.TestKotlinInvokeDSLTask\nimport com.mars.component.home.test.kotlin.TestKotlinInvokeActionFunctionTask\nimport com.mars.component.home.test.kotlin.TestKotlinInvokeActionFunctionJavaTask\nimport com.mars.component.home.test.kotlin.TestKotlinInvokeRouteFunctionTask\nimport com.rubik.router.navigate\nimport com.rubik.router.result\nimport kotlinx.android.synthetic.main.activity_kotlin.*\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestCompanionBean\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestListBean\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.DetailJavaContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.TestJavaBean\n\nclass HomeActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_kotlin)\n\n        supportFragmentManager.beginTransaction().replace(R.id.container, HomeFragment(), \"\").commit()\n\n        button_navigation_k_2_k.setOnClickListener {\n            text_hello.text = \"\"\n            TestKotlinInvokeDSLTask().invoke(applicationContext) { result ->\n                println(result)\n                text_hello.text = \"${text_hello.text}\\n$result\"\n            }\n        }\n\n        button_context_k_2_k_action.setOnClickListener {\n            text_hello.text = \"\"\n            val timeAction = System.currentTimeMillis()\n            TestKotlinInvokeActionFunctionTask().invoke(applicationContext) { result ->\n                println(result)\n                text_hello.text = \"${text_hello.text}\\n$result\"\n            }\n            text_hello.text = \"${text_hello.text}\\n\\naction cost:${System.currentTimeMillis()-timeAction}\"\n        }\n\n        button_context_k_2_k_router.setOnClickListener {\n            text_hello.text = \"\"\n            val timeRoute = System.currentTimeMillis()\n            TestKotlinInvokeRouteFunctionTask().invoke(applicationContext) { result ->\n                println(result)\n                text_hello.text = \"${text_hello.text}\\n$result\"\n            }\n            text_hello.text = \"${text_hello.text}\\n\\nroute  cost:${System.currentTimeMillis()-timeRoute}\"\n        }\n\n        button_context_k_2_j.setOnClickListener{\n            text_hello.text = \"\"\n            TestKotlinInvokeActionFunctionJavaTask().invoke(applicationContext) { result ->\n                println(result)\n                text_hello.text = \"${text_hello.text}\\n$result\"\n            }\n        }\n\n\n        button_navigation_livedata_k_2_k.setOnClickListener {\n            text_hello.text = \"\"\n\n            navigate {\n                uri = DetailContext.Uris.LIVE_DATA_GET\n                result<LiveData<String>> { data ->\n                    data.observe(this@HomeActivity, Observer {\n                        text_hello.text = \"${text_hello.text}\\nobs:$it\"\n                    })\n                }\n            }\n\n            navigate {\n                uri = DetailContext.Uris.LIVE_DATA_BEAN_GET\n                result<LiveData<TestDataBean>> { data ->\n                    data.observe(this@HomeActivity, Observer {\n                        text_hello.text = \"${text_hello.text}\\nobs:${it.d2}\"\n                        text_hello.text = \"${text_hello.text}\\nget:${data.value?.d2}\"\n                    })\n                }\n            }\n\n            navigate {\n                uri = DetailContext.Uris.LIVE_DATA_BEAN_LIST_GET\n                result<LiveData<List<TestListBean>>> { data ->\n                    data.observe(this@HomeActivity, Observer {\n                        text_hello.text = \"${text_hello.text}\\nobs:${it.toLog()}\"\n                        text_hello.text = \"${text_hello.text}\\nget:${data.value?.toLog()}\"\n                    })\n                }\n            }\n        }\n\n        button_context_livedata_k_2_k.setOnClickListener {\n            text_hello.text = \"\"\n\n            DetailContext.liveDataGet { data ->\n                data.observe(this@HomeActivity, Observer {\n                    text_hello.text = \"${text_hello.text}\\nobs:$it\"\n                })\n            }\n\n            DetailContext.liveDataBeanGet { data ->\n                data.observe(this@HomeActivity, Observer {\n                    text_hello.text = \"${text_hello.text}\\nobs:${it.d1}\"\n                    text_hello.text = \"${text_hello.text}\\nget:${data.value?.d2}\"\n                })\n            }\n\n            DetailContext.liveDataBeanListGet { data ->\n                data.observe(this@HomeActivity, Observer {\n                    text_hello.text = \"${text_hello.text}\\nobs:${it.toLog()}\"\n                    text_hello.text = \"${text_hello.text}\\nget:${data.value?.toLog()}\"\n                })\n            }\n\n//            MutableLiveData<A1Bean>().apply {\n//                this.observe(this@B1Activity, Observer {\n//                    text_hello.text = \"${text_hello.text}\\nobs3:${it.b1}\"\n//                    text_hello.text = \"${text_hello.text}\\nobs3:${it.b2}\"\n//                })\n//                DetailContext.sthWithLiveData(this)\n//            }\n        }\n\n        button_navigation_start_k_2_k.setOnClickListener {\n            navigate {\n                uri = DetailContext.Uris.Activity.PAGE1\n                query {\n                    flags = Intent.FLAG_ACTIVITY_SINGLE_TOP\n                    \"key_3_int\" with 33.toInt()\n                    \"key_b_str\" with \"i am from b\"\n                    \"key_4_strs\" withSerializable  ArrayList<String>().apply { add((\"i am from b list\")) }\n                    \"key_a_ints\" with ArrayList<Int>().apply { add(123) }\n                    \"key_5_bean\" with TestDataBean(203, \"203\")\n\n                    \"key_1_pa\" with TestCompanionBean(303, \"303303\")\n                    \"key_2_pa_ar\" with arrayOf(TestCompanionBean(304, \"304304\"))\n                    \"key_c_pa_li\" with ArrayList<TestCompanionBean>().apply { add(TestCompanionBean(305, \"305305\")) }\n\n//                    \"key_pa_p\"  withParcelable TmpA3Bean(1303, \"303303\")\n//                    \"key_pa_ar_p\" withParcelable  arrayOf(TmpA3Bean(1304, \"304304\"))\n//                    \"key_pa_li_p\" withParcelable  ArrayList<TmpA3Bean>().apply { add(TmpA3Bean(1305, \"305305\")) }\n//\n//                    \"key_ser\" withSerializable TmpA4Bean(2303, \"23032303\")\n                }\n            }\n        }\n\n        button_context_start_k_2_k.setOnClickListener {\n            DetailContext.Activity.page1(\n                this,\n                TestCompanionBean(5303, \"303303\"),\n                arrayOf(TestCompanionBean(5304, \"304304\")),\n                533,\n                ArrayList<String>().apply { add((\"i am from b DetailContext list\")) },\n                TestDataBean(5203, \"203\"),\n                ArrayList<Int>().apply { add(5123) },\n                ArrayList<TestCompanionBean>().apply { add(TestCompanionBean(5305, \"305305\")) },\n                \"i am from b DetailContext\"\n            )\n        }\n\n        button_navigation_start_for_result_k_2_k.setOnClickListener {\n            navigate {\n                uri = DetailContext.Uris.Activity.Page2.KeyStr1.KeyStr2.KEY_STR3(\"fff\", \"ggg\", \"hhh\")\n                query {\n                    requestCode = 101\n                }\n            }\n        }\n\n        button_context_start_for_result_k_2_k.setOnClickListener {\n            DetailContext.Activity.Page2.KeyStr1.KeyStr2.keyStr3(\n                this,\n                \"ccc\",\n                \"vvv\",\n                \"bbb\",\n                null,\n                102\n            )\n        }\n\n        button_navigation_start_k_2_j.setOnClickListener {\n            navigate {\n                uri = DetailJavaContext.Uris.Activity.JAVA_PAGE1\n                query {\n                    flags = Intent.FLAG_ACTIVITY_SINGLE_TOP\n                    \"key_str4\" withSerializable  ArrayList<String>().apply { add((\"i am from b list\")) }\n                    \"key_str5\" with  ArrayList<TestJavaBean>().apply { add(TestJavaBean(505, \"505505\")) }\n                    \"key_str6\" with arrayOf(TestJavaBean(504, \"504504\"))\n                }\n            }\n        }\n\n        button_context_start_k_2_j.setOnClickListener {\n            DetailJavaContext.Activity.javaPage1(\n                this,\n                ArrayList<String>().apply { add((\"i am from b list\")) },\n                ArrayList<TestJavaBean>().apply { add(TestJavaBean(505, \"505505\")) },\n                arrayOf(TestJavaBean(504, \"504504\"))\n            )\n        }\n\n        button_navigation_start_for_result_k_2_j.setOnClickListener {\n            navigate {\n                uri = DetailJavaContext.Uris.Activity.JavaPage2.KeyStr1.KeyStr2.KEY_STR3(\"rrr\", \"ttt\", \"90\")\n                query {\n                    requestCode = 103\n                }\n            }\n        }\n\n        button_context_start_for_result_k_2_j.setOnClickListener {\n            DetailJavaContext.Activity.JavaPage2.KeyStr1.KeyStr2.keyStr3(\n                this,\n                \"ccc\",\n                \"vvv\",\n                90,\n                null,\n                104\n            )\n        }\n\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        text_hello.text =\n            \"onActivityResult requestCode:$requestCode resultCode:$resultCode data:${data?.getStringExtra(\"data\")}\"\n    }\n\n    private fun List<TestListBean?>.toLog() =\n        fold(\"\") { str, bean ->\n            \"$str/${bean?.d2?.fold(\"\") { beanStr, value ->\n                \"$beanStr|$value\"\n            }}\"\n        }\n\n    override fun onDestroy() {\n        super.onDestroy()\n    }\n\n}\n"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/ui/HomeFragment.kt",
    "content": "package com.mars.component.home.ui;\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport com.mars.component.home.R\nimport com.rubik.router.navigate\nimport kotlinx.android.synthetic.main.fragment_b1.*\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.DetailJavaContext\n\nclass HomeFragment : Fragment() {\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        return inflater.inflate(R.layout.fragment_b1, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        button_navigation_fragment_start_for_result_k_2_k.setOnClickListener {\n            navigate {\n                uri = DetailContext.Uris.Activity.Page2.KeyStr1.KeyStr2.KEY_STR3(\n                    \"fff33\",\n                    \"ggg3\",\n                    \"hhh3\"\n                )\n                query {\n                    requestCode = 301\n                }\n            }\n        }\n\n        button_context_fragment_start_for_result_k_2_k.setOnClickListener {\n            DetailContext.Activity.Page2.KeyStr1.KeyStr2.keyStr3(\n                this,\n                \"ccc3\",\n                \"vvv3\",\n                \"bbb3\",\n                null,\n                302\n            )\n        }\n\n        button_navigation_fragment_start_for_result_k_2_j.setOnClickListener {\n            navigate {\n                uri = DetailJavaContext.Uris.Activity.JavaPage2.KeyStr1.KeyStr2.KEY_STR3(\n                    \"ccc55\",\n                    \"vvv55\",\n                    88.toString()\n                )\n                query {\n                    requestCode = 303\n                }\n            }\n        }\n\n        button_context_fragment_start_for_result_k_2_j.setOnClickListener {\n            DetailJavaContext.Activity.JavaPage2.KeyStr1.KeyStr2.keyStr3(\n                this,\n                \"ccc55\",\n                \"vvv55\",\n                88,\n                null,\n                304\n            )\n        }\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        text_hello_fragment.text =\n            \"onFragmentResult requestCode:$requestCode resultCode:$resultCode data:${data?.getStringExtra(\"data\")}\"\n    }\n}\n"
  },
  {
    "path": "demo/demo_component_home/src/main/java/com/mars/component/home/ui/java/JavaHomeActivity.java",
    "content": "package com.mars.component.home.ui.java;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.mars.component.home.R;\nimport com.mars.component.home.test.java.TestJavaInvokeBuilderTask;\nimport com.mars.component.home.test.java.TestJavaInvokeFunctionTask;\nimport com.mars.component.home.test.java.TestJavaInvokeJavaFunctionTask;\nimport com.rubik.router.Router;\n\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AppCompatActivity;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestCompanionBean;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.DetailJavaContext;\nimport rubik.generate.context.demo_com_mars_rubik_test_detail_java.TestJavaBean;\n\npublic class JavaHomeActivity extends AppCompatActivity{\n\n   private TextView textHello;\n\n   @Override\n   protected void onCreate(@Nullable Bundle savedInstanceState) {\n      super.onCreate(savedInstanceState);\n      setContentView(R.layout.activity_java);\n\n      textHello = findViewById(R.id.text_hello);\n\n      findViewById(R.id.button_builder_j_2_k).setOnClickListener(view -> {\n         textHello.setText(\"\");\n         new TestJavaInvokeBuilderTask().invoke(getApplicationContext(), (result) -> {\n            System.out.println(result);\n            textHello.setText(textHello.getText() + \"\\n\" + result);\n            return null;\n         });\n      });\n      findViewById(R.id.button_context_j_2_k).setOnClickListener(view -> {\n         textHello.setText(\"\");\n         new TestJavaInvokeFunctionTask().invoke(getApplicationContext(), (result) -> {\n            System.out.println(result);\n            textHello.setText(textHello.getText() + \"\\n\" + result);\n            return null;\n         });\n      });\n      findViewById(R.id.button_context_j_2_j).setOnClickListener(view -> {\n         textHello.setText(\"\");\n         new TestJavaInvokeJavaFunctionTask().invoke(getApplicationContext(), (result) -> {\n            System.out.println(result);\n            textHello.setText(textHello.getText() + \"\\n\" + result);\n            return null;\n         });\n      });\n\n      findViewById(R.id.button_builder_start_j_2_j).setOnClickListener(view -> {\n         List<String> strs = new ArrayList<>();\n         strs.add(\"i am from b java list\");\n         List<TestJavaBean> cPaLi = new ArrayList<>();\n         cPaLi.add(new TestJavaBean(405, \"405405\"));\n\n         Router.builder(JavaHomeActivity.this).uri(DetailJavaContext.Uris.Activity.JAVA_PAGE1)\n                 .launchFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)\n                 .withSerializable(\"key_str4\", strs)\n                 .with(\"key_str5\", cPaLi)\n                 .with(\"key_str6\", new TestJavaBean[] {new TestJavaBean(404, \"404404\")})\n                 .build().route();\n      });\n\n      findViewById(R.id.button_context_start_j_2_j).setOnClickListener(view -> {\n         List<String> strs = new ArrayList<>();\n         strs.add(\"i am from b java list\");\n         List<TestJavaBean> cPaLi = new ArrayList<>();\n         cPaLi.add(new TestJavaBean(405, \"405405\"));\n\n         DetailJavaContext.Activity.javaPage1(\n                 JavaHomeActivity.this,\n                 strs,\n                 cPaLi,\n                 new TestJavaBean[] {new TestJavaBean(404, \"404404\")}, null, null);\n      });\n\n      findViewById(R.id.button_builder_start_j_2_k).setOnClickListener(view -> {\n         List<String> strs = new ArrayList<>();\n         strs.add(\"i am from b java list\");\n         List<Integer> ints = new ArrayList<>();\n         ints.add(456);\n         List<TestCompanionBean> cPaLi = new ArrayList<>();\n         cPaLi.add(new TestCompanionBean(405, \"405405\"));\n\n         Router.builder(JavaHomeActivity.this).uri(DetailContext.Uris.Activity.PAGE1)\n                 .launchFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)\n                 .with(\"key_3_int\", 55)\n                 .with(\"key_b_str\", \"i am from b java\")\n                 .withSerializable(\"key_4_strs\", strs)\n                 .with(\"key_a_ints\", ints)\n                 .with(\"key_5_bean\", new TestDataBean(205, \"205\"))\n                 .with(\"key_1_pa\", new TestCompanionBean(403, \"403403\"))\n                 .with(\"key_2_pa_ar\", new TestCompanionBean[] {new TestCompanionBean(404, \"404404\")})\n                 .with(\"key_c_pa_li\", cPaLi)\n                 .build().route();\n      });\n\n      findViewById(R.id.button_context_start_j_2_k).setOnClickListener(new View.OnClickListener() {\n         @Override\n         public void onClick(View view) {\n            List<String> strs = new ArrayList<>();\n            strs.add(\"i am from b java list\");\n            List<Integer> ints = new ArrayList<>();\n            ints.add(456);\n            List<TestCompanionBean> cPaLi = new ArrayList<>();\n            cPaLi.add(new TestCompanionBean(405, \"405405\"));\n\n            DetailContext.Activity.page1(JavaHomeActivity.this,\n                            new TestCompanionBean(7303, \"303303\"),\n                            new TestCompanionBean[] {new TestCompanionBean(404, \"404404\")},\n                            733,\n                            strs,\n                            new TestDataBean(205, \"205\"), ints, cPaLi,\n                            \"i am from b java\",\n                            null,\n                            null);\n         }\n      });\n\n\n   }\n}\n"
  },
  {
    "path": "demo/demo_component_home/src/main/res/layout/activity_java.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <LinearLayout\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <LinearLayout\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"wrap_content\"\n          android:layout_gravity=\"center\"\n          android:orientation=\"horizontal\">\n\n            <Button\n              android:id=\"@+id/button_builder_j_2_k\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n              android:layout_weight=\"1\"\n              android:text=\"builder \\n(Java -> Kotlin)\"\n              android:textSize=\"10dp\" />\n\n            <Button\n              android:id=\"@+id/button_context_j_2_k\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n              android:layout_weight=\"1\"\n              android:text=\"context \\n(Java -> Kotlin)\"\n              android:textSize=\"10dp\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"wrap_content\"\n          android:layout_gravity=\"center\"\n          android:orientation=\"horizontal\">\n\n            <Button\n              android:id=\"@+id/button_context_j_2_j\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n              android:layout_weight=\"1\"\n              android:text=\"context \\n(Java -> Java)\"\n              android:textSize=\"10dp\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"wrap_content\"\n          android:layout_gravity=\"center\"\n          android:orientation=\"horizontal\">\n\n            <Button\n              android:id=\"@+id/button_builder_start_j_2_j\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n              android:layout_weight=\"1\"\n              android:text=\"builder start \\n(java -> Java)\"\n              android:textSize=\"10dp\" />\n\n            <Button\n              android:id=\"@+id/button_context_start_j_2_j\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n              android:layout_weight=\"1\"\n              android:text=\"context start \\n(java -> Java)\"\n              android:textSize=\"10dp\" />\n        </LinearLayout>\n\n        <LinearLayout\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"wrap_content\"\n          android:layout_gravity=\"center\"\n          android:orientation=\"horizontal\">\n\n            <Button\n              android:id=\"@+id/button_builder_start_j_2_k\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n              android:layout_weight=\"1\"\n              android:text=\"builder start \\n(java -> Kotlin)\"\n              android:textSize=\"10dp\" />\n\n            <Button\n              android:id=\"@+id/button_context_start_j_2_k\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n              android:layout_weight=\"1\"\n              android:text=\"context start \\n(java -> Kotlin)\"\n              android:textSize=\"10dp\" />\n        </LinearLayout>\n\n        <TextView\n            android:id=\"@+id/text_hello\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Hello B1 !!\" />\n\n    </LinearLayout>\n</ScrollView>"
  },
  {
    "path": "demo/demo_component_home/src/main/res/layout/activity_kotlin.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <LinearLayout\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:orientation=\"horizontal\">\n\n            <Button\n                android:id=\"@+id/button_navigation_k_2_k\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"navigation \\n(Kotlin -> Kotlin)\"\n                android:textSize=\"10dp\" />\n\n            <Button\n                android:id=\"@+id/button_context_k_2_k_action\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"context(action) \\n(Kotlin -> Kotlin)\"\n                android:textSize=\"10dp\" />\n\n            <Button\n              android:id=\"@+id/button_context_k_2_k_router\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n              android:layout_weight=\"1\"\n              android:text=\"context(router) \\n(Kotlin -> Kotlin)\"\n              android:textSize=\"10dp\" />\n\n        </LinearLayout>\n\n\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:orientation=\"horizontal\">\n\n            <Button\n                android:id=\"@+id/button_context_k_2_j\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"context \\n(Kotlin -> Java)\"\n                android:textSize=\"10dp\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <Button\n                android:id=\"@+id/button_navigation_livedata_k_2_k\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"navigation observe LiveData  \\n(Kotlin -> Kotlin)\"\n                android:textSize=\"10dp\" />\n\n            <Button\n                android:id=\"@+id/button_context_livedata_k_2_k\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"context observe LiveData  \\n(Kotlin -> Kotlin)\"\n                android:textSize=\"10dp\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:orientation=\"horizontal\">\n\n            <Button\n                android:id=\"@+id/button_navigation_start_k_2_k\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"navigation start \\n(Kotlin -> Kotlin)\"\n                android:textSize=\"10dp\" />\n\n            <Button\n                android:id=\"@+id/button_context_start_k_2_k\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"context start \\n(Kotlin -> Kotlin)\"\n                android:textSize=\"10dp\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <Button\n                android:id=\"@+id/button_navigation_start_for_result_k_2_k\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"navigation start for result\\n(Kotlin -> Kotlin)\"\n                android:textSize=\"10dp\" />\n\n            <Button\n                android:id=\"@+id/button_context_start_for_result_k_2_k\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"context start for result\\n(Kotlin -> Kotlin)\"\n                android:textSize=\"10dp\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:orientation=\"horizontal\">\n\n            <Button\n                android:id=\"@+id/button_navigation_start_k_2_j\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"navigation start \\n(Kotlin -> Java)\"\n                android:textSize=\"10dp\" />\n\n            <Button\n                android:id=\"@+id/button_context_start_k_2_j\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"context start \\n(Kotlin -> Java)\"\n                android:textSize=\"10dp\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <Button\n                android:id=\"@+id/button_navigation_start_for_result_k_2_j\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"navigation start for result\\n(Kotlin -> Java)\"\n                android:textSize=\"10dp\" />\n\n            <Button\n                android:id=\"@+id/button_context_start_for_result_k_2_j\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"context start for result\\n(Kotlin -> Java)\"\n                android:textSize=\"10dp\" />\n        </LinearLayout>\n\n        <FrameLayout\n            android:id=\"@+id/container\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:id=\"@+id/text_hello\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Hello B1 !!\" />\n\n    </LinearLayout>\n</ScrollView>"
  },
  {
    "path": "demo/demo_component_home/src/main/res/layout/fragment_b1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@android:color/holo_blue_dark\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id/button_navigation_fragment_start_for_result_k_2_k\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:text=\"navigation fragment start for result\\n(Kotlin -> Kotlin)\"\n            android:textSize=\"10dp\" />\n\n        <Button\n            android:id=\"@+id/button_context_fragment_start_for_result_k_2_k\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:text=\"context fragment start for result\\n(Kotlin -> Kotlin)\"\n            android:textSize=\"10dp\" />\n    </LinearLayout>\n\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id/button_navigation_fragment_start_for_result_k_2_j\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:text=\"navigation fragment start for result\\n(Kotlin -> Java)\"\n            android:textSize=\"10dp\" />\n\n        <Button\n            android:id=\"@+id/button_context_fragment_start_for_result_k_2_j\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:text=\"context fragment start for result\\n(Kotlin -> Java)\"\n            android:textSize=\"10dp\" />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/text_hello_fragment\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello B1 Fragment !!\" />\n\n</LinearLayout>"
  },
  {
    "path": "demo/demo_component_home/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">ComponentB</string>\n</resources>\n"
  },
  {
    "path": "demo/demo_root_app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        applicationId \"com.baidu.kcomponent\"\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    flavorDimensions \"company\", \"channel\"\n\n    productFlavors {\n        company1 { dimension \"company\" }\n        company2 { dimension \"company\" }\n        channel1 { dimension \"channel\" }\n        channel2 { dimension \"channel\" }\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.core:core-ktx:1.0.2'\n    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'\n\n    androidTestImplementation 'androidx.test:core:1.3.0'\n    androidTestImplementation 'androidx.test:runner:1.3.0'\n    androidTestImplementation 'androidx.test:rules:1.3.0'\n    androidTestImplementation 'androidx.test.ext:junit:1.1.2'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'\n\n    implementation project(':demo:demo_until_library_a')\n\n}\n"
  },
  {
    "path": "demo/demo_root_app/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\n"
  },
  {
    "path": "demo/demo_root_app/src/androidTest/java/com/mars/component/test/RouterTestCase.kt",
    "content": "package com.mars.component.test\n\nimport android.content.Intent\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.LargeTest\nimport androidx.test.rule.ActivityTestRule\nimport com.baidu.kcomponent.MainActivity\nimport com.rubik.Rubik\nimport com.rubik.router.navigate\nimport com.rubik.router.result\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext.Companion.activityPage1\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.DetailContext.Companion.activityPage2KeyStr1KeyStr2KeyStr3\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestCompanionBean\nimport rubik.generate.context.demo_com_mars_rubik_test_detail.TestDataBean\nimport rubik.generate.root.init\n\n@LargeTest\n@RunWith(AndroidJUnit4::class)\nclass RouterTestCase {\n    companion object{\n        const val LOG_TAG = \"RouterTest\"\n    }\n\n    private fun log(msg: String) {\n        println(\"$LOG_TAG $msg \")\n    }\n\n    @get:Rule\n    var activityRule = ActivityTestRule(MainActivity::class.java)\n\n    @Before\n    fun init() {\n        log(\" INIT \")\n        Rubik.logger {\n            d = { msg ->\n                log(msg)\n            }\n            e = { msg, e ->\n                log(msg)\n                e?.let { throw e }\n            }\n        }\n        Rubik.init()\n    }\n\n    @After\n    fun after(){\n        log(\" AFTER \")\n    }\n\n    @Test\n    fun useDetail() {\n        // 高阶函数异步返回\n        DetailContext.doSthAsyncHOF { s, testDataBean ->\n            log(\"doSthAsyncHOF s:${s} testDataBean:${testDataBean}\")\n        }\n\n\n        // 高阶函数\n        navigate {\n            uri = DetailContext.Uris.DO_STH_HOF\n            query {\n                \"a0\" with  4\n                \"a1\" with \"123\"\n                \"a2\" with TestDataBean(1, \"456\")\n            }\n            result<Int> { value ->\n                log(\"DO_STH_HOF value:${value}\")\n            }\n        }\n\n        activityRule.activity.activityPage1(\n            TestCompanionBean(5303, \"303303\"),\n            arrayOf(TestCompanionBean(5304, \"304304\")),\n            533,\n            ArrayList<String>().apply { add((\"i am from b AContext list\")) },\n            TestDataBean(5203, \"203\"),\n            ArrayList<Int>().apply { add(5123) },\n            ArrayList<TestCompanionBean>().apply { add(TestCompanionBean(5305, \"305305\")) },\n            \"i am from b AContext\",\n            Intent.FLAG_ACTIVITY_NEW_TASK\n        )\n\n        activityRule.activity.activityPage2KeyStr1KeyStr2KeyStr3(\n            \"ccc\",\n            \"vvv\",\n            \"bbb\",\n            Intent.FLAG_ACTIVITY_NEW_TASK,\n            102\n        )\n\n//        val countdown = CountDownLatch(1)\n//        countdown.await()\n    }\n\n}\n\n"
  },
  {
    "path": "demo/demo_root_app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.baidu.kcomponent\">\n\n    <application\n        android:name=\".MainApplication\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "demo/demo_root_app/src/main/java/com/baidu/kcomponent/MainActivity.kt",
    "content": "package com.baidu.kcomponent\n\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.mars.component.home.test.kotlin.TestBigData\nimport com.mars.component.home.test.kotlin.invokeDataType\nimport com.mars.component.home.ui.HomeActivity\nimport com.mars.component.home.ui.java.JavaHomeActivity\nimport com.rubik.Rubik\nimport com.rubik.context.LifeCycleEvent\nimport com.rubik.router.doEvent\nimport com.rubik.router.doEventWithContext\nimport kotlinx.android.synthetic.main.activity_main.*\nimport rubik.generate.shell.idChecker\n\nclass MainActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(R.layout.activity_main)\n\n        button_start_home.setOnClickListener {\n            startActivity(Intent(this, HomeActivity::class.java))\n        }\n\n        button_start_java_home.setOnClickListener {\n            startActivity(Intent(this, JavaHomeActivity::class.java))\n        }\n\n        button_test_life.setOnClickListener {\n            applicationContext.doEventWithContext(LifeCycleEvent.INIT, \"initapp\", 11, 22)\n            doEvent(LifeCycleEvent.DESTROY, applicationContext, \"desapp\", 33, 44)\n\n            doEvent(\"MY_INIT\", true, \"initmyapp\", \"a\", \"b\")\n            doEvent(\"MY_DESTROY\", false, \"desapp\", \"c\", \"d\")\n        }\n\n        button_test_data_type.setOnClickListener {\n            invokeDataType(applicationContext)\n        }\n\n        button_test_big_data.setOnClickListener {\n            text_info.text = \"\"\n            TestBigData().invoke(applicationContext) { info ->\n                text_info.text = text_info.text.toString() + \"\\n\" + info\n            }\n        }\n\n        button_check_ids.setOnClickListener {\n             Rubik.idChecker().check()\n        }\n    }\n}\n"
  },
  {
    "path": "demo/demo_root_app/src/main/java/com/baidu/kcomponent/MainApplication.kt",
    "content": "package com.baidu.kcomponent\n\nimport android.app.Application\nimport android.util.Log\nimport com.rubik.Rubik\nimport rubik.generate.shell.init\n\nclass MainApplication : Application() {\n    override fun onCreate() {\n        super.onCreate()\n        Rubik.logger {\n            bigLogEnable = false\n            d = { log -> Log.d(\"R DEBUG\", log) }\n            e = { log, e ->\n                Log.e(\"R ERROR\", \"$log \")\n//                e?.let {\n//                    throw it\n//                }\n            }\n        }\n        Rubik.init()\n        Rubik.Properties.autoParcel = true\n    }\n}"
  },
  {
    "path": "demo/demo_root_app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\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=\"#008577\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "demo/demo_root_app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "demo/demo_root_app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\nandroid:layout_width=\"match_parent\"\nandroid:layout_height=\"wrap_content\">\n\n<LinearLayout\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"wrap_content\"\n  android:orientation=\"vertical\">\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center\"\n      android:orientation=\"horizontal\">\n\n        <Button\n          android:id=\"@+id/button_start_home\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"start HOME\" />\n        <Button\n          android:id=\"@+id/button_start_java_home\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"start HOME (Java lang)\" />\n\n    </LinearLayout>\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center\"\n      android:orientation=\"horizontal\">\n\n        <Button\n          android:id=\"@+id/button_test_life\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"test EVENT\" />\n\n    </LinearLayout>\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center\"\n      android:orientation=\"horizontal\">\n\n        <Button\n          android:id=\"@+id/button_test_data_type\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"test DATA TYPE\" />\n\n        <Button\n          android:id=\"@+id/button_test_big_data\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"test BIG DATA\" />\n    </LinearLayout>\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center\"\n      android:orientation=\"horizontal\">\n\n        <Button\n          android:id=\"@+id/button_check_ids\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          android:layout_weight=\"1\"\n          android:text=\"check IDS\" />\n\n    </LinearLayout>\n\n    <TextView\n      android:id=\"@+id/text_info\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"-\" />\n\n</LinearLayout>\n</ScrollView>"
  },
  {
    "path": "demo/demo_root_app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "demo/demo_root_app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "demo/demo_root_app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#008577</color>\n    <color name=\"colorPrimaryDark\">#00574B</color>\n    <color name=\"colorAccent\">#D81B60</color>\n</resources>\n"
  },
  {
    "path": "demo/demo_root_app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">RUBIK_DEMO</string>\n</resources>\n"
  },
  {
    "path": "demo/demo_root_app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "demo/demo_until_library_a/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n}\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n\n        consumerProguardFiles 'consumer-rules.pro'\n//\n//        missingDimensionStrategy 'company', 'company1', 'company2'\n//        missingDimensionStrategy 'channel', 'channel1', 'channel2', 'channel3'\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),\n                    'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n//    flavorDimensions \"abc\" , 'channel'\n\n//    productFlavors {\n//        abc1 {\n//            dimension \"abc\"\n//            missingDimensionStrategy 'company', 'company1'\n//        }\n//        abc2 {\n//            dimension \"abc\"\n//            missingDimensionStrategy 'company', 'company2'\n////            missingDimensionStrategy 'channel', 'channel1', 'channel2', 'channel3'\n//        }\n//\n//        channel1 {\n//            dimension \"channel\"\n//        }\n//\n//        channel2 {\n//            dimension \"channel\"\n//        }\n//\n//        channel3 {\n//            dimension \"channel\"\n//        }\n//    }\n\n}\n\n//configurations {\n//    abc1Implementation {\n//    }\n//}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.core:core-ktx:1.0.2'\n\n//    implementation project(':demo:demo_until_library_b')\n\n}"
  },
  {
    "path": "demo/demo_until_library_a/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "demo/demo_until_library_a/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": "demo/demo_until_library_a/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.mars.util_library.a\">\n\n</manifest>"
  },
  {
    "path": "demo/demo_until_library_a/src/main/java/com/mars/util_library/TestClassA.kt",
    "content": "package com.mars.util_library\n\nclass TestClassA {\n    val testTag: String = \"test a!!!\"\n//    val b : TestClassB? =null\n//    val qwe = b\n}"
  },
  {
    "path": "demo/demo_until_library_a/src/main/java/com/mars/util_library/TestLibDataBean.kt",
    "content": "package com.mars.util_library\n\ndata class TestLibDataBean(val d1: Int?, val d2: String?)"
  },
  {
    "path": "demo/demo_until_library_b/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n}\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n\n        consumerProguardFiles 'consumer-rules.pro'\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),\n                    'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n\n\n    }\n\n\n    sourceSets {\n        main {\n            java {\n                srcDirs 'src/main/java', 'src/testex/java'\n//                excludes = [ '**/com/x/**'] // 'com/x/Yx.java',\n            }\n\n        }\n    }\n\n//    packagingOptions {\n//        exclude '**/generate/component/**'\n//    }\n\n    flavorDimensions \"company\", \"channel\"\n\n    productFlavors {\n        company1 { dimension \"company\" }\n        company2 { dimension \"company\" }\n        channel1 { dimension \"channel\" }\n        channel2 { dimension \"channel\" }\n    }\n}\n\n//tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile.class).configureEach {\n//    println(\"xxxxxxxxxxxxxxxx\")\n//    println(it.name)\n//    it.setExcludes( [ '**/com/x/**'])\n//}\n\n//tasks.withType(org.gradle.api.tasks.SourceTask.class).configureEach {\n//    it.exclude('**/com/x/**')\n//}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.core:core-ktx:1.0.2'\n}"
  },
  {
    "path": "demo/demo_until_library_b/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "demo/demo_until_library_b/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": "demo/demo_until_library_b/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.mars.util_library.b\">\n\n</manifest>"
  },
  {
    "path": "demo/demo_until_library_b/src/main/java/com/mars/util_library/TestClassB.kt",
    "content": "package com.mars.util_library\n\nimport com.x.Xx\nimport com.x.Yx\n\nclass TestClassB {\n    val testTag: String = \"test b!!!\"\n    val x : Xx = Xx()\n    val y : Yx = Yx()\n    val a =1232\n}"
  },
  {
    "path": "demo/demo_until_library_b/src/testex/java/com/x/Xx.kt",
    "content": "package com.x\n\nclass Xx {\n    val a =13211\n}"
  },
  {
    "path": "demo/demo_until_library_b/src/testex/java/com/x/Yx.java",
    "content": "package com.x;\n\npublic class Yx {\n}\n"
  },
  {
    "path": "demo/demo_until_library_c_java/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'kotlin-android'\n}\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n\n        consumerProguardFiles 'consumer-rules.pro'\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),\n                    'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n//    flavorDimensions  \"channel\"\n//\n//    productFlavors {\n//        channel1 { dimension \"channel\" }\n//        channel2 { dimension \"channel\" }\n//    }\n}\n\ndependencies {\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n}"
  },
  {
    "path": "demo/demo_until_library_c_java/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "demo/demo_until_library_c_java/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": "demo/demo_until_library_c_java/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.mars.cui.demo_until_library_c_java\">\n\n</manifest>"
  },
  {
    "path": "demo/demo_until_library_c_java/src/main/java/TestClassC.kt",
    "content": "//import com.mars.util_library.TestClassB\n\nclass TestClassC {\n//    val testTag: String = TestClassB().testTag\n}"
  },
  {
    "path": "demo/rubik-components.gradle",
    "content": "rubik {\n    global {\n\n        scheme 'demo'\n        group 'com.mars.rubik-test'\n\n        devMode true\n\n//      forceMavenMode true\n\n        variant 'release'\n\n    }\n\n    component {\n        uri '.detail'\n        source {\n            project (':demo:demo_component_detail')\n            maven {\n                variant 'company1Channel1Release'\n            }\n        }\n\n        tag 'pr1', 'pr2', 'pr3'\n    }\n\n    component {\n        uri '.detail-java'\n        source {\n            project \":demo:demo_component_detail_java\"\n        }\n        tag 'lib1'\n    }\n\n    component {\n        uri '.home'\n        touching '.detail', '.detail-java'\n\n        source {\n            project ':demo:demo_component_home'\n        }\n\n        tag 'pr2'\n    }\n\n    library {\n        uri '.library.b'\n        source {\n            project \":demo:demo_until_library_b\"\n            maven{\n                forFlavor('company1') {\n                    variant \"company1Channel1Release\"\n                }\n                forFlavor('company2') {\n                    variant \"company2Channel2Release\"\n                }\n            }\n        }\n        tag 'lib1'\n    }\n\n    library {\n        uri '.library.c-java'\n        source {\n            project \":demo:demo_until_library_c_java\"\n        }\n        tag 'lib1'\n    }\n\n}"
  },
  {
    "path": "demo/rubik-packing.gradle",
    "content": "// 本地本地的组件组合配置,覆盖云端配置\nrubik {\n    packing { // 被选择组合成app的组件\n\n//        mavenMode all\n\n        projectMode all\n\n        mavenMode '.detail' , '.detail-java'\n\n//        mavenMode tag(\"pr2\")\n\n//        noSourceMode tag(\"pr2\")\n\n//        except '.detail'\n\n//        uri('.detail') {\n//            noSourceMode {\n//                aggregate false\n//            }\n//        }\n\n//        flavor('samsung') {\n//            uri('.library.c-java') {\n//                mavenMode {\n//                    variant \"samsung\"\n//                }\n//            }\n//        }\n//\n//        flavor('netdisk') {\n//            uri('.library.c-java') {\n//                mavenMode {\n//                    variant \"netdisk\"\n//                }\n//            }\n//        }\n    }\n\n//    except '.library.c-java', \"detail-java\"\n}\n\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Aug 20 12:44:46 CST 2021\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStorePath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.2-bin.zip\n\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\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# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Automatically convert third-party libraries to use AndroidX\nandroid.enableJetifier=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n\norg.gradle.caching=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$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=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "rubik/rubik_annotations/build.gradle",
    "content": "apply plugin: 'java-library'\napply plugin: 'maven-publish'\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n}\n\ntasks.withType(JavaCompile) {\n    options.encoding = \"UTF-8\"\n}\n\ntasks.withType(GenerateModuleMetadata) {\n    enabled = false\n}\n\npublishing {\n    publications {\n        rubikAnnotations(MavenPublication) {\n            groupId \"com.rubik\"\n            artifactId 'annotations'\n            version pubs.rubik.annotations\n            description 'annotations'\n            from components.java\n        }\n    }\n\n    apply from: '../rubik_maven_repositories.gradle'\n    addRubikMavenRepos(repositories)\n}\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_1_8\n    targetCompatibility = JavaVersion.VERSION_1_8\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/context/REvent.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.context;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(REventRepeatable.class)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface REvent {\n    String uri() default \"\";\n    @Deprecated\n    String context() default \"\";\n    String msg();\n    String tag() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/context/REventRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.context;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface REventRepeatable {\n    REvent[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/context/assist/REventAssist.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.context.assist;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Deprecated\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(REventAssistRepeatable.class)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface REventAssist {\n    String uri() default \"\";\n    @Deprecated\n    String context() default \"\";\n    String assistForTag() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/context/assist/REventAssistRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.context.assist;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Deprecated\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface REventAssistRepeatable {\n    REventAssist[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/context/instance/REventInstance.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.context.instance;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Deprecated\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(REventInstanceRepeatable.class)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface REventInstance {\n    String uri() default \"\";\n    String provideForTag() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/context/instance/REventInstanceRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.context.instance;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Deprecated\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface REventInstanceRepeatable {\n    REventInstance[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RCallback.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE})\npublic @interface RCallback {\n    String uri() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RExtend.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.PARAMETER})\npublic @interface RExtend {\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RInstance.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(RInstanceRepeatable.class)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RInstance {\n    String uri() default \"\";\n    String provideForTag() default \"\";\n    String provideForPath() default \"\";\n    String version() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RInstanceRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RInstanceRepeatable {\n    RInstance[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RObject.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RObject {\n    String uri() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RProperty.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.FIELD, ElementType.METHOD})\npublic @interface RProperty {\n    String name() default \"\";\n\n    String[] forPath() default {};\n\n    String extra() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RResult.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.PARAMETER, ElementType.METHOD})\npublic @interface RResult {\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RRoute.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport com.rubik.annotations.route.function.RDefaultType;\n\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(RRouteRepeatable.class)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RRoute {\n    String uri() default \"\";\n    @Deprecated\n    String context() default \"\";\n    String path() default \"\";\n    String version() default \"\";\n    boolean navigationOnly() default false;\n    @Deprecated\n    boolean forResult() default false;\n    boolean syncReturn() default false;\n    Class resultType() default RDefaultType.class;\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RRouteRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RRouteRepeatable {\n    RRoute[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/RValue.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE, ElementType.CONSTRUCTOR})\npublic @interface RValue {\n    String uri() default \"\";\n    @Deprecated\n    String context() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/assist/RRouteAssist.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route.assist;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Deprecated\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(RRouteAssistRepeatable.class)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RRouteAssist {\n    String uri() default \"\";\n    @Deprecated\n    String context() default \"\";\n    String assistForPath();\n    String version() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/assist/RRouteAssistRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route.assist;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Deprecated\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RRouteAssistRepeatable {\n    RRouteAssist[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/function/RDefaultType.java",
    "content": "package com.rubik.annotations.route.function;\n\npublic class RDefaultType { }\n"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/function/RFunction.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route.function;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(RFunctionRepeatable.class)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})\npublic @interface RFunction {\n    String uri() default \"\";\n    String path() default \"\";\n    String version() default \"\";\n    boolean navigationOnly() default false;\n    @Deprecated\n    boolean forResult() default false;\n    boolean syncReturn() default true;\n    Class resultType() default RDefaultType.class;\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/function/RFunctionRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route.function;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})\npublic @interface RFunctionRepeatable {\n    RFunction[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/instance/RRouteInstance.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route.instance;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Deprecated\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(RRouteInstanceRepeatable.class)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RRouteInstance {\n    String uri() default \"\";\n    String provideForPath();\n    String version() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/instance/RRouteInstanceRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route.instance;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Deprecated\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RRouteInstanceRepeatable {\n    RRouteInstance[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/page/RPage.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route.page;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Repeatable;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Repeatable(RPageRepeatable.class)\n@Target({ ElementType.TYPE})\npublic @interface RPage {\n    String uri() default \"\";\n    String path() default \"\";\n    String version() default \"\";\n    boolean navigationOnly() default false;\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/route/page/RPageRepeatable.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.route.page;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.SOURCE)\n@Target({ElementType.TYPE})\npublic @interface RPageRepeatable {\n    RPage[] value();\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/source/RAggregate.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.source;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE})\npublic @interface RAggregate {\n    String uri();\n    String version();\n    String token() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/source/RComponent.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.source;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE})\npublic @interface RComponent {\n    String uri();\n    String version();\n    String variant( ) default \"\";\n    String[] touched() default {};\n    String[] packed() default {};\n    @Deprecated\n    String[] dependencies() default {};\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/source/RContext.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.source;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE})\npublic @interface RContext {\n    String uri();\n    String version();\n    String token() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/source/RContextLib.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.source;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.CLASS)\n@Target({ElementType.TYPE})\npublic @interface RContextLib {\n    String uri();\n    @Deprecated\n    String context() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/source/RGenerated.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.source;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.TYPE})\npublic @interface RGenerated {\n    String kind() default \"\";\n    String by() default \"\";\n    String version() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/source/RGeneratedRouter.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.source;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.METHOD})\npublic @interface RGeneratedRouter {\n    String uri() default \"\";\n    String kind() default \"\";\n    String clazz() default \"\";\n    String method() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/source/RGeneratedValue.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.source;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE})\npublic @interface RGeneratedValue {\n    String uri() default \"\";\n    @Deprecated\n    String context() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_annotations/src/main/java/com/rubik/annotations/source/ROriginalValue.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.annotations.source;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.CLASS)\n@Target({ElementType.TYPE})\npublic @interface ROriginalValue {\n    String uri() default \"\";\n    @Deprecated\n    String context() default \"\";\n}"
  },
  {
    "path": "rubik/rubik_context/build.gradle",
    "content": "apply plugin: 'java-library'\napply plugin: 'kotlin'\napply plugin: 'maven-publish'\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation gradleApi()\n\n    implementation \"com.android.tools.build:gradle:$agbt_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n    implementation deps.ktnail.x\n    implementation deps.ktnail.gradle\n    implementation deps.synccode.syncer\n\n    implementation deps.rubik.annotations\n}\n\ntasks.withType(JavaCompile) {\n    options.encoding = \"UTF-8\"\n}\n\ncompileKotlin {\n    kotlinOptions.freeCompilerArgs += ['-module-name', \"kmd.mars.rubik.context\"]\n}\n\npublishing {\n    publications {\n        rubikPlugins(MavenPublication) {\n            groupId \"com.rubik\"\n            artifactId 'context'\n            version pubs.rubik.context\n            description 'context'\n            from components.java\n        }\n    }\n\n    apply from: '../rubik_maven_repositories.gradle'\n    addRubikMavenRepos(repositories)\n}\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/Dependency.kt",
    "content": "package com.rubik.context\n\n\ndata class Dependency(\n    val uri: String,\n    val forFlavor: String?\n)"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/Ext.kt",
    "content": "package com.rubik.context\n\n\nobject Ext {\n    const val RUBIK_TMP_LIB_DIR = \"rubik_tmp_lib_dir\"\n    const val RUBIK_TMP_LIB_DIR_MODE = \"rubik_tmp_lib_dir_mode\"\n\n    const val RUBIK_MAVEN_REPOSITORY = \"rubik_maven_repository\"\n    const val RUBIK_MAVEN_USERNAME = \"rubik_maven_username\"\n    const val RUBIK_MAVEN_PASSWORD = \"rubik_maven_password\"\n    const val RUBIK_MAVEN_LOCAL_REPOSITORY = \"rubik_maven_local_repository\"\n\n    const val RUBIK_PUBLISH_CONTEXT_LIB_SOURCE = \"rubik_publish_context_lib_source\"\n\n    const val RUBIK_EXTENSION_NAME = \"rubik_extension_name\"\n\n    const val RUBIK_AUTO_GENERATE_AGGREGATE = \"rubik_auto_generate_aggregate\"\n\n    const val RUBIK_AGGREGATE_KDOC_ADD_USER_ADD_TIME = \"rubik_aggregate_kdoc_add_user_add_time\"\n\n    const val RUBIK_AUTO_GENERATE_COMPONENT_ID = \"rubik_auto_generate_component_id\"\n\n    const val RUBIK_GENERATE_AGGREGATE_IN_BUILD_DIR = \"rubik_generate_aggregate_in_build_dir\"\n\n    const val RUBIK_GENERATE_ROUTER_CONTEXT = \"rubik_generate_router_context\"\n\n    const val RUBIK_CLEAN_BEFORE_TASK = \"rubik_clean_before_task\"\n\n    const val RUBIK_KAPT_SOURCE_FOLDER = \"rubik_kapt_source_folder\"\n\n    const val RUBIK_USE_RESET_COMPILER = \"rubik_use_reset_compiler\"\n\n    const val RUBIK_KAPT_VERSION = \"rubik_kapt_version\"\n    const val RUBIK_ROUTER_VERSION = \"rubik_router_version\"\n\n    const val RUBIK_AUTO_APPLY_SHELL_PLUGIN = \"rubik_auto_apply_shell_plugin\"\n\n    const val RUBIK_CONFIG_FILE_DIRS = \"rubik_config_file_dirs\"\n\n    const val RUBIK_ENABLE_CHECK_ROUTER_VERSION = \"rubik_enable_check_router_version\"\n    const val RUBIK_ENABLE_CHECK_CONTEXT_VERSION = \"rubik_enable_check_context_version\"\n\n    const val RUBIK_CHECK_CONTEXT_LIB_TASKS_STATE = \"rubik_check_context_lib_tasks_state\"\n\n    const val RUBIK_CONTEXT_PACKING_COMPILE_ONLY = \"rubik_context_packing_compile_only\"\n\n    const val RUBIK_CHECK_FLAVOR_WHEN_PICK = \"rubik_check_flavor_when_pick\"\n\n    const val RUBIK_AUTO_FILL_FLAVOR = \"rubik_auto_fill_flavor\"\n\n    const val RUBIK_STRICT_TOUCHING_AND_PACKING = \"rubik_strict_touching_and_packing\"\n\n    const val RUBIK_EXCEPT_COMPONENT_BUILD_TYPES = \"rubik_except_component_build_types\"\n\n    const val RUBIK_EXCEPT_COMPONENT_FLAVORS = \"rubik_except_component_flavors\"\n\n    const val RUBIK_PUBLICATION_RECORD_FILES_DIR = \"rubik_publication_record_files_dir\"\n\n    const val RUBIK_PUBLICATION_RECORD_HISTORY_MAX_SIZE = \"rubik_publication_record_history_max_size\"\n\n    const val RUBIK_AUTO_UPDATE_PUBLICATION_RECORD = \"rubik_auto_update_publication_record\"\n\n    const val RUBIK_AUTO_USE_PUBLICATION_RECORD = \"rubik_auto_use_publication_record\"\n\n    const val RUBIK_REMOVE_PROJECT_WHEN_PUBLISH_CONTEXT_LIBS = \"rubik_remove_project_when_publish_context_libs\"\n\n    const val RUBIK_ON_ROUTE_METHOD_MAX_SIZE = \"rubik_on_route_method_max_size\"\n\n    const val RUBIK_SYNC_CODE_ENABLE = \"rubik_sync_code_enable\"\n\n    const val RUBIK_AUTO_GENERATE_SETTINGS = \"rubik_auto_generate_settings\"\n\n    const val RUBIK_LOG_LEVEL = \"rubik_log_level\"\n\n    const val RUBIK_WRITE_LOG_TO_FILE = \"rubik_write_log_to_file\"\n\n    const val R_PUB_VERSION = \"rpubversion\"\n\n    const val RUBIK_REPORT_GENERATED = \"rubik_report_generated\"\n\n    const val RUBIK_REPORT_GENERATED_ASYNC = \"rubik_report_generated_async\"\n\n    const val RUBIK_IGNORE_VALUE_ANNOTATIONS = \"rubik_ignore_value_annotations\"\n\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/MavenSource.kt",
    "content": "package com.rubik.context\n\ndata class MavenSource(\n    var version: String?,\n    var variant: String?,\n    val flavors: Map<String, MavenSource>?\n)\n\nfun MavenSource?.mergeOther(other: MavenSource): MavenSource =\n    if (this == null) other else\n        MavenSource(version ?: other.version, variant ?: other.variant, flavors ?: other.flavors)"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/Source.kt",
    "content": "package com.rubik.context\n\nimport com.ktnail.x.command.Command\n\ndata class Source(\n    var projectPath: String?,\n    val publishVersion: String?,\n    val publishOriginalValue: Boolean,\n    val allowAutoVersion: Boolean,\n    val maven: MavenSource,\n    val codeSyncer: (() -> Command?)?\n)"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/container/ContextsContainer.kt",
    "content": "package com.rubik.context.container\n\nimport com.ktnail.x.Logger\nimport com.rubik.context.extra.Context\nimport com.rubik.context.exception.RubikComponentUndefinedException\nimport com.rubik.context.exception.RubikMultipleComponentDefinedException\nimport com.rubik.context.log.LogTags\n\nclass ContextsContainer {\n    val contexts = mutableMapOf<String, Context>()\n\n     fun register(context: Context) = context.apply {\n        if (!contexts.containsKey(uri)) {\n            contexts[uri] = this\n        } else {\n            throw RubikMultipleComponentDefinedException(uri)\n        }\n\n        Logger.dta(LogTags.CONTEXT) { \" REGISTER <$this>\" }\n    }\n\n    fun obtainAny() =\n        contexts.map { (_, value) -> value }\n\n    fun obtainByUri(uri: String, strict: Boolean = true) =\n        contexts[uri] ?: if (strict) throw RubikComponentUndefinedException(uri) else null\n\n    fun obtainByProject(projectPath: String): List<Context> =\n        contexts.filterValues { value -> value.projectPath == projectPath }.map { (_, value) -> value }\n\n    fun obtainByTag(tag: String) =\n        contexts.filterValues { value -> value.tags.containsKey(tag) }.map { (_, value) -> value }\n\n    fun obtainPackingLink(\n        context: Context,\n        acc: MutableList<Context> = mutableListOf()\n    ): List<Context> = acc.apply {\n        obtainPacking(context).let { packing ->\n            addAll(packing)\n            packing.forEach { packed ->\n                obtainPackingLink(packed, acc)\n            }\n        }\n    }\n\n    fun obtainPacking(\n        context: Context\n    ): List<Context> =\n        context.packing.mapNotNull { dep -> contexts[dep.uri] }\n\n    fun obtainPackingThis(context: Context) =\n        contexts.filterValues { value -> value.packing.any { dep -> dep.uri == context.uri } }\n            .map { (_, value) -> value }\n}\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/exception/RubikComponentUndefinedException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.context.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when find a component by uri, but the component is undefined .\n *\n * @since 1.9\n */\ninternal open class RubikComponentUndefinedException(\n    private val uri: String\n) : RuntimeException() {\n    override fun toString() =\n        \"RubikComponentUndefinedException the <$uri> of component is undefined.\"\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/exception/RubikDSLDefaultGroupNotSetException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.context.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when use only name to build uri, but no defaultGroup set.\n *\n * @since 1.9\n */\nclass RubikDSLDefaultGroupNotSetException : RuntimeException() {\n    override fun toString() =\n        \"RubikDefaultGroupNotSetException if you want build uri use only name , please set defaultGroup and defaultScheme in context first! \"\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/exception/RubikDSLDefaultSchemeNotSetException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.context.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when use only authority to build uri, but no defaultScheme set.\n *\n * @since 1.6\n */\nclass RubikDSLDefaultSchemeNotSetException : RuntimeException() {\n    override fun toString() =\n        \"RubikDefaultSchemeNotSetException if you want build uri use only authority , please set defaultScheme in context first! \"\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/exception/RubikMultipleComponentDefinedException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.context.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when component defined multiple times.\n *\n * @since 1.8\n */\ninternal open class RubikMultipleComponentDefinedException(private val uri:String) : RuntimeException() {\n    override fun toString() =\n        \"RubikMultipleComponentDefinedException Component<$uri> defined multiple times in gradle files! \"\n}\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/exception/RubikPluginNotApplyException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.context.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when plugin not apply yet.\n *\n * @since 1.3\n */\nclass RubikPluginNotApplyException : RuntimeException() {\n    override fun toString() = \"RubikPluginNotApplyException plugin not apply yet!\"\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/extra/Context.kt",
    "content": "package com.rubik.context.extra\n\nimport com.ktnail.x.uri.toSchemeAndAuthority\nimport com.rubik.context.Dependency\nimport com.rubik.context.Source\nimport com.rubik.context.id.ContextIdHolder\nimport org.gradle.api.Project\n\ndata class Context(\n    val project: Project,\n    val enableProvideRoute: Boolean,\n    val enablePublishComponent: Boolean,\n    val uri: String,\n    val touching: List<Dependency>,\n    val packing: List<Dependency>,\n    val source: Source,\n    val tags: Map<String, Source?>\n) {\n    val scheme: String\n    val name: String\n    val group: String\n\n    init {\n        uri.toSchemeAndAuthority().let { (scheme, authority) ->\n            this.scheme = scheme\n            this.group = authority.substringBeforeLast(\".\")\n            this.name = authority.substringAfterLast(\".\")\n        }\n    }\n\n    // packingLink\n    var packingWho: List<Context> = emptyList()\n\n    var whoPackingMe: List<Context> = emptyList()\n\n    // source\n    val projectPath\n        get() = source.projectPath\n\n    fun updateProjectPathIfNull(project: String) {\n        if (null == source.projectPath)\n            source.projectPath = project\n    }\n\n    // tags\n    val tagNames\n        get() = tags.keys\n\n    // id\n    val id: ContextIdHolder = ContextIdHolder(this)\n\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/extra/Injector.kt",
    "content": "package com.rubik.context.extra\n\nimport com.rubik.context.container.ContextsContainer\nimport com.rubik.global.GlobalConfig\nimport com.rubik.context.utility.Module\nimport com.rubik.context.utility.ModuleInjector\n\n\ninterface ContextModuleInjector : ModuleInjector {\n    val globalConfig: GlobalConfig\n    val contextsContainer: ContextsContainer\n}\n\nobject ContextModule : Module<ContextModuleInjector>()\n\nval globalConfig: GlobalConfig\n    get() = ContextModule.content.globalConfig\n\nval contextsContainer: ContextsContainer\n    get() = ContextModule.content.contextsContainer\n\nval allContexts: Map<String, Context>\n    get() = contextsContainer.contexts"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/extra/Rubik.kt",
    "content": "package com.rubik.context.extra\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.android.builder.model.BuildType\nimport com.ktnail.gradle.forEachVariant\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.x.Logger\nimport com.rubik.context.Ext\nimport com.rubik.context.exception.RubikPluginNotApplyException\nimport com.rubik.context.log.LogTags\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport java.io.File\n\nobject Rubik {\n    const val MAIN_PLUGIN_NAME = \"rubik\"\n    const val RUBIK_TASK_GROUP_NAME = \"rubik\"\n}\n\nfun Project.rubikTask(name: String, action: (Task) -> Unit): Task =\n    task(name, action).apply {\n        group = Rubik.RUBIK_TASK_GROUP_NAME\n        Logger.dta(LogTags.CREATE_TASK) { \" CREATE $group TASK ($name) for [${this@rubikTask.path}]\" }\n    }\n\nfun <T : Task> Project.rubikTask(\n    name: String,\n    type: Class<T>,\n    action: (T) -> Unit\n): T = tasks.create(name, type, action).apply {\n    group = Rubik.RUBIK_TASK_GROUP_NAME\n    Logger.dta(LogTags.CREATE_TASK) { \" CREATE $group TASK ($name) for [${this@rubikTask.path}]\" }\n}\n\nval Project.rubikExtensionName\n    get() = project.propertyOr(Ext.RUBIK_EXTENSION_NAME) { \"rubik\" }\n\n\nval Project.rubikMainProject: Project\n    get() =\n        when {\n            pluginManager.hasPlugin(Rubik.MAIN_PLUGIN_NAME) -> this\n            rootProject.pluginManager.hasPlugin(Rubik.MAIN_PLUGIN_NAME) -> rootProject\n            else -> throw RubikPluginNotApplyException()\n        }\n\nval Project.libTmpDirRoot: File\n    get() = File(project.propertyOr(Ext.RUBIK_TMP_LIB_DIR) {\n        project.rootProject.rootDir.absolutePath + File.separator + \"rubik_libs\"\n    })\n\nfun BuildType.isContextLibBuildType() = name.endsWith(com.rubik.context.publication.BuildType.CONTEXT_LIB_BUILD_TYPE_NAME)\n\nfun BuildType.isContextLibCompilerBuildType() = name.endsWith(com.rubik.context.publication.BuildType.CONTEXT_LIB_COMPILER_BUILD_TYPE_NAME)\n\nval BuildType.isCustomBuildType: Boolean\n    get() = isContextLibBuildType() || isContextLibCompilerBuildType()\n\nval BaseVariant.isCustomVariant: Boolean\n    get() = buildType.isCustomBuildType\n\nval Project.autoGenerateAggregate\n    get() = propertyOr(Ext.RUBIK_AUTO_GENERATE_AGGREGATE, false)\n\nval Project.autoGenerateComponentId\n    get() = propertyOr(Ext.RUBIK_AUTO_GENERATE_COMPONENT_ID, false)\n\nval Project.generateAggregateInBuildDir\n    get() = propertyOr(Ext.RUBIK_GENERATE_AGGREGATE_IN_BUILD_DIR, true)\n\nfun Project.makeRubikGeneratingDirs(onMakeDir: (File, BaseVariant) -> Unit) {\n    project.forEachVariant { variant ->\n        onMakeDir(makeRubikGeneratingDir(variant), variant)\n    }\n}\n\nfun Project.makeRubikGeneratingDir(variant: BaseVariant): File =\n    File(project.file(File(project.buildDir, \"generated/source/rubikKotlin\")), variant.name).apply {\n        mkdirs()\n    }"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/folder/ClassesTmpDir.kt",
    "content": "package com.rubik.context.folder\n\nimport com.ktnail.x.uriToSnake\nimport org.gradle.api.Project\nimport java.io.File\n\nprivate fun classesTmpDirPath(project: Project, libType: String, variantName: String, uri: String) =\n        \"${project.buildDir}${File.separator}rubik${File.separator}${variantName}${File.separator}${uri.uriToSnake()}${File.separator}${libType}_classes\"\n\nfun getLibClassesTmpDir(project: Project, libType: String, variantName: String, uri: String) = File(\n        classesTmpDirPath(project, libType, variantName, uri)\n).apply {\n        mkdirs()\n}\n\nfun cleanLibClassesTmpDir(project: Project, libType: String, variantName: String, uri: String) =\n        File(classesTmpDirPath(project, libType, variantName, uri)).apply {\n                deleteRecursively()\n                mkdirs()\n        }\n\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/folder/GeneratedSourceDir.kt",
    "content": "package com.rubik.context.folder\n\nimport com.ktnail.x.uriToSnake\nimport org.gradle.api.Project\nimport java.io.File\n\nprivate fun generatedSourceDir(project: Project, variantName: String, uri: String) =\n        \"${project.buildDir}${File.separator}rubik${File.separator}${variantName}${File.separator}${uri.uriToSnake()}${File.separator}generated${File.separator}source\"\n\n\nfun getGeneratedSourceDir(project: Project, variantName: String, uri: String) =\n        File(generatedSourceDir(project, variantName, uri)).apply {\n                mkdirs()\n        }"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/folder/LibsTmpDir.kt",
    "content": "package com.rubik.context.folder\n\nimport com.ktnail.x.uriToSnake\nimport java.io.File\n\nfun getLibsTmpDirPath(libTmpDirRoot: File, uri: String, typeName: String) =\n    \"${libTmpDirRoot.absolutePath}${File.separator}${uri.uriToSnake()}${File.separator}$typeName\"\n\nfun getLibsTmpDir(libTmpDirRoot: File, uri: String, typeName: String) =\n    File(\n        getLibsTmpDirPath(\n            libTmpDirRoot,\n            uri,\n            typeName\n        )\n    )\n\nfun cleanLibsTmpDir(libTmpDirRoot: File, uri: String, typeName: String) =\n    getLibsTmpDir(\n        libTmpDirRoot,\n        uri,\n        typeName\n    ).apply {\n        deleteRecursively()\n        mkdirs()\n    }\n\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/id/ContextIdHolder.kt",
    "content": "package com.rubik.context.id\n\nimport com.rubik.context.extra.Context\n\nclass ContextIdHolder(val context: Context) {\n    val uri: String\n        get() = context.uri\n    var version: String? = null\n    var variant: String? = null\n    val touched: MutableList<ContextIdHolder> = mutableListOf()\n    val packed: MutableList<ContextIdHolder> = mutableListOf()\n\n    fun addVersion(version: String){\n        this.version = version\n    }\n\n    fun toJson() =\n        LeastContext(\n            uri,\n            context.name,\n            version ?: \"unkown\"\n        ).toJson()\n\n    fun addVariant(variant: String){\n        this.variant = variant\n    }\n\n    fun addTouching(depContext: Context, version: String, variant: String?) {\n        touched.add(ContextIdHolder(depContext).apply {\n            this.version = version\n            this.variant = variant\n        })\n    }\n\n    fun addPacking(depContext: Context, version: String, variant: String?) {\n        packed.add(ContextIdHolder(depContext).apply {\n            this.version = version\n            this.variant = variant\n        })\n    }\n\n}\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/id/LeastContext.kt",
    "content": "package com.rubik.context.id\n\nimport com.google.gson.Gson\nimport com.google.gson.annotations.SerializedName\n\nclass LeastContext(\n    @SerializedName(\"uri\")\n    val uri: String,\n    @SerializedName(\"name\")\n    val name: String,\n    @SerializedName(\"version\")\n    val version: String\n) {\n    fun toJson(): String = Gson().toJson(this)\n}\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/log/LogTags.kt",
    "content": "package com.rubik.context.log\n\nimport com.ktnail.x.LogTag\nimport com.ktnail.x.Logger\n\nobject LogTags {\n    val CONTEXT = LogTag(\"<RUBIK> CONTEXT \", Logger.Level.DEFAULT)\n\n    val CREATE_TASK = LogTag(\"<RUBIK> CREATE_TASK \", Logger.Level.DEFAULT)\n\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/publication/BuildType.kt",
    "content": "package com.rubik.context.publication\n\nobject BuildType {\n    const val CONTEXT_LIB_BUILD_TYPE_NAME = \"RContextLib\"\n    const val CONTEXT_LIB_COMPILER_BUILD_TYPE_NAME = \"RContextLibCompiler\"\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/publication/LibType.kt",
    "content": "package com.rubik.context.publication\n\nobject LibType {\n    const val CONTEXT = \"context\"\n    const val ORIGINAL_VALUE = \"original_value\"\n    const val CONTEXT_SOURCES = \"context_sources\"\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/router/RouterRegister.kt",
    "content": "package com.rubik.context.router\n\nenum class RouterRegister {\n    NONE,\n    NEW_INSTANCE,\n    REFLECT_INSTANCE,\n}"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/utility/KApt.kt",
    "content": "package com.rubik.context.utility\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.x.uriToSnake\nimport com.rubik.context.extra.Context\nimport com.rubik.context.utility.Arguments.Declare.JSON_CONTEXT\nimport org.gradle.api.Project\nimport org.jetbrains.kotlin.gradle.plugin.KaptExtension\n\nobject Kapt {\n    const val EXTENSION_NAME = \"kapt\"\n    const val CONFIGURATION_NAME = \"kapt\"\n}\n\nobject Arguments {\n    object Declare {\n        const val JSON_CONTEXT = \"rubik.context.json\"\n        const val CONTEXT_LIBS_ENABLE = \"rubik.context.libs.enable\"\n        const val CONTEXT_ROUTER_ENABLE = \"rubik.context.router.enable\"\n        const val CONTEXT_IGNORE_VALUE_ANNOS = \"rubik.context.value.ignoreannos\"\n        const val AGGREGATE_USER_AND_TIME_ENABLE = \"rubik.aggregate.userandtime.enable\"\n\n        const val AGGREGATE_ENABLE = \"rubik.aggregate.enable\"\n        const val AGGREGATE_GENERATED = \"rubik.aggregate.generated\"\n        const val AGGREGATE_METHOD_SIZE = \"rubik.aggregate.method.size\"\n\n        const val DEFAULT_SCHEME = \"rubik.default.scheme\"\n    }\n}\n\nval Project.kaptExtension: KaptExtension?\n    get() = extensions.findByName(Kapt.EXTENSION_NAME) as? KaptExtension\n\nfun Project.putKaptArgument(key: String, value: Any) {\n    kaptExtension?.arguments {\n        arg(key, value)\n    }\n}\n\nfun Project.putKaptBooleanArgument(key: String, value: Boolean) {\n    putKaptArgument(key, value.toString())\n}\n\n\nfun BaseVariant.putKaptArgument(key: String, value: Any) {\n    javaCompileOptions.annotationProcessorOptions.arguments[key] = value.toString()\n}\n\nfun BaseVariant.putKaptBooleanArgument(key: String, value: Boolean) {\n    putKaptArgument(key, value.toString())\n}\n\nfun BaseVariant.putKaptContext(context: Context, version: String) {\n    context.id.addVersion(version)\n    putKaptArgument(\"$JSON_CONTEXT.${context.uri.uriToSnake()}\", context.id.toJson())\n}\n\nfun BaseVariant.putKaptContextLibsEnable(context: Context) {\n    putKaptBooleanArgument(\"${Arguments.Declare.CONTEXT_LIBS_ENABLE}.${context.uri.uriToSnake()}\", true)\n}\n\nfun BaseVariant.putKaptAggregateEnable(context: Context) {\n    putKaptBooleanArgument(\"${Arguments.Declare.AGGREGATE_ENABLE}.${context.uri.uriToSnake()}\", true)\n}\n\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/utility/Module.kt",
    "content": "package com.rubik.context.utility\n\nopen class Module<T : ModuleInjector> {\n    private var inj: (() -> T)? = null\n\n    fun inject(\n        injector: () -> T\n    ) {\n        inj = injector\n    }\n\n    val content\n        get() = inj?.invoke() ?: throw RuntimeException(\" ${this::class.java.simpleName} module not init.\")\n}\n\ninterface ModuleInjector\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/context/utility/Uri.kt",
    "content": "package com.rubik.context.utility\n\nimport com.ktnail.x.uri.buildUri\nimport com.rubik.context.exception.RubikDSLDefaultGroupNotSetException\nimport com.rubik.context.exception.RubikDSLDefaultSchemeNotSetException\n\nfun String.toUriIfAuthorityOrName(\n    globalScheme: String?,\n    globalGroup: String?\n) = when {\n    contains(\"://\") -> { // is full uri\n        this\n    }\n    startsWith(\".\") -> { // name start with '.'\n        buildUri(\n            globalScheme ?: throw RubikDSLDefaultSchemeNotSetException(),\n            toAuthority(\n                globalGroup ?: throw RubikDSLDefaultGroupNotSetException(),\n                this.removePrefix(\".\")\n            )\n        )\n    }\n    else -> { // authority\n        buildUri(\n            globalScheme ?: throw RubikDSLDefaultSchemeNotSetException(),\n            this\n        )\n    }\n}\n\nfun toAuthority(group: String, name: String) = \"$group.$name\"\n"
  },
  {
    "path": "rubik/rubik_context/src/main/java/com/rubik/global/GlobalConfig.kt",
    "content": "package com.rubik.global\n\nimport com.rubik.context.MavenSource\nimport com.rubik.context.mergeOther\nimport com.rubik.context.utility.toUriIfAuthorityOrName\n\nclass GlobalConfig{\n    var devEnable = false\n\n    var scheme: String? = null\n        set(value) {\n            field = value\n            schemeChangedListeners.forEach { action ->\n                action(value)\n            }\n        }\n\n    private val schemeChangedListeners = mutableListOf<(String?) -> Unit>()\n\n    fun listenSchemeChanged(action: (String?) -> Unit) {\n        action(scheme)\n        schemeChangedListeners.add {\n            action(scheme)\n        }\n    }\n\n    var group: String? = null\n\n    var forceMavenModeEnable = false\n        set(value) {\n            field = value\n            if (value) {\n                forceProjectModeEnable = false\n            }\n        }\n\n    var forceProjectModeEnable = false\n        set(value) {\n            field = value\n            if (value) {\n                forceMavenModeEnable = false\n            }\n        }\n\n    var defaultVariant: String? = null\n\n    val uris = mutableMapOf<String, MavenSource>()\n    val publishVersions = mutableMapOf<String, String>()\n\n    val tags = mutableMapOf<String, MavenSource>()\n    val tagPublishVersions = mutableMapOf<String, String>()\n\n    fun publishVersion(uri: String): String? = publishVersions[uri]\n\n    fun publishTagVersion(tagName: String): String? = tagPublishVersions[tagName]\n\n    fun addVersion(uri: String, version: String) {\n        uris[uri] = uris[uri].mergeOther(MavenSource(version, null, null))\n    }\n\n    fun addMaven(uri: String, maven: MavenSource) {\n        uris[uri] = uris[uri].mergeOther(maven)\n    }\n\n    fun addTagVersion(tagName: String, version: String) {\n        tags[tagName] = tags[tagName].mergeOther(MavenSource(version, null, null))\n    }\n\n    fun addTagMaven(tagName: String, maven: MavenSource) {\n        tags[tagName] = tags[tagName].mergeOther(maven)\n    }\n\n    fun authorityOrNameToUri(uriIfAuthorityOrName: String) =\n        uriIfAuthorityOrName.toUriIfAuthorityOrName(scheme, group)\n\n}"
  },
  {
    "path": "rubik/rubik_dsl/build.gradle",
    "content": "apply plugin: 'java-library'\napply plugin: 'kotlin'\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation gradleApi()\n    implementation localGroovy()\n\n    implementation \"com.android.tools.build:gradle:$agbt_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n    implementation project(':rubik:rubik_context')\n    implementation project(':rubik:rubik_picker')\n\n    implementation deps.ktnail.x\n    implementation deps.ktnail.gradle\n    implementation deps.synccode.syncer\n\n    implementation deps.rubik.annotations\n}\n\ntasks.withType(JavaCompile) {\n    options.encoding = \"UTF-8\"\n}\n\ncompileKotlin {\n    kotlinOptions.freeCompilerArgs += ['-module-name', \"kmd.mars.rubik.dsl\"]\n}\n"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/DSLRubik.kt",
    "content": "package com.rubik.dsl\n\nimport com.rubik.context.extra.Context\nimport com.rubik.dsl.context.DSLContext\nimport com.rubik.dsl.packing.DSLExcept\nimport com.rubik.dsl.packing.DSLPacking\nimport com.rubik.pick.ByUri\nimport com.rubik.pick.Excepted\nimport com.rubik.pick.FlavorHows\nimport com.rubik.pick.PickWhat\nimport com.rubik.context.extra.globalConfig\nimport groovy.lang.Closure\nimport org.gradle.api.Project\nimport org.gradle.util.ConfigureUtil\n\nabstract class DSLRubik(\n    val project: Project\n) {\n\n    fun authorityOrNameToUri(uriIfAuthorityOrName: String) =\n        globalConfig.authorityOrNameToUri(uriIfAuthorityOrName)\n\n    // components\n    @RDSL\n    fun router(closure: Closure<DSLContext>) {\n        configTypeRouter(DSLContext(this), closure)\n    }\n\n    @RDSL\n    fun router(uri: String, closure: Closure<DSLContext>) {\n        DSLContext(this).apply {\n            uri(uri)\n            configTypeRouter(this, closure)\n        }\n    }\n\n    @RDSL\n    fun library(closure: Closure<DSLContext>) {\n        configTypeLibrary(DSLContext(this), closure)\n    }\n\n    @RDSL\n    fun library(uri: String, closure: Closure<DSLContext>) {\n        DSLContext(this).apply {\n            uri(uri)\n            configTypeLibrary(this, closure)\n        }\n    }\n\n    @RDSL\n    fun component(closure: Closure<DSLContext>) {\n        configTypeComponent(DSLContext(this), closure)\n    }\n\n    @RDSL\n    fun component(uri: String, closure: Closure<DSLContext>) {\n        DSLContext(this).apply {\n            uri(uri)\n            configTypeComponent(this, closure)\n        }\n    }\n\n    @RDSL\n    fun context(closure: Closure<DSLContext>) {\n        configTypeComponent(DSLContext(this), closure)\n    }\n\n    // config type\n    private fun configTypeRouter(dsl: DSLContext, closure: Closure<DSLContext>) {\n        ConfigureUtil.configure(closure, dsl)\n        onDefineContext(\n            dsl.toContext(\n                enableProvideRoute = true,\n                enablePublishComponent = false\n            ),\n            dsl.sourcePickHow\n        )\n    }\n\n    private fun configTypeLibrary(dsl: DSLContext, closure: Closure<DSLContext>) {\n        ConfigureUtil.configure(closure, dsl)\n        onDefineContext(\n            dsl.toContext(\n                enableProvideRoute = false,\n                enablePublishComponent = true\n            ),\n            dsl.sourcePickHow\n        )\n    }\n\n    private fun configTypeComponent(dsl: DSLContext, closure: Closure<DSLContext>) {\n        ConfigureUtil.configure(closure, dsl)\n        onDefineContext(\n            dsl.toContext(\n                enableProvideRoute = true,\n                enablePublishComponent = true\n            ),\n            dsl.sourcePickHow\n        )\n    }\n\n    // packing\n    @RDSL\n    fun pick(closure: Closure<DSLPacking>) {\n        DSLPacking(this, null) { what, hows ->\n            onDefinePacking(what, hows)\n        }.apply {\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    @RDSL\n    fun packing(closure: Closure<DSLPacking>) {\n        DSLPacking(this, null) { what, hows ->\n            onDefinePacking(what, hows)\n        }.apply {\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    @RDSL\n    fun except(closure: Closure<DSLPacking>) {\n        DSLExcept(this, null) { excepted ->\n            onDefineExcept(excepted)\n        }.apply {\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    @RDSL\n    fun except(vararg uriOrAuthorityOrNames: String) {\n        uriOrAuthorityOrNames.forEach { uriOrAuthorityOrName ->\n            onDefineExcept(Excepted(null, ByUri.create(authorityOrNameToUri(uriOrAuthorityOrName))))\n        }\n    }\n\n    abstract fun onDefineContext(context: Context, hows: FlavorHows?)\n\n    abstract fun onDefinePacking(what: PickWhat, hows: FlavorHows?)\n\n    abstract fun onDefineExcept(what: Excepted)\n\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/RDSL.java",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.dsl;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.METHOD, ElementType.FIELD})\npublic @interface RDSL {\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/context/DSLContext.kt",
    "content": "package com.rubik.dsl.context\n\nimport com.rubik.context.extra.Context\nimport com.rubik.dsl.DSLRubik\nimport com.rubik.dsl.RDSL\nimport com.rubik.dsl.context.dependency.DSLDependencies\nimport com.rubik.dsl.context.source.DSLSource\nimport com.rubik.dsl.exception.RubikDSLComponentUriException\nimport com.rubik.pick.FlavorHows\nimport groovy.lang.Closure\nimport org.gradle.util.ConfigureUtil\n\n/**\n *  Rubik context extension of gradle plugins.\n *\n *  @since 1.3\n */\nopen class DSLContext(\n   val rubik: DSLRubik\n) {\n\n    private var _uri: String? = null\n\n    /**\n     *  When defining a context, call this method once and only once.\n     */\n    @RDSL\n    fun uri(uri: String) {\n        if (null != _uri) throw RubikDSLComponentUriException(uri)\n        _uri = rubik.authorityOrNameToUri(uri)\n    }\n\n    @RDSL\n    fun authority(authority: String) {\n        uri(authority)\n    }\n\n    @RDSL\n    fun name(name: String) {\n        uri(name)\n    }\n\n    // touching\n    private val _touching = DSLDependencies(rubik)\n\n    @RDSL\n    fun dependencies(closure: Closure<DSLDependencies>) {\n        ConfigureUtil.configure(closure, _touching)\n    }\n\n    @RDSL\n    fun dependencies(vararg uriOrAuthorityOrNames: String) {\n        uriOrAuthorityOrNames.forEach { uriOrAuthorityOrName ->\n            _touching.uri(uriOrAuthorityOrName)\n        }\n    }\n\n    @RDSL\n    fun touching(closure: Closure<DSLDependencies>) {\n        ConfigureUtil.configure(closure, _touching)\n    }\n\n    @RDSL\n    fun touching(vararg uriOrAuthorityOrNames: String) {\n        uriOrAuthorityOrNames.forEach { uriOrAuthorityOrName ->\n            _touching.uri(uriOrAuthorityOrName)\n        }\n    }\n\n    // packing\n    private val _packing  = DSLDependencies(rubik)\n\n    @RDSL\n    fun packing(closure: Closure<DSLDependencies>) {\n        ConfigureUtil.configure(closure, _packing)\n    }\n\n    @RDSL\n    fun packing(vararg uriOrAuthorityOrNames: String) {\n        uriOrAuthorityOrNames.forEach { uriOrAuthorityOrName ->\n            _packing.uri(uriOrAuthorityOrName)\n        }\n    }\n\n    // source\n    private val _source = DSLSource()\n\n    @RDSL\n    fun source(closure: Closure<DSLSource>) {\n        ConfigureUtil.configure(closure, _source)\n    }\n\n    // tag\n   private val _tags = mutableMapOf<String, DSLSource?>()\n\n    @RDSL\n    fun tag(name: String, closure: Closure<DSLSource>) {\n        DSLSource().apply {\n            ConfigureUtil.configure(closure, this)\n            _tags[name] = this\n        }\n    }\n\n    @RDSL\n    fun tag(vararg names: String) {\n        names.forEach { tagName ->\n            _tags[tagName] = null\n        }\n    }\n\n    fun toContext(\n        enableProvideRoute: Boolean,\n        enablePublishComponent: Boolean\n    ) = Context(\n        rubik.project,\n        enableProvideRoute,\n        enablePublishComponent,\n        _uri ?: throw RubikDSLComponentUriException(_uri.toString()),\n        _touching.toDependencies(),\n        _packing.toDependencies(),\n        _source.toSource(rubik.project),\n        _tags.mapValues { (_, source) -> source?.toSource(rubik.project) }\n    )\n\n    val sourcePickHow: FlavorHows\n        get() = _source.pickHows\n\n\n    override fun toString() =\n        \"DSLContext : uri:$_uri  touching:$_touching packing:$_packing  source:$_source \"\n\n\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/context/dependency/DSLDependencies.kt",
    "content": "package com.rubik.dsl.context.dependency\n\nimport com.ktnail.x.uri.buildUri\nimport com.rubik.context.Dependency\nimport com.rubik.context.exception.RubikDSLDefaultGroupNotSetException\nimport com.rubik.context.exception.RubikDSLDefaultSchemeNotSetException\nimport com.rubik.context.extra.globalConfig\nimport com.rubik.dsl.DSLRubik\nimport com.rubik.dsl.RDSL\nimport com.rubik.context.utility.toAuthority\nimport groovy.lang.Closure\nimport org.gradle.util.ConfigureUtil\n\nopen class DSLDependencies(\n    val rubik: DSLRubik\n) {\n    private val dependencies: MutableList<DSLDependency> = mutableListOf()\n\n    @set:RDSL\n    var uri: String\n        get() = throw RuntimeException(\"It is only for DSL\")\n        set(value) = uri(value)\n\n    @RDSL\n    fun uri(uri: String) {\n        uri(uri, null)\n    }\n\n    @RDSL\n    fun uri(uri: String, closure: Closure<DSLDependency>?) {\n        DSLDependency(rubik.authorityOrNameToUri(uri)).apply {\n            dependencies.add(this)\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    @set:RDSL\n    var authority: String\n        get() = throw RuntimeException(\"It is only for DSL\")\n        set(value) = authority(value)\n\n    @RDSL\n    fun authority(authority: String) {\n        authority(authority, null)\n    }\n\n    @RDSL\n    fun authority(authority: String, closure: Closure<DSLDependency>?) {\n        DSLDependency(\n            buildUri(\n                globalConfig.scheme ?: throw  RubikDSLDefaultSchemeNotSetException(),\n                authority\n            )\n        ).apply {\n            dependencies.add(this)\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    @set:RDSL\n    var name: String\n        get() = throw RuntimeException(\"It is only for DSL\")\n        set(value) = name(value)\n\n    @RDSL\n    fun name(name: String) {\n        name(name, null)\n    }\n\n    @RDSL\n    fun name(name: String, closure: Closure<DSLDependency>?) {\n        DSLDependency(\n            buildUri(\n                globalConfig.scheme ?: throw  RubikDSLDefaultSchemeNotSetException(),\n                toAuthority(globalConfig.group ?: throw  RubikDSLDefaultGroupNotSetException(), name)\n            )\n        ).apply {\n            dependencies.add(this)\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    fun toDependencies() = dependencies.map {\n        Dependency(it.uri, it.forFlavor)\n    }\n\n    override fun toString() = \"DSLDependencies: dependencies:$dependencies \"\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/context/dependency/DSLDependency.kt",
    "content": "package com.rubik.dsl.context.dependency\n\nimport com.rubik.dsl.RDSL\n\n\nopen class DSLDependency(val uri: String) {\n\n    var forFlavor: String? = null\n\n    @RDSL\n    fun forFlavor(flavor: String) {\n        forFlavor = flavor\n    }\n\n    override fun toString() = \"DSLDependency: uri:$uri \"\n\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/context/source/DSLMavenSource.kt",
    "content": "package com.rubik.dsl.context.source\n\nimport com.rubik.context.MavenSource\nimport com.rubik.dsl.RDSL\nimport com.rubik.dsl.packing.DSLPackingHow\nimport groovy.lang.Closure\nimport org.gradle.util.ConfigureUtil\n\nopen class DSLMavenSource : DSLPackingHow() {\n\n    @set:RDSL\n    var version: String? = null\n\n    @set:RDSL\n    var variant: String? = null\n\n    val flavors = mutableMapOf<String, DSLMavenSource>()\n\n    @RDSL\n    fun version(version: String) {\n        this.version = version\n    }\n\n    @RDSL\n    fun variant(variant: String) {\n        this.variant = variant\n    }\n\n    @RDSL\n    fun forFlavor(flavorName: String, closure: Closure<DSLMavenSource>) {\n        flavors[flavorName] = ConfigureUtil.configure(closure, DSLMavenSource())\n    }\n\n    fun toMavenSource(): MavenSource =\n        MavenSource(version, variant, flavors.mapValues { (_, source) ->\n            MavenSource(source.version, source.variant, null)\n        })\n\n    override fun toString() = \"MavenExtension: version:$version variant:$variant\"\n\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/context/source/DSLProjectSource.kt",
    "content": "package com.rubik.dsl.context.source\n\nimport com.rubik.dsl.RDSL\nimport com.synccode.command.dsl.DSLGit\n\n\nopen class DSLProjectSource: DSLGit() {\n    @set:RDSL\n    var path: String? = null\n\n    @set:RDSL\n    var publishVersion: String? = null\n\n    @set:RDSL\n    var publishOriginalValue = false\n\n    @RDSL\n    fun path(path: String) {\n        this.path = path\n    }\n\n    @RDSL\n    fun publishVersion(version: String) {\n        publishVersion = version\n    }\n\n    @RDSL\n    fun supportOriginalValue(publish: Boolean) {\n        publishOriginalValue = publish\n    }\n\n    override fun toString() = \"ProjectExtension: path:$path publishVersion:$publishVersion supportOriginalValue:$publishOriginalValue\"\n\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/context/source/DSLSource.kt",
    "content": "package com.rubik.dsl.context.source\n\n\nimport com.ktnail.gradle.projectPathToFilePath\nimport com.rubik.context.Source\nimport com.rubik.dsl.RDSL\nimport com.rubik.dsl.packing.DSLPackingHow\nimport groovy.lang.Closure\nimport org.gradle.api.Project\nimport org.gradle.util.ConfigureUtil\n\nopen class DSLSource : DSLPackingHow() {\n    private val project: DSLProjectSource = DSLProjectSource()\n    var maven: DSLMavenSource = DSLMavenSource()\n\n    @set:RDSL\n    var allowAutoVersion: Boolean = true\n\n    @RDSL\n    fun project(path: String) {\n        project.path(path)\n    }\n\n    @RDSL\n    fun project(closure: Closure<DSLProjectSource>) {\n        ConfigureUtil.configure(closure, project)\n    }\n\n    @RDSL\n    fun project(path: String, closure: Closure<DSLProjectSource>) {\n        project(path)\n        project(closure)\n    }\n\n    @RDSL\n    fun maven(closure: Closure<DSLMavenSource>) {\n        ConfigureUtil.configure(closure, maven)\n    }\n\n    @RDSL\n    fun allowAutoVersion(allow: Boolean) {\n        allowAutoVersion = allow\n    }\n\n    fun toSource(gradleProject: Project) = Source(\n        this.project.path,\n        this.project.publishVersion,\n        this.project.publishOriginalValue,\n        allowAutoVersion,\n        maven.toMavenSource(),\n        this.project.path?.let { path ->\n            {\n                this.project.executor(gradleProject.projectDir, path.projectPathToFilePath())\n            }\n        }\n    )\n\n    override fun toString() = \"SourceExtension: project:$project  maven:$maven \"\n\n}\n"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/exception/RubikDSLComponentUriException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.dsl.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when defined component, but not set uri or uri ambiguity .\n *\n * @since 1.8\n */\ninternal open class RubikDSLComponentUriException(\n    private val uri: String\n) : RuntimeException() {\n    override fun toString() =\n        \"RubikDSLComponentUriException You can choose only one way of \\\"uri\\\" , \\\"scheme + \" +\n                \"authority\\\" or \\\"scheme + group + name\\\" to define \" +\n                \"component、context、library or router <$uri> , only once.\"\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/global/DSLGlobalConfig.kt",
    "content": "package com.rubik.dsl.global\n\nimport com.rubik.dsl.RDSL\nimport com.rubik.global.GlobalConfig\nimport groovy.lang.Closure\nimport org.gradle.api.Project\nimport org.gradle.util.ConfigureUtil\n\n\nopen class GlobalExtension(val project: Project) {\n\n    val config : GlobalConfig = GlobalConfig()\n\n    /* devMode */\n    @set:RDSL\n    var devMode: Boolean\n        set(value) {\n            devMode(value)\n        }\n        get() = throw RuntimeException(\"It is only for DSL\")\n\n    @RDSL\n    fun devMode(enable: Boolean) {\n        config.devEnable = enable\n    }\n\n    /* scheme */\n    @set:RDSL\n    var scheme: String\n        set(value) {\n            scheme(value)\n        }\n        get() = throw RuntimeException(\"It is only for DSL\")\n\n    @RDSL\n    fun scheme(scheme: String) {\n        config.scheme = scheme\n    }\n\n\n    /* group */\n    @set:RDSL\n    var group: String\n        set(value) {\n            group(value)\n        }\n        get() = throw RuntimeException(\"It is only for DSL\")\n\n    @RDSL\n    fun group(group: String) {\n        config.group = group\n    }\n\n    /* force projectMode or mavenMode */\n    @set:RDSL\n    var forceMavenMode: Boolean\n        set(value) {\n            forceMavenMode(value)\n        }\n        get() = throw RuntimeException(\"It is only for DSL\")\n\n    @set:RDSL\n    var forceProjectMode: Boolean\n        set(value) {\n            forceProjectMode(value)\n        }\n        get() = throw RuntimeException(\"It is only for DSL\")\n\n    @RDSL\n    fun forceMavenMode(enable: Boolean) {\n        config.forceMavenModeEnable = enable\n    }\n\n    @RDSL\n    fun forceProjectMode(enable: Boolean) {\n        config.forceProjectModeEnable = enable\n    }\n\n\n    /* maven */\n    private val maven = DSLGlobalMavenConfig(project, config)\n\n    @RDSL\n    fun maven(closure: Closure<DSLGlobalMavenConfig>) {\n        ConfigureUtil.configure(closure, maven)\n    }\n\n    fun variant(variant: String) {\n        this.maven.variant(variant)\n    }\n\n    @RDSL\n    fun uri(\n        uriOrAuthorityOrName: String,\n        closure: Closure<DSLGlobalContextConfig>\n    ) {\n        this.maven.version(uriOrAuthorityOrName, closure)\n    }\n\n    @RDSL\n    fun tag(\n        tagName: String,\n        closure: Closure<DSLGlobalContextConfig>\n    ) {\n        this.maven.tagVersion(tagName, closure)\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/global/DSLGlobalContextConfig.kt",
    "content": "package com.rubik.dsl.global\n\nimport com.rubik.dsl.context.source.DSLMavenSource\n\nopen class DSLGlobalContextConfig : DSLMavenSource() {\n\n    var publishVersion: String? = null\n\n    fun publish(version: String) {\n        publishVersion = version\n    }\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/global/DSLGlobalMavenConfig.kt",
    "content": "package com.rubik.dsl.global\n\nimport com.rubik.dsl.RDSL\nimport com.rubik.global.GlobalConfig\nimport groovy.lang.Closure\nimport org.gradle.api.Project\nimport org.gradle.util.ConfigureUtil\n\nopen class DSLGlobalMavenConfig(\n    val project: Project,\n    val config: GlobalConfig\n) {\n    /* version、variant */\n    @RDSL\n    fun variant(variant: String) {\n        config.defaultVariant = variant\n    }\n\n    @RDSL\n    fun version(\n        uriOrAuthorityOrName: String,\n        version: String\n    ) {\n        val uri = config.authorityOrNameToUri(uriOrAuthorityOrName)\n        config.addVersion(uri, version)\n    }\n\n    @RDSL\n    fun version(\n        uriOrAuthorityOrName: String,\n        closure: Closure<DSLGlobalContextConfig>\n    ) {\n        val uri = config.authorityOrNameToUri(uriOrAuthorityOrName)\n        val maven = ConfigureUtil.configure(closure, DSLGlobalContextConfig())\n        config.addMaven(uri, maven.toMavenSource())\n        maven.publishVersion?.let { publishVersion ->\n            config.publishVersions[uri] = publishVersion\n        }\n    }\n\n    @RDSL\n    fun version(\n        uriOrAuthorityOrName: String,\n        version: String,\n        closure: Closure<DSLGlobalContextConfig>\n    ) {\n        version(uriOrAuthorityOrName, version)\n        version(uriOrAuthorityOrName, closure)\n    }\n\n    @RDSL\n    fun tagVersion(\n        tagName: String,\n        version: String\n    ) {\n        config.addTagVersion(tagName, version)\n    }\n\n    @RDSL\n    fun tagVersion(\n        tagName: String,\n        closure: Closure<DSLGlobalContextConfig>\n    ) {\n        val maven = ConfigureUtil.configure(closure, DSLGlobalContextConfig())\n        config.addTagMaven(tagName, maven.toMavenSource())\n        maven.publishVersion?.let { publishVersion ->\n            config.tagPublishVersions[tagName] = publishVersion\n        }\n    }\n\n    @RDSL\n    fun tagVersion(\n        tagName: String,\n        version: String,\n        closure: Closure<DSLGlobalContextConfig>\n    ) {\n        tagVersion(tagName, version)\n        tagVersion(tagName, closure)\n    }\n\n\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/packing/DSLExcept.kt",
    "content": "package com.rubik.dsl.packing\n\nimport com.rubik.dsl.DSLRubik\nimport com.rubik.dsl.RDSL\nimport com.rubik.pick.ByTag\nimport com.rubik.pick.ByUri\nimport com.rubik.pick.Excepted\nimport groovy.lang.Closure\nimport org.gradle.util.ConfigureUtil\n\nopen class DSLExcept(\n    private val rubik: DSLRubik,\n    private val forFlavor: String?,\n    private val onExcept: (Excepted) -> Unit\n) {\n\n    @RDSL\n    fun flavor(name: String, closure: Closure<DSLExcept>) {\n        DSLExcept(rubik, name, onExcept).apply {\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    @RDSL\n    fun tag(vararg tags: String) {\n        tags.forEach { tag ->\n            onExcept(Excepted(forFlavor, ByTag(tag)))\n        }\n    }\n\n    @RDSL\n    fun uri(vararg uriOrAuthorityOrNames: String) {\n        uriOrAuthorityOrNames.forEach { uriOrAuthorityOrName ->\n            onExcept(Excepted(forFlavor, ByUri.create(rubik.authorityOrNameToUri(uriOrAuthorityOrName))))\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/packing/DSLPacking.kt",
    "content": "package com.rubik.dsl.packing\n\nimport com.rubik.context.router.RouterRegister\nimport com.rubik.dsl.DSLRubik\nimport com.rubik.dsl.RDSL\nimport com.rubik.dsl.context.source.DSLMavenSource\nimport com.rubik.pick.*\nimport groovy.lang.Closure\nimport org.gradle.util.ConfigureUtil\n\nopen class DSLPacking(\n    private val rubik: DSLRubik,\n    private val forFlavor: String?,\n    private val onPick: (PickWhat, FlavorHows?) -> Unit\n) {\n\n    @RDSL\n    fun flavor(name: String, closure: Closure<DSLPacking>) {\n        DSLPacking(rubik, name, onPick).apply {\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    // pickWho\n    @RDSL\n    fun all(closure: Closure<DSLPackingHow>) {\n        val how = DSLPackingHow()\n        ConfigureUtil.configure(closure, how)\n        onPick.invoke(shellPackingComponentWhat(forFlavor, ByAll()), how.pickHows)\n    }\n\n    @RDSL\n    fun tag(tag: String, closure: Closure<DSLPackingHow>) {\n        val how = DSLPackingHow()\n        ConfigureUtil.configure(closure, how)\n        onPick.invoke(shellPackingComponentWhat(forFlavor, ByTag(tag)), how.pickHows)\n    }\n\n    @RDSL\n    fun uri(uriOrAuthorityOrName: String, closure: Closure<DSLPackingHow>) {\n        val how = DSLPackingHow()\n        ConfigureUtil.configure(closure, how)\n        onPick.invoke(\n            shellPackingComponentWhat(\n                forFlavor, ByUri.create(rubik.authorityOrNameToUri(uriOrAuthorityOrName))\n            ),\n            how.pickHows\n        )\n    }\n\n    // pickHow\n    @get:RDSL\n    val all\n        get() = ByAll()\n\n    @RDSL\n    fun tag(tag: String) = ByTag(tag)\n\n    @RDSL\n    fun projectMode(vararg uriOrWheres: Any) {\n        uriOrWheres.forEach { uriOrWhere ->\n            uriOrWhere.pickWhereAction { how ->\n                how.projectMode = true\n            }\n        }\n    }\n\n    @RDSL\n    fun mavenMode(vararg uriOrWheres: Any) {\n        uriOrWheres.forEach { uriOrWhere ->\n            uriOrWhere.pickWhereAction { how ->\n                how.mavenMode = true\n            }\n        }\n    }\n\n    @RDSL\n    fun noSourceMode(vararg uriOrWheres: Any) {\n        uriOrWheres.forEach { uriOrWhere ->\n            uriOrWhere.pickWhereAction { how ->\n                how.noSourceMode = true\n            }\n        }\n    }\n\n    @RDSL\n    fun except(vararg uriOrWheres: Any) {\n        uriOrWheres.forEach { uriOrWhere ->\n            uriOrWhere.pickWhereAction { how ->\n                how.pickHows[null] = NoSourceMode(RouterRegister.NONE)\n            }\n        }\n    }\n\n    @RDSL\n    fun mavenMode(uriOrWhere: Any, closure: Closure<DSLMavenSource>) {\n        uriOrWhere.pickWhereAction { how ->\n            how.mavenMode(closure)\n        }\n    }\n\n    @RDSL\n    fun noSourceMode(uriOrWhere: Any, closure: Closure<DSLPackingNoSource>) {\n        uriOrWhere.pickWhereAction { how ->\n            how.noSourceMode(closure)\n        }\n    }\n\n    @RDSL\n    fun mavenMode(uriOrWheres: List<Any>, closure: Closure<DSLMavenSource>) {\n        uriOrWheres.forEach { uriOrWhere ->\n            uriOrWhere.pickWhereAction { how ->\n                how.mavenMode(closure)\n            }\n        }\n    }\n\n    @RDSL\n    fun noSourceMode(uriOrWheres: List<Any>, closure: Closure<DSLPackingNoSource>) {\n        uriOrWheres.forEach { uriOrWhere ->\n            uriOrWhere.pickWhereAction { how ->\n                how.noSourceMode(closure)\n            }\n        }\n    }\n\n    private fun Any.pickWhereAction(action: (DSLPackingHow) -> Unit) =\n        when (this) {\n            is PickWhere -> this\n            is String -> ByUri.create(rubik.authorityOrNameToUri(this))\n            else -> null\n        }?.let { where ->\n            DSLPackingHow().let { how ->\n                action(how)\n                onPick.invoke(shellPackingComponentWhat(forFlavor, where), how.pickHows)\n            }\n        }\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/packing/DSLPackingHow.kt",
    "content": "package com.rubik.dsl.packing\n\nimport com.rubik.context.router.RouterRegister\nimport com.rubik.dsl.RDSL\nimport com.rubik.dsl.context.source.DSLMavenSource\nimport com.rubik.pick.MavenMode\nimport com.rubik.pick.NoSourceMode\nimport com.rubik.pick.PickHow\nimport com.rubik.pick.ProjectMode\nimport groovy.lang.Closure\nimport org.gradle.util.ConfigureUtil\n\nopen class DSLPackingHow {\n    var pickHows = mutableMapOf<String?, PickHow>()\n\n    @set:RDSL\n    var projectMode = false\n        get() = throw java.lang.RuntimeException(\"It is only for DSL\")\n        set(value) {\n            projectMode(value)\n            field = value\n        }\n\n    @RDSL\n    fun projectMode() {\n        pickHows[null] = ProjectMode()\n    }\n\n    @RDSL\n    fun projectMode(flag: Boolean) {\n        if (flag) projectMode() else mavenMode()\n    }\n\n    @set:RDSL\n    var mavenMode = false\n        get() = throw java.lang.RuntimeException(\"It is only for DSL\")\n        set(value) {\n            mavenMode(value)\n            field = value\n        }\n\n    @RDSL\n    fun mavenMode() {\n        pickHows[null] = MavenMode()\n    }\n\n    @RDSL\n    fun mavenMode(flag: Boolean) {\n        if (flag) mavenMode() else projectMode()\n    }\n\n    @RDSL\n    fun mavenMode(closure: Closure<DSLMavenSource>) {\n        val maven = ConfigureUtil.configure(closure, DSLMavenSource())\n        pickHows[null] = MavenMode(maven.version, maven.variant)\n        maven.flavors.forEach { (flavor, dsl) ->\n            pickHows[flavor]  = MavenMode(dsl.version, dsl.variant)\n        }\n    }\n\n    @set:RDSL\n    var noSourceMode = false\n        get() = throw java.lang.RuntimeException(\"It is only for DSL\")\n        set(value) {\n            noSourceMode(value)\n            field = value\n        }\n\n    @RDSL\n    fun noSourceMode() {\n        pickHows[null] = NoSourceMode(RouterRegister.NEW_INSTANCE)\n    }\n\n    @RDSL\n    fun noSourceMode(flag: Boolean) {\n        if (flag) noSourceMode() else projectMode()\n    }\n\n    @RDSL\n    fun noSourceMode(closure: Closure<DSLPackingNoSource>) {\n        pickHows[null] = NoSourceMode(DSLPackingNoSource().apply {\n            ConfigureUtil.configure(closure, this)\n        }.let { dsl ->\n            if (!dsl.enableAggregate) RouterRegister.NONE\n            else if (dsl.enableReflect) RouterRegister.REFLECT_INSTANCE\n            else RouterRegister.NEW_INSTANCE\n        }\n        )\n    }\n}"
  },
  {
    "path": "rubik/rubik_dsl/src/main/java/com/rubik/dsl/packing/DSLPackingNoSource.kt",
    "content": "package com.rubik.dsl.packing\n\nimport com.rubik.dsl.RDSL\n\n\nopen class DSLPackingNoSource {\n\n    @set:RDSL\n    var enableAggregate: Boolean = true\n\n    @set:RDSL\n    var enableReflect: Boolean = false\n\n    @RDSL\n    fun aggregate(enable: Boolean) {\n        this.enableAggregate = enable\n    }\n\n    @RDSL\n    fun reflect(enable: Boolean) {\n        this.enableReflect = enable\n    }\n\n    override fun toString() = \"DSLPackingNoSource: enableAggregate:$enableAggregate  enableReflect:$enableReflect\"\n}"
  },
  {
    "path": "rubik/rubik_kapt/build.gradle",
    "content": "apply plugin: 'java-library'\napply plugin: 'kotlin'\napply plugin: 'maven-publish'\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation 'com.squareup:kotlinpoet:1.4.0'\n    implementation 'com.google.auto.service:auto-service:1.0-rc6'\n    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'\n    implementation \"org.jetbrains.kotlin:kotlin-reflect:$kotlin_version\"\n    implementation 'com.google.code.gson:gson:2.8.5'\n\n    implementation deps.ktnail.x\n\n    implementation deps.kotlin.blueprint\n\n    compileOnly project(':rubik:rubik_annotations')\n}\n\nsourceCompatibility = JavaVersion.VERSION_1_8\ntargetCompatibility = JavaVersion.VERSION_1_8\n\ntasks.withType(JavaCompile) {\n    options.encoding = \"UTF-8\"\n}\n\ncompileKotlin {\n    kotlinOptions.freeCompilerArgs += ['-module-name', \"kmd.mars.rubik.kapt\"]\n}\n\ntasks.withType(GenerateModuleMetadata) {\n    enabled = false\n}\n\npublishing {\n    publications {\n        rubikKapt(MavenPublication) {\n            groupId \"com.rubik\"\n            artifactId 'kapt'\n            version pubs.rubik.kapt\n            description 'kapt'\n            from components.java\n        }\n    }\n\n    apply from: '../rubik_maven_repositories.gradle'\n    addRubikMavenRepos(repositories)\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/ByVersion.kt",
    "content": "const val BY_VERSION = \"1.10.0.0-K1_5-LOCAL\"\n// KTNail plugin update.\n//   by [sync].\n//   at timestamp : 2024-05-22 12:51:23.\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/Constants.kt",
    "content": "package com.rubik.apt\n\nimport com.ktnail.x.*\nimport com.rubik.apt.utility.noSpaces\n\nobject Constants {\n\n    const val ANDROIDX_PACKAGE_NAME = \"androidx\"\n\n    object Router {\n        const val PACKAGE_NAME = \"com.rubik\"\n        const val CHECK_ROUTER_VERSION = \"900\"\n    }\n\n    object Annotations {\n        const val R_EVENT = \"${Router.PACKAGE_NAME}.annotations.context.REvent\"\n        const val R_EVENT_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.context.REventRepeatable\"\n        const val R_EVENT_INSTANCE = \"${Router.PACKAGE_NAME}.annotations.context.instance.REventInstance\"\n        const val R_EVENT_INSTANCE_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.context.instance.REventInstanceRepeatable\"\n        const val R_EVENT_ASSIST = \"${Router.PACKAGE_NAME}.annotations.context.assist.REventAssist\"\n        const val R_EVENT_ASSIST_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.context.assist.REventAssistRepeatable\"\n        const val R_ROUTE = \"${Router.PACKAGE_NAME}.annotations.route.RRoute\"\n        const val R_ROUTE_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.route.RRouteRepeatable\"\n        const val R_ROUTE_FUNCTION = \"${Router.PACKAGE_NAME}.annotations.route.function.RFunction\"\n        const val R_ROUTE_FUNCTION_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.route.function.RFunctionRepeatable\"\n        const val R_ROUTE_PAGE = \"${Router.PACKAGE_NAME}.annotations.route.page.RPage\"\n        const val R_ROUTE_PAGE_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.route.page.RPageRepeatable\"\n        const val R_ROUTE_INSTANCE = \"${Router.PACKAGE_NAME}.annotations.route.instance.RRouteInstance\"\n        const val R_ROUTE_INSTANCE_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.route.instance.RRouteInstanceRepeatable\"\n        const val R_ROUTE_ASSIST = \"${Router.PACKAGE_NAME}.annotations.route.assist.RRouteAssist\"\n        const val R_ROUTE_ASSIST_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.route.assist.RRouteAssistRepeatable\"\n        const val R_INSTANCE = \"${Router.PACKAGE_NAME}.annotations.route.RInstance\"\n        const val R_INSTANCE_REPEATABLE = \"${Router.PACKAGE_NAME}.annotations.route.RInstanceRepeatable\"\n        const val R_VALUE = \"${Router.PACKAGE_NAME}.annotations.route.RValue\"\n        const val R_OBJECT = \"${Router.PACKAGE_NAME}.annotations.route.RObject\"\n    }\n\n    object Aggregate {\n        private const val GENERATE_PACKAGE_NAME = \"rubik.generate\"\n\n        object Declare{\n            fun makeAggregatePackageName(uri: String): String = \"$GENERATE_PACKAGE_NAME.aggregate.${uri.uriToSnake()}\"\n            fun makeAggregateClassName(name: String) = toPascal(name, \"Aggregate\")\n        }\n\n        const val INTERFACE_NAME = \"${Router.PACKAGE_NAME}.context.Aggregatable\"\n\n        const val PROPERTY_URI_NAME = \"URI\"\n        const val PROPERTY_EVENT_MSGS_NAME = \"EVENT_MSGS\"\n\n        const val COMPANION_SUPER_NAME = \"${Router.PACKAGE_NAME}.context.AggregateFactory\"\n        const val PROPERTY_CREATOR_NAME = \"CREATOR\"\n\n        const val ROUTE_PACKAGE_NAME = \"${Router.PACKAGE_NAME}.route\"\n        const val RESULT_CLASS_NAME = \"Result\"\n        val RESULT_CLASS_NAME_AS = RESULT_CLASS_NAME.toLegalClassName()\n\n        const val QUERIES_CLASS_NAME = \"Queries\"\n        val QUERIES_CLASS_NAME_AS = QUERIES_CLASS_NAME.toLegalClassName()\n        const val RESULTS_CLASS_NAME = \"ResultGroups\"\n        val RESULTS_CLASS_NAME_AS = RESULTS_CLASS_NAME.toLegalClassName()\n\n        const val METHOD_ON_EVENT_NAME = \"onEvent\"\n        const val METHOD_ON_ROUTE_NAME = \"onRoute\"\n\n        const val ROUTE_PARAMETER_PATH_NAME = \"path\"\n        const val ROUTE_PARAMETER_QUERIES_NAME = \"queries\"\n        const val ROUTE_PARAMETER_RESULTS_NAME = \"results\"\n        const val EVENT_PARAMETER_MSG_NAME = \"msg\"\n\n        const val PATH_PACKAGE_NAME = \"${Router.PACKAGE_NAME}.router.uri\"\n        const val PATH_CLASS_NAME = \"Path\"\n        val PATH_CLASS_NAME_AS = PATH_CLASS_NAME.toLegalClassName()\n\n        const val METHOD_MATCHING_NAME = \"matching\"\n        const val METHOD_SET_PARAMETERS_NAME = \"setParameters\"\n        private const val METHOD_GET_PARAMETERS_NAME = \"getParameters\"\n        const val PARAMETER_VALUES_NAME = \"values\"\n\n        const val LAUNCHER_PACKAGE_NAME = \"${Router.PACKAGE_NAME}.activity\"\n        const val LAUNCHER_CLASS_NAME = \"Launcher\"\n        val LAUNCHER_CLASS_NAME_AS = LAUNCHER_CLASS_NAME.toLegalClassName()\n        const val METHOD_LAUNCH_NAME = \"launch\"\n\n        const val MAPPING_PACKAGE_NAME = \"${Router.PACKAGE_NAME}.route.mapping\"\n        const val TO_TYPE_OF_T_FUNCTION_NAME = \"toTypeOfT\"\n        const val CAST_TO_TYPE_OF_T_FUNCTION_NAME = \"castToTypeOfT\"\n        const val MAP_TO_TYPE_FUNCTION_NAME = \"mapToType\"\n\n        private val PATH_PARAMETER_REGEX = Regex(\"\\\\{([^}]*)\\\\}\")\n        fun isParameterPath(path: String) = path.contains(PATH_PARAMETER_REGEX)\n        fun makeGetPathQueriesCode(originPath: String): String = \"$PATH_CLASS_NAME_AS(\\\"$originPath\\\").$METHOD_GET_PARAMETERS_NAME($ROUTE_PARAMETER_PATH_NAME)\"\n        fun makeAddPathQueriesCode(originPath: String): String = \"$ROUTE_PARAMETER_QUERIES_NAME.addAll(${makeGetPathQueriesCode(originPath)})\"\n\n        fun makeRouteExceptionCode() = \"${Router.PACKAGE_NAME}.route.exception.BadPathOrVersionException($ROUTE_PARAMETER_PATH_NAME)\"\n\n        fun makeGetQueryCode(name: String, index: Int): String = \"${ROUTE_PARAMETER_QUERIES_NAME}.value($index, $name)\".noSpaces()\n\n        fun makeResultsCode(name: String): String = \"$RESULT_CLASS_NAME_AS($name)\"\n        fun makeSetResultsCode(code: String, index: Int): String = \"${ROUTE_PARAMETER_RESULTS_NAME}.set($index, $code)\".noSpaces()\n    }\n\n    object Contexts {\n        private const val GENERATE_PACKAGE_NAME = \"rubik.generate\"\n\n        object Declare {\n            fun makeContextPackageName(\n                uri: String,\n                subPackage: String? = null\n            ): String = listOfNotNull(\n                GENERATE_PACKAGE_NAME,\n                \"context\",\n                uri.uriToSnake(),\n                subPackage\n            ).joinToString(\".\")\n        }\n        const val CONTEXT_BASE_CLASS_NAME = \"Context\"\n        const val CONSTANTS_URI_NAME = \"URI\"\n        const val OBJECT_URIS_NAME = \"Uris\"\n        const val CLASS_TOUCH_HOLDER = \"${Router.PACKAGE_NAME}.router.TouchHolder\"\n        const val CLASS_TOUCHER = \"Toucher\"\n\n        const val PARCELABLE_CREATOR_CLASS_NAME = \"android.os.Parcelable.Creator\"\n        const val COMPANION_CLASS_NAME = \".Companion\"\n\n        const val KEEP_ANNOTATION_CLASS_NAME = \"$ANDROIDX_PACKAGE_NAME.annotation.Keep\"\n    }\n\n    object Apis {\n        const val NAVIGATE_FUNCTION_PACKAGE_NAME = \"${Router.PACKAGE_NAME}.router\"\n        const val TOUCH_FUNCTION_NAME = \"touch\"\n        const val MISS_FUNCTION_NAME = \"miss\"\n        const val NAVIGATE_FUNCTION_NAME = \"navigate\"\n        const val NAVIGATE_FOR_RESULT_FUNCTION_NAME = \"navigateForResult\"\n        const val URI_DSL_NAME = \"uri\"\n        const val QUERY_DSL_NAME = \"query\"\n        const val RESULT_DSL_NAME = \"result\"\n        const val CHECK_ROUTER_VERSION_DSL_NAME = \"checkRouterVersion\"\n        const val PARAMETER_NAME_PREFIX = \"rubik\"\n        const val PARAMETER_NAME_INSTANCE_PREFIX = \"${PARAMETER_NAME_PREFIX}Instance\"\n        fun toResultTransformerName(index: Int, baseName: String?): String = if (null == baseName || baseName.isBlank()) \"routeResultTransformer${if (index>0) index.toString() else \"\"}\" else baseName\n        fun makeAddToQueryCode(keyName: String, filedName: String): String = \"\\\"$keyName\\\" with $filedName\"\n\n        const val FUNCTION_ARGUMENTS = \"lambdaArg\"\n\n        private val PARAMETER_KEYWORDS = arrayOf(\"navigate\", \"query\", \"uri\", \"flags\", \"requestCode\", \"result\", \"path\", \"queries\", \"results\")\n        fun toLegalParameterName(name: String) = if (PARAMETER_KEYWORDS.contains(name)) toCamel(name, \"parameter\") else name\n        fun toCallbackTransformerName(name: String) = toCamel(name, \"callback\", \"transformer\")\n        fun toCallbackName(name: String) = toCamel(name, \"callback\")\n    }\n\n    object Activities {\n        const val ACTIVITY_CLASS_NAME = \"android.app.Activity\"\n        const val CONTEXT_CLASS_NAME = \"android.content.Context\"\n        const val FRAGMENT_CLASS_NAME = \"$ANDROIDX_PACKAGE_NAME.fragment.app.Fragment\"\n        const val PROPERTY_INTENT_FLAGS = \"${Apis.PARAMETER_NAME_PREFIX}IntentFlags\"\n        const val PROPERTY_REQUEST_CODE = \"${Apis.PARAMETER_NAME_PREFIX}RequestCode\"\n        const val PROPERTY_LAUNCHER = \"${Apis.PARAMETER_NAME_PREFIX}Launcher\"\n        const val REQUEST_CODE_DSL_NAME = \"requestCode\"\n        const val FLAGS_DSL_NAME = \"flags\"\n    }\n\n    object RouteActions {\n        const val CONTEXT_ROUTE_ACTIONS_BASE_CLASS_NAME = \"RouteActions\"\n        const val INTERFACE_NAME = \"${Router.PACKAGE_NAME}.context.RouteActions\"\n        const val PROPERTY_ROUTE_ACTION = \"rubikRouteAction\"\n    }\n\n    object ContextRouters {\n        const val ROUTE_CONTEXT_BASE_CLASS_NAME = \"RouteContext\"\n        const val RUBIK_CLASS_NAME = \"Rubik\"\n        const val FIND_ACTIONS_FUNCTION_NAME = \"safeFindActions\"\n        const val ROUTE_FUNCTION_NAME = \"safeRoute\"\n    }\n\n    object Object {\n        const val SUPER_NAME = \"${Router.PACKAGE_NAME}.route.SubObject\"\n        const val OBJECT_MAPPINGS_NAME = \"Mappings\"\n        const val SUB_OBJECT_ORIGINAL_FILED_NAME = \"originalObject\"\n        fun makeToTypeMappingFunctionName(name: String, nullable: Boolean = false): String = if (nullable) \"toNullable${name}Mapping\" else \"to${name}Mapping\"\n        const val OBJECT_INSTANCE_PARAMETER_NAME = \"objectInstance\"\n\n    }\n\n    object Identity {\n        object Declare {\n            const val CONTEXT_ID_BASE_CLASS_NAME = \"ContextId\"\n            const val AGGREGATE_ID_BASE_CLASS_NAME = \"AggregateId\"\n        }\n        const val CONTEXT_ID_SUPER_CLASS_NAME = \"${Router.PACKAGE_NAME}.identity.RContextId\"\n        const val AGGREGATE_ID_SUPER_CLASS_NAME = \"${Router.PACKAGE_NAME}.identity.RAggregateId\"\n    }\n\n    private const val CLASS_NAME_PREFIX = \"Rubik\"\n    fun String.toLegalClassName() = if (!this.startsWith(CLASS_NAME_PREFIX)) toPascal(CLASS_NAME_PREFIX, this) else this\n\n    object KDoc {\n        fun function(\n            function: String,\n            queries: List<String>,\n            result: String? = null\n        ) = mutableListOf<String>().apply {\n            add(function)\n            if (queries.isNotEmpty()) {\n                add(\"- parameters:\")\n                queries.forEach { query ->\n                    add(\"--- $query\".noSpaces())\n                }\n            }\n            if (null != result) {\n                add(\"- resultType:\")\n                add(\"--- $result\".noSpaces())\n            }\n        }\n\n        fun functionRouter(\n            uri: String,\n            originFunction: String,\n            queries: List<String>,\n            result: String? = null\n        ) =\n            \"\"\"\n            |encapsulate Rubik DSL Router.\n            |\n            |from uri: \n            |[$uri]\n            |\n            |route to:\n            |@see ${function(originFunction, queries, result).joinToString(\"\\n\")}\n            \"\"\".trimMargin()\n\n        private fun contextKDoc(\n            title: String,\n            uri: String,\n            version: String,\n            enableUserAndTime: Boolean = true\n        ): String {\n            val des = \"uri\" to \"[$uri]\"\n            return if (enableUserAndTime)\n                updateFileKDoc(title, version, des)\n            else\n                updateFileKDocWithoutUserAndTime(title, version, des)\n        }\n\n        private fun contextIdKDoc(\n            title: String,\n            uri: String,\n            version: String,\n            originalToken: String,\n            enableUserAndTime: Boolean = true\n        ): String {\n            val uriDes = \"uri\" to \"[$uri]\"\n            val tokenDes = \"originalToken\" to originalToken.noSpaces()\n            return if (enableUserAndTime)\n                updateFileKDoc(title, version, uriDes, tokenDes)\n            else\n                updateFileKDocWithoutUserAndTime(title, version, uriDes, tokenDes)\n        }\n\n        fun context(uri: String, version: String) =\n            contextKDoc(\"generated Rubik Context.\", uri, version)\n\n        fun routerContext(uri: String, version: String) =\n            contextKDoc(\"generated Rubik Router Context.\", uri, version)\n\n        fun value(uri: String, version: String) =\n            contextKDoc(\"generated Rubik Context Value class.\", uri, version)\n\n        fun aggregate(uri: String, version: String, enableUserAndTime: Boolean) =\n            contextKDoc(\"aggregate router function and router event of Rubik Context.\", uri, version, enableUserAndTime)\n\n        fun routeActions(uri: String, version: String) =\n            contextKDoc(\"generated Rubik RouteActions.\", uri, version)\n\n        fun contextId(uri: String, version: String, originalToken: String) =\n            contextIdKDoc(\"generated Rubik ContextId.\", uri, version, originalToken)\n\n        fun aggregateId(\n            uri: String,\n            version: String,\n            originalToken: String,\n            enableUserAndTime: Boolean\n        ) = contextIdKDoc(\"generated Rubik AggregateId.\", uri, version, originalToken,enableUserAndTime )\n\n        fun objekt(uri: String, version: String) =\n            contextKDoc(\"generated Rubik Context Object class.\", uri, version)\n\n        fun callback(uri: String, version: String) =\n            contextKDoc(\"generated Rubik Context Callback interface.\", uri, version)\n    }\n}\n\nenum class InvokeElementType {\n    METHOD, HIGHER_ORDER_FUNC, PROPERTY, CONSTRUCTOR\n}\n\nenum class CallbackType {\n    HIGHER_ORDER_FUNC, OPEN_CLASS, INTERFACE\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/RContextProcessService.java",
    "content": "package com.rubik.apt;\n\nimport java.util.Set;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.annotation.processing.Processor;\nimport javax.annotation.processing.RoundEnvironment;\nimport javax.annotation.processing.SupportedAnnotationTypes;\nimport javax.annotation.processing.SupportedSourceVersion;\nimport javax.lang.model.SourceVersion;\nimport javax.lang.model.element.TypeElement;\n\nimport com.google.auto.service.AutoService;\n\n@SupportedAnnotationTypes({\n        Constants.Annotations.R_EVENT,\n        Constants.Annotations.R_EVENT_REPEATABLE,\n        Constants.Annotations.R_EVENT_INSTANCE,\n        Constants.Annotations.R_EVENT_INSTANCE_REPEATABLE,\n        Constants.Annotations.R_EVENT_ASSIST,\n        Constants.Annotations.R_EVENT_ASSIST_REPEATABLE,\n        Constants.Annotations.R_ROUTE,\n        Constants.Annotations.R_ROUTE_REPEATABLE,\n        Constants.Annotations.R_ROUTE_FUNCTION,\n        Constants.Annotations.R_ROUTE_FUNCTION_REPEATABLE,\n        Constants.Annotations.R_ROUTE_PAGE,\n        Constants.Annotations.R_ROUTE_PAGE_REPEATABLE,\n        Constants.Annotations.R_ROUTE_INSTANCE,\n        Constants.Annotations.R_ROUTE_INSTANCE_REPEATABLE,\n        Constants.Annotations.R_ROUTE_ASSIST,\n        Constants.Annotations.R_ROUTE_ASSIST_REPEATABLE,\n        Constants.Annotations.R_INSTANCE,\n        Constants.Annotations.R_INSTANCE_REPEATABLE,\n        Constants.Annotations.R_VALUE,\n        Constants.Annotations.R_OBJECT\n\n})\n@SupportedSourceVersion(SourceVersion.RELEASE_8)\n@AutoService(Processor.class)\npublic class RContextProcessService extends AbstractProcessor {\n\n    private final RContextProcessor processor = new RContextProcessor();\n\n    @Override\n    public synchronized void init(ProcessingEnvironment processingEnv) {\n        if (null != processingEnv) {\n            super.init(processingEnv);\n            processor.init(processingEnv);\n        }\n    }\n\n    @Override\n    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n        if (null != processingEnv) {\n            return processor.process(annotations, processingEnv, roundEnv);\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/RContextProcessor.kt",
    "content": "package com.rubik.apt\n\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.ktnail.x.Logger\nimport com.ktnail.x.replaceDir\nimport com.rubik.apt.annotation.*\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.files.source.AggregateSourceFile\nimport com.rubik.apt.files.source.ContextSourceFiles\nimport com.rubik.apt.plugin.PluginArguments\nimport com.rubik.apt.utility.makeAggregateGeneratedDir\nimport com.rubik.apt.utility.makeDefaultGeneratedDir\nimport javax.annotation.processing.ProcessingEnvironment\nimport javax.annotation.processing.RoundEnvironment\nimport javax.lang.model.element.TypeElement\nimport javax.tools.Diagnostic\n\nclass RContextProcessor {\n\n    private val processingContexts: MutableMap<String, ContextCodeBase> = mutableMapOf()\n    private var defaultContexts: ContextCodeBase? = null\n\n    private val elementPool = ElementPool()\n\n    private var _args: PluginArguments? = null\n    private val args: PluginArguments\n        get() = _args ?: throw RuntimeException(\"RContextProcessor is not init !\")\n\n    @Synchronized\n    fun init(processingEnv: ProcessingEnvironment) {\n        Logger.d = { msg ->\n            processingEnv.messager.printMessage(Diagnostic.Kind.OTHER, \"$msg\\n \")\n        }\n        Logger.e = { msg ->\n            processingEnv.messager.printMessage(Diagnostic.Kind.WARNING, \"$msg\\n \")\n        }\n        _args = PluginArguments(processingEnv)\n        Logger.e(\" APT DBG RContextProcessor init args:$args \")\n    }\n\n    fun process(\n        annotations: MutableSet<out TypeElement>?,\n        processingEnv: ProcessingEnvironment,\n        roundEnv: RoundEnvironment?\n    ): Boolean {\n        if (!args.contextLibsEnable && !args.aggregateEnable) return true\n        if (roundEnv?.processingOver() == false) {\n            processContexts(roundEnv)\n            Logger.e(\" APT DBG RContextProcessor processing \")\n        } else {\n            if (processingContexts.isNotEmpty()) {\n                processingContexts.forEach { (_, context) ->\n                    defaultContexts?.let { default -> context.merge(default) }\n                    context.compose()\n                }\n                if (args.aggregateEnable) {\n                    Logger.e(\" APT DBG RContextProcessor aggregateEnable \")\n                    (makeAggregateGeneratedDir(args.aggregateGenerated) ?: makeDefaultGeneratedDir(processingEnv))?.let { directory->\n                        directory.replaceDir { dir->\n                            processingContexts.forEach { (uri, context) ->\n                                if (context.generatedAggregateEnable){\n                                    AggregateSourceFile(\n                                        dir,\n                                        args.aggregateMethodSize,\n                                        args.aggregateKDocUserAndTime\n                                    ).generate(uri, context)\n                                }\n                            }\n                        }\n                    }\n                }\n                if (args.contextLibsEnable) {\n                    Logger.e(\" APT DBG RContextProcessor contextLibsEnable \")\n                    makeDefaultGeneratedDir(processingEnv)?.let { directory ->\n                        processingContexts.forEach { (uri, context) ->\n                            if (context.generatedContextLibsEnable){\n                                ContextSourceFiles(directory).generate(\n                                    uri,\n                                    context,\n                                    args.routerContextEnable\n                                )\n                            }\n                        }\n                    }\n                }\n            }\n            Logger.e(\" APT DBG RContextProcessor process over \")\n        }\n        return true\n    }\n\n    private fun processContexts(\n        roundEnv: RoundEnvironment\n    ) {\n        args.contexts?.forEach { context-> addContextByUri(context) }\n\n        // value\n        Value.OBTAINER.addToContext(roundEnv, elementPool, args, ::getContextByUri)\n\n        // event\n        Event.OBTAINER.addToContext(roundEnv, elementPool, args, ::getContextByUri)\n        EventInstance.OBTAINER.addToContext(roundEnv, elementPool, args, ::getContextByUri)\n\n        // route\n        Route.OBTAINER.addToContext(roundEnv, elementPool, args, ::getContextByUri)\n        RouteInstance.OBTAINER.addToContext(roundEnv, elementPool, args, ::getContextByUri)\n\n        // object\n        Object.OBTAINER.addToContext(roundEnv, elementPool, args, ::getContextByUri)\n\n        // callback\n        Callback.OBTAINER.addToContext(roundEnv, elementPool, args, ::getContextByUri)\n\n    }\n\n\n    private fun addContextByUri(arguments: PluginArguments.ContextArguments) {\n        val uri = arguments.context.uri\n        val name  = arguments.context.name\n        val version = arguments.context.version\n\n        if (uri.isNotBlank()) {\n            processingContexts[uri] = getContextByUri(uri).apply {\n                this.name = name\n                this.version = version\n                this.generatedContextLibsEnable = arguments.contextLibsEnable\n                this.generatedAggregateEnable = arguments.aggregateEnable\n            }\n        }\n    }\n\n    private fun getContextByUri(uri: String): ContextCodeBase {\n        return if (uri.isBlank()) {\n            return defaultContexts ?: ContextCodeBase().apply {\n                defaultContexts = this\n            }\n        } else {\n            processingContexts.getOrPut(uri) { ContextCodeBase() }\n        }\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/AnnotationData.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.lang.element.KbpConstructorElement\nimport com.blueprint.kotlin.lang.utility.toKbpElement\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase.Companion.toInvokeOriginalCodeBases\nimport com.rubik.apt.codebase.value.ValueCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport javax.annotation.processing.RoundEnvironment\nimport javax.lang.model.element.Element\n\nabstract class AnnotationData(val element: Element, val annotation: Annotation) {\n    abstract fun addToCodebase(\n        context: (String) -> ContextCodeBase,\n        elementPool: ElementPool,\n        arguments: PluginArguments\n    )\n\n    fun invokers(\n        elementPool: ElementPool,\n        action: (InvokeOriginalCodeBase) -> Unit\n    ) = element.toKbpElement(elementPool)?.toInvokeOriginalCodeBases(elementPool)?.forEach { codebase ->\n        action(codebase)\n    }\n}\n\nfun annotationUri(uri: String, defaultScheme: String?) =\n    if (uri.contains(\"://\") || uri.isBlank() || defaultScheme.isNullOrBlank()) uri else \"$defaultScheme://$uri\"\n\nfun RoundEnvironment.elementsAndAnnotations(\n    vararg annotations: Class<out Annotation>,\n    action: (Element, Annotation) -> Unit\n) {\n    annotations.forEach { clazz ->\n        elementsAndAnnotation(clazz) { element, annotation ->\n            action(element, annotation)\n        }\n    }\n}\n\nfun <T : Annotation> RoundEnvironment.elementsAndAnnotation(\n    annotation: Class<T>,\n    action: (Element, T) -> Unit\n) {\n    getElementsAnnotatedWith(annotation)?.forEach { element ->\n        action(element, element.getAnnotation(annotation))\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/Callback.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.lang.utility.toKbpClassElement\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.annotations.route.RCallback\nimport com.rubik.apt.codebase.callback.ObjectCallbackCodeBase\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport javax.lang.model.element.Element\nimport javax.lang.model.element.TypeElement\n\nclass Callback(element: Element, originAnnotation: Annotation) : AnnotationData(element, originAnnotation) {\n    companion object {\n        val OBTAINER = object : CodebaseObtainer<Callback>() {\n            override val annotations = arrayOf<Class<out Annotation>>(\n                RCallback::class.java\n            )\n\n            override fun onObtain(\n                element: Element,\n                annotation: Annotation,\n                action: (Callback) -> Unit\n            ) {\n                if (annotation is RCallback) action(Callback(element, annotation))\n            }\n\n        }\n    }\n\n    private fun uri(defaultScheme: String?) = when (annotation) {\n        is RCallback -> annotationUri(annotation.uri, defaultScheme)\n        else -> \"\"\n    }\n\n    override fun addToCodebase(\n        context: (String) -> ContextCodeBase,\n        elementPool: ElementPool,\n        arguments: PluginArguments\n    ) {\n        if (element is TypeElement) {\n            element.toKbpClassElement(elementPool)?.let { kbpClassElement ->\n                ObjectCallbackCodeBase(elementPool, kbpClassElement)?.let { codebase ->\n                    context(uri(arguments.defaultScheme)).addCallback(codebase)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/CodebaseObtainer.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport javax.annotation.processing.RoundEnvironment\nimport javax.lang.model.element.Element\n\nabstract class CodebaseObtainer<T : AnnotationData> {\n    abstract val annotations: Array<Class<out Annotation>>\n\n    abstract fun onObtain(element: Element, annotation: Annotation, action: (T) -> Unit)\n\n    private fun annotationData(environment: RoundEnvironment, action: (T) -> Unit) {\n        environment.elementsAndAnnotations(*annotations) { element, annotation ->\n            onObtain(element, annotation) { data ->\n                action(data)\n            }\n        }\n    }\n\n    fun addToContext(\n        environment: RoundEnvironment,\n        elementPool: ElementPool,\n        arguments: PluginArguments,\n        context: (String) -> ContextCodeBase\n    ) {\n        annotationData(environment) { data ->\n            data.addToCodebase(context, elementPool, arguments)\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/Event.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.annotations.context.REvent\nimport com.rubik.annotations.context.REventRepeatable\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.event.EventCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport javax.lang.model.element.Element\n\nclass Event(element: Element, originAnnotation: Annotation) : AnnotationData(element, originAnnotation) {\n    companion object {\n        val OBTAINER = object : CodebaseObtainer<Event>() {\n            override val annotations = arrayOf(\n                REvent::class.java,\n                REventRepeatable::class.java\n            )\n\n            override fun onObtain(\n                element: Element,\n                annotation: Annotation,\n                action: (Event) -> Unit\n            ) {\n                if (annotation is REvent)\n                    action(Event(element, annotation))\n                else if (annotation is REventRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n            }\n\n        }\n    }\n\n    private fun uri(defaultScheme: String?) = when (annotation) {\n        is REvent -> annotationUri(annotation.uri.ifBlank { annotation.context }, defaultScheme)\n        else -> \"\"\n    }\n\n    private val msg = when (annotation) {\n        is REvent -> annotation.msg\n        else -> \"\"\n    }\n\n    private val tag = when (annotation) {\n        is REvent -> annotation.tag\n        else -> \"\"\n    }\n\n    override fun addToCodebase(\n        context: (String) -> ContextCodeBase,\n        elementPool: ElementPool,\n        arguments: PluginArguments\n    ) {\n        invokers(elementPool) { invoker ->\n            EventCodeBase(invoker, msg, tag).let { codeBase ->\n                if (codeBase.msg.isNotBlank()) {\n                    context(uri(arguments.defaultScheme)).events.getOrPut(codeBase.msg) { mutableListOf() }.add(codeBase)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/EventInstance.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.annotations.context.assist.REventAssist\nimport com.rubik.annotations.context.assist.REventAssistRepeatable\nimport com.rubik.annotations.context.instance.REventInstance\nimport com.rubik.annotations.context.instance.REventInstanceRepeatable\nimport com.rubik.annotations.route.RInstance\nimport com.rubik.annotations.route.RInstanceRepeatable\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.event.EventInstanceCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport javax.lang.model.element.Element\n\nclass EventInstance(element: Element, originAnnotation: Annotation) : AnnotationData(element, originAnnotation) {\n    companion object {\n        val OBTAINER = object : CodebaseObtainer<EventInstance>() {\n            override val annotations = arrayOf(\n                RInstance::class.java,\n                REventInstance::class.java,\n                REventAssist::class.java,\n                RInstanceRepeatable::class.java,\n                REventInstanceRepeatable::class.java,\n                REventAssistRepeatable::class.java\n            )\n\n            override fun onObtain(\n                element: Element,\n                annotation: Annotation,\n                action: (EventInstance) -> Unit\n            ) {\n                if (annotation is RInstance && annotation.provideForTag.isNotBlank() || annotation is REventInstance || annotation is REventAssist)\n                    action(EventInstance(element, annotation))\n                else if (annotation is RInstanceRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n                else if (annotation is REventInstanceRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n                else if (annotation is REventAssistRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n            }\n\n        }\n    }\n\n    private fun uri(defaultScheme: String?) = when (annotation) {\n        is RInstance -> annotationUri(annotation.uri, defaultScheme)\n        is REventInstance -> annotationUri(annotation.uri, defaultScheme)\n        is REventAssist -> annotationUri(annotation.uri.ifBlank { annotation.context }, defaultScheme)\n        else -> \"\"\n    }\n\n    private val forTag = when (annotation) {\n        is RInstance -> annotation.provideForTag\n        is REventInstance -> annotation.provideForTag\n        is REventAssist -> annotation.assistForTag\n        else -> \"\"\n    }\n\n    override fun addToCodebase(\n        context: (String) -> ContextCodeBase,\n        elementPool: ElementPool,\n        arguments: PluginArguments\n    ) {\n        invokers(elementPool) { invoker ->\n            EventInstanceCodeBase(invoker, forTag).let { codeBase ->\n                if (codeBase.forTag.isNotBlank()) {\n                    context(uri(arguments.defaultScheme)).addEventInstance(codeBase)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/Object.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.lang.utility.toKbpClassElement\nimport com.blueprint.kotlin.lang.utility.toKbpConstructorElement\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.annotations.route.RObject\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.objekt.ObjectCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport javax.lang.model.element.Element\nimport javax.lang.model.element.ExecutableElement\nimport javax.lang.model.element.TypeElement\n\nclass Object(element: Element, originAnnotation: Annotation) : AnnotationData(element, originAnnotation) {\n    companion object {\n        val OBTAINER = object : CodebaseObtainer<Object>() {\n            override val annotations = arrayOf<Class<out Annotation>>(\n                RObject::class.java\n            )\n\n            override fun onObtain(\n                element: Element,\n                annotation: Annotation,\n                action: (Object) -> Unit\n            ) {\n                if (annotation is RObject) action(Object(element, annotation))\n            }\n\n        }\n    }\n\n    private fun uri(defaultScheme: String?) = when (annotation) {\n        is RObject -> annotationUri(annotation.uri, defaultScheme)\n        else -> \"\"\n    }\n\n    override fun addToCodebase(\n        context: (String) -> ContextCodeBase,\n        elementPool: ElementPool,\n        arguments: PluginArguments\n    ) {\n        if (element is TypeElement) {\n            element.toKbpClassElement(elementPool)?.let { kbpClassElement ->\n                ObjectCodeBase(kbpClassElement)?.let { codebase ->\n                    context(uri(arguments.defaultScheme)).addObject(codebase)\n                }\n            }\n        } else if (element is ExecutableElement) {\n            element.toKbpConstructorElement(elementPool)?.let { kbpConstructorElement ->\n                (kbpConstructorElement.jmElement?.enclosingElement as? TypeElement)?.toKbpClassElement(elementPool)?.let { kbpClassElement ->\n                    ObjectCodeBase( kbpClassElement)?.let { codebase ->\n                        context(uri(arguments.defaultScheme)).addObject(codebase)\n                    }\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/Route.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.lang.utility.findSuperType\nimport com.blueprint.kotlin.lang.utility.toKbpClassElement\nimport com.blueprint.kotlin.lang.utility.toKbpElement\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.ktnail.x.pascalToSnake\nimport com.rubik.annotations.route.RObject\nimport com.rubik.annotations.route.RRoute\nimport com.rubik.annotations.route.RRouteRepeatable\nimport com.rubik.annotations.route.function.RDefaultType\nimport com.rubik.annotations.route.function.RFunction\nimport com.rubik.annotations.route.function.RFunctionRepeatable\nimport com.rubik.annotations.route.page.RPage\nimport com.rubik.annotations.route.page.RPageRepeatable\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.activity.ActivityCodeBase\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport com.rubik.apt.utility.defaultPath\nimport com.rubik.apt.utility.typeToStringInAnnotations\nimport javax.lang.model.element.Element\nimport javax.lang.model.element.TypeElement\n\nclass Route(element: Element, originAnnotation: Annotation) : AnnotationData(element, originAnnotation) {\n    companion object {\n        val OBTAINER = object : CodebaseObtainer<Route>() {\n            override val annotations = arrayOf(\n                RRoute::class.java,\n                RFunction::class.java,\n                RPage::class.java,\n                RObject::class.java,\n                RRouteRepeatable::class.java,\n                RFunctionRepeatable::class.java,\n                RPageRepeatable::class.java\n            )\n\n            override fun onObtain(\n                element: Element,\n                annotation: Annotation,\n                action: (Route) -> Unit\n            ) {\n                if (annotation is RRoute || annotation is RFunction || annotation is RPage || annotation is RObject)\n                    action(Route(element, annotation))\n                else if (annotation is RRouteRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n                else if (annotation is RFunctionRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n                else if (annotation is RPageRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n            }\n\n        }\n    }\n\n    private fun uri(defaultScheme: String?) = when (annotation) {\n        is RRoute -> annotationUri(annotation.uri.ifBlank { annotation.context }, defaultScheme)\n        is RFunction -> annotationUri(annotation.uri, defaultScheme)\n        is RPage -> annotationUri(annotation.uri, defaultScheme)\n        is RObject -> annotationUri(annotation.uri, defaultScheme)\n        else -> \"\"\n    }\n\n    private val path = when (annotation) {\n        is RRoute -> annotation.path\n        is RFunction -> annotation.path\n        is RPage -> annotation.path\n        is RObject -> \"\"\n        else -> \"\"\n    }\n\n    private val version = when (annotation) {\n        is RRoute -> annotation.version\n        is RFunction -> annotation.version\n        is RPage -> annotation.version\n        is RObject -> \"\"\n        else -> \"\"\n    }\n\n    private val navigationOnly = when (annotation) {\n        is RRoute -> annotation.navigationOnly\n        is RFunction -> annotation.navigationOnly\n        is RPage -> annotation.navigationOnly\n        is RObject -> true\n        else -> false\n    }\n\n    private val resultType = when (annotation) {\n        is RRoute -> typeToStringInAnnotations {  annotation.resultType.qualifiedName }\n        is RFunction -> typeToStringInAnnotations {  annotation.resultType.qualifiedName }\n        is RPage -> null\n        is RObject -> null\n        else -> null\n    }\n\n    private val syncReturn = when (annotation) {\n        is RRoute -> annotation.forResult || annotation.syncReturn\n        is RFunction -> annotation.forResult || annotation.syncReturn\n        is RPage -> true\n        is RObject -> true\n        else -> true\n    }\n\n    private val pathSectionOptimize = when (annotation) {\n        is RRoute -> false\n        is RFunction -> true\n        is RPage -> true\n        is RObject -> true\n        else -> false\n    }\n\n    override fun addToCodebase(\n        context: (String) -> ContextCodeBase,\n        elementPool: ElementPool,\n        arguments: PluginArguments\n    ) {\n        if ((element as? TypeElement)?.findSuperType(Constants.Activities.ACTIVITY_CLASS_NAME) != null) {\n            element.toKbpClassElement(elementPool)?.let { kbpClassElement ->\n                ActivityCodeBase(\n                    kbpClassElement,\n                    path.ifBlank { kbpClassElement.simpleNames.pascalToSnake(false, \"-\") },\n                    version,\n                    navigationOnly = navigationOnly,\n                    pathSectionOptimize = pathSectionOptimize\n                ).let { codeBase ->\n                    if (codeBase.path.isNotBlank()) {\n                        context(uri(arguments.defaultScheme)).addActivity(codeBase)\n                    }\n                }\n            }\n        } else {\n            invokers(elementPool) { invoker ->\n                ApiCodeBase(\n                    invoker,\n                    path.ifBlank { element.toKbpElement(elementPool)?.defaultPath() ?: path },\n                    version,\n                    resultType.let { if (it == RDefaultType::class.java.name) null else it },\n                    navigationOnly = navigationOnly,\n                    syncReturn = syncReturn,\n                    pathSectionOptimize = pathSectionOptimize\n                ).let { codeBase ->\n                    if (codeBase.path.isNotBlank()) {\n                        context(uri(arguments.defaultScheme)).addApi(codeBase) { added ->\n                            codeBase.apply { resetCrashPath(added) }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/RouteInstance.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.annotations.route.RInstance\nimport com.rubik.annotations.route.RInstanceRepeatable\nimport com.rubik.annotations.route.assist.RRouteAssist\nimport com.rubik.annotations.route.assist.RRouteAssistRepeatable\nimport com.rubik.annotations.route.instance.RRouteInstance\nimport com.rubik.annotations.route.instance.RRouteInstanceRepeatable\nimport com.rubik.apt.codebase.api.ApiInstanceCodeBase\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport javax.lang.model.element.Element\n\nclass RouteInstance(element: Element, originAnnotation: Annotation) : AnnotationData(element, originAnnotation) {\n    companion object {\n        val OBTAINER = object : CodebaseObtainer<RouteInstance>() {\n            override val annotations = arrayOf(\n                RInstance::class.java,\n                RRouteInstance::class.java,\n                RRouteAssist::class.java,\n                RInstanceRepeatable::class.java,\n                RRouteInstanceRepeatable::class.java,\n                RRouteAssistRepeatable::class.java\n            )\n\n            override fun onObtain(\n                element: Element,\n                annotation: Annotation,\n                action: (RouteInstance) -> Unit\n            ) {\n                if (annotation is RInstance && annotation.provideForPath.isNotBlank() || annotation is RRouteInstance || annotation is RRouteAssist)\n                    action(RouteInstance(element, annotation))\n                else if (annotation is RInstanceRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n                else if (annotation is RRouteInstanceRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n                else if (annotation is RRouteAssistRepeatable)\n                    annotation.value.forEach {\n                        onObtain(element, it, action)\n                    }\n            }\n        }\n    }\n\n    private fun uri(defaultScheme: String?) = when (annotation) {\n        is RInstance -> annotationUri(annotation.uri, defaultScheme)\n        is RRouteInstance -> annotationUri(annotation.uri, defaultScheme)\n        is RRouteAssist -> annotationUri(annotation.uri.ifBlank { annotation.context }, defaultScheme)\n        else -> \"\"\n    }\n\n    private val forPath = when (annotation) {\n        is RInstance -> annotation.provideForPath\n        is RRouteInstance -> annotation.provideForPath\n        is RRouteAssist -> annotation.assistForPath\n        else -> \"\"\n    }\n\n    private val version = when (annotation) {\n        is RInstance -> annotation.version\n        is RRouteInstance -> annotation.version\n        is RRouteAssist -> annotation.version\n        else -> \"\"\n    }\n\n    override fun addToCodebase(\n        context: (String) -> ContextCodeBase,\n        elementPool: ElementPool,\n        arguments: PluginArguments\n    ) {\n        invokers(elementPool) { invoker ->\n            ApiInstanceCodeBase(invoker, forPath, version).let { codeBase ->\n                if (codeBase.path.isNotBlank()) {\n                    context(uri(arguments.defaultScheme)).addApiInstance(codeBase)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/annotation/Value.kt",
    "content": "package com.rubik.apt.annotation\n\nimport com.blueprint.kotlin.lang.utility.toKbpClassElement\nimport com.blueprint.kotlin.lang.utility.toKbpConstructorElement\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.annotations.route.RValue\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.value.ValueCodeBase\nimport com.rubik.apt.plugin.PluginArguments\nimport javax.lang.model.element.Element\nimport javax.lang.model.element.ExecutableElement\nimport javax.lang.model.element.TypeElement\n\nclass Value(element: Element, originAnnotation: Annotation) : AnnotationData(element, originAnnotation) {\n    companion object {\n        val OBTAINER = object : CodebaseObtainer<Value>() {\n            override val annotations = arrayOf<Class<out Annotation>>(\n                RValue::class.java\n            )\n\n            override fun onObtain(\n                element: Element,\n                annotation: Annotation,\n                action: (Value) -> Unit\n            ) {\n                if (annotation is RValue) action(Value(element, annotation))\n            }\n\n        }\n    }\n\n    private fun uri(defaultScheme: String?) = when (annotation) {\n        is RValue -> annotationUri(annotation.uri.ifBlank { annotation.context }, defaultScheme)\n        else -> \"\"\n    }\n\n    override fun addToCodebase(\n        context: (String) -> ContextCodeBase,\n        elementPool: ElementPool,\n        arguments: PluginArguments\n    ) {\n        if (element is TypeElement) {\n            element.toKbpClassElement(elementPool)?.let { kbpClassElement ->\n                ValueCodeBase(\n                    kbpClassElement,\n                    ignoreAnnotations = arguments.ignoreValueAnnos\n                )?.let { codebase ->\n                    context(uri(arguments.defaultScheme)).values.add(codebase)\n                }\n            }\n        } else if (element is ExecutableElement) {\n            element.toKbpConstructorElement(elementPool)?.let { kbpConstructorElement ->\n                (kbpConstructorElement.jmElement?.enclosingElement as? TypeElement)?.toKbpClassElement(elementPool)?.let { kbpClassElement ->\n                    ValueCodeBase(\n                        kbpClassElement,\n                        kbpConstructorElement,\n                        arguments.ignoreValueAnnos\n                    )?.let { codebase ->\n                        context(uri(arguments.defaultScheme)).values.add(codebase)\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/AnnotationCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase\n\ndata class AnnotationCodeBase(\n    val className: String,\n    val members: List<String>\n) : RToken {\n    override val tokenList\n        get() = TokenList(TokenName(className), members, key = \"ANT\", warp = false)\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/ClassMirrorable.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase\n\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.rubik.apt.codebase.invoker.Instanceable\nimport com.rubik.apt.utility.toContextPackageName\nimport com.rubik.apt.utility.toRMirrorName\nimport com.squareup.kotlinpoet.ClassName\n\n/**\n * The code structure of Mirror Class.\n *\n * @since 1.10\n */\ninterface ClassMirrorable : Instanceable {\n    val qualifiedName: String\n    val simpleName: String\n    val originalType: KbpType\n}\n\nfun ClassMirrorable.packageName(uri: String) = originalType.toContextPackageName(uri)\n\nfun ClassMirrorable.contextClassName(uri: String) = originalType.toRMirrorName(uri)\n\nval ClassMirrorable.originalClassName\n    get() = ClassName.bestGuess(qualifiedName)"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/RToken.kt",
    "content": "package com.rubik.apt.codebase\n\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.ktnail.x.NameMapping\nimport com.squareup.kotlinpoet.TypeName\n\ninterface RToken {\n    val tokenList: TokenList\n}\n\nclass TokenName(val name: String) {\n    fun mapping(nameMapping: NameMapping) {\n        nameMapping.mapping(name)\n    }\n\n    fun use(nameMapping: NameMapping?) = nameMapping?.use(name) ?: name\n}\n\nclass TokenList(\n    vararg tokens: Any?,\n    private val key: String? = null,\n    private val warp: Boolean = false\n) {\n    private val tokenList = tokens.toList()\n    fun mappingNames(nameMapping: NameMapping) {\n        tokenList.anyMappingNames(nameMapping)\n    }\n\n    fun toToken(nameMapping: NameMapping?): String {\n        val token = if (warp) tokenList.joinToString(\"\") { item -> \"\\n${item.anyToToken(nameMapping)}\" }\n        else tokenList.anyToToken(nameMapping)\n        return if (null != key) \"[${key}]${token}[<]\" else token\n    }\n\n}\n\nfun RToken.createToken() = NameMapping(5) { original ->\n    when {\n//        original.contains(\"/\") -> original.split(\"/\").let { paths->\n//            if (paths.size > 2)  paths[paths.lastIndex - 1] + \"/\" to paths.last()\n//            else original to null\n//        }\n        original.contains(\".\") -> {\n            val simple = original.substringAfterLast(\".\")\n            if (original.endsWith(\"?\")) simple.removeSuffix(\"?\") to \"?\"\n            else simple to null\n        }\n        original.length > 10 -> original.substring(0, 10) to null\n        else -> original to null\n    }\n}.let { nameMapping ->\n    this.tokenList.mappingNames(nameMapping)\n\n    this.tokenList.toToken(nameMapping) +\n            nameMapping.mappingManyTimes.sortedBy { (_, simple) ->\n                simple\n            }.joinToString(\"\") { (original, simple) ->\n                \"\\n[MAP]$simple->$original[<]\"\n            }\n}\n\nprivate fun Any?.anyMappingNames(nameMapping: NameMapping) {\n    when (this) {\n        is RToken -> this.tokenList.mappingNames(nameMapping)\n        is Collection<*> -> this.forEach { any -> any.anyMappingNames(nameMapping) }\n        is Map<*, *> -> this.forEach { entry ->\n            entry.key.anyMappingNames(nameMapping)\n            entry.value.anyMappingNames(nameMapping)\n        }\n        is KbpType -> this.mappingTypes(nameMapping)\n        is TokenName -> this.mapping(nameMapping)\n        is TypeName -> nameMapping.mapping(this.toString())\n    }\n}\n\n\nprivate fun Any?.anyToToken(nameMapping: NameMapping?): String = if (this == null) \"N\" else\n    when (this) {\n        is RToken -> this.tokenList.toToken(nameMapping)\n        is Collection<*> -> if(this.isEmpty()) \"E\" else this.joinToString(\"|\") { any -> any.anyToToken(nameMapping) }\n        is Map<*, *> -> if(this.isEmpty()) \"E\" else this.map { entry -> \"${entry.key.anyToToken(nameMapping)}:${entry.value.anyToToken(nameMapping)}\" }.anyToToken(nameMapping)\n        is KbpType -> this.toSign(nameMapping)\n        is TokenName -> this.use(nameMapping)\n        is TypeName -> nameMapping?.use(this.toString()) ?: this.toString()\n        is Boolean -> if (this) \"T\" else \"F\"\n        is String -> this.ifBlank { \"B\" }\n        else -> \"-\"\n    }"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/RouteCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase\n\nimport com.ktnail.x.pathToCamel\nimport com.ktnail.x.pathToSnake\nimport com.ktnail.x.uri.buildVersionPath\n\nabstract class RouteCodeBase(\n    private val originalPath: String,\n    val version: String,\n    val navigationOnly: Boolean,\n    val pathSectionOptimize: Boolean\n) {\n    var resetPath: String? = null\n\n    val path\n        get() = resetPath ?: originalPath\n\n    private val pathSection\n        get() = if (pathSectionOptimize && path.contains(\"/\")) path.split(\"/\") else listOf()\n\n    val sections\n        get() = if (pathSectionOptimize && pathSection.isNotEmpty()) pathSection.dropLast(1) else listOf()\n\n    val contextFunctionName\n        get() = (if (pathSectionOptimize && pathSection.isNotEmpty()) pathSection.last() else path).pathToCamel()\n\n    val contextPropertyName\n        get() = (if (pathSectionOptimize && pathSection.isNotEmpty()) pathSection.last() else path).pathToSnake(true)\n\n    val actionFunctionName\n        get() = path.pathToCamel()\n\n    val versionPath\n        get() = buildVersionPath(path, version)\n\n    fun isSamePath(other: RouteCodeBase) = path == other.path\n\n    abstract fun location(): String\n\n    open fun resetCrashPath(crash: RouteCodeBase) {\n        throw RuntimeException(\" Duplicate Rubik Route Path：[$versionPath] ! Between [${location()}] and [${crash.location()}] !\")\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/activity/ActivityCodeBase.kt",
    "content": "package com.rubik.apt.codebase.activity\n\nimport com.blueprint.kotlin.lang.element.KbpRooterElement\nimport com.rubik.annotations.route.RProperty\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.TokenName\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.noSpaces\n\n/**\n * The code structure of Router Activity.\n *\n * @since 1.1\n */\nclass ActivityCodeBase(\n    path: String,\n    version: String,\n    navigationOnly: Boolean,\n    pathSectionOptimize: Boolean,\n    val className: String,\n    private val properties: List<ActivityPropertyCodeBase>\n) : RouteCodeBase(path, version, navigationOnly, pathSectionOptimize), RToken {\n    companion object {\n        operator fun invoke(\n            classElement: KbpRooterElement,\n            path: String,\n            version: String,\n            navigationOnly: Boolean,\n            pathSectionOptimize: Boolean\n        ): ActivityCodeBase {\n            return ActivityCodeBase(\n                path,\n                version,\n                navigationOnly,\n                pathSectionOptimize,\n                classElement.qualifiedName,\n                classElement.properties.mapNotNull { entry ->\n                    entry.value.jmElement?.let { jmElement ->\n                        val annotation = jmElement.getAnnotation(RProperty::class.java)\n                        if (null != annotation && (annotation.forPath.isEmpty() || path in annotation.forPath)) {\n                            ActivityPropertyCodeBase(\n                                annotation.name.let { it.ifBlank { jmElement.simpleName.toString() } },\n                                entry.value.type,\n                                annotation.extra.let { it.ifBlank { null } }\n                            )\n                        } else null\n                    }\n                } + classElement.functions.mapNotNull { entry ->\n                    entry.value.jmElement?.let { jmElement ->\n                        val annotation = jmElement.getAnnotation(RProperty::class.java)\n                        if (null != annotation && (annotation.forPath.isEmpty() || path in annotation.forPath) && null != entry.value.propertyNameIfAsGetter) {\n                            ActivityPropertyCodeBase(\n                                annotation.name.let { it.ifBlank { entry.value.propertyNameIfAsGetter.toString() } },\n                                entry.value.returnType,\n                                annotation.extra.let { it.ifBlank { null } }\n                            )\n                        } else null\n                    }\n                }\n            )\n        }\n    }\n\n    val sortedProperties\n        get() = properties.sortedWith(compareBy { it.originalName })\n\n    val propertiesKDoc\n        get() =  sortedProperties.map { queryCodeBase -> \"${queryCodeBase.originalName} : ${queryCodeBase.originalType}\" }\n\n    fun startCode(path: String, nameBox: FileNameBox): String =\n        \"${Constants.Aggregate.LAUNCHER_CLASS_NAME_AS}().${Constants.Aggregate.METHOD_LAUNCH_NAME}(${\n            nameBox.closeSimpleName(className)\n        }::class.java, ${Constants.Aggregate.ROUTE_PARAMETER_QUERIES_NAME}, ${\n            if (Constants.Aggregate.isParameterPath(path)) Constants.Aggregate.makeGetPathQueriesCode(path) else \"null\"\n        }, ${Constants.Aggregate.ROUTE_PARAMETER_RESULTS_NAME})\".noSpaces()\n\n    override fun location() = className\n\n    override val tokenList\n        get() = TokenList(\n            path,\n            version,\n            navigationOnly,\n            pathSectionOptimize,\n            TokenName(className),\n            properties,\n            key = \"ACT\",\n            warp = false\n        )\n\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/activity/ActivityPropertyCodeBase.kt",
    "content": "package com.rubik.apt.codebase.activity\n\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.ktnail.x.toCamel\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.invoker.TypeCodeBase\n\nclass ActivityPropertyCodeBase(\n    private val name: String,\n    originalType: KbpType,\n    private val queryWithType: String? = null\n) : TypeCodeBase(originalType) {\n\n    val legalName\n        get() = Constants.Apis.toLegalParameterName(name)\n\n    val originalName\n        get() = name\n\n    fun makeAddToQueryCode(): String =\n        \"\\\"$originalName\\\" ${if (null != queryWithType) toCamel(\"with\", queryWithType) else \"with\"} $legalName\"\n\n    override val tokenList\n        get() = TokenList(name, queryWithType, originalType, key = \"PRT\", warp = false)\n\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/api/ApiCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.api\n\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.TokenName\nimport com.rubik.apt.codebase.invoker.InvokeContextCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\nimport com.rubik.apt.codebase.invoker.OriginalInvokable\n\n/**\n * The code structure of Router Api.\n *\n * @since 1.1\n */\nopen class ApiCodeBase(\n    override val invoker: InvokeOriginalCodeBase,\n    path: String,\n    version: String,\n    val defineResultType: String? = null,\n    navigationOnly: Boolean,\n    val syncReturn: Boolean = false,\n    pathSectionOptimize: Boolean\n) : RouteCodeBase(path, version, navigationOnly, pathSectionOptimize), OriginalInvokable, RToken {\n\n    fun contextInvoker(uri: String) = InvokeContextCodeBase(this, uri)\n\n    fun objectContextInvoker(uri: String) = InvokeContextCodeBase(this, uri, inObject = true)\n\n    override fun resetCrashPath(crash: RouteCodeBase) {\n        resetPath = resetPath ?: (path + invoker.parameterPathSuffix)\n\n        if (crash.versionPath == versionPath)\n            super.resetCrashPath(crash)\n    }\n\n    override fun location() = invoker.location\n\n    override val tokenList\n        get() = TokenList(\n            TokenName(versionPath),\n            defineResultType,\n            navigationOnly,\n            syncReturn,\n            pathSectionOptimize,\n            invoker,\n            key = \"API\",\n            warp = false\n        )\n\n}\n\n\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/api/ApiInstanceCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.api\n\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.TokenName\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\nimport com.rubik.apt.codebase.invoker.OriginalInvokable\n\nclass ApiInstanceCodeBase(\n    override val invoker: InvokeOriginalCodeBase,\n    path: String,\n    version: String\n) : RToken, OriginalInvokable, RouteCodeBase(\n    path,\n    version,\n    navigationOnly = false,\n    pathSectionOptimize = true\n) {\n\n    override fun location() = invoker.location\n\n    override val tokenList: TokenList\n        get() = TokenList(TokenName(versionPath), invoker, key = \"AIN\", warp = false)\n\n}\n\n\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/api/QueryCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.api\n\nimport com.blueprint.kotlin.lang.element.KbpHighOrderFunctionElement\nimport com.blueprint.kotlin.lang.element.KbpVariableElement\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.blueprint.kotlin.lang.utility.asTypeElement\nimport com.blueprint.kotlin.lang.utility.toKbpClassElement\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.ktnail.x.camelToPascal\nimport com.rubik.annotations.route.RExtend\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.callback.FunctionCallbackCodeBase\nimport com.rubik.apt.codebase.callback.ObjectCallbackCodeBase\nimport com.rubik.apt.codebase.invoker.Callbackable\nimport com.rubik.apt.codebase.invoker.TypeCodeBase\nimport com.rubik.apt.utility.isResultCallback\nimport com.rubik.apt.utility.isVarargs\n\n/**\n * The code structure of Router Query.\n *\n * @since 1.1\n */\nclass QueryCodeBase(\n    private var name: String,\n    type: KbpType,\n    val isExtendThis: Boolean,\n    val isVarargs: Boolean,\n    val callback: Callbackable?\n) : TypeCodeBase(type) {\n    companion object {\n        operator fun invoke(\n            parameters: List<KbpType>, prefix: String\n        ): List<QueryCodeBase> =\n            parameters.mapIndexed { index, type ->\n                QueryCodeBase(\n                    \"$prefix$index\",\n                    type,\n                    isExtendThis = false,\n                    isVarargs = false,\n                    callback = null\n                )\n            }\n\n        operator fun invoke(\n            parameters: List<KbpVariableElement>,\n            elementPool: ElementPool\n        ): List<QueryCodeBase> =\n            parameters.map { variableElement ->\n                QueryCodeBase(\n                    variableElement.name,\n                    variableElement.type,\n                    isExtendThis = null != variableElement.jmElement?.getAnnotation(RExtend::class.java),\n                    isVarargs = variableElement.type.isVarargs(),\n                    callback = when {\n                        variableElement is KbpHighOrderFunctionElement -> FunctionCallbackCodeBase(variableElement)\n                        variableElement.isResultCallback() -> variableElement.jmElement?.asTypeElement()?.toKbpClassElement(elementPool)?.let { classElement ->\n                            ObjectCallbackCodeBase(elementPool, classElement)\n                        }\n                        else -> null\n                    }\n                )\n            }\n    }\n\n    fun addNameApiInstancePrefix() {\n        if (!name.startsWith(Constants.Apis.PARAMETER_NAME_INSTANCE_PREFIX)) {\n            name = \"${Constants.Apis.PARAMETER_NAME_INSTANCE_PREFIX}${name.camelToPascal()}\"\n        }\n    }\n\n    val legalName\n        get() = Constants.Apis.toLegalParameterName(\n            (callback as? FunctionCallbackCodeBase)?.function?.legalName ?: name\n        )\n\n    val originalName\n        get() = name\n\n    val callName\n        get() = if (isVarargs) \"*${legalName}\" else legalName\n\n    val resultCallbacks\n        get() = if (null != callback && callback.isResult) callback else null\n\n\n    override val tokenList\n        get() = TokenList(\n            name,\n            originalType,\n            isExtendThis,\n            isVarargs,\n            null != resultCallbacks,\n            key = \"QUY\",\n            warp = false\n        )\n\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/api/ResultCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.api\n\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.invoker.TypeCodeBase\nimport javax.lang.model.type.TypeKind\n\n/**\n * The code structure of Router Result.\n *\n * @since 1.1\n */\nclass ResultCodeBase(\n    val name: String,\n    type: KbpType\n) : TypeCodeBase(type) {\n    companion object {\n        operator fun invoke(\n            kbpType: KbpType\n        ): ResultCodeBase? =\n            if (kbpType.jmType?.kind != TypeKind.VOID)\n                ResultCodeBase(\"\", kbpType)\n            else\n                null\n    }\n\n    override val tokenList\n        get() = TokenList(\n            name,\n            originalType,\n            key =  \"RST\",\n            warp = false\n        )\n\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/callback/FunctionCallbackCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.callback\n\nimport com.blueprint.kotlin.lang.element.KbpHighOrderFunctionElement\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.invoker.Callbackable\nimport com.rubik.apt.codebase.invoker.InvokeFunctionCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeFunctionCodeBase.Companion.toInvokeFunctionCodeBase\nimport com.rubik.apt.utility.isResultCallback\n\nclass FunctionCallbackCodeBase(\n    val function: InvokeFunctionCodeBase,\n    override val isResult: Boolean\n) : RToken, Callbackable {\n    companion object {\n        operator fun invoke(\n            element: KbpHighOrderFunctionElement\n        ): FunctionCallbackCodeBase? = element.toInvokeFunctionCodeBase()?.let {\n            FunctionCallbackCodeBase(\n                it,\n                element.isResultCallback()\n            )\n        }\n    }\n\n    override val transformRMirror: Boolean\n        get() = function.containRMirror\n\n    override val transformRMirrorResult: Boolean\n        get() = if (!isResult) function.result?.isRMirror == true else false\n\n    override val functions: List<InvokeFunctionCodeBase>\n        get() = listOf(function)\n\n    override val tokenList\n        get() = TokenList(\n            function,\n            isResult,\n            key = \"CBF\",\n            warp = false\n        )\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/callback/ObjectCallbackCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.callback\n\nimport com.blueprint.kotlin.lang.element.KbpRooterElement\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.blueprint.kotlin.lang.utility.toType\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.rubik.apt.codebase.ClassMirrorable\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.invoker.Callbackable\nimport com.rubik.apt.codebase.invoker.InvokeFunctionCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeFunctionCodeBase.Companion.toInvokeFunctionCodeBase\nimport com.rubik.apt.utility.isResultCallback\nimport javax.lang.model.element.ElementKind\n\n/**\n * The code structure of Router Result Callback.\n *\n * @since 1.10\n */\nclass ObjectCallbackCodeBase(\n    override val qualifiedName: String,\n    override val simpleName: String,\n    override val originalType: KbpType,\n    val isInterface: Boolean,\n    override val functions: List<InvokeFunctionCodeBase>\n) : ClassMirrorable, Callbackable, RToken {\n    companion object {\n        operator fun invoke(\n            elementPool: ElementPool,\n            classElement: KbpRooterElement\n        ): ObjectCallbackCodeBase? = classElement.toType()?.let { type ->\n            val isInterface = classElement.jmElement?.kind == ElementKind.INTERFACE\n            classElement.functions.let { functions ->\n                val resultFunctions = functions.filter { (_, function) -> function.isResultCallback() }.values.toMutableList()\n                if (resultFunctions.isEmpty() && isInterface) {\n                    resultFunctions.addAll(functions.values)\n                }\n                ObjectCallbackCodeBase(\n                    classElement.qualifiedName,\n                    classElement.simpleNames,\n                    type,\n                    isInterface,\n                    resultFunctions.mapNotNull { function ->\n                        function.toInvokeFunctionCodeBase(elementPool)\n                    }\n                )\n            }\n        }\n    }\n\n    override val isResult: Boolean = true\n\n    override val transformRMirror: Boolean\n        get() = isResult\n\n    override val transformRMirrorResult: Boolean\n        get() = false\n\n\n    override val tokenList\n        get() = TokenList(\n            originalType,\n            functions,\n            key = \"CBO\",\n            warp = false\n        )\n\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/context/ContextCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.context\n\nimport com.ktnail.x.find\nimport com.ktnail.x.toPascal\nimport com.rubik.apt.Constants\nimport com.rubik.apt.InvokeElementType\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.activity.ActivityCodeBase\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.api.ApiInstanceCodeBase\nimport com.rubik.apt.codebase.createToken\nimport com.rubik.apt.codebase.event.EventCodeBase\nimport com.rubik.apt.codebase.event.EventInstanceCodeBase\nimport com.rubik.apt.codebase.callback.ObjectCallbackCodeBase\nimport com.rubik.apt.codebase.objekt.ObjectCodeBase\nimport com.rubik.apt.codebase.value.ValueCodeBase\nimport com.rubik.apt.utility.toArrayCode\n\n/**\n * The code structure of Router Context.\n *\n * @since 1.1\n */\nclass ContextCodeBase : RToken {\n    var name: String = \"\"\n    val apis: MutableMap<String, ApiCodeBase> = mutableMapOf() // key : path\n    val events: MutableMap<String, MutableList<EventCodeBase>> = mutableMapOf() // key : msg\n    val values: MutableList<ValueCodeBase> = mutableListOf()\n    val valuesCreateByConstructor\n        get() = values.filter { value -> value.createByConstructor }\n    val activities: MutableMap<String, ActivityCodeBase> = mutableMapOf()\n    var version: String = \"undefine\"\n\n    val sections = SectionCodeBase<RouteCodeBase>()\n    private val apiInstances: MutableList<ApiInstanceCodeBase> = mutableListOf()\n    private val eventInstances: MutableMap<String, EventInstanceCodeBase> = mutableMapOf() // key : tag\n    val objects: MutableMap<String, ObjectCodeBase> = mutableMapOf() // key : classname\n    val callbacks: MutableList<ObjectCallbackCodeBase> = mutableListOf()\n\n    var generatedContextLibsEnable: Boolean = false\n    var generatedAggregateEnable: Boolean = false\n\n    fun merge(other: ContextCodeBase) {\n        events.putAll(other.events)\n        eventInstances.putAll(other.eventInstances)\n        values.addAll(other.values)\n        apis.putAll(other.apis)\n        apiInstances.addAll(other.apiInstances)\n        activities.putAll(other.activities)\n        objects.putAll(other.objects)\n        callbacks.addAll(other.callbacks)\n    }\n\n    fun addActivity(activity: ActivityCodeBase) {\n        activities[activity.versionPath] = activity\n    }\n\n    fun addApi(api: ApiCodeBase, pathCrash: (ApiCodeBase) -> ApiCodeBase) {\n        val addedApi = apis[api.versionPath]\n        if (null != addedApi)\n            addApi(pathCrash(addedApi), pathCrash)\n        else\n            apis[api.versionPath] = api\n    }\n\n    fun addApiInstance(codeBase: ApiInstanceCodeBase) {\n        apiInstances.add(codeBase)\n    }\n\n    fun addEventInstance(codeBase: EventInstanceCodeBase){\n        eventInstances[codeBase.forTag] = codeBase\n    }\n\n    fun addObject(objekt: ObjectCodeBase) {\n        objects[objekt.qualifiedName] = objekt\n    }\n\n     fun addCallback(callBack: ObjectCallbackCodeBase){\n         callbacks.add(callBack)\n     }\n\n    private fun composeSections() {\n        activities.forEach { (_, activity) ->\n            sections.addItem(activity, activity.sections) { route -> !route.navigationOnly }\n        }\n        apis.forEach { (_, api) ->\n            sections.addItem(api, api.sections) { route -> !route.navigationOnly }\n        }\n    }\n\n    private fun composeEventInstances() {\n        eventInstances.forEach { (tag, instance) ->\n            instance.invoker.queries.forEach { query ->\n                query.addNameApiInstancePrefix()\n            }\n            events.forEach { (_, msgEvents) ->\n                msgEvents.filter { life -> life.tag == tag }.forEach { life ->\n                    life.invoker.instance = instance\n                }\n            }\n        }\n    }\n\n    private fun composeApiInstances() {\n        apiInstances.forEach { instance ->\n            instance.invoker.queries.forEach { query ->\n                query.addNameApiInstancePrefix()\n            }\n            apis.find { api -> instance.isSamePath(api) }.forEach { (_, api) ->\n                api.invoker.instance = instance\n            }\n        }\n    }\n\n    private fun composeObject() {\n        objects.forEach { (className, objekt) ->\n            apis.forEach { (versionPath, api) ->\n                if (api.invoker.clazz.name == className) {\n                    if (api.invoker.type == InvokeElementType.CONSTRUCTOR) {\n                        objekt.addConstructor(api)\n                    } else {\n                        objekt.addApi(versionPath, api)\n                        api.invoker.instance = objekt\n                    }\n                }\n            }\n            objekt.composeSections()\n        }\n    }\n\n    fun compose() {\n        composeObject()\n        composeSections()\n        composeEventInstances()\n        composeApiInstances()\n    }\n\n    // make code\n    val aggregateName\n        get() = Constants.Aggregate.Declare.makeAggregateClassName(name)\n    val contextName\n        get() = toPascal(name, Constants.Contexts.CONTEXT_BASE_CLASS_NAME)\n    val routeActionsName\n        get() = toPascal(name, Constants.RouteActions.CONTEXT_ROUTE_ACTIONS_BASE_CLASS_NAME)\n    val routeContextName\n        get() = toPascal(name, Constants.ContextRouters.ROUTE_CONTEXT_BASE_CLASS_NAME)\n    val contextIdName\n        get() = toPascal(name, Constants.Identity.Declare.CONTEXT_ID_BASE_CLASS_NAME)\n    val aggregateIdName\n        get() = toPascal(name, Constants.Identity.Declare.AGGREGATE_ID_BASE_CLASS_NAME)\n    val eventsArray: String\n        get() = events.keys.toArrayCode { event -> \"\\\"$event\\\"\" }\n\n    private var _token: String? = null\n\n    val token: String\n        get() = _token ?: createToken().apply { _token = this }\n\n    override val tokenList\n        get() = TokenList(\n            *apis.map { entry -> entry.value }.sortedBy { api -> api.path }.toTypedArray(),\n            *activities.map { entry -> entry.value }.sortedBy { act -> act.path }.toTypedArray(),\n            *events.flatMap { entry -> entry.value }.sortedBy { evt -> evt.msg }.toTypedArray(),\n            *values.sortedBy { it.qualifiedName }.toTypedArray(),\n            *objects.map { entry -> entry.value }.sortedBy { obj -> obj.qualifiedName }.toTypedArray(),\n            *callbacks.sortedBy { it.qualifiedName }.toTypedArray(),\n            key = null,\n            warp = true\n        )\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/context/SectionCodeBase.kt",
    "content": "package com.rubik.apt.codebase.context\n\nimport com.rubik.apt.codebase.RouteCodeBase\n\nclass SectionCodeBase<T : RouteCodeBase> {\n    val nextLevel = mutableMapOf<String, SectionCodeBase<T>>()\n    val items = mutableSetOf<T>()\n    private val disableItems = mutableSetOf<T>()\n\n    fun addItem(\n        item: T,\n        sections: List<String>,\n        enable: (T) -> Boolean = { true }\n    ) {\n        if (enable(item)) {\n            if (sections.isNotEmpty()) {\n                getNextLevel(sections.first()).addItem(\n                    item,\n                    sections.takeLast(sections.size - 1),\n                    enable\n                )\n            } else {\n                items.add(item)\n            }\n        } else {\n            disableItems.add(item)\n        }\n    }\n\n    private fun getNextLevel(nextSection: String) = nextLevel.getOrPut(nextSection) {\n        SectionCodeBase()\n    }\n\n    fun forEachRoute(action: (T) -> Unit) {\n        items.forEach (action)\n        nextLevel.forEach { (_, value) ->\n            value.forEachRoute(action)\n        }\n        disableItems.forEach(action)\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/event/EventCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.event\n\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.invoker.OriginalInvokable\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\n\n/**\n * The code structure of Router Event.\n *\n * @since 1.1\n */\nclass EventCodeBase(\n    override val invoker: InvokeOriginalCodeBase,\n    val msg: String,\n    val tag: String?\n) : OriginalInvokable, RToken {\n\n    override val tokenList\n        get() = TokenList(\n            msg,\n            tag,\n            invoker,\n            key = \"EVT\",\n            warp = false\n        )\n}\n\n\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/event/EventInstanceCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.event\n\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.invoker.OriginalInvokable\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\n\nclass EventInstanceCodeBase(\n    override val invoker: InvokeOriginalCodeBase,\n    val forTag: String\n) : OriginalInvokable, RToken {\n    override val tokenList: TokenList\n        get() = TokenList(forTag, invoker, key = \"EIN\", warp = false)\n}\n\n\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/invoker/Callbackable.kt",
    "content": "package com.rubik.apt.codebase.invoker\n\n\ninterface Callbackable {\n    val isResult: Boolean\n    val transformRMirror: Boolean\n    val transformRMirrorResult: Boolean\n    val functions: List<InvokeFunctionCodeBase>\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/invoker/Instanceable.kt",
    "content": "package com.rubik.apt.codebase.invoker\n\ninterface Instanceable\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/invoker/InvokeContextCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.invoker\n\nimport com.blueprint.kotlin.lang.type.toKotlinTypeName\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.api.QueryCodeBase\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.TypeName\nimport com.squareup.kotlinpoet.asClassName\nimport com.squareup.kotlinpoet.asTypeName\n\nclass InvokeContextCodeBase(\n    val receiver: QueryCodeBase?,\n    private val objectInstance: QueryCodeBase?,\n    val parameters: List<QueryCodeBase>,\n    val hasSyncReturn: Boolean,\n    val resultParameters: List<LambdaTypeCodeBase>,\n    val returnType: TypeName\n) {\n    companion object {\n        operator fun invoke(\n            api: ApiCodeBase,\n            contextUri: String,\n            inObject: Boolean = false\n        ): InvokeContextCodeBase {\n            val receiver = api.invoker.parameters.find { query -> query.isExtendThis }\n\n            var objectInstance: QueryCodeBase? = null\n\n            val parameter = api.invoker.parameters.filter { query ->\n                null == query.resultCallbacks && !query.isExtendThis\n            }.let {\n                if (inObject) it.filter { query ->\n                    (query.originalName != Constants.Object.OBJECT_INSTANCE_PARAMETER_NAME).also { check ->\n                        if (!check) objectInstance = query\n                    }\n                } else it\n            }\n\n            val hasSyncReturn = api.syncReturn && null != api.invoker.result\n\n            val resultParameters = api.invoker.getResultGroupsLambdaOrDefine(\n                api.defineResultType,\n                contextUri,\n                hasSyncReturn\n            )\n\n            val returnType = api.invoker.getForResultOrDefine(api.defineResultType, contextUri)\n\n            return InvokeContextCodeBase(\n                receiver,\n                objectInstance,\n                parameter,\n                hasSyncReturn,\n                resultParameters,\n                returnType\n            )\n        }\n\n        private fun InvokeOriginalCodeBase.getForResultOrDefine(\n            defineResultType: String?,\n            uri: String\n        ): TypeName {\n            return if (defineResultType?.isNotBlank() == true)\n                Class.forName(defineResultType).asTypeName().toKotlinTypeName()\n            else\n                result?.toContextTypeName(uri) ?: Unit::class.asClassName()\n        }\n\n        private fun InvokeOriginalCodeBase.getResultGroupsLambdaOrDefine(\n            defineResultType: String?,\n            uri: String,\n            hasSyncReturn: Boolean\n        ): List<LambdaTypeCodeBase> =\n            mutableListOf<LambdaTypeCodeBase>().apply {\n                val resultCallbackFunctions = queries.flatMap { query ->\n                    query.resultCallbacks?.functions?.map { function->\n                        query to function\n                    } ?: listOf()\n                }\n                resultCallbackFunctions.forEach { (query, function) ->  // have @RResult callback\n                    if (size == 0 && defineResultType?.isNotBlank() == true) {\n                        // if have defineResultType and have @RResult, merge there in first callback\n                        add(\n                            LambdaTypeCodeBase(\n                                Constants.Apis.toResultTransformerName(size, function.legalName),\n                                listOf(Class.forName(defineResultType).asTypeName().toKotlinTypeName()),\n                                Unit::class.asClassName(),\n                                query.nullable\n                            )\n                        )\n                    } else {\n                        val parameters = function.queries.map { codeBase -> codeBase.toContextTypeName(uri) }\n                        add(\n                            LambdaTypeCodeBase(\n                                Constants.Apis.toResultTransformerName(size, function.legalName),\n                                parameters,\n                                Unit::class.asClassName(),\n                                query.nullable\n                            )\n                        )\n                    }\n                }\n                if (!hasSyncReturn) {\n                    if (resultCallbackFunctions.isEmpty() && defineResultType?.isNotBlank() == true) {\n                        // if have defineResultType but no @RResult, give a defineResultType callback\n                        add(\n                            LambdaTypeCodeBase(\n                                Constants.Apis.toResultTransformerName(size, result?.name),\n                                listOf(Class.forName(defineResultType).asTypeName().toKotlinTypeName()),\n                                Unit::class.asClassName(),\n                                result?.originalType?.nullable ?: false\n                            )\n                        )\n                    }\n                    if (isEmpty() && null != result) {\n                        // still no callback but is asnyc return, give callback of function return type\n                        add(\n                            LambdaTypeCodeBase(\n                                Constants.Apis.toResultTransformerName(size, result.name),\n                                listOf(result.toContextTypeName(uri)),\n                                Unit::class.asClassName(),\n                                result.originalType.nullable\n                            )\n                        )\n                    }\n                }\n            }\n    }\n\n    fun invokeParameterNames(): List<String> =\n        listOfNotNull(objectInstance?.let { query->\"this@${(query.originalType.toTypeName() as? ClassName)?.simpleName}\" }) +\n                listOfNotNull(receiver?.let { \"this\" }) +\n                parameters.map { query -> query.callName } +\n                resultParameters.map { lambda -> lambda.name }\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/invoker/InvokeFunctionCodeBase.kt",
    "content": "package com.rubik.apt.codebase.invoker\n\nimport com.blueprint.kotlin.lang.element.KbpFunctionElement\nimport com.blueprint.kotlin.lang.element.KbpHighOrderFunctionElement\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.ktnail.x.camelToPascal\nimport com.ktnail.x.pascalToSnake\nimport com.ktnail.x.toPascal\nimport com.rubik.apt.Constants\nimport com.rubik.apt.InvokeElementType\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.TokenName\nimport com.rubik.apt.codebase.api.QueryCodeBase\nimport com.rubik.apt.codebase.api.ResultCodeBase\nimport javax.lang.model.element.Modifier\n\nopen class InvokeFunctionCodeBase(\n    val type: InvokeElementType,\n    val name: String,\n    val static: Boolean,\n    val queries: List<QueryCodeBase>,\n    val result: ResultCodeBase?\n): RToken{\n    companion object{\n        fun KbpFunctionElement.toInvokeFunctionCodeBase(elementPool: ElementPool) =\n            jmElement?.let { functionElement ->\n                InvokeFunctionCodeBase(\n                    type = InvokeElementType.METHOD,\n                    name = name,\n                    static = functionElement.modifiers.contains(Modifier.STATIC),\n                    queries = QueryCodeBase(parameters, elementPool),\n                    result = ResultCodeBase(returnType)\n                )\n            }\n\n        fun KbpHighOrderFunctionElement.toInvokeFunctionCodeBase() =\n            jmElement?.let { functionElement ->\n                InvokeFunctionCodeBase(\n                    type = InvokeElementType.HIGHER_ORDER_FUNC,\n                    name = name,\n                    static = functionElement.modifiers.contains(Modifier.STATIC),\n                    queries = QueryCodeBase(parameters, Constants.Apis.FUNCTION_ARGUMENTS),\n                    result = ResultCodeBase(returnType)\n                )\n            }\n    }\n\n    var useName: String = name\n\n    val parameterPathSuffix\n        get() = if (queries.isNotEmpty())\n            \"-\" + toPascal(\n                \"By\", queries.joinToString(\"\") { query ->\n                    query.originalName.camelToPascal()\n                }).pascalToSnake(separator = \"-\")\n        else \"\"\n\n    val legalName: String\n        get() = Constants.Apis.toLegalParameterName(useName)\n\n    val containRMirror\n        get() = null != queries.find { it.isRMirror } || result?.isRMirror == true\n\n    val queriesKDoc\n        get() =  queries.map { queryCodeBase -> \"${queryCodeBase.originalName} : ${queryCodeBase.originalType}\" }\n\n    val resultKDoc\n        get() =  result?.originalType.toString()\n\n    val originalParameters = queries.map { query ->\n        query.legalName to query.originalType.toTypeName()\n    }\n\n    fun contextParameters(uri: String) = queries.map { query ->\n        query.legalName to query.toContextTypeName(uri)\n    }\n\n    fun contextResult(uri: String) = result?.toContextTypeName(uri)\n\n    override val tokenList\n        get() = TokenList(\n            TokenName(name),\n            queries,\n            result,\n            static,\n            key = \"IVF\",\n            warp = false\n        )\n}\n\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/invoker/InvokeOriginalCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.invoker\n\nimport com.blueprint.kotlin.lang.element.*\nimport com.blueprint.kotlin.pool.ElementPool\nimport com.ktnail.x.NameBox\nimport com.rubik.apt.Constants\nimport com.rubik.apt.InvokeElementType\nimport com.rubik.apt.codebase.ClassMirrorable\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.TokenName\nimport com.rubik.apt.codebase.api.QueryCodeBase\nimport com.rubik.apt.codebase.api.ResultCodeBase\nimport javax.lang.model.element.Modifier\nimport javax.lang.model.element.TypeElement\n\nopen class InvokeOriginalCodeBase(\n    type: InvokeElementType,\n    name: String,\n    static: Boolean,\n    queries: List<QueryCodeBase>,\n    result: ResultCodeBase?,\n    val clazz: InvokeHandle\n) : InvokeFunctionCodeBase(type, name, static, queries, result) {\n    companion object {\n        fun KbpRooterElement.toInvokeOriginalCodeBases(elementPool: ElementPool): List<InvokeOriginalCodeBase> =\n            mutableListOf<InvokeOriginalCodeBase>().also { result ->\n                jmElement?.let { classElement ->\n                    constructors.forEach { (_, constructor) ->\n                        result.add(\n                            InvokeOriginalCodeBase(\n                                type = InvokeElementType.CONSTRUCTOR,\n                                name = classElement.qualifiedName.toString(),\n                                static = false,\n                                queries = QueryCodeBase(constructor.parameters, elementPool),\n                                result = ResultCodeBase(constructor.returnType),\n                                clazz = InvokeHandle(classElement.qualifiedName.toString(), false)\n                            )\n                        )\n                    }\n                }\n            }\n\n        fun KbpConstructorElement.toInvokeOriginalCodeBase(elementPool: ElementPool) =\n            (jmElement?.enclosingElement as? TypeElement)?.let { classElement ->\n                InvokeOriginalCodeBase(\n                    type = InvokeElementType.CONSTRUCTOR,\n                    name = classElement.qualifiedName.toString(),\n                    static = false,\n                    queries = QueryCodeBase(parameters, elementPool),\n                    result = ResultCodeBase(returnType),\n                    clazz = InvokeHandle(classElement.qualifiedName.toString(), false)\n                )\n            }\n\n        fun KbpFunctionElement.toInvokeOriginalCodeBase(elementPool: ElementPool) =\n            jmElement?.let { functionElement ->\n                (functionElement.enclosingElement as? TypeElement)?.let { classElement ->\n                    InvokeOriginalCodeBase(\n                        type = InvokeElementType.METHOD,\n                        name = name,\n                        static = functionElement.modifiers.contains(Modifier.STATIC),\n                        queries = QueryCodeBase(parameters, elementPool),\n                        result = ResultCodeBase(returnType),\n                        clazz = InvokeHandle(classElement.qualifiedName.toString(), classElement.modifiers.contains(Modifier.STATIC))\n                    )\n                }\n            }\n\n        fun KbpHighOrderFunctionElement.toInvokeOriginalCodeBase() =\n            jmElement?.let { functionElement ->\n                (functionElement.enclosingElement as? TypeElement)?.let { classElement ->\n                    InvokeOriginalCodeBase(\n                        type = InvokeElementType.HIGHER_ORDER_FUNC,\n                        name = name,\n                        static = functionElement.modifiers.contains(Modifier.STATIC),\n                        queries = QueryCodeBase(parameters, Constants.Apis.FUNCTION_ARGUMENTS),\n                        result = ResultCodeBase(returnType),\n                        clazz = InvokeHandle(classElement.qualifiedName.toString(), classElement.modifiers.contains(Modifier.STATIC))\n                    )\n                }\n            }\n\n        fun KbpVariableElement.toInvokeOriginalCodeBase() = jmElement?.let { propertyElement ->\n            (propertyElement.enclosingElement as? TypeElement)?.let { classElement ->\n                InvokeOriginalCodeBase(\n                    type = InvokeElementType.PROPERTY,\n                    name = name,\n                    static = propertyElement.modifiers.contains(Modifier.STATIC),\n                    queries = listOf(),\n                    result = ResultCodeBase(type),\n                    clazz = InvokeHandle(classElement.qualifiedName.toString(), classElement.modifiers.contains(Modifier.STATIC))\n                )\n            }\n        }\n\n        fun KbpElement.toInvokeOriginalCodeBases(elementPool: ElementPool): List<InvokeOriginalCodeBase> =\n            when (this) {\n                is KbpRooterElement -> toInvokeOriginalCodeBases(elementPool)\n                is KbpConstructorElement -> listOfNotNull(toInvokeOriginalCodeBase(elementPool))\n                is KbpFunctionElement -> listOfNotNull(toInvokeOriginalCodeBase(elementPool))\n                is KbpHighOrderFunctionElement -> listOfNotNull(toInvokeOriginalCodeBase())\n                is KbpVariableElement -> listOfNotNull(toInvokeOriginalCodeBase())\n                else -> listOf()\n            }\n\n    }\n\n    init {\n        NameBox().let { box ->\n            queries.forEach { query ->\n                query.callback?.functions?.forEach { function ->\n                    function.useName = Constants.Apis.toCallbackName(box.useName(function.name))\n                }\n            }\n        }\n    }\n\n    var instance: Instanceable? = null\n\n    val parameters\n        get() = listOfNotNull(objectParameter) + (instanceInvoker?.queries ?: listOf()) + queries\n\n    val instanceInvoker: InvokeOriginalCodeBase?\n        get() = (instance as? OriginalInvokable)?.invoker\n\n    val objectParameter: QueryCodeBase?\n        get() = (instance as? ClassMirrorable)?.let { type ->\n            QueryCodeBase(\n                Constants.Object.OBJECT_INSTANCE_PARAMETER_NAME, type.originalType,\n                isExtendThis = false,\n                isVarargs = false,\n                callback = null\n            )\n        }\n\n    val location\n        get() = if (type == InvokeElementType.CONSTRUCTOR) clazz.name else \"${clazz.name}.$name\"\n\n    override val tokenList\n        get() = TokenList(\n            TokenName(name),\n            static,\n            instance,\n            parameters,\n            result,\n            TokenName(clazz.name),\n            clazz.static,\n            key =  \"IVO\",\n            warp = false\n        )\n}\n\ndata class InvokeHandle(\n    val name: String,\n    val static: Boolean\n)"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/invoker/LambdaTypeCodeBase.kt",
    "content": "package com.rubik.apt.codebase.invoker\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.noSpaces\nimport com.squareup.kotlinpoet.LambdaTypeName\nimport com.squareup.kotlinpoet.TypeName\n\ndata class LambdaTypeCodeBase(\n    val name: String,\n    val parameters: List<TypeName>,\n    val returnType: TypeName,\n    val nullable: Boolean = true\n) {\n    fun toTypeName() =\n        LambdaTypeName.get(\n            returnType = returnType,\n            parameters = *parameters.map { parameter -> parameter }.toTypedArray()\n        ).copy(nullable = nullable)\n\n    fun toTypeCode(nameBox: FileNameBox) =\n        (\"(${parameters.joinToString(\", \") { type -> nameBox.closeSimpleName(type) }}) -> ${nameBox.closeSimpleName(returnType)}\").let { lambda->\n            if(nullable) \"($lambda)?\" else lambda\n        }.noSpaces()\n\n    private val parametersNames :List<String>\n        get() =  parameters.mapIndexed { index, _ -> \"${Constants.Apis.FUNCTION_ARGUMENTS}$index\" }\n\n    val queriesCode: String\n        get() = parametersNames.joinToString(\", \")\n\n    val queriesRequestsCode: String\n        get() = parametersNames.joinToString(\",\") { Constants.Aggregate.makeResultsCode(it) }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/invoker/OriginalInvokable.kt",
    "content": "package com.rubik.apt.codebase.invoker\n\ninterface OriginalInvokable : Instanceable {\n    val invoker: InvokeOriginalCodeBase\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/invoker/TypeCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.invoker\n\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.rubik.annotations.route.RCallback\nimport com.rubik.annotations.route.RObject\nimport com.rubik.annotations.route.RValue\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.getRMirrorType\nimport com.rubik.apt.utility.isSupportMappingRMirror\nimport com.rubik.apt.utility.noSpaces\nimport com.rubik.apt.utility.toRMirrorName\nimport com.squareup.kotlinpoet.TypeName\n\nopen class TypeCodeBase(\n    val originalType: KbpType\n) : RToken {\n    companion object {\n        fun castToTypeCode(name: String, toType: String? = null): String =\n            \"$name.${Constants.Aggregate.CAST_TO_TYPE_OF_T_FUNCTION_NAME}${if (null != toType) \"<$toType>\" else \"\"}()\".noSpaces()\n    }\n\n    fun toContextTypeName(uri: String): TypeName = originalType.toRMirrorName(uri)\n\n    private val valueType = originalType.getRMirrorType(RValue::class.java)\n\n    private val objectType = originalType.getRMirrorType(RObject::class.java)\n\n    private val callbackType = originalType.getRMirrorType(RCallback::class.java)\n\n    val isRMirror\n        get() = null != valueType || null != objectType || null != callbackType\n\n    val nullable\n        get() = originalType.nullable\n\n    private fun toTypeOfTCode(\n        code: String,\n        nameBox: FileNameBox,\n        toOriginal: Boolean,\n        toTypeName: String? = null,\n        castIfNot: Boolean = false\n    ): String{\n        val startCode = if (originalType.nullable) \"$code?\" else code\n        return  when {\n            null != objectType && nameBox.useMapping(objectType, toOriginal) ->\n                \"$startCode.${Constants.Aggregate.MAP_TO_TYPE_FUNCTION_NAME}(${\n                    mappingName(toOriginal, objectType, nameBox)\n                })\".addComment(toOriginal, nameBox).noSpaces()\n            null != callbackType && nameBox.useMapping(callbackType, toOriginal) ->\n                \"$startCode.${Constants.Aggregate.MAP_TO_TYPE_FUNCTION_NAME}(${\n                    mappingName(toOriginal, callbackType, nameBox)\n                })\".addComment(toOriginal, nameBox).noSpaces()\n            null != valueType && nameBox.useMapping(valueType, toOriginal) && originalType.isSupportMappingRMirror() ->\n                \"$startCode.${Constants.Aggregate.MAP_TO_TYPE_FUNCTION_NAME}(${\n                    mappingName(toOriginal, valueType, nameBox)\n                })\".addComment(toOriginal, nameBox).noSpaces()\n            null != valueType ->\n                \"$startCode.${Constants.Aggregate.TO_TYPE_OF_T_FUNCTION_NAME}${\n                    if (null != toTypeName) \"<$toTypeName>\" else \"\"\n                }()\".addComment(toOriginal, nameBox).noSpaces()\n            castIfNot -> castToTypeCode(startCode, toTypeName).addComment(null, nameBox)\n            else -> code.addComment(null, nameBox)\n        }\n    }\n\n    private fun String.addComment(toOriginal: Boolean?, nameBox: FileNameBox) = this + when (toOriginal) {\n        true -> \" /* -> TO ORIGINAL TYPE :[${originalType.toTypeName()}] */ \"\n        false -> \" /* -> TO CONTEXT TYPE :[${originalType.toRMirrorName(nameBox.uri)}] */ \"\n        null-> \" /* -> NO NEED TO MAPPING :[${originalType.toTypeName()}] */ \"\n    }.noSpaces()\n\n    fun toOriginalCode(\n        code: String,\n        nameBox: FileNameBox,\n        toTypeName: String? = null,\n        castIfNot: Boolean = false\n    ): String = toTypeOfTCode(code, nameBox, true, toTypeName, castIfNot)\n\n    fun toContextCode(\n        code: String,\n        nameBox: FileNameBox,\n        toTypeName: String? = null,\n        castIfNot: Boolean = false\n    ): String = toTypeOfTCode(code, nameBox, false, toTypeName, castIfNot)\n\n    private fun mappingName(toOriginal: Boolean, rType: KbpType, nameBox: FileNameBox) =\n        Constants.Object.makeToTypeMappingFunctionName(nameBox.closeTypeName(rType, toOriginal), rType.nullable)\n\n    override fun toString(): String = originalType.toString()\n\n    override val tokenList\n        get() = TokenList(originalType, key = \"T\", warp = false)\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/objekt/ObjectCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.objekt\n\nimport com.blueprint.kotlin.lang.element.KbpRooterElement\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.blueprint.kotlin.lang.utility.toType\nimport com.rubik.apt.codebase.ClassMirrorable\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.TokenName\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.context.SectionCodeBase\n\n/**\n * The code structure of Router Object.\n *\n * @since 1.10\n */\nclass ObjectCodeBase(\n    override val qualifiedName: String,\n    override val simpleName: String,\n    override val originalType: KbpType\n) : ClassMirrorable, RToken {\n    companion object {\n        operator fun invoke(\n            classElement: KbpRooterElement\n        ): ObjectCodeBase? =\n            classElement.toType()?.let { type ->\n                ObjectCodeBase(\n                    classElement.qualifiedName,\n                    classElement.simpleNames,\n                    type\n                )\n            }\n    }\n\n    val constructors: MutableList<ApiCodeBase> = mutableListOf()\n\n    val apis: MutableMap<String, ApiCodeBase> = mutableMapOf() // key : versionPath\n\n    val sections = SectionCodeBase<ApiCodeBase>()\n\n    fun addConstructor(api: ApiCodeBase) {\n        constructors.add(api)\n    }\n\n    fun addApi(versionPath: String, api: ApiCodeBase) {\n        apis[versionPath] = api\n    }\n\n    fun composeSections() {\n        apis.forEach { (_, api) ->\n            sections.addItem(api, api.sections)\n        }\n    }\n\n    override val tokenList\n        get() = TokenList(\n            originalType,\n            constructors.map { api -> api.versionPath }.sortedBy { it }.map { path -> TokenName(path) },\n            apis.map { (_, api) -> api.versionPath }.sortedBy { it }.map { path -> TokenName(path) },\n            key = \"OBJ\",\n            warp = false\n        )\n\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/value/ValueCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.value\n\nimport com.blueprint.kotlin.lang.element.KbpAnnotationElement\nimport com.blueprint.kotlin.lang.element.KbpConstructorElement\nimport com.blueprint.kotlin.lang.element.KbpRooterElement\nimport com.blueprint.kotlin.lang.element.KbpVariableElement\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.blueprint.kotlin.lang.utility.findInterface\nimport com.blueprint.kotlin.lang.utility.toType\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.AnnotationCodeBase\nimport com.rubik.apt.codebase.ClassMirrorable\nimport com.rubik.apt.codebase.RToken\nimport com.rubik.apt.codebase.TokenList\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.asClassName\nimport org.jetbrains.annotations.NotNull\nimport org.jetbrains.annotations.Nullable\n\n/**\n * The code structure of Router Value.\n *\n * @since 1.1\n */\nclass ValueCodeBase(\n    override val qualifiedName: String,\n    override val simpleName: String,\n    override val originalType: KbpType,\n    val interfaces: List<ClassName>,\n    val annotations: List<AnnotationCodeBase>,\n    val fields: List<ValueFieldCodeBase>,\n    val createByConstructor: Boolean\n) : ClassMirrorable, RToken {\n    companion object {\n        operator fun invoke(\n            classElement: KbpRooterElement,\n            constructorElement: KbpConstructorElement? = null,\n            ignoreAnnotations: List<String>\n        ): ValueCodeBase? = classElement.toType()?.let { type ->\n            ValueCodeBase(\n                classElement.qualifiedName,\n                classElement.simpleNames,\n                type,\n                classElement.toInterfaceNames(),\n                classElement.annotations.toAnnotationCodeBase(),\n                constructorElement?.toFields(ignoreAnnotations) ?: classElement.toFields(ignoreAnnotations),\n                createByConstructor = null != constructorElement\n            )\n        }\n\n        private fun KbpConstructorElement.toFields(ignoreAnnotations: List<String>) = parameters.map { parameter ->\n            parameter.toValueFieldCodeBase(ignoreAnnotations)\n        }\n\n        private fun KbpRooterElement.toFields(ignoreAnnotations: List<String>) = properties.filter { (_, parameter) ->\n            parameter.type.name.toString() != Constants.Contexts.PARCELABLE_CREATOR_CLASS_NAME && parameter.type.name.toString() != qualifiedName + Constants.Contexts.COMPANION_CLASS_NAME\n        }.map { (_, parameter) ->\n            parameter.toValueFieldCodeBase(ignoreAnnotations)\n        }\n\n        private fun KbpVariableElement.toValueFieldCodeBase(ignoreAnnotations: List<String>) =\n            ValueFieldCodeBase(\n            name,\n            type,\n                createFiledAnnotationCodeBase(annotations, ignoreAnnotations),\n            defaultValueWithSuffix,\n            isConstant\n        )\n\n        private fun KbpRooterElement.toInterfaceNames(): List<ClassName> {\n            return mutableListOf<ClassName>().apply {\n                jmElement?.findInterface(\"android.os.Parcelable\")?.let { element ->\n                    add(element.asClassName())\n                }\n            }\n        }\n\n        private fun List<KbpAnnotationElement>.toAnnotationCodeBase(): List<AnnotationCodeBase> {\n            return filter { element ->\n                element.className == \"kotlinx.android.parcel.Parcelize\"\n            }.map { element ->\n                AnnotationCodeBase(\n                    element.className,\n                    element.members.toList().map { pair ->\n                        \"${pair.first} = ${pair.second}\"\n                    }\n                )\n            }\n        }\n\n        private fun createFiledAnnotationCodeBase(\n            elements: List<KbpAnnotationElement>,\n            ignoreAnnotations: List<String>\n        ): List<AnnotationCodeBase> {\n            return elements.filter { element ->\n                element.className != Nullable::class.qualifiedName.toString()\n                        && element.className != NotNull::class.qualifiedName.toString()\n                        && !ignoreAnnotations.contains(element.className)\n            }.map { element ->\n                AnnotationCodeBase(\n                    element.className,\n                    element.members.toList().map { pair ->\n                        \"${pair.first} = ${pair.second}\"\n                    }\n                )\n            }\n        }\n    }\n\n    override val tokenList\n        get() = TokenList(\n            originalType,\n            interfaces,\n            annotations,\n            fields,\n            key = \"VLE\",\n            warp = false\n        )\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/codebase/value/ValueFieldCodeBase.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.codebase.value\n\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.rubik.apt.codebase.AnnotationCodeBase\nimport com.rubik.apt.codebase.TokenList\nimport com.rubik.apt.codebase.invoker.TypeCodeBase\n\nclass ValueFieldCodeBase(\n    val name: String,\n    originalType: KbpType,\n    val annotations: List<AnnotationCodeBase>,\n    val defaultValueCode: String?,\n    val isConstant: Boolean\n) : TypeCodeBase(originalType) {\n    override val tokenList\n        get() = TokenList(\n            originalType,\n            annotations,\n            defaultValueCode,\n            isConstant,\n            key = \"FLD\",\n            warp = false\n        )\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/declare/LeastContext.kt",
    "content": "package com.rubik.apt.declare\n\nimport com.google.gson.Gson\nimport com.google.gson.annotations.SerializedName\nimport com.google.gson.reflect.TypeToken\n\nclass LeastContext(\n    @SerializedName(\"uri\")\n    val uri: String,\n    @SerializedName(\"name\")\n    val name: String,\n    @SerializedName(\"version\")\n    val version: String\n) {\n    companion object {\n        fun createByJson(json: String): LeastContext =\n            Gson().fromJson(json, object : TypeToken<LeastContext>() {}.type)\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/AggregateSourceFile.kt",
    "content": "package com.rubik.apt.files.source\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.files.source.aggregate.*\nimport com.rubik.apt.files.source.identity.addAggregateIdentity\nimport com.rubik.apt.namebox.closeInNameBox\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.rubik.apt.utility.process\nimport com.squareup.kotlinpoet.AnnotationSpec\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FileSpec\nimport com.squareup.kotlinpoet.TypeSpec\nimport java.io.File\n\nclass AggregateSourceFile(\n    private val directory: File,\n    private val methodSize: Int,\n    private val kDocUserAndTime: Boolean\n) {\n    fun generate(\n        uri: String,\n        context: ContextCodeBase\n    ) {\n        val className = context.aggregateName\n        FileSpec.builder(Constants.Aggregate.Declare.makeAggregatePackageName(uri), className).closeInNameBox(uri) { nameBox ->\n            nameBox.close(ClassName(Constants.Aggregate.PATH_PACKAGE_NAME, Constants.Aggregate.PATH_CLASS_NAME), asName = Constants.Aggregate.PATH_CLASS_NAME_AS)\n            nameBox.close(ClassName(Constants.Aggregate.ROUTE_PACKAGE_NAME, Constants.Aggregate.RESULT_CLASS_NAME), asName = Constants.Aggregate.RESULT_CLASS_NAME_AS)\n            nameBox.close(ClassName(Constants.Aggregate.LAUNCHER_PACKAGE_NAME, Constants.Aggregate.LAUNCHER_CLASS_NAME), asName = Constants.Aggregate.LAUNCHER_CLASS_NAME_AS)\n            nameBox.close(ClassName(Constants.Aggregate.ROUTE_PACKAGE_NAME, Constants.Aggregate.QUERIES_CLASS_NAME), asName = Constants.Aggregate.QUERIES_CLASS_NAME_AS)\n            nameBox.close(ClassName(Constants.Aggregate.ROUTE_PACKAGE_NAME, Constants.Aggregate.RESULTS_CLASS_NAME), asName = Constants.Aggregate.RESULTS_CLASS_NAME_AS)\n            nameBox.import(Constants.Aggregate.MAPPING_PACKAGE_NAME, Constants.Aggregate.CAST_TO_TYPE_OF_T_FUNCTION_NAME)\n            nameBox.import(Constants.Aggregate.MAPPING_PACKAGE_NAME, Constants.Aggregate.TO_TYPE_OF_T_FUNCTION_NAME)\n            nameBox.import(Constants.Aggregate.MAPPING_PACKAGE_NAME, Constants.Aggregate.MAP_TO_TYPE_FUNCTION_NAME)\n            nameBox.closeClassMirrorable(uri, context)\n            addType(\n                TypeSpec.classBuilder(className).addSuperinterface(\n                    ClassName.bestGuess(Constants.Aggregate.INTERFACE_NAME)\n                ).addSuperinterface(\n                    ClassName.bestGuess(\"${Constants.Contexts.Declare.makeContextPackageName(uri)}.${context.routeActionsName}\")\n                ).addFunction( // onEvent\n                    onEventFunction(context, nameBox)\n                ).addOnRouteFunction( // onRoute\n                    context, nameBox, methodSize\n                ).addRouteActionsImplFunctions( // RouteActionsImpl\n                    context.sections, nameBox\n                ).addMappings(\n                    context, nameBox\n                ).addAggregateFactory(\n                    uri, context, className\n                ).addRGeneratedAnnotation(\n                    \"aggregate\", context.version\n                ).addAnnotation(\n                    AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME))\n                        .build()\n                ).addKdoc(\n                    Constants.KDoc.aggregate(uri, context.version, kDocUserAndTime)\n                ).build()\n            ).addAggregateIdentity( // AggregateId\n                context.aggregateIdName,\n                uri,\n                context.version,\n                context.token,\n                kDocUserAndTime\n            ).process().build().writeTo(directory)\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/ContextSourceFiles.kt",
    "content": "package com.rubik.apt.files.source\n\nimport com.ktnail.x.uri.buildVersionUri\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.activity.ActivityCodeBase\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.context.SectionCodeBase\nimport com.rubik.apt.files.source.context.action.addApiRouteActionFunctions\nimport com.rubik.apt.files.source.context.action.inceface.generateRouteActionsFile\nimport com.rubik.apt.files.source.context.addTouchFunction\nimport com.rubik.apt.files.source.context.addToucherClass\nimport com.rubik.apt.files.source.context.dsl.addActivityRouterFunctions\nimport com.rubik.apt.files.source.context.dsl.generateContextRouteFile\nimport com.rubik.apt.files.source.identity.generateContextIdentityFile\nimport com.rubik.apt.files.source.mirror.callback.generateCallbackFiles\nimport com.rubik.apt.files.source.mirror.objekt.generateObjectFiles\nimport com.rubik.apt.files.source.mirror.value.generateValueFiles\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.namebox.closeInNameBox\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.rubik.apt.utility.addSectionTypes\nimport com.rubik.apt.utility.noSpaces\nimport com.rubik.apt.utility.process\nimport com.squareup.kotlinpoet.*\nimport java.io.File\n\nclass ContextSourceFiles(private val dictionary: File) {\n    fun generate(\n        uri: String,\n        context: ContextCodeBase,\n        routerContextEnable: Boolean\n    ) {\n        generateContextFile(\n            context.contextName,\n            uri,\n            context.sections,\n            context.version,\n            dictionary,\n            context.routeActionsName\n        )\n        generateValueFiles(\n            uri,\n            context.values,\n            context.version,\n            dictionary\n        )\n        generateRouteActionsFile(\n            context.routeActionsName,\n            uri,\n            context.sections,\n            context.version,\n            dictionary\n        )\n        generateContextIdentityFile(\n            context.contextIdName,\n            uri,\n            context.version,\n            context.token,\n            dictionary\n        )\n        if (routerContextEnable) {\n            generateContextRouteFile(\n                context.routeContextName,\n                uri,\n                context.sections,\n                context.version,\n                dictionary\n            )\n        }\n        generateObjectFiles(\n            uri,\n            context.objects,\n            context.version,\n            context.routeActionsName,\n            dictionary\n        )\n        generateCallbackFiles(\n            uri,\n            context.callbacks,\n            context.version,\n            dictionary\n        )\n    }\n\n    private fun generateContextFile(\n        className: String,\n        uri: String,\n        routers: SectionCodeBase<RouteCodeBase>,\n        version: String,\n        dictionary: File,\n        routeActionsName: String\n    ) {\n        FileSpec.builder(Constants.Contexts.Declare.makeContextPackageName(uri), className).closeInNameBox(uri) { nameBox ->\n            addAliasedImport(ClassName(Constants.Aggregate.PATH_PACKAGE_NAME, Constants.Aggregate.PATH_CLASS_NAME), Constants.Aggregate.PATH_CLASS_NAME_AS)\n            addImport(Constants.Apis.NAVIGATE_FUNCTION_PACKAGE_NAME, Constants.Apis.TOUCH_FUNCTION_NAME)\n            addImport(Constants.Apis.NAVIGATE_FUNCTION_PACKAGE_NAME, Constants.Apis.NAVIGATE_FUNCTION_NAME)\n            addImport(Constants.Router.PACKAGE_NAME, Constants.ContextRouters.RUBIK_CLASS_NAME)\n            addImport(Constants.Apis.NAVIGATE_FUNCTION_PACKAGE_NAME, Constants.ContextRouters.ROUTE_FUNCTION_NAME)\n            addType(\n                TypeSpec.classBuilder(className).addType(\n                    TypeSpec.objectBuilder(\n                        Constants.Contexts.OBJECT_URIS_NAME\n                    ).addSectionTypes(routers) { builder, route ->\n                        builder.addPathProperties(uri, route)\n                    }.addRGeneratedAnnotation(\n                        \"context_uris\", version\n                    ).addAnnotation(\n                        AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n                    ).build()\n                ).also { rootType ->\n                    rootType.addType(\n                        TypeSpec.companionObjectBuilder().addProperty(\n                            PropertySpec.builder(\n                                Constants.Contexts.CONSTANTS_URI_NAME, String::class\n                            ).addModifiers(\n                                KModifier.CONST\n                            ).initializer(\n                                \"%S\", uri\n                            ).build()\n                        ).addTouchFunction(\n                        ).addSectionTypes(routers, true, rootType) { builder, route ->\n                            builder.addRouteActionFunctions(uri, route, nameBox)\n                        }.addRouteActionProperty(\n                            uri, routeActionsName\n                        ).addRGeneratedAnnotation(\n                            \"context_companion\", version\n                        ).addAnnotation(\n                            AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n                        ).build()\n                    )\n                }.addToucherClass(\n                    version\n                ).addRGeneratedAnnotation(\n                    \"context\",version\n                ).addAnnotation(\n                    AnnotationSpec.builder(RContextLib::class.java).addMember(\"uri = %S\", uri).build()\n                ).addAnnotation(\n                    AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n                ).addKdoc(\n                    Constants.KDoc.context(uri, version)\n                ).build()\n            ).process().build().writeTo(dictionary)\n        }\n    }\n}\n\ninternal fun TypeSpec.Builder.addRouteActionFunctions(\n    uri: String,\n    route: RouteCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    when(route){\n        is ApiCodeBase -> addApiRouteActionFunctions(uri, route, nameBox)\n        is ActivityCodeBase -> addActivityRouterFunctions(uri, route, nameBox)\n    }\n}\n\nfun TypeSpec.Builder.addPathProperties(\n    uri: String,\n    route: RouteCodeBase\n) = apply {\n    val name = route.contextPropertyName\n    val versionUri = buildVersionUri(uri, route.path, route.version)\n    if (Constants.Aggregate.isParameterPath(route.path)) {\n        addFunction(\n            FunSpec.builder(\n                name\n            ).addParameter(\n                Constants.Aggregate.PARAMETER_VALUES_NAME, String::class, KModifier.VARARG\n            ).returns(\n                String::class\n            ).addStatement(\n                \"return ${Constants.Aggregate.PATH_CLASS_NAME_AS}(\\\"$versionUri\\\").${Constants.Aggregate.METHOD_SET_PARAMETERS_NAME}(${Constants.Aggregate.PARAMETER_VALUES_NAME})\"\n            ).build()\n        )\n    } else {\n        addProperty(\n            PropertySpec.builder(\n                name, String::class\n            ).addModifiers(\n                KModifier.CONST\n            ).initializer(\n                \"%S\", versionUri\n            ).build()\n        )\n    }\n}\n\ninternal fun TypeSpec.Builder.addRouteActionProperty(\n    uri: String,\n    routeActionsName: String\n) = apply {\n    addProperty(\n        PropertySpec.builder(\n            Constants.RouteActions.PROPERTY_ROUTE_ACTION,\n            ClassName(Constants.Contexts.Declare.makeContextPackageName(uri), routeActionsName).copy(nullable = true)\n        ).addModifiers(\n            KModifier.PRIVATE\n        ).getter(\n            FunSpec.getterBuilder().addStatement(\n                \"return \" + \"${Constants.ContextRouters.RUBIK_CLASS_NAME}.${Constants.ContextRouters.FIND_ACTIONS_FUNCTION_NAME}<${routeActionsName}>(${Constants.Contexts.CONSTANTS_URI_NAME})\".noSpaces()\n            ).build()\n        ).build()\n    )\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/aggregate/CallbackTransformCode.kt",
    "content": "package com.rubik.apt.files.source.aggregate\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.api.QueryCodeBase\nimport com.rubik.apt.codebase.callback.FunctionCallbackCodeBase\nimport com.rubik.apt.codebase.callback.ObjectCallbackCodeBase\nimport com.rubik.apt.codebase.contextClassName\nimport com.rubik.apt.codebase.invoker.Callbackable\nimport com.rubik.apt.codebase.invoker.InvokeFunctionCodeBase\nimport com.rubik.apt.codebase.originalClassName\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.noSpaces\nimport com.rubik.apt.utility.toParametersCode\nimport com.squareup.kotlinpoet.FunSpec\nimport com.squareup.kotlinpoet.asClassName\n\ninternal fun FunSpec.Builder.addCallbackTransformCode(\n    query: QueryCodeBase,\n    callback: Callbackable,\n    nameBox: FileNameBox\n) {\n    if (callback is FunctionCallbackCodeBase) {\n        callback.function.let { function ->\n            val lambdaTypeCode  = \"(${function.queries.joinToString(\", \") {\n                nameBox.closeSimpleName(\"${Any::class.qualifiedName}\") + \"?\" \n            }}) -> ${\n                if (callback.transformRMirrorResult && null != function.result) \n                        nameBox.closeSimpleName(function.result.originalType.name) + if (function.result.nullable) \"?\" else \"\"\n                else nameBox.closeSimpleName(Unit::class.java.asClassName())\n            }\"\n            beginControlFlow(\n                \"val ${Constants.Apis.toCallbackTransformerName(query.legalName)}: $lambdaTypeCode = { ${function.queries.joinToString(\", \") { it.originalName }} -> \".noSpaces()\n            )\n            addCallbackTransformActionCode(null, callback, function, true, query.nullable, nameBox)\n            endControlFlow()\n        }\n    } else if (callback is ObjectCallbackCodeBase) {\n        addObjectCallbackTransformCode(\n            \"val ${Constants.Apis.toCallbackTransformerName(query.legalName)} =\",\n            null,\n            callback,\n            true,\n            query.nullable,\n            nameBox\n        )\n    }\n}\n\nfun FunSpec.Builder.addObjectCallbackTransformCode(\n    receiveCode: String?,\n    handleCode: String?,\n    callback: ObjectCallbackCodeBase,\n    toOriginal: Boolean,\n    variableNullable: Boolean,\n    nameBox: FileNameBox\n) = apply {\n    val className = if (toOriginal) callback.originalClassName else callback.contextClassName(nameBox.uri)\n    beginControlFlow(\n        \"${if (receiveCode.isNullOrBlank()) \"\" else \"$receiveCode \"}object : ${\n            nameBox.closeSimpleName(className).let { if (callback.isInterface ) it else \"$it()\" }\n        }\".noSpaces()\n    )\n    callback.functions.forEach { function ->\n        val parameters =  if(toOriginal) function.originalParameters else function.contextParameters(nameBox.uri)\n        beginControlFlow(\n            \"override fun ${function.name}(${\n                parameters.joinToString(\", \") { (name, type) ->\n                    \"${name}: ${nameBox.closeSimpleName(type)}\" }.noSpaces()\n            })\".noSpaces()\n        )\n        addCallbackTransformActionCode(\n            handleCode,\n            callback,\n            function,\n            toOriginal,\n            variableNullable,\n            nameBox\n        )\n        endControlFlow()\n    }\n    endControlFlow()\n}\n\nprivate fun FunSpec.Builder.addCallbackTransformActionCode(\n    handleCode: String?,\n    callback: Callbackable,\n    function: InvokeFunctionCodeBase,\n    toOriginal: Boolean,\n    variableNullable: Boolean,\n    nameBox: FileNameBox\n) = apply {\n    val invokeCode =\n        \"${if (handleCode.isNullOrBlank()) \"\" else \"$handleCode.\"}${function.legalName}${if (variableNullable) \"?.invoke\" else \"\"}(${\n        function.queries.toParametersCode { type ->\n            if(toOriginal)\n                type.toContextCode(type.legalName, nameBox, castIfNot = callback is FunctionCallbackCodeBase)\n            else\n                type.toOriginalCode(type.legalName, nameBox, castIfNot = callback is FunctionCallbackCodeBase)\n        }\n    })\".noSpaces()\n    addCode(\n        if (callback.transformRMirrorResult && null != function.result){\n            if (toOriginal)\n                function.result.toOriginalCode(invokeCode, nameBox)\n            else\n                function.result.toContextCode(invokeCode, nameBox)\n        } else invokeCode\n    )\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/aggregate/FactoryCode.kt",
    "content": "package com.rubik.apt.files.source.aggregate\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.squareup.kotlinpoet.*\nimport com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy\n\nfun TypeSpec.Builder.addAggregateFactory(uri: String, context: ContextCodeBase, className: String) = apply {\n    addType(\n        TypeSpec.companionObjectBuilder()\n            .superclass(\n                ClassName.bestGuess(Constants.Aggregate.COMPANION_SUPER_NAME)  //  AggregateFactory\n            ).addProperty( // URI\n                PropertySpec.builder(\n                    Constants.Aggregate.PROPERTY_URI_NAME, String::class\n                ).addModifiers(\n                    KModifier.OVERRIDE\n                ).initializer(\n                    \"%S\", uri\n                ).build()\n            ).addProperty( // EVENT_MSGS\n                PropertySpec.builder(\n                    Constants.Aggregate.PROPERTY_EVENT_MSGS_NAME,\n                    List::class.parameterizedBy(String::class)\n                ).addModifiers(\n                    KModifier.OVERRIDE\n                ).initializer(\n                    \"listOf(${context.eventsArray})\"\n                ).build()\n            ).addProperty( // CREATOR\n                PropertySpec.builder(\n                    Constants.Aggregate.PROPERTY_CREATOR_NAME,\n                    Function0::class.asTypeName()\n                        .parameterizedBy(ClassName.bestGuess(Constants.Aggregate.INTERFACE_NAME))\n                ).addModifiers(\n                    KModifier.OVERRIDE\n                ).initializer(\n                    \"{${className}()}\"\n                ).build()\n            ).addRGeneratedAnnotation(\n                \"aggregate_companion\", context.version\n            ).addAnnotation(\n                AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n            ).build()\n    )\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/aggregate/InvokeOriginalCode.kt",
    "content": "package com.rubik.apt.files.source.aggregate\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.InvokeElementType\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\nimport com.rubik.apt.codebase.invoker.TypeCodeBase\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.noSpaces\nimport com.rubik.apt.utility.toParametersCode\n\nfun invokeOriginalCode(\n    invoker: InvokeOriginalCodeBase,\n    nameBox: FileNameBox,\n    castAllQuery: Boolean,\n    processExt: Boolean\n): String = invoker.invokeCode(\n    nameBox,\n    invoker.instanceInvoker?.let { instanceInvoker ->\n        invokeOriginalCode(instanceInvoker, nameBox, castAllQuery, processExt)\n    }?:invoker.objectParameter?.let { query->\n        query.toOriginalCode(Constants.Object.OBJECT_INSTANCE_PARAMETER_NAME, nameBox)\n    },\n    parametersCode(invoker, nameBox, castAllQuery, processExt)\n).let { code ->\n    \"\"\"\n        |${\n        if (null != invoker.result) {\n            invoker.result.toContextCode(code, nameBox)\n        } else {\n            code\n        }\n    }\n    \"\"\".trimMargin().noSpaces()\n}\n\nprivate fun InvokeOriginalCodeBase.invokeCode(\n    nameBox: FileNameBox,\n    instanceCode: String?,\n    parametersCode: String?\n): String {\n    val instance = when {\n        null != instanceCode -> instanceCode\n        clazz.static -> nameBox.closeSimpleName(clazz.name)\n        static -> \"\"\n        else -> \"${nameBox.closeSimpleName(clazz.name)}()\"\n    }\n    val method = when {\n        static -> \"${if (clazz.name.endsWith(\"Kt\")) clazz.name.substringBeforeLast(\".\") else clazz.name}.$name\"\n        type == InvokeElementType.CONSTRUCTOR -> nameBox.closeSimpleName(clazz.name)\n        else -> \".$name\"\n    }\n    val parameters = if (parametersCode.isNullOrBlank()) \"\" else \"$parametersCode\"\n    return when (type) {\n        InvokeElementType.CONSTRUCTOR -> {\n            \"$method(${parameters})\"\n        }\n        InvokeElementType.METHOD, InvokeElementType.HIGHER_ORDER_FUNC -> {\n            \"$instance$method(${parameters})\"\n        }\n        InvokeElementType.PROPERTY -> {\n            \"$instance$method\"\n        }\n    }\n}\n\nprivate fun parametersCode(\n    invoker: InvokeOriginalCodeBase,\n    nameBox: FileNameBox,\n    castAllQuery: Boolean,\n    processExt: Boolean\n) = invoker.queries.toParametersCode { query ->\n        val needTransform = null != query.callback && query.callback.transformRMirror\n        var code = when {\n            query.isExtendThis && processExt -> \"this\"\n            needTransform -> Constants.Apis.toCallbackTransformerName(query.legalName)\n            else -> query.callName\n        }\n        if (!needTransform) {\n            code = query.toOriginalCode(code, nameBox, castIfNot = castAllQuery)\n        } else {\n            if (castAllQuery) code = TypeCodeBase.castToTypeCode(code)\n        }\n        code\n    }"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/aggregate/MappingType.kt",
    "content": "package com.rubik.apt.files.source.aggregate\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.ClassMirrorable\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.contextClassName\nimport com.rubik.apt.codebase.invoker.TypeCodeBase\nimport com.rubik.apt.codebase.originalClassName\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.rubik.apt.utility.noSpaces\nimport com.rubik.apt.utility.toParametersCode\nimport com.squareup.kotlinpoet.*\n\nfun TypeSpec.Builder.addMappings(\n    context: ContextCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    if (context.objects.isNotEmpty() || context.valuesCreateByConstructor.isNotEmpty())\n        addType(\n            TypeSpec.objectBuilder(\n                Constants.Object.OBJECT_MAPPINGS_NAME\n            ).addObjectMappings(\n                context, nameBox\n            ).addCallbackMappings(\n                context, nameBox\n            ).addValueMapping(\n                context, nameBox\n            ).addRGeneratedAnnotation(\n                \"aggregate_mappings\", context.version\n            ).addAnnotation(\n                AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n            ).build()\n        )\n}\n\nprivate fun TypeSpec.Builder.addObjectMappings(\n    context: ContextCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    context.objects.forEach {(_, objekt) ->\n        addMappings(\n            context.aggregateName,\n            objekt,\n            nameBox,\n            addToContextBody = { context, _ ->\n                returnMappingBodyCodeOneLine(\"${nameBox.closeSimpleName(context)}.create(this)\")\n            }, addToOriginalBody = { _, _ ->\n                returnMappingBodyCodeOneLine(\"this.${TypeCodeBase.castToTypeCode(Constants.Object.SUB_OBJECT_ORIGINAL_FILED_NAME)}\".noSpaces())\n            })\n    }\n}\n\nprivate fun TypeSpec.Builder.addCallbackMappings(\n    context: ContextCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    context.callbacks.forEach { callback ->\n        addMappings(\n            context.aggregateName,\n            callback,\n            nameBox,\n            addToContextBody = { _, _ ->\n                this.returnMappingBody {\n                    addStatement(\"val mappingTarget = this\".noSpaces())\n                    addObjectCallbackTransformCode(\n                        null,\n                        \"mappingTarget\",\n                        callback,\n                        toOriginal = false,\n                        variableNullable = false,\n                        nameBox = nameBox\n                    )\n                }\n            }, addToOriginalBody = { _, _ ->\n                this.returnMappingBody {\n                    addStatement(\"val mappingTarget = this\".noSpaces())\n                    addObjectCallbackTransformCode(\n                        null,\n                        \"mappingTarget\",\n                        callback,\n                        toOriginal = true,\n                        variableNullable = false,\n                        nameBox = nameBox\n                    )\n                }\n            })\n    }\n}\n\nprivate fun TypeSpec.Builder.addValueMapping(\n    context: ContextCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    context.valuesCreateByConstructor.forEach { value ->\n        val toContextParameterCode =  value.fields.toParametersCode { filed -> filed.toContextCode(filed.name, nameBox) }\n        val toOriginalParameterCode =   value.fields.toParametersCode { filed -> filed.toOriginalCode(filed.name, nameBox) }\n        addMappings(\n            context.aggregateName,\n            value,\n            nameBox,\n            addToContextBody = { context, _ ->\n                returnMappingBodyCodeOneLine(\"${nameBox.closeSimpleName(context)}(${toContextParameterCode})\")\n            }, addToOriginalBody = { _, original ->\n                returnMappingBodyCodeOneLine(\"${nameBox.closeSimpleName(original)}(${toOriginalParameterCode})\")\n            })\n    }\n}\n\nprivate fun TypeSpec.Builder.addMappings(\n    aggregateName: String,\n    mirror: ClassMirrorable,\n    nameBox: FileNameBox,\n    addToContextBody: FunSpec.Builder.(TypeName, TypeName) -> FunSpec.Builder,\n    addToOriginalBody: FunSpec.Builder.(TypeName, TypeName) -> FunSpec.Builder\n) {\n    val contextClassName = mirror.contextClassName(nameBox.uri)\n    val originalClassName = mirror.originalClassName\n\n    val contextMappingName = Constants.Object.makeToTypeMappingFunctionName(nameBox.closeSimpleName(contextClassName))\n    val originalMappingName = Constants.Object.makeToTypeMappingFunctionName(nameBox.closeSimpleName(originalClassName))\n\n    val nullableContextMappingName = Constants.Object.makeToTypeMappingFunctionName(nameBox.closeSimpleName(contextClassName), true)\n    val nullableOriginalMappingName = Constants.Object.makeToTypeMappingFunctionName(nameBox.closeSimpleName(originalClassName), true)\n\n    val kDoc =  \"\"\" \n                | Mapping between :\n                | ${originalClassName.canonicalName} < --- > $contextClassName \n            \"\"\".trimMargin().noSpaces()\n\n    var kDocAdded = false\n\n    nameBox.needAddMapping(mirror.originalType, toContext = {\n        addProperty(\n            PropertySpec.builder(\n                contextMappingName,\n                LambdaTypeName.get(\n                    receiver = originalClassName,\n                    returnType = contextClassName\n                )\n            ).mutable(false).getter(\n                FunSpec.getterBuilder().addToContextBody(contextClassName, originalClassName).build()\n            ).apply {\n                if (!kDocAdded) addKdoc(kDoc)\n                kDocAdded = true\n            }.build()\n        )\n\n        nameBox.import(\n            Constants.Aggregate.Declare.makeAggregatePackageName(nameBox.uri),\n            listOf( aggregateName,Constants.Object.OBJECT_MAPPINGS_NAME, contextMappingName).joinToString(\".\")\n        )\n    }, toOriginal = {\n        addProperty(\n            PropertySpec.builder(\n                originalMappingName,\n                LambdaTypeName.get(\n                    receiver = contextClassName,\n                    returnType = originalClassName\n                )\n            ).mutable(false).getter(\n                FunSpec.getterBuilder().addToOriginalBody(contextClassName, originalClassName).build()\n            ).apply {\n                if (!kDocAdded) addKdoc(kDoc)\n                kDocAdded = true\n            }.build()\n        )\n\n        nameBox.import(\n            Constants.Aggregate.Declare.makeAggregatePackageName(nameBox.uri),\n            listOf( aggregateName,Constants.Object.OBJECT_MAPPINGS_NAME, originalMappingName).joinToString(\".\")\n        )\n    }, toContextNullable = {\n        addProperty(\n            PropertySpec.builder(\n                nullableContextMappingName,\n                LambdaTypeName.get(\n                    receiver = originalClassName.copy(nullable = true),\n                    returnType = contextClassName.copy(nullable = true)\n                )\n            ).mutable(false).getter(\n                FunSpec.getterBuilder().returnMappingBodyCodeOneLine(\"this?.$contextMappingName()\").build()\n            ).build()\n        )\n\n        nameBox.import(\n            Constants.Aggregate.Declare.makeAggregatePackageName(nameBox.uri),\n            listOf( aggregateName,Constants.Object.OBJECT_MAPPINGS_NAME, nullableContextMappingName).joinToString(\".\")\n        )\n    }, toOriginalNullable = {\n        addProperty(\n            PropertySpec.builder(\n                nullableOriginalMappingName,\n                LambdaTypeName.get(\n                    receiver = contextClassName.copy(nullable = true),\n                    returnType = originalClassName.copy(nullable = true)\n                )\n            ).mutable(false).getter(\n                FunSpec.getterBuilder().returnMappingBodyCodeOneLine(\"this?.$originalMappingName()\")\n                    .build()\n            ).build()\n        )\n\n        nameBox.import(\n            Constants.Aggregate.Declare.makeAggregatePackageName(nameBox.uri),\n            listOf(aggregateName, Constants.Object.OBJECT_MAPPINGS_NAME, nullableOriginalMappingName).joinToString(\".\")\n        )\n    })\n}\n\nprivate fun FunSpec.Builder.returnMappingBodyCodeOneLine(mappingCode: String) =apply {\n    addStatement(\"return ${\"{ $mappingCode }\".noSpaces()}\")\n}\n\nprivate fun FunSpec.Builder.returnMappingBody(mappingCode: FunSpec.Builder.() -> FunSpec.Builder) =\n    apply {\n        beginControlFlow(\"return \")\n        mappingCode()\n        endControlFlow()\n    }\n\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/aggregate/OnEventCode.kt",
    "content": "package com.rubik.apt.files.source.aggregate\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.event.EventCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.addWhenBlockStatements\nimport com.rubik.apt.utility.noSpaces\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FunSpec\nimport com.squareup.kotlinpoet.KModifier\n\nfun onEventFunction(\n    context: ContextCodeBase,\n    nameBox: FileNameBox\n) = FunSpec.builder(\n    Constants.Aggregate.METHOD_ON_EVENT_NAME\n).addModifiers(\n    KModifier.OVERRIDE\n).addParameter(\n    Constants.Aggregate.EVENT_PARAMETER_MSG_NAME, String::class\n).addParameter(\n    Constants.Aggregate.ROUTE_PARAMETER_QUERIES_NAME,\n    ClassName.bestGuess(\"${Constants.Aggregate.ROUTE_PACKAGE_NAME}.${Constants.Aggregate.QUERIES_CLASS_NAME}\")\n).addWhenBlockStatements(Constants.Aggregate.EVENT_PARAMETER_MSG_NAME, null) {\n    addEventStatements(context.events, nameBox)\n}.build()\n\nprivate fun FunSpec.Builder.addEventStatements(\n    events: Map<String, List<EventCodeBase>>,\n    nameBox: FileNameBox\n) = apply {\n    events.forEach { (msg, msgEvents) ->\n        beginControlFlow(\"\\\"$msg\\\" -> \".noSpaces())\n        msgEvents.forEach {event->\n            Constants.KDoc.function(\n                event.invoker.location,\n                event.invoker.queriesKDoc,\n                event.invoker.resultKDoc\n            ).forEach { doc ->\n                addComment(doc)\n            }\n            addInvokeParametersCode(event.invoker, nameBox)\n            addCode(invokeOriginalCode(event.invoker,nameBox, castAllQuery = true, processExt = false))\n        }\n        endControlFlow()\n    }\n}\n\nprivate fun FunSpec.Builder.addInvokeParametersCode(\n    invoker: InvokeOriginalCodeBase,\n    nameBox: FileNameBox\n){\n\n    var queryCount = 0\n    val queryIndex = { queryCount++ }\n\n    invoker.parameters.forEach { parameter ->\n        if (null != parameter.callback && parameter.callback.transformRMirror) {\n            addQueryVariableCaseToContextType(invoker, parameter, queryIndex(), nameBox)\n            addCallbackTransformCode(parameter, parameter.callback, nameBox)\n        } else {\n            addQueryVariable(invoker, parameter, queryIndex())\n        }\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/aggregate/OnRouteCode.kt",
    "content": "package com.rubik.apt.files.source.aggregate\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.activity.ActivityCodeBase\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.invoker.TypeCodeBase\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.addWhenBlockStatements\nimport com.rubik.apt.utility.noSpaces\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FunSpec\nimport com.squareup.kotlinpoet.KModifier\nimport com.squareup.kotlinpoet.TypeSpec\n\ninternal fun TypeSpec.Builder.addOnRouteFunction(\n    context: ContextCodeBase,\n    nameBox: FileNameBox,\n    maxPageSize: Int\n) = apply {\n    val routes :List<RouteCodeBase> = context.apis.map { (_, value) -> value } + context.activities.map { (_, value) -> value }\n    var page = 0\n    var start = 0\n    do {\n        val end = (start + maxPageSize).let { e -> if (e > routes.size) routes.size else e }\n        addFunction(\n            onRouteFunction(routes.subList(start, end), page, end >= routes.size, nameBox)\n        )\n        page++\n        start = end\n    } while (start < routes.size)\n}\n\nprivate fun onRouteFunction(\n    routes: List<RouteCodeBase>,\n    index: Int,\n    end: Boolean,\n    nameBox: FileNameBox\n) = FunSpec.builder(\n   index.indexToFunctionName()\n).apply {\n    if (index == 0) addModifiers(KModifier.OVERRIDE)\n    else addModifiers(KModifier.PRIVATE)\n}.addParameter(\n    Constants.Aggregate.ROUTE_PARAMETER_PATH_NAME, String::class\n).addParameter(\n    Constants.Aggregate.ROUTE_PARAMETER_QUERIES_NAME,\n    ClassName.bestGuess(\"${Constants.Aggregate.ROUTE_PACKAGE_NAME}.${Constants.Aggregate.QUERIES_CLASS_NAME}\")\n).addParameter(\n    Constants.Aggregate.ROUTE_PARAMETER_RESULTS_NAME,\n    ClassName.bestGuess(\"${Constants.Aggregate.ROUTE_PACKAGE_NAME}.${Constants.Aggregate.RESULTS_CLASS_NAME}\")\n).addWhenBlockStatements(\n    null,\n    if (end) \"throw ${Constants.Aggregate.makeRouteExceptionCode()}\"\n    else \"${(index + 1).indexToFunctionName()}(${Constants.Aggregate.ROUTE_PARAMETER_PATH_NAME}, ${Constants.Aggregate.ROUTE_PARAMETER_QUERIES_NAME}, ${Constants.Aggregate.ROUTE_PARAMETER_RESULTS_NAME})\"\n) {\n    routes.forEach { route ->\n        if (route is ApiCodeBase)\n            addApiOnRouteStatements(route, nameBox)\n        else if (route is ActivityCodeBase)\n            addActivityOnRouteStatements(route, nameBox)\n    }\n}.build()\n\nprivate fun Int.indexToFunctionName() =\n    if (this == 0) Constants.Aggregate.METHOD_ON_ROUTE_NAME\n    else \"${Constants.Aggregate.METHOD_ON_ROUTE_NAME}Ext${this}\"\n\nprivate fun FunSpec.Builder.addApiOnRouteStatements(\n    api: ApiCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    val contextInvoker = api.contextInvoker(nameBox.uri)\n    val versionPath = api.versionPath\n    if (Constants.Aggregate.isParameterPath(versionPath)) {\n        beginControlFlow(\"${Constants.Aggregate.PATH_CLASS_NAME_AS}(\\\"$versionPath\\\").${Constants.Aggregate.METHOD_MATCHING_NAME}(${Constants.Aggregate.ROUTE_PARAMETER_PATH_NAME}) -> \".noSpaces())\n        addStatement(Constants.Aggregate.makeAddPathQueriesCode(versionPath))\n    } else\n        beginControlFlow(\"\\\"$versionPath\\\" == ${Constants.Aggregate.ROUTE_PARAMETER_PATH_NAME} -> \".noSpaces())\n\n    val parameterNames = mutableListOf<String>()\n\n    var queryCount = 0\n    val queryIndex = { queryCount++ }\n\n    contextInvoker.receiver?.let { query ->\n        addQueryVariable(api.invoker, query, queryIndex())\n        parameterNames.add(TypeCodeBase.castToTypeCode(query.callName))\n    }\n\n    contextInvoker.parameters.forEach { query ->\n        addQueryVariable(api.invoker, query, queryIndex())\n        parameterNames.add(TypeCodeBase.castToTypeCode(query.callName))\n    }\n\n    var resultCount = 0\n    val resultIndex = { resultCount++ }\n\n    contextInvoker.resultParameters.forEach { result ->\n        addStatement(\"val ${result.name}: ${result.toTypeCode(nameBox)} = { ${result.queriesCode} ->\".noSpaces())\n        addStatement(\n            \"  ${\n                Constants.Aggregate.makeSetResultsCode(\n                    result.queriesRequestsCode,\n                    resultIndex()\n                )\n            }\".noSpaces()\n        )\n        addStatement(\"}\".noSpaces())\n        parameterNames.add(result.name)\n    }\n\n    val stringParameterCode = parameterNames.joinToString(\", \")\n\n    val invokeCode = \"${api.actionFunctionName}(${stringParameterCode})\"\n\n    if (contextInvoker.hasSyncReturn) {\n        beginControlFlow(\"${invokeCode}.apply\".noSpaces())\n        addStatement(\n            Constants.Aggregate.makeSetResultsCode(\n                Constants.Aggregate.makeResultsCode(\"this\"),\n                resultIndex()\n            )\n        )\n        endControlFlow()\n    } else {\n        addStatement(invokeCode.noSpaces())\n    }\n    endControlFlow()\n}\n\nprivate fun FunSpec.Builder.addActivityOnRouteStatements(\n    activity: ActivityCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    val versionPath = activity.versionPath\n    if (Constants.Aggregate.isParameterPath(versionPath))\n        beginControlFlow(\"${Constants.Aggregate.PATH_CLASS_NAME_AS}(\\\"$versionPath\\\").${Constants.Aggregate.METHOD_MATCHING_NAME}(${Constants.Aggregate.ROUTE_PARAMETER_PATH_NAME}) -> \")\n    else\n        beginControlFlow(\"\\\"$versionPath\\\" == ${Constants.Aggregate.ROUTE_PARAMETER_PATH_NAME} -> \")\n    Constants.KDoc.function(\n        activity.className,\n        activity.propertiesKDoc\n    ).forEach { doc ->\n        addComment(doc)\n    }\n    addStatement(activity.startCode(versionPath, nameBox))\n    endControlFlow()\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/aggregate/QueryCode.kt",
    "content": "package com.rubik.apt.files.source.aggregate\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.InvokeElementType\nimport com.rubik.apt.codebase.api.QueryCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\nimport com.rubik.apt.codebase.invoker.TypeCodeBase\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.noSpaces\nimport com.squareup.kotlinpoet.FunSpec\n\nprivate fun queryVariableCode(\n    originalInvoker: InvokeOriginalCodeBase,\n    variableName:String,\n    originalName: String,\n    index: Int\n) = \"val $variableName = ${\n    Constants.Aggregate.makeGetQueryCode(\n        if (originalInvoker.type == InvokeElementType.HIGHER_ORDER_FUNC) \"\\\"${originalName}\\\"\" else \"null\",\n        index\n    )\n}\".noSpaces()\n\ninternal fun FunSpec.Builder.addQueryVariable(\n    originalInvoker: InvokeOriginalCodeBase,\n    query: QueryCodeBase,\n    index: Int\n) {\n    addStatement(queryVariableCode(originalInvoker, query.legalName, query.originalName, index))\n}\n\ninternal fun FunSpec.Builder.addQueryVariableCaseToContextType(\n    originalInvoker: InvokeOriginalCodeBase,\n    query: QueryCodeBase,\n    index: Int,\n    nameBox: FileNameBox\n) {\n    addStatement(\n        queryVariableCode(originalInvoker, query.legalName, query.originalName, index) +\n                TypeCodeBase.castToTypeCode(\"\" , toType = nameBox.closeSimpleName(query.toContextTypeName(nameBox.uri))\n    ))\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/aggregate/RouteActionsImplCode.kt",
    "content": "package com.rubik.apt.files.source.aggregate\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.context.SectionCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeContextCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeOriginalCodeBase\nimport com.rubik.apt.files.source.context.action.inceface.addApiRouteActionParametersAndResult\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.inControlFlowStatementIf\nimport com.rubik.apt.utility.noSpaces\nimport com.squareup.kotlinpoet.FunSpec\nimport com.squareup.kotlinpoet.KModifier\nimport com.squareup.kotlinpoet.TypeSpec\n\n\ninternal fun TypeSpec.Builder.addRouteActionsImplFunctions(\n    routers: SectionCodeBase<RouteCodeBase>,\n    nameBox: FileNameBox\n) =\n    apply {\n        routers.forEachRoute { route ->\n            if (route is ApiCodeBase) {\n                addApiRouteActionsImplFunctions(route, nameBox)\n            }\n        }\n    }\n\nprivate fun TypeSpec.Builder.addApiRouteActionsImplFunctions(\n    api: ApiCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    val functionName = api.actionFunctionName\n    val contextInvoker = api.contextInvoker(nameBox.uri)\n    addFunction(\n        FunSpec.builder(\n            functionName\n        ).addModifiers(\n            KModifier.OVERRIDE\n        ).addApiRouteActionParametersAndResult(\n            contextInvoker,\n            nameBox,\n            false\n        ).addApiRouteActionImplBody(\n            api.invoker,\n            contextInvoker,\n            nameBox\n        ).build()\n    )\n}\n\n\nprivate fun FunSpec.Builder.addApiRouteActionImplBody(\n    originalInvoker: InvokeOriginalCodeBase,\n    contextInvoker: InvokeContextCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    Constants.KDoc.function(\n        originalInvoker.location,\n        originalInvoker.queriesKDoc,\n        originalInvoker.resultKDoc\n    ).forEach { doc ->\n        addComment(doc)\n    }\n    originalInvoker.queries.forEach { query ->\n        query.callback?.let { callback ->\n            if (callback.transformRMirror)\n                addCallbackTransformCode(query, callback, nameBox)\n        }\n    }\n    val invokeCode =\n        invokeOriginalCode(originalInvoker, nameBox, castAllQuery = false, processExt = false)\n\n    if (null != originalInvoker.result) {\n        when {\n            contextInvoker.hasSyncReturn -> {\n                addCode(\"return $invokeCode\".noSpaces())\n            }\n            contextInvoker.resultParameters.isNotEmpty() -> {\n                val resultFunction = contextInvoker.resultParameters.first()\n                inControlFlowStatementIf(resultFunction.nullable, resultFunction.name) {\n                    addCode(\"${resultFunction.name}(${invokeCode})\")\n                }\n            }\n            else -> {\n                addCode(invokeCode)\n            }\n        }\n    } else {\n        addCode(invokeCode)\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/context/TouchCode.kt",
    "content": "package com.rubik.apt.files.source.context\n\nimport com.rubik.apt.Constants\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.squareup.kotlinpoet.*\n\nfun TypeSpec.Builder.addToucherClass(version: String): TypeSpec.Builder = apply {\n    addType(\n        TypeSpec.classBuilder(\n            Constants.Contexts.CLASS_TOUCHER\n        ).primaryConstructor(\n            FunSpec.constructorBuilder().addParameter(\n                \"action\", LambdaTypeName.get(returnType = Unit::class.asClassName())\n            ).build()\n        ).addProperty(\n            PropertySpec.builder(\n                \"holder\",\n                ClassName.bestGuess(Constants.Contexts.CLASS_TOUCH_HOLDER)\n            ).addModifiers(\n                KModifier.PRIVATE\n            ).initializer(\n                \"${Constants.Apis.TOUCH_FUNCTION_NAME}(${Constants.Contexts.CONSTANTS_URI_NAME}, action)\"\n            ).build()\n        ).addFunction(\n            FunSpec.builder(\n                Constants.Apis.MISS_FUNCTION_NAME\n            ).addParameter(\n                \"action\", LambdaTypeName.get(returnType = Unit::class.asClassName())\n            ).addStatement(\n                \"holder.${Constants.Apis.MISS_FUNCTION_NAME}(action)\"\n            ).build()\n        ).addRGeneratedAnnotation(\n            \"context_toucher\",version\n        ).addAnnotation(\n            AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n        ).build()\n    )\n}\n\nfun TypeSpec.Builder.addTouchFunction(): TypeSpec.Builder = apply {\n    addFunction(\n        FunSpec.builder(\n            Constants.Apis.TOUCH_FUNCTION_NAME\n        ).addParameter(\n            ParameterSpec.builder(\n                \"action\", LambdaTypeName.get(returnType = Unit::class.asClassName())\n            ).build()\n        ).addStatement(\n            \"return ${Constants.Contexts.CLASS_TOUCHER}(action)\"\n        ).addAnnotation(\n            JvmStatic::class.java\n        ).build()\n    )\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/context/action/ApiRouteActionFunctionCode.kt",
    "content": "package com.rubik.apt.files.source.context.action\n\nimport com.ktnail.x.uri.buildVersionUri\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeContextCodeBase\nimport com.rubik.apt.files.source.context.action.inceface.addApiRouteActionParametersAndResult\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.addRGeneratedRouterAnnotation\nimport com.rubik.apt.utility.noSpaces\nimport com.squareup.kotlinpoet.FunSpec\nimport com.squareup.kotlinpoet.TypeSpec\nimport com.squareup.kotlinpoet.asTypeName\n\n\n/**\n *  add call router RouteAction function\n */\nfun TypeSpec.Builder.addApiRouteActionFunctions(\n    uri: String,\n    api: ApiCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    val functionName = api.contextFunctionName\n    val apiUri = buildVersionUri(uri, api.path, api.version)\n    val contextInvoker = api.contextInvoker(uri)\n    addFunction(\n        FunSpec.builder(\n            functionName\n        ).addApiRouteActionParametersAndResult(\n            contextInvoker,\n            nameBox,\n            true\n        ).addApiRouteActionCallRouterBody(\n            contextInvoker,\n            api.actionFunctionName,\n            nameBox\n        ).addAnnotation(\n            JvmStatic::class.java\n        ).addRGeneratedRouterAnnotation(\n            apiUri,\n            api.invoker.type.toString(),\n            api.invoker.clazz.name,\n            api.invoker.name\n        ).addKdoc(\n            Constants.KDoc.functionRouter(\n                apiUri,\n                api.invoker.location,\n                api.invoker.queriesKDoc,\n                api.invoker.resultKDoc\n            )\n        ).build()\n    )\n}\n\nfun FunSpec.Builder.addApiRouteActionCallRouterBody(\n    contextInvoker: InvokeContextCodeBase,\n    functionName: String,\n    nameBox: FileNameBox\n) = apply {\n    val safeRouteCode = \"${Constants.ContextRouters.ROUTE_FUNCTION_NAME}${\n        if (contextInvoker.hasSyncReturn) \"\"\n        else \"<${nameBox.closeSimpleName(Unit::class.asTypeName())}>\"\n    }\"\n    val invokeCode = \"${Constants.RouteActions.PROPERTY_ROUTE_ACTION}?.$functionName(${contextInvoker.invokeParameterNames().joinToString(\", \")})\"\n    beginControlFlow(if (contextInvoker.hasSyncReturn) \"return $safeRouteCode\" else safeRouteCode)\n    addStatement(invokeCode.noSpaces())\n    endControlFlow()\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/context/action/inceface/RouteActionFunctionCode.kt",
    "content": "package com.rubik.apt.files.source.context.action.inceface\n\nimport com.rubik.apt.codebase.api.QueryCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeContextCodeBase\nimport com.rubik.apt.codebase.invoker.LambdaTypeCodeBase\nimport com.rubik.apt.namebox.FileNameBox\nimport com.squareup.kotlinpoet.FunSpec\nimport com.squareup.kotlinpoet.KModifier\nimport com.squareup.kotlinpoet.ParameterSpec\nimport com.squareup.kotlinpoet.TypeName\n\n/**\n * add RouteAction parameters and result for function\n */\nfun FunSpec.Builder.addApiRouteActionParametersAndResult(\n    contextInvoker: InvokeContextCodeBase,\n    nameBox: FileNameBox,\n    processExt: Boolean = false\n) = apply {\n    contextInvoker.receiver?.let { query ->\n        if (processExt) {\n            receiver(query.toContextTypeName(nameBox.uri))\n        } else {\n            addApiRouterParameter(nameBox.uri, query)\n        }\n    }\n    contextInvoker.parameters.forEach { query ->\n        addApiRouterParameter(nameBox.uri, query)\n    }\n\n    if (contextInvoker.hasSyncReturn) {\n        addApiRouterReturnType(contextInvoker.returnType)\n    }\n    val results = contextInvoker.resultParameters\n    addApiRouterResultParameters(results)\n}\n\n\nfun FunSpec.Builder.addApiRouterParameter(\n    contextUri: String,\n    query: QueryCodeBase\n) {\n    addParameter(\n        ParameterSpec.builder(\n            query.legalName, query.toContextTypeName(contextUri)\n        ).apply {\n            if (query.isVarargs) { addModifiers(KModifier.VARARG) }\n        }.build()\n    )\n}\n\n\nfun FunSpec.Builder.addApiRouterReturnType(\n    resultType: TypeName\n) = apply {\n    returns(resultType.copy(nullable = true))\n}\n\nfun FunSpec.Builder.addApiRouterResultParameters(\n    results: List<LambdaTypeCodeBase>\n) = apply {\n    results.forEach { resultLambdaType ->\n        addParameter(\n            resultLambdaType.name,\n            resultLambdaType.toTypeName()\n        )\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/context/action/inceface/RouteActionsSourceFile.kt",
    "content": "package com.rubik.apt.files.source.context.action.inceface\n\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.context.SectionCodeBase\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.namebox.closeInNameBox\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.rubik.apt.utility.process\nimport com.squareup.kotlinpoet.*\nimport java.io.File\n\ninternal fun generateRouteActionsFile(\n    className: String,\n    uri: String,\n    routers: SectionCodeBase<RouteCodeBase>,\n    version: String,\n    dictionary: File\n) {\n    FileSpec.builder(Constants.Contexts.Declare.makeContextPackageName(uri), className).closeInNameBox(uri) { nameBox ->\n        addType(\n            TypeSpec.interfaceBuilder(className).addSuperinterface(\n                ClassName.bestGuess(Constants.RouteActions.INTERFACE_NAME)\n            ).addRouteActionsFunction(\n                uri, routers, nameBox\n            ).addRGeneratedAnnotation(\n                \"route_actions\", version\n            ).addAnnotation(\n                AnnotationSpec.builder(RContextLib::class.java).addMember(\"uri = %S\", uri).build()\n            ).addAnnotation(\n                AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n            ).addKdoc(\n                Constants.KDoc.routeActions(uri, version)\n            ).build()\n        ).process().build().writeTo(dictionary)\n    }\n}\n\nprivate fun TypeSpec.Builder.addRouteActionsFunction(\n    uri: String,\n    routers: SectionCodeBase<RouteCodeBase>,\n    nameBox: FileNameBox\n) = apply {\n    routers.forEachRoute { route ->\n        if (route is ApiCodeBase) {\n            addApiRouteActionsFunctions(uri, route, nameBox)\n        }\n    }\n}\n\n/**\n *  add abstract RouteAction function\n */\nprivate fun TypeSpec.Builder.addApiRouteActionsFunctions(\n    uri: String,\n    api: ApiCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    val functionName = api.actionFunctionName\n    val contextInvoker = api.contextInvoker(uri)\n    addFunction(\n        FunSpec.builder(\n            functionName\n        ).addModifiers(\n            KModifier.ABSTRACT\n        ).addApiRouteActionParametersAndResult(\n            contextInvoker,\n            nameBox,\n            false\n        ).build()\n    )\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/context/dsl/ActivityDSLFuntionCode.kt",
    "content": "package com.rubik.apt.files.source.context.dsl\n\nimport com.ktnail.x.uri.buildVersionUri\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.activity.ActivityCodeBase\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.addRGeneratedRouterAnnotation\nimport com.squareup.kotlinpoet.*\n\nfun TypeSpec.Builder.addActivityRouterFunctions(\n    uri: String,\n    activity: ActivityCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    buildVersionUri(uri, activity.path, activity.version).let { apiUri ->\n        addFunction(createActivityRouterFunctionBuilder(uri, apiUri, activity, Constants.Activities.CONTEXT_CLASS_NAME).build())\n        addFunction(createActivityRouterFunctionBuilder(uri, apiUri, activity, Constants.Activities.ACTIVITY_CLASS_NAME).build())\n        addFunction(createActivityRouterFunctionBuilder(uri, apiUri, activity, Constants.Activities.FRAGMENT_CLASS_NAME).build())\n    }\n}\n\nfun createActivityRouterFunctionBuilder(\n    uri: String,\n    apiUri: String,\n    activity: ActivityCodeBase,\n    receiverName: String\n) = FunSpec.builder(\n    activity.contextFunctionName\n).addParameter(\n    Constants.Activities.PROPERTY_LAUNCHER, ClassName.bestGuess(receiverName)\n).addActivityDSLRouterStatement(\n    uri,\n    apiUri,\n    activity\n).addAnnotation(\n    JvmStatic::class.java\n).addRGeneratedRouterAnnotation(\n    apiUri, \"ACTIVITY\", activity.className, \"\"\n).addKdoc(\n    Constants.KDoc.functionRouter(apiUri, activity.className, activity.propertiesKDoc)\n)\n\nfun FunSpec.Builder.addActivityDSLRouterStatement(\n    contextUri: String,\n    apiUri: String,\n    activity: ActivityCodeBase\n) = apply {\n    beginControlFlow(\"${Constants.Activities.PROPERTY_LAUNCHER}.${Constants.Apis.NAVIGATE_FUNCTION_NAME}\") // navigate\n    addStatement(\"${Constants.Apis.URI_DSL_NAME}=\\\"$apiUri\\\"\") // uri\n    addStatement(\"${Constants.Apis.CHECK_ROUTER_VERSION_DSL_NAME}(${Constants.Router.CHECK_ROUTER_VERSION})\") // checkRouterVersion\n\n    beginControlFlow(Constants.Apis.QUERY_DSL_NAME) // query\n    addStatement(\"${Constants.Activities.FLAGS_DSL_NAME}=${Constants.Activities.PROPERTY_INTENT_FLAGS}\") // flags\n    addStatement(\"${Constants.Activities.REQUEST_CODE_DSL_NAME}=${Constants.Activities.PROPERTY_REQUEST_CODE}\") // requestCode\n    activity.sortedProperties.forEach { property ->\n        addParameter(\n            ParameterSpec.builder(\n                property.legalName, property.toContextTypeName(contextUri)\n            ).build()\n        )\n        addStatement(property.makeAddToQueryCode())\n    }\n    addParameter(\n        ParameterSpec.builder(\n            Constants.Activities.PROPERTY_INTENT_FLAGS,\n            Int::class.asTypeName().copy(nullable = true)\n        ).defaultValue(\"null\").build()\n    )\n    addParameter(\n        ParameterSpec.builder(\n            Constants.Activities.PROPERTY_REQUEST_CODE,\n            Int::class.asTypeName().copy(nullable = true)\n        ).defaultValue(\"null\").build()\n    )\n    endControlFlow()\n\n    endControlFlow() // navigate end\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/context/dsl/ApiDSLFunctionCode.kt",
    "content": "package com.rubik.apt.files.source.context.dsl\n\nimport com.ktnail.x.uri.buildVersionUri\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.api.QueryCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeContextCodeBase\nimport com.rubik.apt.files.source.context.action.inceface.addApiRouteActionParametersAndResult\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.utility.addRGeneratedRouterAnnotation\nimport com.rubik.apt.utility.inControlFlowStatementIf\nimport com.squareup.kotlinpoet.FunSpec\nimport com.squareup.kotlinpoet.TypeSpec\n\n/**\n *  add DSL call router RouteAction function\n */\nfun TypeSpec.Builder.addApiRouterDSLFunctions(\n    uri: String,\n    api: ApiCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    val functionName = api.contextFunctionName\n    val apiUri = buildVersionUri(uri, api.path, api.version)\n    val contextInvoker = api.contextInvoker(uri)\n    addFunction(\n        FunSpec.builder(\n            functionName\n        ).addApiRouteActionParametersAndResult(\n            contextInvoker,\n            nameBox,\n            true\n        ).addApiRouterDSLBody(\n            apiUri,\n            contextInvoker,\n            functionName\n        ).addAnnotation(\n            JvmStatic::class.java\n        ).addRGeneratedRouterAnnotation(\n            apiUri,\n            api.invoker.type.toString(),\n            api.invoker.clazz.name,\n            api.invoker.name\n        ).addKdoc(\n            Constants.KDoc.functionRouter(\n                apiUri,\n                api.invoker.location,\n                api.invoker.queriesKDoc,\n                api.invoker.resultKDoc\n            )\n        ).build()\n    )\n}\n\nprivate fun FunSpec.Builder.addApiRouterDSLAddToQueryCode(query: QueryCodeBase, functionName: String) {\n    if (!query.isExtendThis) {\n        addStatement(Constants.Apis.makeAddToQueryCode(query.originalName, query.legalName))\n    } else {\n        addStatement(Constants.Apis.makeAddToQueryCode(query.originalName, \"this@$functionName\"))\n    }\n}\n\nprivate fun FunSpec.Builder.addApiRouterDSLBody(\n    apiUri: String,\n    contextInvoker: InvokeContextCodeBase,\n    functionName: String\n) = apply {\n    if (contextInvoker.hasSyncReturn) {\n        beginControlFlow(\"return ${Constants.Apis.NAVIGATE_FOR_RESULT_FUNCTION_NAME}\") // navigateForResult\n    } else {\n        beginControlFlow(Constants.Apis.NAVIGATE_FUNCTION_NAME) // navigate\n    }\n\n    addApiRouterDSLQueriesStatement(apiUri, functionName, contextInvoker)\n    contextInvoker.resultParameters.forEach { resultLambdaType ->\n        inControlFlowStatementIf(resultLambdaType.nullable, resultLambdaType.name) {\n            addStatement(\"${Constants.Apis.RESULT_DSL_NAME}(${resultLambdaType.name})\") // result()\n        }\n    }\n    endControlFlow() // navigate or navigateForResult end\n}\n\nprivate fun FunSpec.Builder.addApiRouterDSLQueriesStatement(\n    apiUri: String,\n    functionName: String,\n    contextInvoker: InvokeContextCodeBase\n) = apply {\n    addStatement(\"${Constants.Apis.URI_DSL_NAME}=\\\"$apiUri\\\"\") // uri\n    addStatement(\"${Constants.Apis.CHECK_ROUTER_VERSION_DSL_NAME}(${Constants.Router.CHECK_ROUTER_VERSION})\") // checkRouterVersion\n    if (contextInvoker.parameters.isNotEmpty() || contextInvoker.receiver != null) {\n        beginControlFlow(Constants.Apis.QUERY_DSL_NAME) // query\n        contextInvoker.receiver?.let {\n            addApiRouterDSLAddToQueryCode(it, functionName)\n        }\n        contextInvoker.parameters.forEach {\n            addApiRouterDSLAddToQueryCode(it, functionName)\n        }\n        endControlFlow() // query end\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/context/dsl/DSLRouteContextSourceFiles.kt",
    "content": "package com.rubik.apt.files.source.context.dsl\n\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.activity.ActivityCodeBase\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.context.SectionCodeBase\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.namebox.closeInNameBox\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.rubik.apt.utility.addSectionTypes\nimport com.rubik.apt.utility.process\nimport com.squareup.kotlinpoet.*\nimport java.io.File\n\n\ninternal fun generateContextRouteFile(\n    className: String,\n    uri: String,\n    routers: SectionCodeBase<RouteCodeBase>,\n    version: String,\n    dictionary: File\n) {\n    FileSpec.builder(Constants.Contexts.Declare.makeContextPackageName(uri), className).closeInNameBox(uri) { nameBox ->\n        addAliasedImport(ClassName(Constants.Aggregate.PATH_PACKAGE_NAME, Constants.Aggregate.PATH_CLASS_NAME), Constants.Aggregate.PATH_CLASS_NAME_AS)\n        addImport(Constants.Apis.NAVIGATE_FUNCTION_PACKAGE_NAME, Constants.Apis.RESULT_DSL_NAME)\n        addImport(Constants.Apis.NAVIGATE_FUNCTION_PACKAGE_NAME, Constants.Apis.NAVIGATE_FUNCTION_NAME)\n        addImport(Constants.Apis.NAVIGATE_FUNCTION_PACKAGE_NAME, Constants.Apis.NAVIGATE_FOR_RESULT_FUNCTION_NAME)\n        addType(\n            TypeSpec.classBuilder(className).also { rootType ->\n                rootType.addType(\n                    TypeSpec.companionObjectBuilder().addProperty(\n                        PropertySpec.builder(\n                            Constants.Contexts.CONSTANTS_URI_NAME, String::class\n                        ).addModifiers(\n                            KModifier.CONST\n                        ).initializer(\n                            \"%S\", uri\n                        ).build()\n                    ).addSectionTypes(routers, true, rootType) { builder, route ->\n                        builder.addRouterFunctions(uri, route, nameBox)\n                    }.addRGeneratedAnnotation(\n                        \"context_companion\", version\n                    ).addAnnotation(\n                        AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME))\n                            .build()\n                    ).build()\n                )\n            }.addRGeneratedAnnotation(\n                \"context_route\", version\n            ).addAnnotation(\n                AnnotationSpec.builder(RContextLib::class.java).addMember(\"uri = %S\", uri)\n                    .build()\n            ).addAnnotation(\n                AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME))\n                    .build()\n            ).addKdoc(\n                Constants.KDoc.routerContext(uri, version)\n            ).build()\n        ).process().build().writeTo(dictionary)\n    }\n}\n\ninternal fun TypeSpec.Builder.addRouterFunctions(\n    uri: String,\n    route: RouteCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    when (route) {\n        is ApiCodeBase -> addApiRouterDSLFunctions(uri, route, nameBox)\n        is ActivityCodeBase -> addActivityRouterFunctions(uri, route, nameBox)\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/identity/IdentitySourceFile.kt",
    "content": "package com.rubik.apt.files.source.identity\n\nimport com.ktnail.x.md5\nimport com.rubik.annotations.source.RAggregate\nimport com.rubik.annotations.source.RContext\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.apt.Constants\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.rubik.apt.utility.noSpaces\nimport com.rubik.apt.utility.process\nimport com.squareup.kotlinpoet.AnnotationSpec\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FileSpec\nimport com.squareup.kotlinpoet.TypeSpec\nimport java.io.File\n\ninternal fun generateContextIdentityFile(\n    className: String,\n    uri: String,\n    version: String,\n    token: String,\n    dictionary: File\n) {\n    FileSpec.builder(Constants.Contexts.Declare.makeContextPackageName(uri), className).apply {\n        val md5Token = token.md5()\n        addType(\n            TypeSpec.classBuilder(className).superclass(\n                ClassName.bestGuess(Constants.Identity.CONTEXT_ID_SUPER_CLASS_NAME)\n            ).addSuperclassConstructorParameter(\n                \"uri = %S, version = %S, token = %S\".noSpaces(), uri, version, md5Token\n            ).addRGeneratedAnnotation(\n                \"context_id\", version\n            ).addAnnotation(\n                AnnotationSpec.builder(RContextLib::class.java).addMember(\"uri = %S\", uri).build()\n            ).addAnnotation(\n                AnnotationSpec.builder(RContext::class.java)\n                    .addMember(\"uri = %S\", uri)\n                    .addMember(\"version = %S\", version)\n                    .addMember(\"token = %S\", md5Token).build()\n            ).addAnnotation(\n                AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME))\n                    .build()\n            ).addKdoc(\n                Constants.KDoc.contextId(uri, version, token)\n            ).build()\n        ).process().build().writeTo(dictionary)\n    }\n}\n\ninternal fun FileSpec.Builder.addAggregateIdentity(\n    className: String,\n    uri: String,\n    version: String,\n    token: String,\n    kDocUserAndTime: Boolean\n) = apply {\n    val md5Token = token.md5()\n    addType(\n        TypeSpec.classBuilder(className).superclass(\n            ClassName.bestGuess(Constants.Identity.AGGREGATE_ID_SUPER_CLASS_NAME)\n        ).addSuperclassConstructorParameter(\n            \"uri = %S, version = %S, token = %S\".noSpaces(), uri, version, md5Token\n        ).addRGeneratedAnnotation(\n            \"aggregate_Id\", version\n        ).addAnnotation(\n            AnnotationSpec.builder(RAggregate::class.java)\n                .addMember(\"uri = %S\", uri)\n                .addMember(\"version = %S\", version)\n                .addMember(\"token = %S\", md5Token).build()\n        ).addAnnotation(\n            AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME))\n                .build()\n        ).addKdoc(\n            Constants.KDoc.aggregateId(uri, version,token, kDocUserAndTime)\n        ).build()\n    )\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/mirror/callback/CallbackSourceFiles.kt",
    "content": "package com.rubik.apt.files.source.mirror.callback\n\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.callback.ObjectCallbackCodeBase\nimport com.rubik.apt.codebase.invoker.InvokeFunctionCodeBase\nimport com.rubik.apt.codebase.packageName\nimport com.rubik.apt.namebox.closeInNameBox\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.rubik.apt.utility.process\nimport com.squareup.kotlinpoet.*\nimport java.io.File\n\ninternal fun generateCallbackFiles(\n    uri: String,\n    callbacks: List<ObjectCallbackCodeBase>,\n    version: String,\n    provideDirectory: File\n) {\n    callbacks.forEach { callbackObject ->\n        FileSpec.builder(\n            callbackObject.packageName(uri),\n            callbackObject.simpleName\n        ).closeInNameBox(uri) { nameBox ->\n            nameBox.import(Constants.Router.PACKAGE_NAME, Constants.ContextRouters.RUBIK_CLASS_NAME)\n            addType(\n                TypeSpec.interfaceBuilder(\n                    callbackObject.simpleName\n                ).addCallbackFunction(\n                    uri, callbackObject.functions\n                ).addRGeneratedAnnotation(\n                    \"callback\",version\n                ).addAnnotation(\n                    AnnotationSpec.builder(RContextLib::class.java).addMember(\"uri = %S\", uri).build()\n                ).addAnnotation(\n                    AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n                ).addKdoc(\n                    Constants.KDoc.callback(uri, version)\n                ).build()\n            ).process().build().writeTo(provideDirectory)\n        }\n    }\n}\n\nprivate fun TypeSpec.Builder.addCallbackFunction(\n    uri: String,\n    functions: List<InvokeFunctionCodeBase>\n) = apply {\n    functions.forEach { function ->\n        addFunction(\n            FunSpec.builder(\n                function.name\n            ).addModifiers(KModifier.ABSTRACT).apply {\n                function.contextParameters(uri).forEach { (name, type) ->\n                    addParameter(name, type)\n                }\n            }.clearBody().build()\n        )\n    }\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/mirror/objekt/ObjectSourceFiles.kt",
    "content": "package com.rubik.apt.files.source.mirror.objekt\n\nimport com.ktnail.x.uri.buildVersionUri\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.api.ApiCodeBase\nimport com.rubik.apt.codebase.objekt.ObjectCodeBase\nimport com.rubik.apt.codebase.packageName\nimport com.rubik.apt.files.source.addRouteActionProperty\nimport com.rubik.apt.files.source.context.action.addApiRouteActionCallRouterBody\nimport com.rubik.apt.files.source.context.action.inceface.addApiRouteActionParametersAndResult\nimport com.rubik.apt.namebox.FileNameBox\nimport com.rubik.apt.namebox.closeInNameBox\nimport com.rubik.apt.utility.*\nimport com.squareup.kotlinpoet.*\nimport java.io.File\n\ninternal fun generateObjectFiles(\n    uri: String,\n    objects: MutableMap<String, ObjectCodeBase>,\n    version: String,\n    routeActionsName: String,\n    provideDirectory: File\n) {\n    objects.forEach { (_, objekt) ->\n        val routers = objekt.sections\n        FileSpec.builder(\n            objekt.packageName(uri),\n            objekt.simpleName\n        ).closeInNameBox(uri) { nameBox ->\n            nameBox.import(Constants.Router.PACKAGE_NAME, Constants.ContextRouters.RUBIK_CLASS_NAME)\n            nameBox.import(Constants.Apis.NAVIGATE_FUNCTION_PACKAGE_NAME, Constants.ContextRouters.ROUTE_FUNCTION_NAME)\n            addType(\n                TypeSpec.classBuilder(objekt.simpleName).superclass(\n                    ClassName.bestGuess(Constants.Object.SUPER_NAME)\n                ).primaryConstructor(\n                    FunSpec.constructorBuilder().addParameter(\n                        Constants.Object.SUB_OBJECT_ORIGINAL_FILED_NAME,\n                        Any::class.asTypeName().copy(nullable = true)\n                    ).addModifiers(KModifier.PRIVATE).build()\n                ).addSuperclassConstructorParameter(\n                    Constants.Object.SUB_OBJECT_ORIGINAL_FILED_NAME\n                ).addSectionTypes(routers, false) { builder, route ->\n                    builder.addApiRouteActionFunctions(uri, route, nameBox)\n                }.addType(\n                    TypeSpec.companionObjectBuilder().addProperty(\n                        PropertySpec.builder(\n                            Constants.Contexts.CONSTANTS_URI_NAME, String::class\n                        ).addModifiers(\n                            KModifier.CONST\n                        ).initializer(\n                            \"%S\", uri\n                        ).build()\n                    ).addRouteActionProperty(\n                        uri, routeActionsName\n                    ).addCreator(\n                        objekt.simpleName\n                    ).addFakeConstructors(\n                        objekt.constructors, nameBox\n                    ).addRGeneratedAnnotation(\n                        \"object_companion\",version\n                    ).addAnnotation(\n                        AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n                    ).build()\n                ).addRGeneratedAnnotation(\n                    \"object\",version\n                ).addAnnotation(\n                    AnnotationSpec.builder(RContextLib::class.java).addMember(\"uri = %S\", uri).build()\n                ).addAnnotation(\n                    AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n                ).addKdoc(\n                    Constants.KDoc.objekt(uri, version)\n                ).build()\n            ).process().build().writeTo(provideDirectory)\n        }\n    }\n}\n\nprivate fun TypeSpec.Builder.addFakeConstructors(\n    constructors: MutableList<ApiCodeBase>,\n    nameBox: FileNameBox\n) = apply {\n    constructors.forEach { constructor ->\n        val contextInvoker = constructor.contextInvoker(nameBox.uri)\n        val apiUri = buildVersionUri(nameBox.uri, constructor.path, constructor.version)\n        addFunction(\n            FunSpec.builder(\n                \"invoke\"\n            ).addModifiers(\n                KModifier.OPERATOR\n            ).addApiRouteActionParametersAndResult(\n                contextInvoker,\n                nameBox,\n                true\n            ).addApiRouteActionCallRouterBody(\n                contextInvoker,\n                constructor.actionFunctionName,\n                nameBox\n            ).addRGeneratedRouterAnnotation(\n                apiUri,\n                constructor.invoker.type.toString(),\n                constructor.invoker.clazz.name,\n                constructor.invoker.name\n            ).addKdoc(\n                Constants.KDoc.functionRouter(\n                    apiUri,\n                    constructor.invoker.location,\n                    constructor.invoker.queriesKDoc,\n                    constructor.invoker.resultKDoc\n                )\n            ).build())\n    }\n}\n\nprivate fun TypeSpec.Builder.addCreator(\n    className :String\n) = apply {\n    addFunction(\n        FunSpec.builder(\n            \"create\"\n        ).addParameter(\n            Constants.Object.SUB_OBJECT_ORIGINAL_FILED_NAME,\n            Any::class.asTypeName().copy(nullable = true)\n        ).addStatement(\n            \"return \" + \"${className}(${Constants.Object.SUB_OBJECT_ORIGINAL_FILED_NAME})\".noSpaces()\n        ).build()\n    )\n}\n\nfun TypeSpec.Builder.addApiRouteActionFunctions(\n    uri: String,\n    api: ApiCodeBase,\n    nameBox: FileNameBox\n) = apply {\n    val functionName = api.contextFunctionName\n    val apiUri = buildVersionUri(uri, api.path, api.version)\n    val contextInvoker = api.objectContextInvoker(uri)\n    addFunction(\n        FunSpec.builder(\n            functionName\n        ).addApiRouteActionParametersAndResult(\n            contextInvoker,\n            nameBox,\n            true\n        ).addApiRouteActionCallRouterBody(\n            contextInvoker,\n            api.actionFunctionName,\n            nameBox\n        ).addRGeneratedRouterAnnotation(\n            apiUri,\n            api.invoker.type.toString(),\n            api.invoker.clazz.name,\n            api.invoker.name\n        ).addKdoc(\n            Constants.KDoc.functionRouter(\n                apiUri,\n                api.invoker.location,\n                api.invoker.queriesKDoc,\n                api.invoker.resultKDoc\n            )\n        ).build()\n    )\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/mirror/value/ValueCode.kt",
    "content": "package com.rubik.apt.files.source.mirror.value\n\nimport com.rubik.apt.codebase.value.ValueFieldCodeBase\nimport com.squareup.kotlinpoet.*\n\nfun FunSpec.Builder.addConstructorParameter(\n    fields: List<ValueFieldCodeBase>,\n    contextUri: String\n): FunSpec.Builder {\n    fields.filter { codebase -> !codebase.isConstant }.forEach { field ->\n        addParameter(field.name, field.toContextTypeName(contextUri))\n    }\n    return this\n}\n\nfun TypeSpec.Builder.addFieldsProperty(\n    fields: List<ValueFieldCodeBase>,\n    contextUri: String\n): TypeSpec.Builder {\n    fields.filter { codebase -> !codebase.isConstant }.forEach { field ->\n        addProperty(\n            PropertySpec.builder(\n                field.name, field.toContextTypeName(contextUri)\n            ).addAnnotations(field.annotations.map { codebase ->\n                AnnotationSpec.builder(\n                    Class.forName(\n                        codebase.className\n                    ).asClassName()\n                ).addAnnotationMembers(codebase.members).build()\n            }).initializer(field.name).build()\n        )\n    }\n    return this\n}\nfun TypeSpec.Builder.addConstantsProperty(\n    fields: List<ValueFieldCodeBase>,\n    contextUri: String\n): TypeSpec.Builder {\n    fields.filter { codebase -> codebase.isConstant }.let { constants ->\n        if (constants.isNotEmpty()) {\n            addType(TypeSpec.companionObjectBuilder().apply {\n                constants.forEach { constant ->\n                    addProperty(\n                        PropertySpec.builder(\n                            constant.name, constant.toContextTypeName(contextUri)\n                        ).addModifiers(\n                            KModifier.CONST\n                        ).initializer(\n                            constant.defaultValueCode ?: \"null\"\n                        ).build()\n                    ).build()\n                }\n            }.build())\n        }\n    }\n    return this\n}\n\nfun AnnotationSpec.Builder.addAnnotationMembers(members: List<String>): AnnotationSpec.Builder {\n    members.forEach {\n        addMember(it)\n    }\n    return this\n}\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/files/source/mirror/value/ValueSourceFiles.kt",
    "content": "package com.rubik.apt.files.source.mirror.value\n\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.annotations.source.RGeneratedValue\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.packageName\nimport com.rubik.apt.codebase.value.ValueCodeBase\nimport com.rubik.apt.utility.addAnnotations\nimport com.rubik.apt.utility.addInterfaces\nimport com.rubik.apt.utility.addRGeneratedAnnotation\nimport com.rubik.apt.utility.process\nimport com.squareup.kotlinpoet.*\nimport java.io.File\n\ninternal fun generateValueFiles(\n    uri: String,\n    values: List<ValueCodeBase>,\n    version: String,\n    provideDirectory: File\n) {\n    values.forEach { value ->\n        with(FileSpec) {\n            builder(\n                value.packageName(uri),\n                value.simpleName\n            ).addType(\n                TypeSpec.classBuilder(value.simpleName).primaryConstructor(\n                    FunSpec.constructorBuilder().addConstructorParameter(\n                        value.fields,\n                        uri\n                    ).build()\n                ).addAnnotations(\n                    value.annotations\n                ).addFieldsProperty(\n                    value.fields,\n                    uri\n                ).addConstantsProperty(\n                    value.fields,\n                    uri\n                ).addInterfaces(\n                    value.interfaces\n                ).addRGeneratedAnnotation(\n                    \"value\", version\n                ).addAnnotation(\n                    AnnotationSpec.builder(RContextLib::class.java).addMember(\"uri = %S\", uri).build()\n                ).addAnnotation(\n                    AnnotationSpec.builder(RGeneratedValue::class.java).addMember(\"uri = %S\", uri).build()\n                ).addAnnotation(\n                    AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME)).build()\n                ).addKdoc(\n                    Constants.KDoc.value(uri, version)\n                ).build()\n            ).process().build().writeTo(provideDirectory)\n        }\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/namebox/FileNameBox.kt",
    "content": "package com.rubik.apt.namebox\n\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.ktnail.x.Logger\nimport com.ktnail.x.NameBox\nimport com.rubik.apt.codebase.ClassMirrorable\nimport com.rubik.apt.codebase.context.ContextCodeBase\nimport com.rubik.apt.codebase.contextClassName\nimport com.rubik.apt.codebase.originalClassName\nimport com.rubik.apt.utility.bestGuessNameOrNull\nimport com.rubik.apt.utility.noSpaces\nimport com.rubik.apt.utility.toRMirrorName\nimport com.squareup.kotlinpoet.*\n\nclass FileNameBox(val builder: FileSpec.Builder, val uri: String) {\n    private val numberNameBox = NameBox()\n    private val consumedClassNames = mutableMapOf<String, String>()\n    private val mappingMatrix = MappingMatrix()\n\n    /*\n    * kotlin.collections.Map.Entry ->  Map1.Entry\n    * kotlin.collections.Map ->  Map1\n    * kotlin.collections.getOrPut -> getOrPut\n    */\n    fun closeSimpleName(\n        name: String,\n        asName: String? = null,\n        suffix: String? = null,\n        addNullableSuffix: Boolean = true\n    ): String =\n        bestGuessNameOrNull(name)?.let { className ->\n            closeSimpleName(\n                className,\n                asName,\n                suffix,\n                addNullableSuffix\n            )\n        } ?: name\n\n    fun closeSimpleName(\n        name: TypeName,\n        asName: String? = null,\n        suffix: String? = null,\n        addNullableSuffix: Boolean = true\n    ): String =\n        when (name) {\n            is ClassName -> closeClass(name, asName, suffix, addNullableSuffix)\n            is ParameterizedTypeName -> closeClass(name.rawType, asName, suffix, addNullableSuffix).let { simpleName ->\n                if (name.typeArguments.isEmpty()) simpleName\n                else \"$simpleName<${\n                    name.typeArguments.joinToString(\", \") { argument -> closeSimpleName(argument, asName, suffix, addNullableSuffix) }\n                }>\".noSpaces() + if (addNullableSuffix && name.isNullable) \"?\" else \"\"\n            }\n            else -> name.toString()\n        }\n\n    fun close(\n        name: TypeName,\n        asName: String? = null,\n        suffix: String? = null,\n        addNullableSuffix: Boolean = true\n    ): TypeName {\n        when (name) {\n            is ClassName -> closeClass(name, asName, suffix, addNullableSuffix)\n            is ParameterizedTypeName -> {\n                closeClass(name.rawType, asName, suffix, addNullableSuffix)\n                name.typeArguments.map { typeName ->\n                    close(typeName, asName, suffix, addNullableSuffix)\n                }\n            }\n            else -> { }\n        }\n        return name\n    }\n\n    /*\n     * kotlin.collections.Map.Entry? ->  Map1.Entry?\n     */\n    private fun closeClass(name: ClassName, asName: String?, suffix: String?, addNullableSuffix: Boolean): String =\n        closeTopLevelClass(name.topLevelClassName(), asName, suffix).toMultiLayerSimpleName(name, addNullableSuffix)\n\n    /*\n     * kotlin.collections.Map.Entry ->  Map1\n     */\n    private fun closeTopLevelClass(name: ClassName, asName: String?, suffix: String?): String { // like kotlin.collections.Map\n        return consumedClassNames.getOrPut(name.canonicalName) {\n            numberNameBox.useName(asName ?: (name.simpleName + suffix.orEmpty()))\n                .also { useSimpleName -> // like Map1\n                    if (useSimpleName == name.simpleName)\n                    //  import kotlin.collections.Map\n                        builder.addImport(name.packageName, name.simpleName)\n                    else\n                    //  import kotlin.collections.Map as Map1\n                        builder.addAliasedImport(MemberName(name.packageName, name.simpleName), useSimpleName)\n                }\n        }\n    }\n\n    /*\n     *  Map1? ->  Map1.Entry?\n     */\n    private fun String.toMultiLayerSimpleName(name: ClassName, addNullableSuffix: Boolean): String =\n        (if (name.simpleNames.size > 1)\n            mutableListOf(this).apply { addAll(name.simpleNames.subList(1, name.simpleNames.size)) }.joinToString(\".\")\n        else this) + if (addNullableSuffix && name.isNullable) \"?\" else \"\"\n\n    fun closeClassMirrorable(uri: String, context: ContextCodeBase) {\n        context.values.forEach { value ->\n            closeMaybeCrashClass(uri, value)\n            if (value.createByConstructor) {\n                mappingMatrix.register(closeTypeName(value.originalType))\n            }\n        }\n        context.objects.forEach { (_, objekt) ->\n            closeMaybeCrashClass(uri, objekt)\n            mappingMatrix.register(closeTypeName(objekt.originalType))\n        }\n        context.callbacks.forEach { callback ->\n            closeMaybeCrashClass(uri, callback)\n            mappingMatrix.register(closeTypeName(callback.originalType))\n        }\n    }\n\n    private fun closeMaybeCrashClass(uri: String, mirror: ClassMirrorable) {\n        close(mirror.originalClassName, suffix = \"Org\")\n        close(mirror.contextClassName(uri), suffix = \"Ctx\")\n    }\n\n    fun import(packageName: String, vararg names: String) {\n        builder.addImport(packageName, *names)\n    }\n\n    private fun closeTypeName(kbpType: KbpType) =\n        closeSimpleName(kbpType.toTypeName(), addNullableSuffix = false)\n\n    fun closeTypeName(kbpType: KbpType, toOriginal: Boolean) = if (toOriginal)\n        closeTypeName(kbpType)\n    else\n        closeSimpleName(kbpType.toRMirrorName(uri), addNullableSuffix = false)\n\n    fun useMapping(type: KbpType, toOriginal: Boolean): Boolean =\n        mappingMatrix.use(closeTypeName(type), toOriginal, type.nullable)\n\n    fun needAddMapping(\n        type: KbpType,\n        toContext: () -> Unit,\n        toOriginal: () -> Unit,\n        toContextNullable: () -> Unit,\n        toOriginalNullable: () -> Unit\n    ) = mappingMatrix.addMappingAction(\n        closeTypeName(type),\n        toContext,\n        toOriginal,\n        toContextNullable,\n        toOriginalNullable\n    )\n\n}\n\nfun FileSpec.Builder.closeInNameBox(uri: String, action: FileSpec.Builder.(FileNameBox) -> Unit) =\n    apply {\n        closeIn(FileNameBox(this, uri), action)\n    }\n\nfun <T> T.closeIn(nameBox: FileNameBox, action: T.(FileNameBox) -> Unit) =\n    apply {\n        action(nameBox)\n    }"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/namebox/MappingMatrix.kt",
    "content": "package com.rubik.apt.namebox\n\nimport com.ktnail.x.Logger\n\nclass MappingMatrix {\n    // toOriginal , toOriginal（Nullable）\n    // toContext , toContext（Nullable）\n    private val matrix: MutableMap<String, Pair<Pair<Boolean, Boolean>, Pair<Boolean, Boolean>>> = mutableMapOf()\n\n    fun register(typeSign: String) {\n        matrix.putIfAbsent(typeSign, (false to false) to (false to false))\n    }\n\n    fun use(typeSign: String, toOriginal: Boolean, nullable: Boolean): Boolean {\n        return null != matrix[typeSign]?.also { item ->\n            if (toOriginal)\n                matrix[typeSign] = (true to (item.first.second || nullable)) to item.second\n            else\n                matrix[typeSign] = item.first to (true to (item.second.second || nullable))\n        }\n    }\n\n    fun addMappingAction(\n        typeSign: String,\n        toContext: () -> Unit,\n        toOriginal: () -> Unit,\n        toContextNullable: () -> Unit,\n        toOriginalNullable: () -> Unit\n    ){\n        matrix[typeSign]?.let { item ->\n            if (item.second.first)\n                toContext()\n            if (item.first.first)\n                toOriginal()\n            if (item.second.second)\n                toContextNullable()\n            if (item.first.second)\n                toOriginalNullable()\n        }\n    }\n\n    override fun toString(): String = matrix.toList().joinToString(\"\\n\") { (key, value) ->\n        \"$key - ${value.first.first} ${value.first.second} ${value.second.first} ${value.second.second}\"\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/plugin/Arguments.kt",
    "content": "package com.rubik.apt.plugin\n\nimport javax.annotation.processing.ProcessingEnvironment\n\nobject Arguments {\n    const val KAPT_GENERATED = \"kapt.kotlin.generated\"\n\n    object Declare {\n        const val JSON_CONTEXT = \"rubik.context.json\"\n        const val CONTEXT_LIBS_ENABLE = \"rubik.context.libs.enable\"\n        const val CONTEXT_ROUTER_ENABLE = \"rubik.context.router.enable\"\n        const val CONTEXT_IGNORE_VALUE_ANNOS = \"rubik.context.value.ignoreannos\"\n        const val AGGREGATE_USER_AND_TIME_ENABLE = \"rubik.aggregate.userandtime.enable\"\n\n        const val AGGREGATE_ENABLE = \"rubik.aggregate.enable\"\n        const val AGGREGATE_GENERATED = \"rubik.aggregate.generated\"\n        const val AGGREGATE_METHOD_SIZE = \"rubik.aggregate.method.size\"\n\n        const val DEFAULT_SCHEME = \"rubik.default.scheme\"\n    }\n}\n\nfun ProcessingEnvironment.arguments(key: String): String? {\n    return options?.get(key)\n}\n\nfun ProcessingEnvironment.booleanArguments(key: String): Boolean {\n    return options?.get(key) == \"true\"\n}\n\nfun ProcessingEnvironment.intArguments(key: String, default: Int = 0): Int {\n    return options?.get(key)?.toIntOrNull() ?: default\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/plugin/PluginArguments.kt",
    "content": "package com.rubik.apt.plugin\n\nimport com.ktnail.x.Logger\nimport com.rubik.apt.declare.LeastContext\nimport javax.annotation.processing.ProcessingEnvironment\n\ndata class PluginArguments(\n    val defaultScheme: String?,\n    val aggregateMethodSize: Int,\n    val aggregateGenerated: String?,\n    val routerContextEnable: Boolean,\n    val ignoreValueAnnos: List<String>,\n    val aggregateKDocUserAndTime: Boolean,\n    val contexts: List<ContextArguments>?\n) {\n\n    constructor(processingEnv: ProcessingEnvironment) : this(\n        processingEnv.arguments(Arguments.Declare.DEFAULT_SCHEME),\n        processingEnv.intArguments(Arguments.Declare.AGGREGATE_METHOD_SIZE, 100),\n        processingEnv.arguments(Arguments.Declare.AGGREGATE_GENERATED),\n        processingEnv.booleanArguments(Arguments.Declare.CONTEXT_ROUTER_ENABLE),\n        processingEnv.arguments(Arguments.Declare.CONTEXT_IGNORE_VALUE_ANNOS)?.split(\"|\")?: emptyList(),\n        processingEnv.booleanArguments(Arguments.Declare.AGGREGATE_USER_AND_TIME_ENABLE),\n        processingEnv.argumentContexts()\n    )\n\n    val contextLibsEnable = contexts?.any { context -> context.contextLibsEnable } == true\n    val aggregateEnable = contexts?.any { context -> context.aggregateEnable } == true\n\n    override fun toString(): String = \"defaultScheme:$defaultScheme  \" +\n            \"aggregateMethodSize:$aggregateMethodSize \" +\n            \"aggregateGenerated:$aggregateGenerated \" +\n            \"routerContextEnable:$routerContextEnable \" +\n            \"aggregateKDocUserAndTime:$aggregateKDocUserAndTime \" +\n            \"contexts:$contexts \"\n\n\n    data class ContextArguments(\n        val context: LeastContext,\n        val contextLibsEnable: Boolean,\n        val aggregateEnable: Boolean\n    )\n}\n\nprivate fun ProcessingEnvironment.argumentContexts() :List<PluginArguments.ContextArguments>? =\n    options?.filter { (key, value) ->\n        Logger.e(\" APT DBG options key:${key}  value:${value}\")\n        key.startsWith(Arguments.Declare.JSON_CONTEXT)\n    }?.map { (key, json) ->\n        val contextLibsEnable = booleanArguments(key.replace(Arguments.Declare.JSON_CONTEXT, Arguments.Declare.CONTEXT_LIBS_ENABLE))\n        val aggregateEnable = booleanArguments(key.replace(Arguments.Declare.JSON_CONTEXT, Arguments.Declare.AGGREGATE_ENABLE))\n        PluginArguments.ContextArguments(\n            LeastContext.createByJson(json),\n            contextLibsEnable,\n            aggregateEnable\n        )\n    }\n\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/utility/Code.kt",
    "content": "package com.rubik.apt.utility\n\nimport BY_VERSION\nimport com.ktnail.x.camelToPascal\nimport com.ktnail.x.pathToCamel\nimport com.rubik.annotations.source.RGenerated\nimport com.rubik.annotations.source.RGeneratedRouter\nimport com.rubik.apt.Constants\nimport com.rubik.apt.codebase.AnnotationCodeBase\nimport com.rubik.apt.codebase.RouteCodeBase\nimport com.rubik.apt.codebase.context.SectionCodeBase\nimport com.rubik.apt.files.source.mirror.value.addAnnotationMembers\nimport com.squareup.kotlinpoet.*\n\n\nfun FunSpec.Builder.inControlFlowStatementIf(\n    checkIf: Boolean,\n    nameIf: String,\n    action: () -> Unit\n) {\n    if (checkIf){\n        beginControlFlow(\"if (null != $nameIf)\".noSpaces())\n        action()\n        endControlFlow()\n    } else {\n        action()\n    }\n}\n\nfun FunSpec.Builder.addWhenBlockStatements(\n    whenWhat: String?,\n    elseCode: String?,\n    action: FunSpec.Builder.() -> Unit\n) = apply {\n    if (whenWhat.isNullOrBlank()) beginControlFlow(\"when {\".noSpaces())\n    else beginControlFlow(\"when (${whenWhat}){\".noSpaces())\n    action.invoke(this)\n    if (elseCode.isNullOrBlank()) addStatement(\"else -> { }\".noSpaces())\n    else addStatement(\"else -> { $elseCode }\".noSpaces())\n    endControlFlow()\n}\n\nfun TypeSpec.Builder.addRGeneratedAnnotation(kind: String, version: String) = apply {\n    addAnnotation(\n        AnnotationSpec.builder(RGenerated::class.java)\n            .addMember(\"kind = %S\", kind)\n            .addMember(\"by = %S\", \"rubik-kapt:${BY_VERSION}\")\n            .addMember(\"version = %S\", version)\n            .build()\n    )\n}\n\nfun FunSpec.Builder.addRGeneratedRouterAnnotation(\n    uri: String,\n    kind: String,\n    className: String,\n    methodName: String\n) = apply {\n    addAnnotation(\n        AnnotationSpec.builder(\n            RGeneratedRouter::class.java\n        ).addMember(\n            \"uri = %S\", uri\n        ).addMember(\n            \"kind = %S\", kind\n        ).addMember(\n            \"clazz = %S\", className\n        ).addMember(\n            \"method = %S\",methodName\n        ).build()\n    )\n}\n\nprivate fun <T : RouteCodeBase> TypeSpec.Builder.addThisLevelSectionTypes(\n    sections: SectionCodeBase<T>,\n    action: (TypeSpec.Builder, T) -> Unit\n): TypeSpec.Builder = apply {\n    sections.items.forEach { codeBase ->\n        action(this, codeBase)\n    }\n}\n\nprivate  fun <T : RouteCodeBase> TypeSpec.Builder.addNextLevelSectionTypes(\n    sections: SectionCodeBase<T>,\n    static:Boolean = false,\n    action: (TypeSpec.Builder, T) -> Unit\n): TypeSpec.Builder = apply {\n    sections.nextLevel.forEach { (typeName, codeBase) ->\n        val spaceName =  typeName.pathToCamel().camelToPascal()\n        if (static) {\n            addType(\n                TypeSpec.objectBuilder(\n                    spaceName\n                ).addSectionTypes(\n                    codeBase, static, null, action\n                ).addAnnotation(\n                    AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME))\n                        .build()\n                ).build()\n            )\n        } else {\n            val spaceInnerClassName = \"NameSpace${spaceName}\"\n            addType(\n                TypeSpec.classBuilder(\n                    spaceInnerClassName\n                ).addModifiers(\n                    KModifier.INNER\n                ).addSectionTypes(\n                    codeBase, static, null, action\n                ).addAnnotation(\n                    AnnotationSpec.builder(ClassName.bestGuess(Constants.Contexts.KEEP_ANNOTATION_CLASS_NAME))\n                        .build()\n                ).build()\n            )\n            addProperty(\n                PropertySpec.builder(\n                    spaceName,\n                    ClassName(\"\", spaceInnerClassName)\n                ).getter(\n                    FunSpec.getterBuilder().addStatement(\"return ${spaceInnerClassName}()\").build()\n                ).build())\n        }\n    }\n}\n\nfun <T : RouteCodeBase> TypeSpec.Builder.addSectionTypes(\n    sections: SectionCodeBase<T>,\n    static:Boolean = true,\n    addNextLevelTo: TypeSpec.Builder? = null,\n    action: (TypeSpec.Builder, T) -> Unit\n): TypeSpec.Builder = apply {\n    addThisLevelSectionTypes(sections, action)\n    (addNextLevelTo ?: this).addNextLevelSectionTypes(sections, static, action)\n}\n\nfun TypeSpec.Builder.addAnnotations(annotations: List<AnnotationCodeBase>) = apply {\n    addAnnotations(annotations.map { codebase ->\n        AnnotationSpec.builder(\n            Class.forName(\n                codebase.className\n            ).asClassName()\n        ).addAnnotationMembers(codebase.members).build()\n    })\n}\n\nfun TypeSpec.Builder.addInterfaces(interfaces: List<ClassName>) = apply {\n    interfaces.forEach { name ->\n        addSuperinterface(name)\n    }\n}\n\nfun <T> Collection<T>.toArrayCode(transform: ((T) -> CharSequence)? = null) = joinToString(\",\\n\" , transform = transform).let { code->\n    if(code.isNotBlank()) \"\\n$code\\n\" else code\n}\n\nfun bestGuessNameOrNull(className: String) = try {\n    ClassName.bestGuess(className)\n} catch (e: Exception) {\n    null\n}\n\nfun <T> List<T>.toParametersCode(\n    transform: ((T) -> CharSequence)? = null\n): String {\n    return if (isEmpty()) \"\"\n    else\n        \"\"\"\n            |\n            |${joinToString(separator = \",\\n\") { \n            \"\"\"\n            |  ${transform?.invoke(it) ?: it.toString() }\n            \"\"\".trimMargin()\n            }}\n            |\n        \"\"\".trimMargin()\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/utility/Element.kt",
    "content": "package com.rubik.apt.utility\n\nimport com.blueprint.kotlin.lang.element.*\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.blueprint.kotlin.lang.utility.findConstructors\nimport com.ktnail.x.camelToPascal\nimport com.ktnail.x.pascalToSnake\nimport com.ktnail.x.toPascal\nimport com.rubik.annotations.route.RCallback\nimport com.rubik.annotations.route.RResult\nimport javax.lang.model.element.Element\nimport javax.lang.model.element.TypeElement\nimport javax.lang.model.type.MirroredTypeException\n\n\nfun KbpType.isVarargs() = (null != typeArguments.firstOrNull()?.toTypeName()) && isVarargs\n\nfun KbpAbsElement.isResultCallback() = jmElement?.isResultCallback() == true\n\nfun Element?.isResultCallback() =\n    null != this?.getAnnotation(RCallback::class.java) || null != this?.getAnnotation(RResult::class.java)\n\nfun KbpElement.defaultPath() = when (this) {\n    is KbpRooterElement -> toPascal(\"create\", simpleNames, \"Instance\")\n    is KbpConstructorElement -> toPascal(\"create\",  (jmElement?.enclosingElement as? TypeElement)?.simpleName.toString(), \"Instance\")\n    is KbpFunctionElement -> name\n    is KbpHighOrderFunctionElement -> name\n    is KbpVariableElement -> name\n    else -> null\n}?.pascalToSnake(false, \"-\")\n\nfun typeToStringInAnnotations(action: () -> String?) = try {\n    action().toString()\n} catch (e: MirroredTypeException) {\n    e.typeMirror.toString()\n}\n\n\n\n\n\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/utility/FilePath.kt",
    "content": "package com.rubik.apt.utility\n\nimport com.rubik.apt.plugin.Arguments\nimport com.rubik.apt.plugin.arguments\nimport java.io.File\nimport javax.annotation.processing.ProcessingEnvironment\n\nfun makeDefaultGeneratedDir(processingEnv: ProcessingEnvironment) =\n    processingEnv.arguments(Arguments.KAPT_GENERATED)?.let {\n        File(it).apply { mkdirs() }\n    }\n\nfun makeAggregateGeneratedDir(aggregateGenerated: String?) =\n    aggregateGenerated?.let {\n        File(it).apply { mkdirs() }\n    }\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/utility/KotlinPoet.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.apt.utility\n\nimport com.ktnail.x.Logger\nimport com.squareup.kotlinpoet.FileSpec\n\nfun String.noSpaces() = this.replace(\" \", \"·\")\n\nfun FileSpec.Builder.process()  = apply {\n    try {\n        // fix kotlinpoet issue : \"import xxx as xxx\" auto wrapping\n        this::class.java.getDeclaredField(\"memberImports\").let { field ->\n            field.isAccessible = true\n            (field.get(this) as? Set<*>)?.forEach { import ->\n                if (null != import) {\n                    val importString = import::class.java.getDeclaredField(\"importString\")\n                    importString.isAccessible = true\n                    importString.set(import, importString.get(import).toString().noSpaces())\n                }\n            }\n        }\n    } catch (e: Exception) {\n        Logger.e(e.toString())\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_kapt/src/main/java/com/rubik/apt/utility/RType.kt",
    "content": "package com.rubik.apt.utility\n\nimport com.blueprint.kotlin.lang.type.KbpType\nimport com.blueprint.kotlin.lang.utility.*\nimport com.rubik.annotations.route.RCallback\nimport com.rubik.annotations.route.RObject\nimport com.rubik.annotations.route.RValue\nimport com.rubik.apt.Constants\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.TypeName\nimport javax.lang.model.type.TypeMirror\n\n\nfun TypeMirror?.isRMirror(\n    vararg annotations: Class<out Annotation> = arrayOf(RValue::class.java, RObject::class.java, RCallback::class.java)\n): Boolean =\n    if (null != this)\n        annotations.fold(false) { acc, annotation ->\n            acc || asTypeElement()?.let { element ->\n                null != element.getAnnotation(annotation) || element.findConstructors().fold(false) { acc, constructor -> acc || null != constructor.getAnnotation(annotation) }\n            } ?: false\n        }\n    else false\n\nfun KbpType.containRMirror(vararg annotations: Class<out Annotation>): Boolean = null != getRMirrorType(*annotations)\n\nfun KbpType.toRMirrorName(\n    uri: String,\n    vararg annotations: Class<out Annotation> = arrayOf(RValue::class.java, RObject::class.java, RCallback::class.java)\n): TypeName =\n    if (containRMirror(*annotations)) {\n        toTypeName {\n            name.let { name ->\n                if (jmType.isRMirror(*annotations) && name is ClassName)\n                    ClassName(toContextPackageName(uri), name.simpleName)\n                else name\n            }\n        }\n    } else {\n        toTypeName()\n    }.let {\n        val firstTypeArguments = typeArguments.firstOrNull()?.toTypeName()\n        if (null != firstTypeArguments && isVarargs()) firstTypeArguments\n        else it\n    }\n\nfun KbpType.getRMirrorType(vararg annotations: Class<out Annotation>): KbpType? {\n    when {\n        jmType.isRMirror(*annotations) -> return this\n        typeArguments.isNotEmpty() -> typeArguments.forEach { argument ->\n            if (null != argument.getRMirrorType(*annotations)) return argument\n        }\n        else -> return null\n    }\n    return null\n}\n\nfun KbpType?.isSupportMappingRMirror(\n    vararg annotations: Class<out Annotation> = arrayOf(RValue::class.java, RObject::class.java, RCallback::class.java)\n) = if (this?.jmType.isRMirror(*annotations)) true\n    else {\n        this?.jmType?.let { type ->\n            type.asTypeElement()?.let {  typeElement ->\n                if (null != typeElement.findSuperType(\"androidx.lifecycle.LiveData\") ||\n                    null != typeElement.findInterface(\"java.util.List\") ||\n                    null != typeElement.findInterface(\"java.util.Set\") ||\n                    null != typeElement.findSuperType(\"kotlin.Array\") ||\n                    null != typeElement.findInterface(\"kotlin.collections.List\") ||\n                    null != typeElement.findInterface(\"kotlin.collections.Set\"))\n                    type.typeArguments.firstOrNull()\n                else if (null != typeElement.findInterface(\"java.util.Map\") ||\n                    null != typeElement.findInterface(\"kotlin.collections.Map\"))\n                    type.typeArguments.getOrNull(1)\n                else null\n            }\n        }?.jmType?.isRMirror(*annotations) ?: false\n}\n\nfun KbpType.toContextPackageName(uri: String): String =\n    when {\n//        jmType.isRMirror(RValue::class.java) -> Constants.Contexts.Declare.makeContextPackageName(uri, \"value\")\n        jmType.isRMirror(RObject::class.java) -> Constants.Contexts.Declare.makeContextPackageName(uri, \"objekt\")\n        jmType.isRMirror(RCallback::class.java) -> Constants.Contexts.Declare.makeContextPackageName(uri, \"callback\")\n        else -> Constants.Contexts.Declare.makeContextPackageName(uri)\n    }\n"
  },
  {
    "path": "rubik/rubik_maven_repositories.gradle",
    "content": "def addRubikMavenRepos(RepositoryHandler handler) {\n    if (useLocalMaven) {\n        handler.maven {\n            name 'local'\n            url rubik_maven_local_repository\n            allowInsecureProtocol = true\n        }\n    } else if(useGithubMaven){\n        handler.maven {\n            name 'github'\n            url rubik_github_maven_repository\n            credentials {\n                username rubik_github_maven_username\n                password rubik_github_maven_password\n            }\n            allowInsecureProtocol = true\n        }\n    } else {\n        handler.maven {\n            name 'remote'\n            url rubik_maven_repository\n            credentials {\n                username rubik_maven_username\n                password rubik_maven_password\n            }\n            allowInsecureProtocol = true\n        }\n    }\n}\n\next.addRubikMavenRepos = this.&addRubikMavenRepos"
  },
  {
    "path": "rubik/rubik_picker/build.gradle",
    "content": "apply plugin: 'java-library'\napply plugin: 'kotlin'\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation gradleApi()\n    implementation localGroovy()\n\n    implementation \"com.android.tools.build:gradle:$agbt_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n    implementation deps.ktnail.x\n    implementation deps.ktnail.gradle\n\n    implementation project(':rubik:rubik_context')\n\n}\n\ntasks.withType(JavaCompile) {\n    options.encoding = \"UTF-8\"\n}\n\ncompileKotlin {\n    kotlinOptions.freeCompilerArgs += ['-module-name', \"kmd.mars.rubik.packing\"]\n}\n\n"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/pick/Excepted.kt",
    "content": "package com.rubik.pick\n\n\nclass Excepted(\n    val forFlavor: String?,\n    val where: PickWhere\n) {\n    override fun toString() = \"Excepted forFlavor:${forFlavor} who:${where}\"\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/pick/PickHow.kt",
    "content": "package com.rubik.pick\n\nimport com.rubik.context.router.RouterRegister\n\n\nsealed class PickHow(\n    private val parameters: How\n) {\n    data class How(\n        val version: String? = null,\n        val variant: String? = null,\n        val projectPath: String? = null,\n        val register: RouterRegister? = null\n    ) {\n        fun copy(other: How) = How(\n            version = version ?: other.version,\n            variant = variant ?: other.variant,\n            projectPath = projectPath ?: other.projectPath,\n            register = register ?: other.register\n        )\n    }\n\n    val version: String? get() = parameters.version\n    val variant: String? get() = parameters.variant\n    val projectPath: String? get() = parameters.projectPath\n    val register: RouterRegister? get() = parameters.register\n\n    abstract fun copy(parameters: How): PickHow\n\n    fun mergeLowerPriority(other: PickHow) = copy(parameters.copy(other.parameters))\n\n    fun mergeHigherPriority(other: PickHow) = copy(other.parameters.copy(parameters))\n\n    fun isSufficient() = this !is ImperfectParameters && null != version && null != variant && null != projectPath\n\n    override fun toString() =\n        \"[${this::class.java.simpleName}] - [version:${version}] - [variant:${variant}] - \" +\n                \"[project:${projectPath}] - [register:${register}]\"\n\n}\n\nclass ProjectMode(\n    parameters: How\n) : PickHow(parameters) {\n    constructor(projectPath: String? = null) : this(How(projectPath = projectPath))\n\n    override fun copy(parameters: How) = ProjectMode(parameters)\n}\n\nclass MavenMode(\n    parameters: How\n) : PickHow(parameters) {\n    constructor(version: String? = null, variant: String? = null) : this(How(version = version, variant = variant))\n\n    override fun copy(parameters: How) = MavenMode(parameters)\n}\n\nclass TmpDirMode(\n    parameters: How\n) : PickHow(parameters) {\n    constructor() : this(How())\n\n    override fun copy(parameters: How) = TmpDirMode(parameters)\n}\n\nclass NoSourceMode(\n    parameters: How\n) : PickHow(parameters) {\n    constructor(register: RouterRegister) : this(How(register = register))\n\n    override fun copy(parameters: How) = NoSourceMode(parameters)\n}\n\nclass ImperfectParameters(\n    parameters: How\n) : PickHow(parameters) {\n    constructor(\n        version: String?,\n        variant: String?,\n        projectPath: String?\n    ) : this(How(version = version, variant = variant, projectPath = projectPath))\n\n    override fun copy(parameters: How) = ImperfectParameters(parameters)\n}\n\nfun PickHow?.mergeLowerPriority(vararg lowers: PickHow?): PickHow? {\n    val how = lowers.fold(this) { acc, lower ->\n        if (null != lower && acc?.isSufficient() != true) when (acc) {\n            null -> lower\n            is ImperfectParameters -> lower.mergeHigherPriority(acc)\n            else -> acc.mergeLowerPriority(lower)\n        }\n        else acc\n    }\n    return how\n}\n\ntypealias FlavorHows = Map<String?, PickHow>\n\nval FlavorHows.defaultPickOnly: Boolean\n    get() = this.isEmpty() || (size == 1 && null != get(null))\n\n\nfun FlavorHows.flavorMergeDefault() = toMutableMap().apply {\n    forEach { (flavor, how) ->\n        if (null != flavor) {\n            how.mergeLowerPriority(this[null])?.let { newHow ->\n                this[flavor] = newHow\n            }\n        }\n    }\n}\n\nfun FlavorHows.forEachByFlavorOrDefault(\n    byFlavor: (String, PickHow) -> Unit,\n    default: ((PickHow) -> Unit)? = null\n) {\n    val hasFlavor = keys.any { key -> key != null }\n    forEach { (flavor, packHow) ->\n        if ((hasFlavor && flavor != null)) {\n            byFlavor(flavor, packHow)\n        } else if ((!hasFlavor && flavor == null) && null != default) {\n            default(packHow)\n        }\n    }\n}\n\nfun FlavorHows?.toLog(tag: String): String {\n    return if (this == null) \"\" else \" \\n${tag}\" +\n            if (this.isNotEmpty())\n                this.toList().fold(\"\") { acc, (flavor, pickHow) ->\n                    acc + (if (this.size == 1) \"\" else \"\\n   \") + \" -> FLAVOR:${flavor} HOW : $pickHow\"\n                }\n            else \" EMPTY! \"\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/pick/PickWhat.kt",
    "content": "package com.rubik.pick\n\nimport com.ktnail.gradle.DependencyType\nimport com.rubik.context.extra.Context\nimport com.rubik.context.publication.LibType\n\n\nclass PickWhat(\n    val where: PickWhere,\n    val items: Array<What> = arrayOf(),\n    val forFlavor: String? = null,\n    val dev: Boolean? = null\n) {\n\n    override fun toString(): String =\n        \"[$where] - [${items.joinToString(\",\")}] - [flavor:${forFlavor}] - [dev:${dev}]\"\n\n    val itemsOnlyLib = null == items.find { what -> what is What.Component }\n\n}\n\nsealed class What(\n    val dependencyType: String\n) {\n    open fun condition(context: Context) = true\n\n    class Component(\n        dependencyType: String = DependencyType.IMPLEMENTATION\n    ) : What(dependencyType) {\n        override fun toString() = \"$dependencyType COMPONENT\"\n    }\n\n    class Lib(\n        dependencyType: String = DependencyType.IMPLEMENTATION,\n        val type: String\n    ) : What(dependencyType) {\n        override fun condition(context: Context) =\n            if (!context.enableProvideRoute)\n                false\n            else if (type == LibType.ORIGINAL_VALUE)\n                context.source.publishOriginalValue\n            else\n                true\n\n        override fun toString() = \"$dependencyType LIB-${type}\"\n    }\n}\n\nfun shellPackingComponentWhat(\n    forFlavor: String?,\n    where: PickWhere\n) = PickWhat(\n    where,\n    arrayOf(What.Component()),\n    forFlavor = forFlavor\n)\n\nfun shellPackingLibWhat() = PickWhat(\n    ByAll(),\n    arrayOf(\n        What.Lib(type = LibType.CONTEXT),\n        What.Lib(dependencyType = DependencyType.COMPILE_ONLY, type = LibType.ORIGINAL_VALUE)\n    )\n)\n\nfun contextDependLibWhat(\n    uri: String,\n    dev: Boolean?\n) = PickWhat(\n    ByUri(uri),\n    arrayOf(\n        What.Lib(type = LibType.CONTEXT),\n        What.Lib(dependencyType = DependencyType.COMPILE_ONLY, type = LibType.ORIGINAL_VALUE)\n    ), dev = dev\n)\n\n\nfun contextDependLibCompileOnlyWhat(\n    uri: String,\n    dev: Boolean?\n) = PickWhat(\n    ByUri(uri),\n    arrayOf(\n        What.Lib(dependencyType = DependencyType.COMPILE_ONLY, type = LibType.CONTEXT),\n        What.Lib(dependencyType = DependencyType.COMPILE_ONLY, type = LibType.ORIGINAL_VALUE)\n    ), dev = dev\n)\n\nfun contextDependComponentWhat(\n    uri: String,\n    forFlavor: String?\n) = PickWhat(\n    ByUri(uri),\n    arrayOf(What.Component()),\n    forFlavor = forFlavor\n)\n\n\nfun contextDependComponentCompileOnlyWhat(\n    uri: String,\n    forFlavor: String?\n) = PickWhat(\n    ByUri(uri),\n    arrayOf(What.Component(dependencyType = DependencyType.COMPILE_ONLY)),\n    forFlavor = forFlavor\n)"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/pick/PickWhere.kt",
    "content": "package com.rubik.pick\n\nsealed class PickWhere{\n    val tagName: String?\n        get() = if (this is ByTag) tag else null\n}\n\nopen class ByUri(\n    val uri: String\n) : PickWhere() {\n    companion object {\n        fun create(uri: String): PickWhere {\n            return when {\n                uri == \"*\" -> ByAll()\n                uri.contains('*') -> ByFuzzyUri(uri)\n                else -> ByUri(uri)\n            }\n        }\n    }\n\n    override fun toString(): String {\n        return \"byUri:$uri\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        return (other as? ByUri)?.uri == uri\n    }\n\n    override fun hashCode(): Int {\n        return uri.hashCode()\n    }\n}\n\nclass ByFuzzyUri(\n    private val fuzzyUri: String\n) : PickWhere() {\n    override fun toString(): String {\n        return \"byFuzzyUri:${fuzzyUri}\"\n    }\n\n    fun matching(matchingUri: String): Boolean {\n        if (matchingUri.isBlank() || fuzzyUri.isBlank())\n            return false\n\n        var fuzzyIndex = 0\n        var givenIndex = 0\n        var fuzzyMatching = false\n\n        while (givenIndex < matchingUri.length) {\n\n            val fuzzyChar = fuzzyUri.getOrNull(fuzzyIndex)\n            val givenChar = matchingUri[givenIndex]\n\n            if (fuzzyMatching) {\n                if (fuzzyChar == givenChar) {\n                    fuzzyIndex++\n                    fuzzyMatching = false\n                }\n            } else if (fuzzyChar == '*') {\n                fuzzyIndex++\n                fuzzyMatching = true\n            } else if (fuzzyChar == givenChar) {\n                fuzzyIndex++\n            } else {\n                return false\n            }\n            givenIndex++\n        }\n\n        return fuzzyIndex == fuzzyUri.length\n    }\n}\n\ndata class ByTag(\n    val tag: String\n) : PickWhere() {\n    override fun toString(): String {\n        return \"byTag:$tag\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        return (other as? ByTag)?.tag == tag\n    }\n\n    override fun hashCode(): Int {\n        return tag.hashCode()\n    }\n}\n\nclass ByAll : PickWhere() {\n    override fun toString(): String {\n        return \"all\"\n    }\n\n    override fun equals(other: Any?): Boolean {\n        return other is ByAll\n    }\n\n    override fun hashCode(): Int {\n        return javaClass.hashCode()\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/ContextPickHow.kt",
    "content": "package com.rubik.picker\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.x.Logger\nimport com.ktnail.x.mergeAll\nimport com.rubik.context.extra.Context\nimport com.rubik.context.MavenSource\nimport com.rubik.global.GlobalConfig\nimport com.rubik.pick.*\nimport com.rubik.context.extra.globalConfig\nimport com.rubik.picker.extra.configPickParameters\nimport com.rubik.picker.extra.sourcePickHows\nimport com.rubik.picker.extra.toPickParameters\nimport com.rubik.picker.log.LogTags\n\nclass ContextPickHow(val context: Context) {\n\n    private var shellPacking: PickCase? = null\n    private var shellPickCaseCache: PickCase? = null\n\n    var sourcePickHow: FlavorHows? = null\n\n    private val configByTag = mutableMapOf<String?, FlavorHows>()\n\n    fun hold(hows: FlavorHows?, what: PickWhat) {\n        shellPacking = PickCase(what).apply {\n            hows?.let { addPickHows(hows) }\n        }\n    }\n\n    fun release(exc: Excepted): Boolean {\n        return shellPacking?.let { case ->\n            case.removeFlavor(exc.forFlavor)\n            !case.hasHow\n        } ?: false\n    }\n\n    fun pickCase(what: PickWhat) = PickCase(what).apply {\n        if (null != what.forFlavor) {\n            shellPickCases()?.getFlavorHow(what.forFlavor)?.let { how ->\n                addFlavorHow(what.forFlavor, how)\n            }\n        } else {\n            shellPickCases()?.flavorHows?.let { hows->\n                addPickHows(hows)\n            }\n        }\n\n        if (!hasHow) {\n            val tagConfig = tagConfig(what.where.tagName)\n            if (null != what.forFlavor)\n                tagConfig[what.forFlavor]?.let { how ->\n                    addFlavorHow(what.forFlavor, final(how))\n                }\n            else\n                tagConfig.forEach { (forFlavor, how) ->\n                    if (null != forFlavor) addFlavorHow(forFlavor, final(how))\n                    else addDefaultHow(final(how))\n                }\n        }\n\n    }\n\n    fun shellPickCases(variant: BaseVariant): PickCase? = shellPickCases()?.filter(variant)\n\n    fun shellPickCases(): PickCase? {\n        // SHELL (packing) >  SOURCE  > CONFIG\n        return shellPickCaseCache ?:shellPacking?.let { shell -> // HAS Shell packing\n            PickCase(shell.what).apply {\n                val sourcePacking = context.sourcePickHows\n                val tagConfigs = tagConfig(shell.what.where.tagName)\n                if (shell.defaultPickOnly) {  // SHELL undefine flavor , Subject to SOURCE and CONFIG\n                    val shellHow = shell.getDefaultHow()\n                    if (sourcePacking.defaultPickOnly) {   // SOURCE undefine flavor , Subject to CONFIG\n                        val sourceHow = sourcePacking[null]\n                        tagConfigs.forEachByFlavorOrDefault(\n                            byFlavor = { flavor, how ->\n                                addFlavorHow(flavor, final(shellHow.mergeLowerPriority(sourceHow, how)))\n                            },\n                            default = { how ->\n                                addDefaultHow(final(shellHow.mergeLowerPriority(sourceHow, how)))\n                            }\n                        )\n                    } else { // SOURCE has different flavor , Subject to SOURCE\n                        sourcePacking.forEachByFlavorOrDefault(\n                            byFlavor = { flavor, how ->\n                                addFlavorHow(flavor, final(shellHow.mergeLowerPriority(how, tagConfigs[flavor])))\n                            }\n                        )\n                    }\n                } else { // SHELL has different flavor , Subject to SHELL\n                    shell.flavorHows.forEachByFlavorOrDefault(\n                        byFlavor = { flavor, how ->\n                            val shellHow = shell.getFlavorHow(flavor)\n                            addFlavorHow(flavor, final(shellHow.mergeLowerPriority(how, sourcePacking[flavor], tagConfigs[flavor])))\n                        }\n                    )\n                }\n                Logger.dta(LogTags.PICK_CASE) { \" <${context.uri}> SHELL PICK CASES : \" + this.toLog() }\n                shellPickCaseCache = this\n            }\n        }\n    }\n\n    private fun tagConfig(tagName: String?): FlavorHows =\n        configByTag[tagName] ?: if (null != tagName) {\n            val sourceConfig = context.tags[tagName]?.configPickParameters\n            val globalConfig = globalConfig.tagConfigPickParameters(tagName)\n            val tagConfig = sourceConfig?.mergeAll(globalConfig) { left, right ->\n                left.mergeLowerPriority(right)\n            } ?: globalConfig\n            tagConfig.mergeAll(config()) { left, right ->\n                left.mergeLowerPriority(right)\n            }.flavorMergeDefault().apply {\n                configByTag[tagName] = this\n                Logger.dta(LogTags.PICK_CASE) { \" <${context.uri}> TAG($tagName) HOWS CONFIG :\"+\n                        sourceConfig.toLog(\"   >> SOURCE \") +\n                        globalConfig.toLog(\"   >> GLOBAL \") +\n                        this.toLog(\"   >> MERGED \")\n                }\n            }\n        } else {\n            config()\n        }\n\n    private fun config(): FlavorHows = configByTag[null] ?: let {\n        val sourceConfig = context.source.configPickParameters\n        val globalConfig = globalConfig.configPickParameters(context.uri)\n        sourceConfig.mergeAll(globalConfig) { left, right ->\n            left.mergeLowerPriority(right)\n        }.flavorMergeDefault().apply {\n            configByTag[null] = this\n            Logger.dta(LogTags.PICK_CASE) { \" <${context.uri}> HOWS CONFIG : \" +\n                    sourceConfig.toLog(\"   >> SOURCE \") +\n                    globalConfig.toLog(\"   >> GLOBAL \") +\n                    this.toLog(\"   >> MERGED \")\n            }\n        }\n    }\n\n\n    private fun final(how: PickHow?): PickHow {\n        val result = when (how) {\n            null -> ProjectMode()\n            is ImperfectParameters -> ProjectMode().mergeHigherPriority(how)\n            else -> how\n        }\n//        Logger.da(LogTags.PICK) { \" FINAL PICK HOW:[${context.uri}]  \\n   >> $result\" }\n        return result\n    }\n\n    fun GlobalConfig.configPickParameters(uri: String): FlavorHows =\n        mutableMapOf<String?, PickHow>().apply {\n            val config = uris[uri] ?: MavenSource(null, null, null)\n            put(null, config.toPickParameters(defaultVariant))\n            config.flavors?.forEach { (flavor, maven) ->\n                put(flavor, maven.toPickParameters(defaultVariant))\n            }\n        }\n\n    fun GlobalConfig.tagConfigPickParameters(tagName: String): FlavorHows =\n        mutableMapOf<String?, PickHow>().apply {\n            tags[tagName]?.let { config ->\n                put(null, config.toPickParameters(defaultVariant))\n                config.flavors?.forEach { (flavor, maven) ->\n                    put(flavor, maven.toPickParameters(defaultVariant))\n                }\n            }\n        }\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/ContextPicker.kt",
    "content": "package com.rubik.picker\n\nimport com.android.build.gradle.internal.dsl.BuildType\nimport com.ktnail.gradle.androidExtension\nimport com.ktnail.gradle.flavorNamesInDimensions\nimport com.ktnail.gradle.p\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.x.Logger\nimport com.ktnail.x.firstOrNull\nimport com.rubik.context.extra.Context\nimport com.rubik.pick.*\nimport com.rubik.picker.exception.RubikProjectNoFlavorFoundException\nimport com.rubik.context.Ext\nimport com.rubik.picker.container.ContextPickCase\nimport com.rubik.context.extra.globalConfig\nimport com.rubik.picker.extra.getPickCase\nimport com.rubik.picker.extra.obtainContext\nimport com.rubik.picker.log.LogTags\nimport org.gradle.api.Project\n\nclass ContextPicker {\n    companion object {\n        private const val FLAVOR_DIMENSION = \"RUBIK_AUTO_FILL_FLAVOR_DIMENSION\"\n    }\n\n    fun pick(\n        cases: List<ContextPickCase>,\n        forProject: Project\n    ) {\n        cases.forEach { case ->\n            pickCase(case.pickCase, forProject,  case.context, null, null)\n        }\n    }\n\n    fun pick(\n        what: PickWhat,\n        forProject: Project,\n        forceMode: PickHow? = null,\n        exceptBuildType: ((BuildType) -> Boolean)? = null,\n        pickMavenResult: ((PickResult) -> Unit)? = null\n    ) {\n        what.where.obtainContext(\n            strict = forProject.propertyOr(Ext.RUBIK_STRICT_TOUCHING_AND_PACKING, true)\n        ).forEach { context ->\n            pickCase(\n                context.getPickCase(what),\n                forProject,\n                context,\n                forceMode,\n                exceptBuildType,\n                pickMavenResult\n            )\n        }\n    }\n\n    private fun pickCase(\n        case: PickCase,\n        forProject: Project,\n        context: Context,\n        forceMode: PickHow? = null,\n        exceptBuildType: ((BuildType) -> Boolean)? = null,\n        pickMavenResult: ((PickResult) -> Unit)? = null\n    ) {\n\n        case.processForceMode(forceMode, context)\n            .processOnlyLib(forProject)\n            .processFalsePick(context, pickMavenResult)\n            .processMergeFlavor()\n            .processFlavorCheck(context, forProject, false)\n            .let { processedCase ->\n                processedCase.flavorHows.forEach { (flavor, how) ->\n                    pickCase(\n                        processedCase.what,\n                        how,\n                        forProject,\n                        flavor,\n                        context,\n                        exceptBuildType,\n                        pickMavenResult\n                    )\n                }\n            }\n\n    }\n\n    private fun pickCase(\n        what: PickWhat,\n        how: PickHow,\n        forProject: Project,\n        forFlavor: String?,\n        context: Context,\n        exceptBuildType: ((BuildType) -> Boolean)? = null,\n        pickMavenResult: ((PickResult) -> Unit)? = null\n    ) {\n        Logger.p(LogTags.PICK_CASE, forProject) {  \"\\n    > WHAT:${what}\\n    > HOW:${how} \" }\n\n        when (how) {\n            is MavenMode -> {\n                MavenPicker(what, how, context, pickMavenResult).pick(forProject, forFlavor)\n            }\n            is ProjectMode -> {\n                ProjectPicker(what, how, context, exceptBuildType).pick(forProject, forFlavor)\n            }\n            is TmpDirMode -> {\n                TmpDirLibPicker(what, how, context).pick(forProject, forFlavor)\n            }\n            else -> { /* nothing */\n            }\n        }\n    }\n\n    private fun PickCase.processForceMode(\n        forceMode: PickHow?,\n        context: Context\n    ): PickCase {\n        return if (\n            null != forceMode ||\n            globalConfig.forceMavenModeEnable ||\n            globalConfig.forceProjectModeEnable\n        )\n            PickCase(what).also { newCase ->\n                newCase.addPickHows(flavorHows.mapValues { (_, baseHow) ->\n                    val forceHow = when {\n                        null != forceMode -> forceMode\n                        baseHow is NoSourceMode -> baseHow\n                        globalConfig.forceMavenModeEnable -> MavenMode()\n                        globalConfig.forceProjectModeEnable && null != baseHow.projectPath -> ProjectMode()\n                        else -> baseHow\n                    }\n\n                    if (forceHow != baseHow) forceHow.mergeLowerPriority(baseHow)\n                    else baseHow\n\n                })\n            } else this\n    }\n\n    private fun PickCase.processOnlyLib(project: Project): PickCase {\n        return if (pickLibOnly) {\n            PickCase(what).also { newCase ->\n                flavorHows.firstOrNull()?.let { how->\n                    if (project.propertyOr(Ext.RUBIK_TMP_LIB_DIR_MODE, false)) {\n                        newCase.addDefaultHow(TmpDirMode().mergeLowerPriority(how))\n                    } else if (how is TmpDirMode || how is MavenMode) {\n                        newCase.addDefaultHow(how)\n                    } else {\n                        newCase.addDefaultHow(MavenMode().mergeLowerPriority(how))\n                    }\n                }\n            }\n        } else this\n    }\n\n    private fun PickCase.processFalsePick(\n        context: Context,\n        pickMavenResult: ((PickResult) -> Unit)?\n    ): PickCase {\n        return this.apply {\n            if (null != pickMavenResult && !mavenMode) {\n                flavorHows.forEach { (flavor, how) ->\n                    MavenPicker(what, how, context, pickMavenResult).falsePick(flavor)\n                }\n            }\n        }\n    }\n\n    private fun PickCase.processMergeFlavor(): PickCase {\n        return if (!defaultPickOnly && noFlavorNeedMode) {\n            PickCase(what).also { newCase ->\n                firstHow?.let { how ->\n                    newCase.addDefaultHow(how)\n                }\n            }\n        } else this\n    }\n\n    private fun PickCase.processFlavorCheck(\n        context: Context,\n        forProject: Project,\n        autoFill:Boolean\n    ): PickCase {\n        return this.apply {\n            if (forProject.propertyOr(Ext.RUBIK_CHECK_FLAVOR_WHEN_PICK, true) || autoFill) {\n                flavorHows.forEach { (forFlavor, _) ->\n                    if (null != forFlavor) {\n                        if (!forProject.flavorNamesInDimensions().contains(forFlavor)) {\n                            if (!autoFill)\n                                throw RubikProjectNoFlavorFoundException(forProject.path, context.uri, forFlavor)\n                            else {\n                                forProject.androidExtension?.flavorDimensions(FLAVOR_DIMENSION)\n                                forProject.androidExtension?.productFlavors?.create(forFlavor) {\n                                    it.dimension = FLAVOR_DIMENSION\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    fun fillFlavor(what: PickWhat, forProject: Project) {\n        what.where.obtainContext().forEach { context ->\n            context.getPickCase(what).processFlavorCheck(context, forProject, true)\n        }\n    }\n\n    data class PickResult(\n        val context: Context,\n        val version: String,\n        val variant: String?\n    )\n}\n"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/MavenPicker.kt",
    "content": "package com.rubik.picker\n\nimport com.ktnail.gradle.addDependency\nimport com.ktnail.gradle.maven.MavenDependency\nimport com.rubik.context.extra.Context\nimport com.rubik.pick.PickHow\nimport com.rubik.pick.PickWhat\nimport com.rubik.picker.extra.toMavenDependency\nimport org.gradle.api.Project\n\nclass MavenPicker(\n    override val what: PickWhat,\n    override val how: PickHow?,\n    override val context: Context,\n    private val afterPick: ((ContextPicker.PickResult) -> Unit)? = null\n) : Picker {\n\n    override fun pick(forProject: Project, forFlavor: String?) {\n        toDependencies(forFlavor).forEach { (type ,dependency)->\n            val version = dependency.version ?: \"\"\n            val variant = how?.variant ?: \"\"\n            forProject.addDependency(type, dependency)\n            afterPick?.invoke(ContextPicker.PickResult(context, version, variant))\n        }\n    }\n\n    fun toDependencies(forFlavor: String?): List<Pair<String, MavenDependency>> =\n        mutableListOf<Pair<String, MavenDependency>>().apply {\n        if (null != how) {\n            what.items.filter { what -> what.condition(context) }.forEach { item ->\n                add(\n                    item.dependencyType to context.toMavenDependency(\n                        item,\n                        how,\n                        dev = what.dev,\n                        forFlavor = forFlavor\n                    )\n                )\n            }\n        }\n    }\n\n    fun falsePick(forFlavor: String?) {\n        toDependencies(forFlavor).forEach { (_, dependency) ->\n            val version = dependency.version ?: \"\"\n            val variant = how?.variant ?: \"\"\n            afterPick?.invoke(ContextPicker.PickResult(context, version, variant))\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/PickCase.kt",
    "content": "package com.rubik.picker\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.x.findFirstOrNull\nimport com.ktnail.x.firstOrNull\nimport com.rubik.context.router.RouterRegister\nimport com.rubik.pick.*\n\n\ndata class PickCase(\n    val what: PickWhat\n){\n    val flavorHows: MutableMap<String?, PickHow> = mutableMapOf()\n\n     fun addPickHows(hows: FlavorHows) {\n         flavorHows.putAll(hows)\n    }\n\n    fun addDefaultHow(how: PickHow) {\n        flavorHows[null] = how\n    }\n\n    fun addFlavorHow(flavor: String?, how: PickHow) {\n        flavorHows[flavor] = how\n    }\n\n    fun getDefaultHow(): PickHow? = flavorHows[null]\n\n    fun getFlavorHow(flavorName: String?): PickHow? = flavorHows[flavorName]\n\n    fun removeFlavor(forFlavor: String?) {\n        flavorHows.remove(forFlavor)\n    }\n\n    val hasHow: Boolean\n        get() = flavorHows.isNotEmpty()\n\n    val defaultPickOnly: Boolean\n        get() = flavorHows.defaultPickOnly\n\n    val pickLibOnly\n        get() = what.itemsOnlyLib\n\n    val projectMode\n        get() = flavorHows.any { (_, how) -> how is ProjectMode}\n\n    val noFlavorNeedMode\n        get() = flavorHows.any { (_, how) -> how is ProjectMode || how is TmpDirMode || how is NoSourceMode }\n\n    val mavenMode\n        get() = !noFlavorNeedMode\n\n    fun filter(variant: BaseVariant) =\n        PickCase(what).also { newCase ->\n            flavorHows.forEach{ (flavor, how) ->\n                if (flavor == null || flavor in variant.productFlavors.mapNotNull { productFlavor -> productFlavor.name })\n                    if (null == flavor) newCase.addDefaultHow(how)\n                    else newCase.addFlavorHow(flavor, how)\n            }\n        }\n\n    fun toLog(): String = \"\\n   >> WHAT: $what${flavorHows.toLog(\"   >> HOWS: \")}\"\n\n    val register: RouterRegister\n        get() = flavorHows.findFirstOrNull { how -> null != how.register }?.register ?: RouterRegister.NEW_INSTANCE\n\n    val firstHow: PickHow?\n        get() = flavorHows.firstOrNull()\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/Picker.kt",
    "content": "package com.rubik.picker\n\n\nimport com.rubik.context.extra.Context\nimport com.rubik.pick.PickHow\nimport com.rubik.pick.PickWhat\nimport org.gradle.api.Project\n\ninterface Picker {\n    val what: PickWhat\n    val how: PickHow?\n    val context: Context\n\n    fun pick(forProject: Project, forFlavor: String?)\n}\n\n"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/ProjectPicker.kt",
    "content": "package com.rubik.picker\n\nimport com.android.build.gradle.internal.dsl.BuildType\nimport com.ktnail.gradle.addProjectDependency\nimport com.ktnail.gradle.androidExtension\nimport com.rubik.context.extra.Context\nimport com.rubik.pick.PickHow\nimport com.rubik.pick.PickWhat\nimport com.rubik.pick.What\nimport com.rubik.picker.exception.RubikProjectNotFoundException\nimport com.rubik.picker.exception.RubikProjectPathNotSetException\nimport org.gradle.api.Project\n\nclass ProjectPicker(\n    override val what: PickWhat,\n    override val how: PickHow?,\n    override val context: Context,\n    private val  exceptBuildType: ((BuildType) -> Boolean)? = null\n) : Picker {\n    override fun pick(forProject: Project, forFlavor: String?) {\n        if (null == how) return\n        val path = how.projectPath\n        path ?: throw RubikProjectPathNotSetException(context.uri)\n        if (path != forProject.path) {\n            val projectToPick = try {\n                forProject.project(path)\n            } catch (e: Exception) {\n                throw RubikProjectNotFoundException(context.uri, path)\n            }\n            what.items.filter { what -> what.condition(context) }.forEach { item ->\n                if (item is What.Component) {\n                    doPick(item, forProject, forFlavor, projectToPick)\n                }\n            }\n        }\n    }\n\n    private fun doPick(\n        component: What.Component, forProject: Project, forFlavor: String?, projectToPick: Project\n    ) {\n        when {\n            null != forFlavor -> forProject.addProjectDependency(\n                component.dependencyType,\n                forFlavor,\n                projectToPick\n            )\n            null != exceptBuildType -> forProject.androidExtension?.buildTypes?.all { buildType ->\n                if (!exceptBuildType.invoke(buildType)) {\n                    forProject.addProjectDependency(\n                        component.dependencyType,\n                        buildType.name,\n                        projectToPick\n                    )\n                }\n            }\n            else -> forProject.addProjectDependency(\n                component.dependencyType,\n                projectToPick\n            )\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/TmpDirLibPicker.kt",
    "content": "package com.rubik.picker\n\nimport com.ktnail.gradle.addDirDependency\nimport com.rubik.context.extra.Context\nimport com.rubik.context.extra.libTmpDirRoot\nimport com.rubik.pick.PickHow\nimport com.rubik.pick.PickWhat\nimport com.rubik.pick.What\nimport com.rubik.context.folder.getLibsTmpDir\nimport org.gradle.api.Project\n\nclass TmpDirLibPicker(\n    override val what: PickWhat,\n    override val how: PickHow?,\n    override val context: Context\n): Picker {\n    override fun pick(forProject: Project, forFlavor: String?) {\n        what.items.filter { what -> what.condition(context) }.forEach { item ->\n            if (item is What.Lib) {\n                doPick(item, forProject, context)\n            }\n        }\n    }\n\n    private fun doPick(\n        lib: What.Lib, forProject: Project, context: Context\n    ) {\n        forProject.addDirDependency(\n            lib.dependencyType, getLibsTmpDir(forProject.libTmpDirRoot, context.uri, lib.type)\n        )\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/container/ContextPickHowContainer.kt",
    "content": "package com.rubik.picker.container\n\nimport com.rubik.context.extra.Context\nimport com.rubik.picker.ContextPickHow\n\nclass ContextPickHowContainer {\n    private val pickCases = mutableMapOf<String, ContextPickHow>()\n    fun pickCase(context: Context) = pickCases.getOrPut(context.uri) { ContextPickHow(context) }\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/container/PickedContextsContainer.kt",
    "content": "package com.rubik.picker.container\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.rubik.context.extra.Context\nimport com.rubik.pick.*\nimport com.rubik.picker.*\nimport com.rubik.picker.extra.getShellPickCase\nimport com.rubik.picker.extra.holdPicked\nimport com.rubik.picker.extra.obtainContext\nimport com.rubik.picker.extra.releasePicked\n\nclass PickedContextsContainer {\n    private val contexts = mutableMapOf<String, Context>()\n\n    fun register(what: PickWhat, hows: FlavorHows?) {\n        what.where.obtainContext().forEach { context ->\n            context.holdPicked(hows, what)\n            contexts[context.uri] = context\n        }\n    }\n\n    fun unRegister(excepted: Excepted) {\n        excepted.where.obtainContext().forEach { context ->\n            if (null == excepted.forFlavor) {\n                context.releasePicked(excepted)\n                contexts.remove(context.uri)\n            } else {\n                if (context.releasePicked(excepted)) {\n                    contexts.remove(context.uri)\n                }\n            }\n        }\n    }\n\n    fun pickCases(variant: BaseVariant? = null) = contexts.mapNotNull { (_, context) ->\n        context.getShellPickCase(variant)?.let { case->\n            ContextPickCase(context, case)\n        }\n    }\n\n}\n\ndata class ContextPickCase(val context: Context, val pickCase: PickCase)"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/exception/RubikMavenDependencyVersionNotSetException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.picker.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when context dependency maven but no version set.\n *\n * @since 1.5\n */\nclass RubikMavenDependencyVersionNotSetException(\n    private val uri: String\n) : RuntimeException() {\n    override fun toString() =\n        \"RubikMavenDependencyVersionNotSetException context dependency maven but no version set. uri<$uri> ! \"\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/exception/RubikMavenVariantNotSetException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.picker.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when Component in mavenMode but no variant set.\n *\n * @since 1.5\n */\nclass RubikMavenVariantNotSetException(val uri:String) : RuntimeException() {\n    override fun toString() =\n        \"RubikMavenVariantNotSetException component <${uri}> in mavenMode but no variant set ! \"\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/exception/RubikMavenVersionNotSetException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.picker.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when Component in mavenMode but no version set.\n *\n * @since 1.5\n */\nopen class RubikMavenVersionNotSetException(val uri:String) : RuntimeException() {\n    override fun toString() =\n        \"RubikMavenVersionNotSetException component<${uri}> in mavenMode but no version set ! \"\n}\n"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/exception/RubikProjectNotFoundException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.picker.exception\n\n/**\n * Thrown when Context in projectMode but no project path set.\n *\n * @since 1.8\n */\ninternal class RubikProjectNotFoundException(private val uri:String, private val path:String) : RuntimeException() {\n    override fun toString() =\n        \"RubikProjectPathNotFoundException uri[${uri}] in projectMode but not found project use path[$path] ! \"\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/exception/RubikProjectPathNotSetException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.picker.exception\n\n/**\n * Thrown when Context in projectMode but no project path set.\n *\n * @since 1.5\n */\ninternal class RubikProjectPathNotSetException(private val uri:String) : RuntimeException() {\n    override fun toString() =\n        \"RubikProjectPathNotSetException uri [${uri}] in projectMode but no project path set ! \"\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/exception/RubikPublicationTypeNotConfigureException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.picker.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown pick component or context libs for flavor, but can not found the flavor in project .\n *\n * @since 1.9\n */\ninternal open class RubikProjectNoFlavorFoundException(\n    private val projectPath:String,\n    val uri: String,\n    val flavor:String\n) : RuntimeException() {\n    override fun toString() =\n        \"RubikProjectNoFlavorFoundException pick <$uri> for project[$projectPath] , \" +\n                \"flavor[$flavor] not found ! \"\n}"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/extra/Context.kt",
    "content": "package com.rubik.picker.extra\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.propertyOr\nimport com.rubik.context.*\nimport com.rubik.context.extra.contextsContainer\nimport com.rubik.context.extra.Context\nimport com.rubik.pick.*\nimport com.rubik.picker.PickCase\nimport org.gradle.api.Project\n\n\nfun PickWhere.obtainContext(strict: Boolean = true): List<Context> {\n    return when (this) {\n        is ByFuzzyUri -> {\n            contextsContainer.obtainAny().filter { context-> this.matching(context.uri) }\n        }\n        is ByUri -> {\n            contextsContainer.obtainByUri(uri, strict)?.let { context ->\n                listOf(context)\n            }\n        }\n        is ByTag -> {\n            contextsContainer.obtainByTag(this.tag)\n        }\n        is ByAll -> {\n            contextsContainer.obtainAny()\n        }\n    } ?: emptyList()\n}\n\n//  pick case\nfun Context.holdPicked(hows: FlavorHows?, what: PickWhat) {\n    pickCase.hold(hows, what)\n}\n\nfun Context.releasePicked(exc: Excepted) = pickCase.release(exc)\n\nfun Context.getShellPickCase(variant: BaseVariant? = null): PickCase? {\n    return if (null != variant) pickCase.shellPickCases(variant) else return pickCase.shellPickCases()\n}\n\nfun Context.getPickCase(what: PickWhat): PickCase {\n    return pickCase.pickCase(what)\n}\n\nval Context.sourcePickHows: FlavorHows\n    get() = sourcePickHow ?: mutableMapOf()\n\nval Source.configPickParameters: FlavorHows\n    get() = mutableMapOf<String?, PickHow>().apply {\n        put(null, toPickParameters())\n        maven.flavors?.forEach { (flavor, flavorMaven) ->\n            put(flavor, flavorMaven.toPickParameters())\n        }\n    }\n\nfun Source.toPickParameters() =\n    ImperfectParameters(maven.version, maven.variant, projectPath)\n\nfun MavenSource.toPickParameters(defaultVariant: String? = null) =\n    ImperfectParameters(version, variant ?: defaultVariant, null)\n\nfun Dependency.componentPickWhat(project: Project): PickWhat =\n    if (project.propertyOr(Ext.RUBIK_CONTEXT_PACKING_COMPILE_ONLY, true))\n        contextDependComponentCompileOnlyWhat(uri, forFlavor)\n    else contextDependComponentWhat(uri, forFlavor)\n\n"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/extra/Injector.kt",
    "content": "package com.rubik.picker.extra\n\nimport com.ktnail.gradle.maven.MavenDependency\nimport com.rubik.context.extra.Context\nimport com.rubik.pick.FlavorHows\nimport com.rubik.pick.PickHow\nimport com.rubik.pick.What\nimport com.rubik.picker.container.ContextPickHowContainer\nimport com.rubik.picker.container.PickedContextsContainer\nimport com.rubik.context.utility.Module\nimport com.rubik.context.utility.ModuleInjector\nimport com.rubik.picker.ContextPickHow\n\n\ninterface PickerModuleInjector : ModuleInjector {\n    val pickedContextsContainer: PickedContextsContainer\n    val pickHowContainer: ContextPickHowContainer\n\n    fun contextToMavenDependency(\n        context: Context,\n        item: What,\n        maven: PickHow,\n        dev: Boolean?,\n        forFlavor: String?\n    ): MavenDependency\n}\n\nobject PickerModule : Module<PickerModuleInjector>()\n\nval pickedContextsContainer: PickedContextsContainer\n    get() = PickerModule.content.pickedContextsContainer\n\nval Context.pickCase: ContextPickHow\n    get() = PickerModule.content.pickHowContainer.pickCase(this)\n\nvar Context.sourcePickHow: FlavorHows?\n    set(value) {\n        pickCase.sourcePickHow = value\n    }\n    get() = pickCase.sourcePickHow\n\nfun Context.toMavenDependency(\n    item: What,\n    maven: PickHow,\n    dev: Boolean?,\n    forFlavor: String?\n): MavenDependency = PickerModule.content.contextToMavenDependency(this, item, maven, dev, forFlavor)"
  },
  {
    "path": "rubik/rubik_picker/src/main/java/com/rubik/picker/log/LogTags.kt",
    "content": "package com.rubik.picker.log\n\nimport com.ktnail.x.LogTag\nimport com.ktnail.x.Logger\n\nobject LogTags {\n    val PICK_CASE = LogTag(\"<RUBIK> PICK_CASE \", Logger.Level.LOW)\n}\n\n"
  },
  {
    "path": "rubik/rubik_plugins/build.gradle",
    "content": "apply plugin: 'groovy'\napply plugin: 'kotlin'\napply plugin: 'kotlin-android-extensions'\n\ndependencies {\n    implementation gradleApi()\n    implementation localGroovy()\n\n    implementation \"com.android.tools.build:gradle:$agbt_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    implementation 'com.squareup:kotlinpoet:1.4.0'\n    implementation 'org.javassist:javassist:3.27.0-GA'\n\n    implementation project(':rubik:rubik_context')\n    implementation project(':rubik:rubik_picker')\n    implementation project(':rubik:rubik_dsl')\n    implementation project(':rubik:rubik_publish')\n\n    implementation deps.rubik.annotations\n\n    implementation deps.ktnail.x\n    implementation deps.ktnail.gradle\n}\n\ntasks.withType(JavaCompile) {\n    options.encoding = \"UTF-8\"\n}\n\ncompileKotlin {\n    kotlinOptions.freeCompilerArgs += ['-module-name', \"kmd.mars.rubik.plugins\"]\n}\n\ntasks.withType(GenerateModuleMetadata) {\n    enabled = false\n}\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/ByVersion.kt",
    "content": "const val BY_VERSION = \"1.10.0.0-AGBT4_2-K1_5-LOCAL\"\n// KTNail plugin update.\n//   by [sync].\n//   at timestamp : 2024-05-22 12:51:23.\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/MainPlugin.kt",
    "content": "package com.rubik.plugins\n\nimport com.ktnail.x.Logger\nimport com.ktnail.x.now\nimport com.rubik.publish.extra.PublishModule\nimport com.rubik.context.extra.ContextModule\nimport com.rubik.context.extra.libTmpDirRoot\nimport com.rubik.picker.extra.PickerModule\nimport com.rubik.plugins.basic.extra.logLevel\nimport com.rubik.plugins.basic.extra.logWriteToFile\nimport com.rubik.plugins.basic.extra.rubikSingleton\nimport com.rubik.plugins.context.controller.AllContextController\nimport org.gradle.api.Project\nimport java.io.File\n\n/**\n * The the plugin of rubik config project (gradle root).\n * Provide the ability to define contexts & ext configs.\n *\n * @ Since:1.3\n */\nclass MainPlugin : RubikPlugin() {\n\n    override fun apply(project: Project) {\n        Logger.level = project.logLevel\n        Logger.writeToFile =\n            if (project.logWriteToFile)\n                File(project.libTmpDirRoot.absolutePath + File.separator + now() + \".log\")\n            else null\n\n        ContextModule.inject { project.rubikSingleton }\n        PublishModule.inject { project.rubikSingleton }\n        PickerModule.inject { project.rubikSingleton }\n\n        super.apply(project)\n\n        AllContextController(project).init()\n\n    }\n\n}\n\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/RubikPlugin.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins\n\nimport com.ktnail.gradle.p\nimport com.ktnail.x.Logger\nimport com.rubik.plugins.basic.LogTags\nimport com.rubik.context.exception.RubikPluginNotApplyException\nimport com.rubik.plugins.basic.extra.*\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\n/**\n *  The super class of all gradle plugin in rubik.\n *\n *  @since 1.3\n */\nabstract class RubikPlugin : Plugin<Project> {\n    private var _project: Project? = null\n    val project: Project\n        get() = _project ?: throw RubikPluginNotApplyException()\n\n    override fun apply(project: Project) {\n        _project = project\n        Logger.p(LogTags.PLUGIN, project) { \" APPLIED PLUGIN (${this::class.java})\" }\n        project.rubik\n        project.addRubikRepository()\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/analyst/AnalystPlugin.kt",
    "content": "package com.rubik.plugins.analyst\n\nimport com.ktnail.x.Logger\nimport com.rubik.plugins.RubikPlugin\nimport org.gradle.api.Project\nimport java.io.File\n\n/**\n *\n *  @since 1.8\n */\nclass AnalystPlugin : RubikPlugin() {\n    override fun apply(project: Project) {\n        super.apply(project)\n\n        project.beforeEvaluate {\n            Logger.e(\"beforeEvaluate : ${it.path} executed : ${it.state.executed}\")\n        }\n        project.afterEvaluate {\n            Logger.e(\"afterEvaluate : ${it.path} executed : ${it.state.executed}\")\n        }\n        project.gradle.allprojects{\n            Logger.e(\"allprojects : ${it.path} executed : ${it.state.executed}\")\n\n        }\n        project.gradle.projectsEvaluated{\n            Logger.e(\"projectsEvaluated\")\n\n        }\n        project.gradle.afterProject{\n            Logger.e(\"afterProject: ${it.path} executed : ${it.state.executed}\")\n        }\n        project.gradle.settingsEvaluated{\n            Logger.e(\"settingsEvaluated\")\n\n        }\n        project.gradle.projectsLoaded{\n            Logger.e(\"projectsLoaded\")\n\n        }\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/Constants.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic\n\nimport BY_VERSION\nimport com.ktnail.x.*\nimport org.gradle.api.Project\nimport java.io.File\n\nobject Constants {\n    object Router {\n        const val PACKAGE_NAME = \"com.rubik\"\n        const val RUBIK_CLASS_NAME = \"$PACKAGE_NAME.Rubik\"\n        const val INIT_FUNCTION_NAME = \"init\"\n        const val GENERATE_BASIC_PACKAGE_NAME = \"rubik.generate\"\n        const val GENERATE_PACKAGE_NAME = \"$GENERATE_BASIC_PACKAGE_NAME.shell\"\n        const val GENERATE_RUBIK_INITIALIZER_FILE_NAME = \"RubikInitializer\"\n        const val KEEP_ANNOTATION_CLASS_NAME = \"androidx.annotation.Keep\"\n        const val METHOD_REGISTER_NAME = \"registerAggregatable\"\n\n        const val GENERATE_RUBIK_ID_CHECKER_FILE_NAME = \"RubikIdChecker\"\n        const val ID_CHECKER_FUNCTION_NAME = \"idChecker\"\n\n    }\n\n    object Contexts {\n        object Declare {\n            fun makeContextPackageName(uri: String): String = \"${Router.GENERATE_BASIC_PACKAGE_NAME}.context.${uri.uriToSnake()}\"\n        }\n    }\n\n    object Aggregate {\n        object Declare{\n            fun makeAggregatePackageName(uri: String): String = \"${Router.GENERATE_BASIC_PACKAGE_NAME}.aggregate.${uri.uriToSnake()}\"\n            fun makeAggregateClassName(name: String) = toPascal(name, \"Aggregate\")\n        }\n        const val REGISTER_FUNCTION_NAME = \"register\"\n    }\n\n    object Identity {\n        fun makeComponentPackageName(uri: String): String = \"${Router.GENERATE_BASIC_PACKAGE_NAME}.component.${uri.uriToSnake()}\"\n        const val COMPONENT_ID_BASE_CLASS_NAME = \"ComponentId\"\n\n        object Declare {\n            const val CONTEXT_ID_BASE_CLASS_NAME = \"ContextId\"\n            const val AGGREGATE_ID_BASE_CLASS_NAME = \"AggregateId\"\n        }\n\n        fun contextIdName(name:String): String = toPascal(name, COMPONENT_ID_BASE_CLASS_NAME)\n        const val COMPONENT_ID_SUPER_PACKAGE_NAME = \"${Router.PACKAGE_NAME}.identity\"\n        const val CONTEXT_ID_SUPER_SIMPLE_CLASS_NAME = \"RContextId\"\n        const val COMPONENT_ID_SUPER_SIMPLE_CLASS_NAME = \"RComponentId\"\n        const val COMPONENT_ID_SUPER_CLASS_NAME = \"${this.COMPONENT_ID_SUPER_PACKAGE_NAME}.${this.COMPONENT_ID_SUPER_SIMPLE_CLASS_NAME}\"\n    }\n\n    object IdChecker {\n        const val ID_CHECKER_PACKAGE_NAME = \"com.rubik.identity\"\n        const val ID_CHECKER_SIMPLE_CLASS_NAME = \"IdentityChecker\"\n        fun makeAggregateIdClassName(uri: String, name: String) =\n            \"\\\"${Aggregate.Declare.makeAggregatePackageName(uri)}.${ toPascal(name, Identity.Declare.AGGREGATE_ID_BASE_CLASS_NAME)}\\\"\"\n        fun makeComponentIdClassName(uri: String, name: String) =\n            \"\\\"${Identity.makeComponentPackageName(uri)}.${ toPascal(name, Identity.COMPONENT_ID_BASE_CLASS_NAME)}\\\"\"\n        fun makeContextIdClassName(uri: String, name: String) =\n            \"\\\"${Contexts.Declare.makeContextPackageName(uri)}.${ toPascal(name, Identity.Declare.CONTEXT_ID_BASE_CLASS_NAME)}\\\"\"\n\n        const val ID_CHECKER_FUNCTION_NAME_ADD_COMPONENT_ID = \"addComponentId\"\n        const val ID_CHECKER_FUNCTION_NAME_ADD_CONTEXT_ID = \"addContextId\"\n\n    }\n\n    object KDoc {\n        fun init() =\n            updateFileKDoc(\"init Rubik Router.\", null)\n\n        fun componentId(uri: String, version: String) =\n            updateFileKDoc(\"generated Rubik componentId.\", version, \"uri\" to \"[$uri]\")\n\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/LogTags.kt",
    "content": "package com.rubik.plugins.basic\n\nimport com.ktnail.gradle.p\nimport com.ktnail.x.LogTag\nimport com.ktnail.x.Logger\nimport com.rubik.context.extra.Context\nimport org.gradle.api.Project\n\nobject LogTags {\n    val PREPARE_CONTEXT = LogTag(\"<RUBIK> PREPARE_CONTEXT \", Logger.Level.DEFAULT)\n    val DO_PICK = LogTag(\"<RUBIK> DO_PICK \", Logger.Level.LOW)\n\n    val PLUGIN = LogTag(\"<RUBIK> PLUGIN \", Logger.Level.DEFAULT)\n    val TRANSFORM_CLASSES = LogTag(\"<RUBIK> TRANSFORM_CLASSES \", Logger.Level.LOW)\n    val CHECK_CLASS = LogTag(\"<RUBIK> CHECK_CLASS \", Logger.Level.LOW)\n\n    private val RUBIK_STEP_APPLY_CONFIG =\n        LogTag(\"<< - RUBIK_STEP_CHANGED - >> < - APPLY CONFIG - >  \", Logger.Level.LOW)\n    private val RUBIK_STEP_APPLY_CONTEXT =\n        LogTag(\"<< - RUBIK_STEP_CHANGED - >>  < - APPLY CONTEXT - >  \", Logger.Level.LOW)\n    private val RUBIK_STEP_PREPARE_CONTEXT =\n        LogTag(\"<< - RUBIK_STEP_CHANGED - >>  < - PREPARE_CONTEXT - >  \", Logger.Level.LOW)\n    private val RUBIK_STEP_CREATE_TASK =\n        LogTag(\"<< - RUBIK_STEP_CHANGED - >> < - CREATE_TASK - >  \", Logger.Level.LOW)\n    private val RUBIK_STEP_PICK =\n        LogTag(\"<< - RUBIK_STEP_CHANGED - >> < - PICK - >  \", Logger.Level.LOW)\n\n    fun logApplyConfigFinish(project: Project) =\n        Logger.p(RUBIK_STEP_APPLY_CONFIG, project) {\n            \" FINISH ! \\n\"\n        }\n\n    fun logApplyContext(project: Project) =\n        Logger.p(RUBIK_STEP_APPLY_CONTEXT, project) {\n            \" START ! \\n\"\n        }\n\n    fun logPrepareContextFinish(project: Project, context: Context) =\n        Logger.p(RUBIK_STEP_PREPARE_CONTEXT, project) {\n            \"  <${context.uri}> FINISH ! \\n\"\n        }\n\n    fun logCreateTaskFinish(project: Project) =\n        Logger.p(RUBIK_STEP_CREATE_TASK, project) {\n            \" FINISH ! \\n\"\n        }\n\n    fun logPickFinish(project: Project) =\n        Logger.p(RUBIK_STEP_PICK, project) {\n            \" FINISH ! \\n\"\n        }\n}\n\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/exception/RubikException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.exception\n\n/**\n *  The super class of all exception in rubik plugins.\n *\n *  @since 1.3\n */\nabstract class RubikException : Exception()"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/exception/RubikKaptDependencyNotSetException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.exception\n\n/**\n * Thrown when context dependency maven but no version set.\n *\n * @since 1.5\n */\ninternal class RubikKaptDependencyNotSetException : RubikException() {\n    override fun toString() =\n        \"RubikKaptDependencyNotSetException  please make sure ext.rubik_kapt_version in build.gradle of root project !\"\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/exception/RubikNotCalculatePublicationException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.exception\n\n/**\n * Thrown when publish task not calculate publication finish.\n *\n * @since 1.9\n */\ninternal class RubikNotCalculatePublicationException(private val uri: String) : RubikException() {\n    override fun toString() =\n        \"RubikNotCalculatePublicationException publish task not calculate publication , by uri <$uri> ! \"\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/exception/RubikPackingNotSupportException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.exception\n\n/**\n * Thrown when use rubik.packing in wrong place.\n *\n * @since 1.9\n */\ninternal class RubikPackingNotSupportException(private val path: String) : RubikException(){\n    override fun toString() =\n        \"RubikPackingNotSupportException rubik.packing can only be used in gradle root \" +\n                \"project！current project[${path}]\"\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/exception/RubikProjectNoKotlinAndroidPluginException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.exception\n\n/**\n * Thrown when project not apply 'kotlin-android' plugin.\n *\n * @since 1.6\n */\ninternal class RubikProjectNoKotlinAndroidPluginException(val path :String) :RubikException() {\n    override fun toString() =\n        \"RubikProjectNoKotlinAndroidPluginException the project[${path}] must apply \" +\n                \"'kotlin-android' plugin, Because rubik will generate kotlin code! \"\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/exception/RubikRouterAndContextVersionsNotMatchException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.exception\n\n/**\n * Thrown when router and context versions not match exception.\n *\n * @since 1.9\n */\ninternal class RubikRouterAndContextVersionsNotMatchException(\n    private val generatedBy: String,\n    private val uri: String?,\n    private val routerVersion: String,\n    private val msg: String\n) : RubikException() {\n    override fun toString() = \"RubikPluginNotApplyException router and context versions not \" +\n            \"match! context[$uri] generatedBy[${generatedBy}] and routerVersion[${routerVersion}]\" +\n            \" , $msg \"\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/exception/RubikRouterDependencyNotSetException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.exception\n\n/**\n * Thrown when context dependency maven but no version set.\n *\n * @since 1.5\n */\ninternal class RubikRouterDependencyNotSetException : RubikException() {\n    override fun toString() =\n        \"RubikRouterDependencyNotSetException  please make sure ext.rubik_router_version in build.gradle of root project !\"\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/extra/Rubik.kt",
    "content": "package com.rubik.plugins.basic.extra\n\nimport com.ktnail.gradle.*\nimport com.ktnail.x.Logger\nimport com.rubik.context.Ext\nimport com.rubik.plugins.basic.LogTags\nimport com.rubik.plugins.basic.exception.RubikKaptDependencyNotSetException\nimport com.rubik.context.exception.RubikPluginNotApplyException\nimport com.rubik.context.extra.rubikExtensionName\nimport com.rubik.context.extra.rubikMainProject\nimport com.rubik.plugins.basic.exception.RubikRouterDependencyNotSetException\nimport com.rubik.plugins.basic.extra.Rubik.CONTEXT_PLUGIN_NAME\nimport com.rubik.plugins.basic.extra.Rubik.SHELL_PLUGIN_NAME\nimport com.rubik.context.utility.Kapt\nimport com.rubik.plugins.extension.RubikExtension\nimport com.rubik.plugins.extension.RubikSingletonExtension\nimport com.rubik.publish.extra.publicationRecordDirRoot\nimport com.rubik.publish.extra.rubikMavenLocalRepository\nimport com.rubik.publish.extra.rubikMavenRepository\nimport org.gradle.api.Project\nimport java.io.File\n\nobject Rubik {\n    const val SHELL_PLUGIN_NAME = \"rubik-shell\"\n    const val CONTEXT_PLUGIN_NAME = \"rubik-context\"\n}\n\nval Project.rubik: RubikExtension\n    get() = (extensions.findByName(rubikExtensionName) as? RubikExtension) ?: extensions.create(\n        rubikExtensionName,\n        RubikExtension::class.java,\n        this\n    )\n\nval Project.rubikSingleton\n    get() =\n        rubikMainProject.run {\n            (extensions.findByName(\"rubik-singleton\") as? RubikSingletonExtension)\n                ?: extensions.create(\n                    \"rubik-singleton\",\n                    RubikSingletonExtension::class.java,\n                    this\n                ) ?: throw RubikPluginNotApplyException()\n        }\n\nval Project.isRubikShell\n    get() = pluginManager.hasPlugin(SHELL_PLUGIN_NAME)\n\nfun Project.addRubikRepository() {\n    repositories.maven { maven ->\n        maven.url = rubikMavenRepository\n        maven.isAllowInsecureProtocol = true\n    }\n    repositories.maven { maven ->\n        maven.url = rubikMavenLocalRepository\n        maven.isAllowInsecureProtocol = true\n    }\n}\n\nfun Project.applyContext() {\n    if (!pluginManager.hasPlugin(CONTEXT_PLUGIN_NAME)) pluginManager.apply(CONTEXT_PLUGIN_NAME)\n}\n\nfun Project.applyShell() {\n    if (!pluginManager.hasPlugin(SHELL_PLUGIN_NAME)) pluginManager.apply(SHELL_PLUGIN_NAME)\n}\n\nfun Project.addRubikKaptDependency() {\n    addDependency(Kapt.CONFIGURATION_NAME, propertyOr(Ext.RUBIK_KAPT_VERSION) { throw RubikKaptDependencyNotSetException() })\n}\n\nfun Project.addRubikRouterDependency() {\n    addDependency(DependencyType.IMPLEMENTATION, propertyOr(Ext.RUBIK_ROUTER_VERSION) { throw RubikRouterDependencyNotSetException() })\n}\n\nprivate fun Project.fuzzyApplyRubikConfigFiles(dir: File, vararg startsWith: String) {\n    val configs = mutableListOf<String>()\n    startsWith.forEach { start ->\n        dir.listFiles()?.filter { file ->\n            file.name.startsWith(start) && file.name.endsWith(\".gradle\")\n        }?.forEach { file ->\n            if (!configs.contains(file.absolutePath)) configs.add(file.absolutePath)\n        }\n    }\n    Logger.pIf(configs.isNotEmpty(), LogTags.PLUGIN, this) { \" CONFIG FILES :\\n  ${configs.joinToString(\"\\n  \")}\" }\n    configs.forEach { path ->\n        val file = File(path)\n        Logger.p(LogTags.PLUGIN, this) { \" APPLIED CONFIG FILE path:${file.absolutePath}\" }\n        apply(mapOf(\"from\" to file))\n    }\n}\n\nfun Project.fuzzyApplyRubikConfigFiles(dir: File) {\n    fuzzyApplyRubikConfigFiles(\n        dir,\n        \"rubik-global\",\n        \"rubik-component\",\n        \"rubik-context\",\n        \"rubik-packing\",\n        \"rubik\"\n    )\n}\n\nfun Project.fuzzyApplyGivenRubikConfigFileDirs() {\n    arrayProperties(Ext.RUBIK_CONFIG_FILE_DIRS).forEach { path ->\n        fuzzyApplyRubikConfigFiles(File(path))\n    }\n}\n\nfun Project.fuzzyApplyRubikPublicationRecordFiles() {\n    fuzzyApplyRubikConfigFiles(publicationRecordDirRoot)\n}\n\n\nval Project.logLevel: Int\n    get() {\n        val level = propertyOfT<Int>(Ext.RUBIK_LOG_LEVEL)\n        return when {\n            level == null -> Logger.Level.ALL\n            level > 3 -> Logger.Level.CLOSE\n            level == 3 -> Logger.Level.HIGH\n            level == 2 -> Logger.Level.DEFAULT\n            level == 1 -> Logger.Level.LOW\n            level < 1 -> Logger.Level.ALL\n            else -> Logger.Level.ALL\n        }\n    }\n\nval Project.logWriteToFile: Boolean\n    get() = propertyOr(Ext.RUBIK_WRITE_LOG_TO_FILE, false)"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/transform/MakeLibsTransform.kt",
    "content": "package com.rubik.plugins.basic.transform\n\nimport com.android.build.api.transform.QualifiedContent\nimport com.android.build.api.transform.TransformInvocation\nimport com.android.build.gradle.internal.pipeline.TransformManager\nimport com.ktnail.x.Logger\nimport com.ktnail.x.camelToPascal\nimport com.ktnail.x.copyToDir\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.annotations.source.ROriginalValue\nimport com.rubik.plugins.basic.LogTags\nimport com.rubik.context.folder.cleanLibClassesTmpDir\nimport com.rubik.plugins.basic.utility.forEachCtClasses\nimport com.rubik.context.folder.getLibClassesTmpDir\nimport com.ktnail.gradle.*\nimport com.rubik.context.extra.Context\nimport com.rubik.context.publication.LibType\nimport com.rubik.publish.publishLibArtifactId\nimport javassist.ClassPool\nimport org.gradle.api.Project\nimport java.io.File\n\nclass MakeLibsTransform(\n    private val project: Project,\n    private val context: Context\n) : RubikTransform() {\n\n    override fun getName() = \"rubik${context.publishLibArtifactId(LibType.CONTEXT).camelToPascal()}\"\n\n    override fun getScopes(): MutableSet<in QualifiedContent.Scope> = TransformManager.PROJECT_ONLY\n\n    override fun transform(transformInvocation: TransformInvocation?) {\n\n        val variantName = transformInvocation?.context?.variantName\n\n        Logger.p(LogTags.TRANSFORM_CLASSES, project) { \" TRANSFORM START  variant:$variantName\" }\n\n        variantName?.let {\n            cleanLibClassesTmpDir(project, LibType.CONTEXT, variantName, context.uri)\n            cleanLibClassesTmpDir(project, LibType.ORIGINAL_VALUE, variantName, context.uri)\n        }\n        ClassPool.getDefault()?.let { classPool ->\n            copyClassesAndJar(transformInvocation, { file ->\n                classPool.insertClassPath(file.absolutePath)\n                variantName?.let {\n                    filterAndCopyLibClasses(\n                        classPool,\n                        project,\n                        variantName,\n                        file\n                    )\n                }\n            })\n        }\n    }\n\n    private fun filterAndCopyLibClasses(\n        classPool:ClassPool,\n        project: Project,\n        variantName: String,\n        classDir: File\n    ){\n        classDir.forEachCtClasses(classPool) { ctClass, classFiles ->\n            (ctClass.getAnnotation(RContextLib::class.java) as? RContextLib)?.let {\n                classFiles.forEach { file ->\n                    file.copyToDir(\n                        getLibClassesTmpDir(project, LibType.CONTEXT, variantName, context.uri), classDir.absolutePath\n                    )\n                    Logger.p(LogTags.TRANSFORM_CLASSES, project) { \" COPY CONTEXT FILE:${file.absolutePath}\" }\n                }\n            }\n            (ctClass.getAnnotation(ROriginalValue::class.java) as? ROriginalValue)?.let {\n                classFiles.forEach { file ->\n                    if (context.source.publishOriginalValue) {\n                        file.copyToDir(\n                            getLibClassesTmpDir(project, LibType.ORIGINAL_VALUE, variantName, context.uri), classDir.absolutePath\n                        )\n                    }\n                    Logger.p(LogTags.TRANSFORM_CLASSES, project) { \" COPY ORIGINAL_VALUE FILE:${file.absolutePath}\" }\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/transform/RubikTransform.kt",
    "content": "package com.rubik.plugins.basic.transform\n\nimport com.android.build.api.transform.*\nimport com.android.build.gradle.internal.pipeline.TransformManager\nimport com.ktnail.x.Logger\nimport com.ktnail.x.copyToDir\nimport com.ktnail.x.findFileRecursively\nimport java.io.File\n\nabstract class RubikTransform : Transform() {\n\n    override fun getInputTypes(): MutableSet<QualifiedContent.ContentType> = TransformManager.CONTENT_CLASS\n\n    override fun isIncremental(): Boolean = false\n\n    protected fun copyClassesAndJar(\n        transformInvocation: TransformInvocation?,\n        afterCopyDir: (File) -> Unit,\n        afterCopyJar: ((File) -> Unit)? = null\n    ) {\n        transformInvocation?.outputProvider?.deleteAll()\n\n        transformInvocation?.inputs?.forEachIndexed { index, input ->\n            copyJar(transformInvocation, index, input.jarInputs, afterCopyJar)\n            copyDir(transformInvocation, input.directoryInputs, afterCopyDir)\n        }\n    }\n\n\n    private fun copyDir(\n        transformInvocation: TransformInvocation,\n        input: Collection<DirectoryInput>,\n        afterCopy: ((File) -> Unit)?\n    ) {\n        input.forEach { dir ->\n            transformInvocation.outputProvider.getContentLocation(\n                dir.name,\n                dir.contentTypes,\n                dir.scopes,\n                Format.DIRECTORY\n            ).let { out ->\n                out.deleteRecursively()\n                dir.file.copyRecursively(out,true)\n                afterCopy?.invoke(out)\n            }\n        }\n    }\n\n    private fun copyJar(\n        transformInvocation: TransformInvocation,\n        index: Int,\n        input: Collection<JarInput>,\n        afterCopy: ((File) -> Unit)?\n    ) {\n        input.forEach { jar ->\n            transformInvocation.outputProvider.getContentLocation(\n                \"${index}_${jar.file.nameWithoutExtension}\",\n                jar.contentTypes,\n                jar.scopes,\n                Format.JAR\n            ).let { out ->\n                out.delete()\n                jar.file.copyTo(out, true)\n                afterCopy?.invoke(out)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/utility/Code.kt",
    "content": "package com.rubik.plugins.basic.utility\n\nimport BY_VERSION\nimport com.rubik.annotations.source.RGenerated\nimport com.squareup.kotlinpoet.AnnotationSpec\nimport com.squareup.kotlinpoet.FunSpec\nimport com.squareup.kotlinpoet.TypeSpec\n\nfun TypeSpec.Builder.addRGeneratedAnnotation(kind: String) = apply {\n    addAnnotation(makeAnnotation(kind))\n}\n\nfun FunSpec.Builder.addRGeneratedAnnotation(kind: String) = apply {\n    addAnnotation(makeAnnotation(kind))\n}\n\nprivate fun makeAnnotation(kind: String) =\n    AnnotationSpec.builder(RGenerated::class.java)\n        .addMember(\"kind = %S\", kind)\n        .addMember(\"by = %S\", \"rubik-plugins:${BY_VERSION}\")\n        .build()\n\nfun <T> Collection<T>.toListOfCode(transform: ((T) -> CharSequence)? = null) = \"listOf(${toArrayCode(transform)})\"\n\nfun <T> Collection<T>.toArrayCode(transform: ((T) -> CharSequence)? = null) = joinToString(\",\\n\" , transform = transform).let { code->\n    if(code.isNotBlank()) \"\\n$code\\n\" else code\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/utility/Javassist.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.utility\n\nimport com.android.SdkConstants\nimport com.ktnail.x.findFileRecursively\nimport javassist.ClassPool\nimport javassist.CtClass\nimport java.io.File\nimport java.util.jar.JarFile\n\nfun File.forEachCtClasses(classPool: ClassPool, action: (CtClass, List<File>) -> Unit) {\n    if (this.isDirectory && exists()) {\n        classPool.insertClassPath(absolutePath)\n        findFileRecursively { file ->\n            file.absolutePath.removePrefix(absolutePath).filePathToClassName()?.let { className ->\n                try {\n                    action(classPool.getCtClass(className), file.findInnerClassFiles(true))\n                } catch (e: Exception) {\n                    e.printStackTrace()\n                }\n            }\n        }\n    }\n}\n\nfun File.findCtClassesInJar(classPool: ClassPool, action: (CtClass) -> Unit) {\n    if (!this.isDirectory && exists()) {\n        val jar = JarFile(this)\n        val classes = jar.entries()\n        classes.asIterator().forEach { entry ->\n            if (entry.name.endsWith(SdkConstants.DOT_CLASS)) {\n                val className = entry.name.filePathToClassName()\n                try {\n                    action(classPool.getCtClass(className))\n                } catch (e: Exception) {\n                    e.printStackTrace()\n                }\n            }\n        }\n    }\n}\n\nfun File.findInnerClassFiles(containsThis: Boolean = true) =\n    (parentFile?.listFiles { file ->\n        file.absolutePath.startsWith(absolutePath.substringBeforeLast('.') + \"$\")\n    }?.toMutableList() ?: mutableListOf()).also { list ->\n        if (containsThis) list.add(this)\n    }\n\nfun String.filePathToClassName() =\n    if (endsWith(SdkConstants.DOT_CLASS, ignoreCase = true))\n        substringBefore(\".\")\n            .removePrefix(File.separator)\n            .replace(File.separatorChar, '.')\n//                        .replace('$', '.')\n    else null"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/basic/utility/KotlinPoet.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.basic.utility\n\nfun String.noSpaces() = this.replace(\" \", \"·\")"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/context/ContextPlugin.kt",
    "content": "package com.rubik.plugins.context\n\nimport com.android.build.gradle.internal.dsl.BuildType\nimport com.ktnail.gradle.androidExtension\nimport com.ktnail.gradle.applyMaven\nimport com.ktnail.gradle.p\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.x.Logger\nimport com.rubik.context.extra.Context\nimport com.rubik.context.Ext\nimport com.rubik.pick.ProjectMode\nimport com.rubik.pick.TmpDirMode\nimport com.rubik.pick.contextDependLibCompileOnlyWhat\nimport com.rubik.pick.contextDependLibWhat\nimport com.rubik.plugins.RubikPlugin\nimport com.rubik.plugins.basic.LogTags\nimport com.rubik.context.Ext.RUBIK_AUTO_FILL_FLAVOR\nimport com.rubik.context.extra.autoGenerateComponentId\nimport com.rubik.context.extra.contextsContainer\nimport com.rubik.context.extra.isCustomBuildType\nimport com.rubik.plugins.context.controller.ComponentIdGeneratingController\nimport com.rubik.plugins.context.controller.ContextKaptController\nimport com.rubik.publish.task.PublishContextTaskController\nimport com.rubik.picker.ContextPicker\nimport com.rubik.publish.task.component.VariantComponentTask\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport com.rubik.plugins.basic.transform.MakeLibsTransform\nimport com.rubik.picker.extra.componentPickWhat\nimport com.rubik.plugins.basic.extra.addRubikRouterDependency\nimport com.rubik.publish.extra.target\nimport com.rubik.publish.buildTypeName\nimport com.rubik.publish.compilerBuildTypeName\nimport com.rubik.publish.useResetCompiler\nimport org.gradle.api.Action\nimport org.gradle.api.Project\n\n/**\n * The the plugin of rubik context project .\n * Provide the ability to publish contexts & Dependence other contexts.\n *\n * @ Since:1.3\n */\nabstract class ContextPlugin : RubikPlugin() {\n    private var contexts: List<Context> = emptyList()\n\n    private val tasksController: PublishContextTaskController by lazy { PublishContextTaskController(project) }\n\n    private val kaptController: ContextKaptController  by lazy { ContextKaptController(project) }\n\n    private val picker: ContextPicker by lazy { ContextPicker() }\n\n    override fun apply(project: Project) {\n        super.apply(project)\n\n//        project.fuzzyApplyRubikConfigFiles(project.projectDir)\n\n        LogTags.logApplyContext(project)\n\n        project.afterEvaluate { // wait for gradle task create\n            LogTags.logCreateTaskFinish(project)\n\n            dependContextLibs()\n            dependPackingComponent()\n            project.addRubikRouterDependency()\n\n            LogTags.logPickFinish(project)\n        }\n\n        contexts = contextsContainer.obtainByProject(project.path).onEach { context ->\n            onObtainContext(context)\n        }\n\n    }\n\n    private fun onObtainContext(context: Context) {\n\n        prepareContext(context)\n\n        LogTags.logPrepareContextFinish(project, context)\n\n        tasksController.createTasks(context, context.target) { componentTask ->\n            preparePublishComponent(context, componentTask)\n        }\n\n        fillFlavor(context)\n    }\n\n    private fun prepareContext(context: Context) {\n        if (context.target.publishingSth) {\n            project.applyMaven()\n        }\n\n        if (context.target.publishingContextLibs) {\n            preparePublishContextLibs(context)\n        }\n\n        kaptController.configKapt(context)\n    }\n\n    private fun preparePublishContextLibs(context: Context) {\n        project.androidExtension?.buildTypes(Action { container ->\n            container.maybeCreate(context.buildTypeName()).apply {\n                isDebuggable = true\n                setMatchingFallbacks(\"debug\")\n            }\n            Logger.p(LogTags.PREPARE_CONTEXT, project) { \" ADD BUILD_TYPES (${context.buildTypeName()})\" }\n        })\n\n        if (!context.useResetCompiler) {\n            project.androidExtension?.registerTransform(MakeLibsTransform(project, context))\n        } else {\n            project.androidExtension?.buildTypes(Action { container ->\n                container.maybeCreate(context.compilerBuildTypeName()).apply {\n                    isDebuggable = true\n                    setMatchingFallbacks(\"debug\")\n                }\n                Logger.p(LogTags.PREPARE_CONTEXT, project) { \" ADD BUILD_TYPES (${context.compilerBuildTypeName()})\" }\n            })\n        }\n    }\n\n    private fun preparePublishComponent(context: Context, task: VariantComponentTask) {\n        if (project.autoGenerateComponentId) {\n            ComponentIdGeneratingController(project, context).createTask(\n                task.artifactName,\n                task.version,\n                task.variant\n            )\n        }\n    }\n\n    private fun dependContextLibs() {\n        val dev = contexts.devWhenPublishingComponent  // force pick publishing type , when publishing\n\n        contexts.forEach { context ->\n            context.touching.forEach { dependency ->\n                Logger.p(LogTags.DO_PICK, project) { \"  PICK CONTEXT LIBS  <${dependency.uri}> :\" }\n                picker.pick(contextDependLibWhat(dependency.uri, dev), project, pickMavenResult = { result ->\n                    context.id.addTouching(result.context, result.version, result.variant)\n                })\n            }\n            if(context.enableProvideRoute){\n                if (!context.target.publishingContextLibs) {\n                    Logger.p(LogTags.DO_PICK, project) { \"  PICK SELF CONTEXT LIBS :\" }\n                    picker.pick(contextDependLibWhat(context.uri, dev), project)\n                } else if (context.target.publishingBoth) {\n                    Logger.p(LogTags.DO_PICK, project) { \"  PICK SELF CONTEXT LIBS TMP DIR :\" }\n                    picker.pick(contextDependLibCompileOnlyWhat(context.uri, dev), project, TmpDirMode())\n                }\n            }\n        }\n    }\n\n    private fun dependPackingComponent() {\n        contexts.forEach { context ->\n            context.packing.forEach { relation ->\n                Logger.p(LogTags.DO_PICK, project) { \"  PICK COMPONENT <${relation.uri}> :\" }\n                val what = relation.componentPickWhat(project)\n                val exceptBuildType: ((BuildType) -> Boolean)? =\n                    if (contexts.publishingContextLibs && project.propertyOr(Ext.RUBIK_REMOVE_PROJECT_WHEN_PUBLISH_CONTEXT_LIBS, true))\n                        { buildType -> buildType.isCustomBuildType }\n                    else null\n                if (context.target.publishingComponent ) {\n                    picker.pick(what, project, ProjectMode(), exceptBuildType = exceptBuildType, pickMavenResult = { result ->\n                        context.id.addPacking(result.context, result.version, result.variant)\n                    })\n                } else {\n                    picker.pick(what, project, exceptBuildType = exceptBuildType, pickMavenResult = {result ->\n                        context.id.addPacking(result.context, result.version, result.variant)\n                    })\n                }\n            }\n        }\n    }\n\n    private val List<Context>.publishingContextLibs: Boolean\n        get() = any { context -> context.target.publishingContextLibs }\n\n    private val List<Context>.devWhenPublishingComponent: Boolean?\n        get() = mapNotNull { context -> (context.target as? ContextTaskTarget.PublishContextTarget)?.devWhenPublishingComponent }.firstOrNull()\n\n    private fun fillFlavor(context: Context) {\n        if (project.propertyOr(RUBIK_AUTO_FILL_FLAVOR, true))\n            context.packing.forEach { relation ->\n                if (!context.target.publishingComponent) {\n                    picker.fillFlavor(relation.componentPickWhat(project), project)\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/context/controller/AllContextController.kt",
    "content": "package com.rubik.plugins.context.controller\n\nimport com.ktnail.gradle.*\nimport com.rubik.context.Ext\nimport com.rubik.context.extra.Context\nimport com.rubik.context.extra.contextsContainer\nimport com.rubik.plugins.basic.LogTags\nimport com.rubik.plugins.basic.exception.RubikProjectNoKotlinAndroidPluginException\nimport com.rubik.plugins.basic.extra.*\nimport com.rubik.publish.extra.publishTasksContainer\nimport com.rubik.publish.task.GlobalPublishTasksController\nimport com.rubik.publish.task.target.TaskTargetController\nimport org.gradle.api.Project\n\nclass AllContextController(\n    private val project: Project\n) {\n    private val tasksController = GlobalPublishTasksController(project)\n    private val taskTargetController = TaskTargetController(project)\n    private val projectSyncController = ProjectSyncController(project)\n\n    fun init() {\n        project.fuzzyApplyRubikPublicationRecordFiles()\n        project.fuzzyApplyRubikConfigFiles(project.projectDir)\n        project.fuzzyApplyGivenRubikConfigFileDirs()\n\n        LogTags.logApplyConfigFinish(project)\n\n        listenTasksRegistered()\n        if (!project.isTaskTarget(ProjectSyncController.PROJECT_SYNC_TASK_NAME)) {\n            processContextProjects()\n            processShellProjects()\n        }\n        projectSyncController.init()\n    }\n\n    private fun listenTasksRegistered() {\n        publishTasksContainer.listenTasksRegistered { task ->\n            tasksController.contextTasks(task)\n        }\n    }\n\n    private fun processContextProjects() {\n        contextsContainer.obtainAny().forEach { context ->\n            tasksController.initTags(context.tagNames)\n            context.projectPath?.let { path ->\n                project.findProject(path)?.let { subProject ->\n                    processContextPackingLink(context)\n                    taskTargetController.checkTaskTarget(subProject, context)\n                    subProject.pluginManager.withPlugin(PluginName.KOTLIN_ANDROID) {\n                        if (context.enableProvideRoute || context.enablePublishComponent) {\n                            subProject.applyContext()\n                        }\n                    }\n                    subProject.whenExecuted {\n                        if (!subProject.pluginManager.hasPlugin(PluginName.KOTLIN_ANDROID)) {\n                            throw RubikProjectNoKotlinAndroidPluginException(subProject.path)\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun processContextPackingLink(context: Context) {\n        context.packingWho = contextsContainer.obtainPacking(context)\n        context.whoPackingMe = contextsContainer.obtainPackingThis(context)\n    }\n\n    private fun processShellProjects() {\n        project.allprojects { subProject ->\n            val autoApplyShell = project.propertyOr(Ext.RUBIK_AUTO_APPLY_SHELL_PLUGIN, true)\n            if (autoApplyShell) {\n                subProject.ifAndroidApplication {\n                    if (autoApplyShell) {\n                        subProject.applyShell()\n                    }\n                }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/context/controller/ComponentIdGeneratingController.kt",
    "content": "package com.rubik.plugins.context.controller\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.x.toCamel\nimport com.rubik.context.extra.Context\nimport com.rubik.context.extra.makeRubikGeneratingDir\nimport com.rubik.context.extra.rubikTask\nimport com.rubik.plugins.context.generate.file.IdentitySourceFile\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport java.io.File\n\nclass ComponentIdGeneratingController(\n    private val project: Project,\n    private val context: Context\n) {\n    fun createTask(\n        artifactName: String,\n        version: String,\n        variant: BaseVariant\n    ) {\n        val generateDir = project.makeRubikGeneratingDir(variant)\n        variant.registerJavaGeneratingTask(\n            makeGenerateFileTask(\n                artifactName,\n                version,\n                variant,\n                generateDir\n            ), generateDir\n        )\n    }\n\n    private fun makeGenerateFileTask(\n        artifactName: String,\n        version: String,\n        pubVariant: BaseVariant,\n        generateDir: File\n    ): Task {\n        return project.rubikTask(\n            toCamel(\n                \"generate\",\n                pubVariant.name,\n                artifactName,\n                \"RubikComponentId\"\n            )\n        ) { task ->\n            task.doLast {\n                doGenerate(version, pubVariant, generateDir)\n            }\n        }\n    }\n\n    private fun doGenerate(\n        pubVersion: String,\n        pubVariant: BaseVariant,\n        generateDir: File\n    ) {\n        IdentitySourceFile(\n            context,\n            pubVersion,\n            pubVariant.name,\n            generateDir\n        ).generate()\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/context/controller/ContextKaptController.kt",
    "content": "package com.rubik.plugins.context.controller\n\nimport com.ktnail.gradle.*\nimport com.ktnail.x.Logger\nimport com.rubik.context.Ext\nimport com.rubik.context.extra.*\nimport com.rubik.context.utility.*\nimport com.rubik.plugins.basic.LogTags\nimport com.rubik.publish.publishVersion\nimport com.rubik.plugins.basic.extra.*\nimport com.rubik.publish.extra.target\nimport org.gradle.api.Project\n\nclass ContextKaptController(\n    private val project: Project\n) {\n    private var sourceSetEnabled = false\n    private var kaptEnabled = false\n\n    fun configKapt(context: Context) {\n        if (context.enableProvideRoute && !sourceSetEnabled) {\n            configAggregateSourceSet()\n            sourceSetEnabled = true\n        }\n\n        if (context.target.publishingSth) {\n            enableRubikKapt()\n        }\n\n        project.forEachVariant { variant ->\n            if (variant.buildType.isContextLibBuildType() && context.target.publishingContextLibs) {\n                val version = context.publishVersion(context.target.publicationType,context.target.publishByTag)\n                variant.putKaptContext(context, version)\n                variant.putKaptContextLibsEnable(context)\n                if (!project.generateAggregateInBuildDir) {\n                    variant.putKaptAggregateEnable(context)\n                }\n            }\n            if (!variant.isCustomVariant && (context.target.publishingComponent || (context.target.context.enableProvideRoute && project.autoGenerateAggregate))) {\n                val version = context.publishVersion(context.target.publicationType,context.target.publishByTag)\n                variant.putKaptContext(context, version)\n                variant.putKaptAggregateEnable(context)\n            }\n        }\n    }\n\n    private fun configAggregateSourceSet() {\n        if (project.autoGenerateAggregate) {\n            if (!project.generateAggregateInBuildDir) {\n                project.rubik.listenAggregateSetChanged { path ->\n                    project.addToJavaSourceSet(\"main\", path)\n                    enableRubikKapt()\n                    project.putKaptArgument(Arguments.Declare.AGGREGATE_GENERATED, path)\n                }\n            }\n        } else {\n            project.rubik.listenAggregateSetChanged { path ->\n                project.addToJavaSourceSet(\"main\", path)\n            }\n        }\n    }\n\n    private fun enableRubikKapt() {\n        if (!kaptEnabled) {\n            project.applyKapt()\n            project.addRubikKaptDependency()\n            globalConfig.listenSchemeChanged { scheme ->\n                scheme?.let {\n                    Logger.p(LogTags.PREPARE_CONTEXT, project) { \" DefaultScheme REGISTERED  (${scheme})\" }\n                    project.putKaptArgument(Arguments.Declare.DEFAULT_SCHEME, scheme)\n                    project.putKaptArgument(\n                        Arguments.Declare.AGGREGATE_METHOD_SIZE,\n                        project.propertyOfT<Int>(Ext.RUBIK_ON_ROUTE_METHOD_MAX_SIZE) ?: 100\n                    )\n                }\n            }\n            project.putKaptBooleanArgument(\n                Arguments.Declare.CONTEXT_ROUTER_ENABLE,\n                project.propertyOr(Ext.RUBIK_GENERATE_ROUTER_CONTEXT, false)\n            )\n            project.putKaptBooleanArgument(\n                Arguments.Declare.AGGREGATE_USER_AND_TIME_ENABLE,\n                project.propertyOr(Ext.RUBIK_AGGREGATE_KDOC_ADD_USER_ADD_TIME, true)\n            )\n            project.putKaptArgument(\n                Arguments.Declare.CONTEXT_IGNORE_VALUE_ANNOS,\n                project.arrayProperties(Ext.RUBIK_IGNORE_VALUE_ANNOTATIONS).joinToString(\"|\")\n            )\n            kaptEnabled = true\n        }\n    }\n\n\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/context/controller/ProjectSyncController.kt",
    "content": "package com.rubik.plugins.context.controller\n\nimport com.ktnail.gradle.propertyOr\nimport com.rubik.context.Ext\nimport com.rubik.context.extra.rubikTask\nimport com.rubik.picker.extra.pickedContextsContainer\nimport com.rubik.plugins.context.generate.file.ProjectSettingsFile\nimport org.gradle.api.Project\n\nclass ProjectSyncController(private val rootProject: Project) {\n    companion object {\n        const val PROJECT_SYNC_TASK_NAME = \"RUBIK-sync-projects\"\n    }\n\n    private val rootTask by lazy { rootProject.rubikTask(PROJECT_SYNC_TASK_NAME) {} }\n\n    fun init() {\n        val paths = mutableMapOf<String, Boolean>()\n        val syncCodeEnable = rootProject.propertyOr(Ext.RUBIK_SYNC_CODE_ENABLE, true)\n        val generateSettings = rootProject.propertyOr(Ext.RUBIK_AUTO_GENERATE_SETTINGS, true)\n        if (syncCodeEnable || generateSettings) {\n            pickedContextsContainer.pickCases().forEach { pickedContext ->\n                val source = pickedContext.context.source\n                val path = source.projectPath\n                if (null != path) {\n                    if (syncCodeEnable) {\n                        rootTask.doLast {\n                            source.codeSyncer?.invoke()?.execute()\n                        }\n                    }\n                    if (generateSettings) paths[path] = pickedContext.pickCase.projectMode\n                }\n            }\n            if (generateSettings)\n                rootTask.doLast {\n                    ProjectSettingsFile(rootProject, paths).generate()\n                }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/context/generate/file/IdentitySourceFile.kt",
    "content": "package com.rubik.plugins.context.generate.file\n\nimport com.ktnail.x.packageNameToFilePath\nimport com.rubik.annotations.source.RComponent\nimport com.rubik.context.extra.Context\nimport com.rubik.context.id.ContextIdHolder\nimport com.rubik.plugins.basic.Constants\nimport com.rubik.plugins.basic.utility.addRGeneratedAnnotation\nimport com.rubik.plugins.basic.utility.noSpaces\nimport com.rubik.plugins.basic.utility.toArrayCode\nimport com.rubik.plugins.basic.utility.toListOfCode\nimport com.rubik.publish.publishArtifactName\nimport com.squareup.kotlinpoet.AnnotationSpec\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FileSpec\nimport com.squareup.kotlinpoet.TypeSpec\nimport java.io.File\n\nclass IdentitySourceFile(\n    private val context: Context,\n    private val pubVersion: String,\n    private val pubVariant: String,\n    private val generatedDir: File\n) {\n    fun generate() {\n        val className = Constants.Identity.contextIdName(context.publishArtifactName)\n        cleanSourceFiles()\n        FileSpec.builder(\n            Constants.Identity.makeComponentPackageName(context.uri),\n            className\n        ).addImport(\n            Constants.Identity.COMPONENT_ID_SUPER_PACKAGE_NAME,\n            Constants.Identity.COMPONENT_ID_SUPER_SIMPLE_CLASS_NAME\n        ).addImport(\n            Constants.Identity.COMPONENT_ID_SUPER_PACKAGE_NAME,\n            Constants.Identity.CONTEXT_ID_SUPER_SIMPLE_CLASS_NAME\n        ).addComponentId(\n                context,\n                className,\n                pubVersion,\n                pubVariant\n            ).build().writeTo(generatedDir)\n    }\n\n    private fun cleanSourceFiles() {\n        File(\"${generatedDir.absolutePath}${File.separator}${Constants.Identity.makeComponentPackageName(context.uri).packageNameToFilePath()}\").deleteRecursively()\n    }\n}\n\nprivate fun FileSpec.Builder.addComponentId(\n    context: Context,\n    className: String,\n    pubVersion: String,\n    pubVariant: String\n) = apply {\n    addType(\n        TypeSpec.classBuilder(className).superclass(\n            ClassName.bestGuess(Constants.Identity.COMPONENT_ID_SUPER_CLASS_NAME)\n        ).addSuperclassConstructorParameter(\n            (\"uri = %S, version = %S, variant =%S,\\n\" +\n                    \"dependencies = ${context.id.idDependenciesCode},\\n\" +\n                    \"packed = ${context.id.idPackedCode}\\n    \"\n                    ).noSpaces(),\n            context.uri,\n            pubVersion,\n            pubVariant\n        ).addAnnotation(\n            AnnotationSpec.builder(RComponent::class.java)\n                .addMember(\"uri = %S\", context.uri)\n                .addMember(\"version = %S\", pubVersion)\n                .addMember(\"variant = %S\", pubVariant)\n                .addMember(\"dependencies = [${context.id.dependenciesCode}]\")\n                .addMember(\"packed = [${context.id.packedCode}]\")\n                .build()\n        ).addRGeneratedAnnotation(\n            \"component_id\"\n        ).addAnnotation(\n            AnnotationSpec.builder(ClassName.bestGuess(Constants.Router.KEEP_ANNOTATION_CLASS_NAME))\n                .build()\n        ).addKdoc(\n            Constants.KDoc.componentId(context.uri, pubVersion)\n        ).build()\n    )\n}\n\nprivate val ContextIdHolder.createComponentIdCode\n    get() = \"${Constants.Identity.COMPONENT_ID_SUPER_SIMPLE_CLASS_NAME}(uri = \\\"$uri\\\", version = \\\"$version\\\", variant = \\\"$variant\\\")\".noSpaces()\n\nprivate val ContextIdHolder.createContextIdCode\n    get() = \"${Constants.Identity.CONTEXT_ID_SUPER_SIMPLE_CLASS_NAME}(uri = \\\"$uri\\\", version = \\\"$version\\\")\".noSpaces()\n\nprivate val ContextIdHolder.idDependenciesCode\n    get() = touched.toListOfCode { dep ->\n        dep.createContextIdCode\n    }\n\nprivate val ContextIdHolder.idPackedCode\n    get() = packed.toListOfCode { dep ->\n        dep.createComponentIdCode\n    }\n\nprivate val ContextIdHolder.dependenciesCode\n    get() = touched.toArrayCode{ dep -> \"\\\"${dep.uri}@${dep.version}\\\"\" }\n\n\nprivate val ContextIdHolder.packedCode\n    get() = packed.toArrayCode{ dep -> \"\\\"${dep.uri}@${dep.version}@${dep.variant}\\\"\" }"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/context/generate/file/ProjectSettingsFile.kt",
    "content": "package com.rubik.plugins.context.generate.file\n\nimport BY_VERSION\nimport com.ktnail.x.kdocToLines\nimport com.ktnail.x.updateFileKDoc\nimport com.ktnail.x.writeLines\nimport org.gradle.api.Project\nimport java.io.File\n\nclass ProjectSettingsFile(rootProject: Project, private val paths: MutableMap<String, Boolean>) {\n\n    private val filePath = rootProject.rootDir.path + File.separator + \"settings-rubik.gradle\"\n\n    fun generate() {\n        cleanFile()\n        val lines = mutableListOf<String>()\n        lines.addAll(KDoc.settings())\n        lines.addAll(paths.map { (path, enable) ->\n            \"${if (!enable) \"// \" else \"\"}include '$path'\"\n        })\n        File(filePath).writeLines(lines)\n    }\n\n    private fun cleanFile() {\n        File(filePath).delete()\n    }\n\n    object KDoc {\n        fun settings() = updateFileKDoc(\"generated by Rubik Gradle Plugin (${BY_VERSION}).\", null).kdocToLines()\n    }\n}\n\n\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/extension/RubikExtension.kt",
    "content": "package com.rubik.plugins.extension\n\nimport com.ktnail.gradle.isGradleRoot\nimport com.rubik.context.extra.Context\nimport com.rubik.dsl.DSLRubik\nimport com.rubik.pick.Excepted\nimport com.rubik.pick.FlavorHows\nimport com.rubik.pick.PickWhat\nimport com.rubik.plugins.basic.exception.RubikPackingNotSupportException\nimport com.rubik.plugins.basic.extra.rubikSingleton\nimport com.rubik.dsl.global.GlobalExtension\nimport com.rubik.context.extra.contextsContainer\nimport com.rubik.picker.extra.pickedContextsContainer\nimport com.rubik.picker.extra.sourcePickHow\nimport com.rubik.publish.extension.ContextRecordExtension\nimport groovy.lang.Closure\nimport org.gradle.api.Project\nimport org.gradle.util.ConfigureUtil\nimport java.io.File\n\n/**\n *  Rubik extension of gradle plugins.\n *\n *  @since 1.3\n */\nopen class RubikExtension(project: Project) : DSLRubik(project) {\n    // config\n    private val configExtension\n        get() = project.rubikSingleton\n\n    fun global(closure: Closure<GlobalExtension>) {\n        if (!project.isGradleRoot) throw RubikPackingNotSupportException(project.path)\n        ConfigureUtil.configure(closure, configExtension.globalExtension)\n    }\n\n    // publication_record\n    fun publications(uri: String, closure: Closure<ContextRecordExtension>) {\n        configExtension.publicationRecords[uri] =\n            ConfigureUtil.configure(closure, ContextRecordExtension(project)).records\n    }\n\n    // aggregate set\n    private val aggregateSetChangedListeners = mutableListOf<(String) -> Unit>()\n\n    open var aggregateSet: String =\n        \"${project.projectDir}${File.separator}src${File.separator}main${File.separator}aggregate\"\n        set(value) {\n            field = value\n            aggregateSetChangedListeners.forEach { action ->\n                action(value)\n            }\n        }\n\n    fun listenAggregateSetChanged(action: (String) -> Unit) {\n        action(aggregateSet)\n        aggregateSetChangedListeners.add(action)\n    }\n\n    override fun onDefineContext(context: Context, hows: FlavorHows?) {\n        if (!project.isGradleRoot)\n            context.updateProjectPathIfNull(project.path)\n\n        contextsContainer.register(context)\n\n        context.sourcePickHow = hows\n    }\n\n    override fun onDefinePacking(what: PickWhat, hows: FlavorHows?) {\n        if (!project.isGradleRoot) throw RubikPackingNotSupportException(project.path)\n        pickedContextsContainer.register(what, hows)\n    }\n\n    override fun onDefineExcept(what: Excepted) {\n        pickedContextsContainer.unRegister(what)\n    }\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/extension/RubikSingletonExtension.kt",
    "content": "package com.rubik.plugins.extension\n\nimport com.ktnail.gradle.maven.MavenDependency\nimport com.rubik.publish.extra.PublishModuleInjector\nimport com.rubik.context.extra.Context\nimport com.rubik.context.extra.ContextModuleInjector\nimport com.rubik.context.container.ContextsContainer\nimport com.rubik.dsl.global.GlobalExtension\nimport com.rubik.pick.MavenMode\nimport com.rubik.pick.PickHow\nimport com.rubik.pick.What\nimport com.rubik.pick.contextDependLibWhat\nimport com.rubik.picker.MavenPicker\nimport com.rubik.picker.extra.PickerModuleInjector\nimport com.rubik.picker.container.ContextPickHowContainer\nimport com.rubik.picker.container.PickedContextsContainer\nimport com.rubik.picker.exception.RubikMavenDependencyVersionNotSetException\nimport com.rubik.picker.exception.RubikMavenVariantNotSetException\nimport com.rubik.picker.exception.RubikMavenVersionNotSetException\nimport com.rubik.publish.allowAutoVersion\nimport com.rubik.publish.publication.Lib.Companion.versionToDevVersion\nimport com.rubik.publish.publishComponentArtifactId\nimport com.rubik.publish.publishGroupId\nimport com.rubik.publish.publishLibArtifactId\nimport com.rubik.publish.record.PublicationRecords\nimport com.rubik.publish.task.PublishContextTasksContainer\nimport com.rubik.publish.task.target.TaskTargetContainer\nimport org.gradle.api.Project\n\n/**\n *  Rubik config extension of gradle plugins.\n *\n *  @since 1.3\n */\nopen class RubikSingletonExtension(\n    val project: Project\n) : ContextModuleInjector,\n    PublishModuleInjector,\n    PickerModuleInjector {\n\n    // global\n    val globalExtension = GlobalExtension(project)\n\n    // context\n    override  val contextsContainer = ContextsContainer()\n    override val globalConfig = globalExtension.config\n\n    // publish\n    override val taskTargetContainer =  TaskTargetContainer()\n    override val publicationRecords: PublicationRecords = mutableMapOf()\n    override val publishTasksContainer = PublishContextTasksContainer()\n\n    override fun contextToDependLibMavenDependencies(\n        context: Context,\n        version: String,\n        dev: Boolean?\n    ): List<Pair<String, MavenDependency>> =\n        MavenPicker(\n            contextDependLibWhat(context.uri, dev),\n            MavenMode(version, null),\n            context\n        ).toDependencies(null)\n\n    // picker\n    override val pickedContextsContainer = PickedContextsContainer()\n    override val pickHowContainer = ContextPickHowContainer()\n\n    override fun contextToMavenDependency(\n        context: Context,\n        item: What,\n        maven: PickHow,\n        dev: Boolean?,\n        forFlavor: String?\n    ): MavenDependency {\n        val devMode = dev ?: globalConfig.devEnable\n        val variant = maven.variant\n\n        val artifactId = when (item) {\n            is What.Component -> {\n                variant ?: throw RubikMavenVariantNotSetException(context.uri)\n                context.publishComponentArtifactId(variant)\n            }\n            is What.Lib -> {\n                context.publishLibArtifactId(item.type)\n            }\n        }\n\n        val version = if (null != maven.version) {\n            if (devMode) maven.version?.versionToDevVersion() else maven.version\n        } else if (context.allowAutoVersion) {\n            publicationRecords.getVersion(context.uri, item, maven, devMode)\n        } else null\n\n        version ?: throw when (item) {\n            is What.Component -> RubikMavenVersionNotSetException(context.uri)\n            else -> RubikMavenDependencyVersionNotSetException(context.uri)\n        }\n\n        return  MavenDependency(context.publishGroupId, artifactId, version, forFlavor)\n    }\n\n    private fun PublicationRecords.getVersion(uri: String, what: What, maven: PickHow, dev: Boolean): String? {\n        val key = (if (what is What.Lib) com.rubik.context.publication.BuildType.CONTEXT_LIB_BUILD_TYPE_NAME else maven.variant) ?: return null\n        return this[uri]?.latestVersion(key, dev)\n    }\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/ShellPlugin.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.plugins.shell\n\nimport com.ktnail.gradle.androidExtension\nimport com.ktnail.gradle.p\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.x.Logger\nimport com.rubik.pick.shellPackingLibWhat\nimport com.rubik.plugins.RubikPlugin\nimport com.rubik.plugins.basic.LogTags\nimport com.rubik.context.Ext\nimport com.rubik.plugins.basic.extra.addRubikRouterDependency\nimport com.rubik.picker.ContextPicker\nimport com.rubik.picker.extra.pickedContextsContainer\nimport com.rubik.plugins.shell.checker.context.CheckContextVersionTransform\nimport com.rubik.plugins.shell.checker.router.CheckRouterVersionTransform\nimport com.rubik.plugins.shell.controller.ShellConfigGeneratingController\nimport com.rubik.plugins.shell.controller.ShellSourceGeneratingController\nimport org.gradle.api.Project\n\n/**\n * The the plugin of rubik shell project (application).\n * Provide the ability to pick  contexts.\n *\n * @ Since:1.5\n */\nclass ShellPlugin : RubikPlugin() {\n    private val picker: ContextPicker by lazy { ContextPicker() }\n\n    override fun apply(project: Project) {\n        super.apply(project)\n\n        //  project.fuzzyApplyRubikConfigFiles(project.projectDir)\n\n        ShellSourceGeneratingController(project).createTasks()\n\n        ShellConfigGeneratingController(project).createTasks()\n\n        project.afterEvaluate {\n            doPickContexts()\n            project.addRubikRouterDependency()\n        }\n\n        if (project.propertyOr(Ext.RUBIK_ENABLE_CHECK_ROUTER_VERSION, false) && CheckRouterVersionTransform.RULES.isNotEmpty()) {\n            Logger.p(LogTags.CHECK_CLASS, project) { \" CHECK_ROUTER_VERSION enable ! \" }\n            project.androidExtension?.registerTransform(CheckRouterVersionTransform(project))\n        }\n\n        if (project.propertyOr(Ext.RUBIK_ENABLE_CHECK_CONTEXT_VERSION, false) && CheckContextVersionTransform.RULES.isNotEmpty()) {\n            Logger.p(LogTags.CHECK_CLASS, project) { \" CHECK_CONTEXT_VERSION enable ! \" }\n            project.androidExtension?.registerTransform(CheckContextVersionTransform(project))\n        }\n    }\n\n    private fun doPickContexts() {\n        Logger.p(LogTags.DO_PICK, project) { \" SHELL PICK COMPONENT :\" }\n        picker.pick(pickedContextsContainer.pickCases(), project)\n\n        Logger.p(LogTags.DO_PICK, project) { \" SHELL PICK CONTEXT LIBS :\" }\n        picker.pick(shellPackingLibWhat(), project)\n\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/checker/CheckClassesRule.kt",
    "content": "package com.rubik.plugins.shell.checker\n\nimport javassist.CtClass\nimport org.gradle.api.Project\n\ninterface CheckClassesRule {\n    fun doCheck(project: Project, ctClass: CtClass)\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/checker/CheckClassesTransform.kt",
    "content": "package com.rubik.plugins.shell.checker\n\nimport com.android.build.api.transform.QualifiedContent\nimport com.android.build.api.transform.TransformInvocation\nimport com.android.build.gradle.internal.pipeline.TransformManager\nimport com.ktnail.x.toPascal\nimport com.rubik.plugins.basic.transform.RubikTransform\nimport com.rubik.plugins.basic.utility.findCtClassesInJar\nimport javassist.ClassPool\nimport org.gradle.api.Project\nimport java.io.File\n\nabstract class CheckClassesTransform(\n    private val project: Project,\n    private val rules :Array<CheckClassesRule>\n) : RubikTransform() {\n\n    override fun getName() = toPascal(\"rubik\",\"check\",\"router\",\"version\")\n\n    override fun getInputTypes(): MutableSet<QualifiedContent.ContentType> = TransformManager.CONTENT_CLASS\n\n    override fun getScopes(): MutableSet<in QualifiedContent.Scope> = TransformManager.SCOPE_FULL_PROJECT\n\n    abstract fun onTransform(transformInvocation: TransformInvocation?)\n\n    override fun transform(transformInvocation: TransformInvocation?) {\n\n        onTransform(transformInvocation)\n\n        val jars = mutableSetOf<File>()\n\n        ClassPool.getDefault()?.let { classPool ->\n            copyClassesAndJar(transformInvocation, { dir ->\n                classPool.insertClassPath(dir.absolutePath)\n            }, { jar ->\n                classPool.insertClassPath(jar.absolutePath)\n                jars.add(jar)\n            })\n            check(jars, classPool)\n        }\n    }\n\n    private fun check(\n        jars: Set<File>,\n        classPool: ClassPool\n    ) {\n        rules.forEach { rule ->\n            jars.forEach { jar->\n                jar.findCtClassesInJar(classPool) { ctClass ->\n                    rule.doCheck(project, ctClass)\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/checker/context/CheckContextVersionRule.kt",
    "content": "package com.rubik.plugins.shell.checker.context\n\nimport com.rubik.plugins.shell.checker.CheckClassesRule\nimport javassist.CtClass\nimport org.gradle.api.Project\n\nclass CheckContextVersionRule : CheckClassesRule {\n    override fun doCheck(project: Project, ctClass: CtClass){\n        // todo 实现规则\n    }\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/checker/context/CheckContextVersionTransform.kt",
    "content": "package com.rubik.plugins.shell.checker.context\n\nimport com.android.build.api.transform.TransformInvocation\nimport com.ktnail.x.Logger\nimport com.rubik.plugins.basic.LogTags\nimport com.ktnail.gradle.*\nimport com.rubik.plugins.shell.checker.CheckClassesTransform\nimport com.rubik.plugins.shell.checker.CheckClassesRule\nimport org.gradle.api.Project\n\nclass CheckContextVersionTransform(\n    private val project: Project\n) : CheckClassesTransform(project, RULES) {\n\n    companion object {\n        val RULES = arrayOf<CheckClassesRule>(CheckContextVersionRule())\n    }\n\n    override fun onTransform(transformInvocation: TransformInvocation?) {\n        Logger.p(LogTags.CHECK_CLASS, project) { \" CheckContextVersion TRANSFORM START \" }\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/checker/router/CheckRouterVersionRule.kt",
    "content": "package com.rubik.plugins.shell.checker.router\n\nimport com.ktnail.x.Logger\nimport com.rubik.annotations.source.RContextLib\nimport com.rubik.annotations.source.RGenerated\nimport com.rubik.plugins.basic.Constants\nimport com.rubik.plugins.basic.LogTags\nimport com.rubik.plugins.basic.exception.RubikRouterAndContextVersionsNotMatchException\nimport com.rubik.context.Ext\nimport com.ktnail.gradle.*\nimport com.rubik.plugins.shell.checker.CheckClassesRule\nimport javassist.CtClass\nimport org.gradle.api.Project\n\nclass CheckLowerThan1Dot9Rule : CheckClassesRule {\n    override fun doCheck(project: Project, ctClass: CtClass){\n        if (ctClass.packageName.startsWith(\"${Constants.Router.GENERATE_BASIC_PACKAGE_NAME}.context\")){\n            val routerVersion = project.propertyOr(Ext.RUBIK_ROUTER_VERSION) { \"not-set\" }\n            val kaptVersion = project.propertyOr(Ext.RUBIK_KAPT_VERSION) { \"not-set\" }\n            (ctClass.getAnnotation(RGenerated::class.java) as? RGenerated)?.let { generated ->\n                if (generated.kind == \"context\") {\n                    val version = generated.by.removePrefix(\"rubik-kapt:\").split(\".\")\n                    Logger.p(LogTags.CHECK_CLASS, project) { \" find RGenerated context class:${ctClass.name} by:${generated.by}\" }\n                    if (version[0].toIntOrNull() ?: -1 <= 1 && version[1].toIntOrNull() ?: -1 < 9) {\n                        val uri = (ctClass.getAnnotation(RContextLib::class.java) as? RContextLib)?.uri\n                        throw RubikRouterAndContextVersionsNotMatchException(generated.by, uri,\n                            routerVersion,\"please re-publish context by [${kaptVersion}] or higher version!\")\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/checker/router/CheckRouterVersionTransform.kt",
    "content": "package com.rubik.plugins.shell.checker.router\n\nimport com.android.build.api.transform.TransformInvocation\nimport com.ktnail.x.Logger\nimport com.rubik.plugins.basic.LogTags\nimport com.ktnail.gradle.*\nimport com.rubik.plugins.shell.checker.CheckClassesTransform\nimport com.rubik.plugins.shell.checker.CheckClassesRule\nimport org.gradle.api.Project\n\nclass CheckRouterVersionTransform(\n    private val project: Project\n) : CheckClassesTransform(project, RULES) {\n\n    companion object {\n        val RULES = arrayOf<CheckClassesRule>(CheckLowerThan1Dot9Rule())\n    }\n\n    override fun onTransform(transformInvocation: TransformInvocation?) {\n        Logger.p(LogTags.CHECK_CLASS, project) { \" CheckRouterVersion TRANSFORM START \" }\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/controller/ShellConfigGeneratingController.kt",
    "content": "package com.rubik.plugins.shell.controller\n\nimport com.ktnail.x.firstOrNull\nimport com.rubik.context.extra.allContexts\nimport com.rubik.context.extra.rubikTask\nimport com.rubik.pick.shellPackingLibWhat\nimport com.rubik.picker.extra.getPickCase\nimport com.rubik.picker.extra.pickedContextsContainer\nimport com.rubik.publish.record.PublicationRecords\nimport com.rubik.publish.record.generate.file.RubikPublicationRecordFiles\nimport com.rubik.publish.record.updateComponent\nimport com.rubik.publish.record.updateContextLibs\nimport org.gradle.api.Project\n\nclass ShellConfigGeneratingController(\n    private val project: Project\n) {\n    fun createTasks() {\n        project.rubikTask(\"generateRubikPublicationRecord\") { task ->\n            task.doLast {\n                RubikPublicationRecordFiles.generate(project)\n            }\n        }\n\n        project.rubikTask(\"transRubikPickVersionToPublicationRecord\") { task ->\n            task.doLast {\n                val publicationRecords: PublicationRecords = mutableMapOf()\n\n                pickedContextsContainer.pickCases().forEach { case ->\n                    case.pickCase.flavorHows.forEach { (_, how) ->\n                        how.version?.let { version ->\n                            publicationRecords.updateComponent(\n                                project,\n                                case.context.uri,\n                                how.variant ?: \"\",\n                                version,\n                                false\n                            )\n                        }\n                    }\n                }\n                allContexts.forEach { (_, context) ->\n                    if (context.enableProvideRoute)\n                        context.getPickCase(shellPackingLibWhat()).flavorHows.firstOrNull()?.version?.let { version ->\n                            publicationRecords.updateContextLibs(\n                                project,\n                                context.uri,\n                                version,\n                                false\n                            )\n                        }\n                }\n                RubikPublicationRecordFiles.generate(project, publicationRecords)\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/controller/ShellSourceGeneratingController.kt",
    "content": "package com.rubik.plugins.shell.controller\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.x.packageNameToFilePath\nimport com.ktnail.x.toCamel\nimport com.rubik.context.extra.allContexts\nimport com.rubik.context.extra.makeRubikGeneratingDirs\nimport com.rubik.plugins.basic.Constants\nimport com.rubik.plugins.shell.generate.files.RubikIdCheckerSourceFile\nimport com.rubik.plugins.shell.generate.files.RubikInitializerSourceFile\nimport com.rubik.context.extra.rubikTask\nimport com.rubik.picker.extra.pickedContextsContainer\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport java.io.File\n\nclass ShellSourceGeneratingController(\n    private val project: Project\n) {\n    fun createTasks() {\n        project.makeRubikGeneratingDirs { generateDir, variant ->\n            variant.registerJavaGeneratingTask(\n                makeGenerateFileTask(\n                    variant,\n                    generateDir\n                ), generateDir\n            )\n        }\n    }\n\n    private fun makeGenerateFileTask(variant: BaseVariant, generateDir: File): Task {\n        return project.rubikTask(toCamel(\"generate\", variant.name, \"RubikShellSources\")) { task ->\n            task.doLast {\n                doGenerate(generateDir, variant)\n            }\n        }\n    }\n\n    private fun doGenerate(generateDir: File, variant: BaseVariant) {\n        cleanSourceFiles(generateDir)\n        RubikInitializerSourceFile(\n            pickedContextsContainer.pickCases(variant),\n            generateDir\n        ).generate()\n        RubikIdCheckerSourceFile(\n            pickedContextsContainer.pickCases(variant),\n            allContexts,\n            generateDir\n        ).generate()\n    }\n\n    private fun cleanSourceFiles(generateDir: File) {\n        File(\"${generateDir.absolutePath}${File.separator}${Constants.Router.GENERATE_PACKAGE_NAME.packageNameToFilePath()}\").deleteRecursively()\n    }\n}"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/generate/files/RubikIdCheckerSourceFile.kt",
    "content": "package com.rubik.plugins.shell.generate.files\n\nimport com.rubik.context.extra.Context\nimport com.rubik.plugins.basic.Constants\nimport com.rubik.plugins.basic.utility.addRGeneratedAnnotation\nimport com.rubik.plugins.basic.utility.noSpaces\nimport com.rubik.picker.container.ContextPickCase\nimport com.rubik.context.router.RouterRegister\nimport com.rubik.publish.publishArtifactName\nimport com.squareup.kotlinpoet.AnnotationSpec\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FileSpec\nimport com.squareup.kotlinpoet.FunSpec\nimport java.io.File\n\n\n/**\n *  Generate rubik ID checker.\n *\n *  @since 1.9\n */\nclass RubikIdCheckerSourceFile(\n    private val contextPickCases: List<ContextPickCase>,\n    private val allContexts: Map<String, Context>,\n    private val generatedDir: File\n) {\n    fun generate() {\n        FileSpec.builder(\n            Constants.Router.GENERATE_PACKAGE_NAME,\n            Constants.Router.GENERATE_RUBIK_ID_CHECKER_FILE_NAME\n        ).addImport(\n            Constants.IdChecker.ID_CHECKER_PACKAGE_NAME,\n            Constants.IdChecker.ID_CHECKER_SIMPLE_CLASS_NAME\n        ).generateRubikCheckIds(\n            contextPickCases,\n            allContexts\n        ).build().writeTo(generatedDir)\n    }\n\n    private fun FileSpec.Builder.generateRubikCheckIds(\n        contextPickCases: List<ContextPickCase>,\n        allContexts: Map<String, Context>\n    ) = apply {\n        addFunction(\n            FunSpec.builder(\n                Constants.Router.ID_CHECKER_FUNCTION_NAME\n            ).receiver(\n                ClassName.bestGuess(Constants.Router.RUBIK_CLASS_NAME)\n            ).returns(\n                ClassName.bestGuess(\"${Constants.IdChecker.ID_CHECKER_PACKAGE_NAME}.${Constants.IdChecker.ID_CHECKER_SIMPLE_CLASS_NAME}\")\n            ).addCheckerStatement(\n                contextPickCases,\n                allContexts\n            ).addRGeneratedAnnotation(\n                \"check-ids\"\n            ).addAnnotation(\n                AnnotationSpec.builder(ClassName.bestGuess(Constants.Router.KEEP_ANNOTATION_CLASS_NAME))\n                    .build()\n            ).addKdoc(\n                Constants.KDoc.init()\n            ).build()\n        )\n    }\n\n    private fun FunSpec.Builder.addCheckerStatement(\n        contextPickCases: List<ContextPickCase>,\n        allContexts: Map<String, Context>\n    ) = apply {\n        beginControlFlow(\"return ${Constants.IdChecker.ID_CHECKER_SIMPLE_CLASS_NAME}().apply\")\n        contextPickCases.forEach { value ->\n            val context = value.context\n            val register = value.pickCase.register\n            val componentIdClassName =\n                Constants.IdChecker.makeComponentIdClassName(\n                    context.uri,\n                    context.publishArtifactName\n                )\n            val aggregateIdClassName =\n                if (context.enableProvideRoute && register != RouterRegister.NONE)\n                    Constants.IdChecker.makeAggregateIdClassName(\n                        context.uri,\n                        context.publishArtifactName\n                    )\n                else \"null\"\n            addStatement(\n                (\"${Constants.IdChecker.ID_CHECKER_FUNCTION_NAME_ADD_COMPONENT_ID}(\\n\" +\n                        \"\\\"${context.uri}\\\",\\n\" +\n                        \"${componentIdClassName},\\n\" +\n                        \"${aggregateIdClassName}\\n\" +\n                        \")\").noSpaces()\n            )\n        }\n        allContexts.forEach { (_, context) ->\n            if (context.enableProvideRoute) {\n                val contextIdClassName =\n                    Constants.IdChecker.makeContextIdClassName(\n                        context.uri,\n                        context.publishArtifactName\n                    )\n                addStatement(\n                    (\"${Constants.IdChecker.ID_CHECKER_FUNCTION_NAME_ADD_CONTEXT_ID}(\\n\" +\n                            \"\\\"${context.uri}\\\",\\n\" +\n                            \"${contextIdClassName}\\n\" +\n                            \")\").noSpaces()\n                )\n            }\n        }\n        endControlFlow()\n    }\n\n}\n\n\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/java/com/rubik/plugins/shell/generate/files/RubikInitializerSourceFile.kt",
    "content": "package com.rubik.plugins.shell.generate.files\n\nimport com.ktnail.x.NameBox\nimport com.rubik.plugins.basic.Constants\nimport com.rubik.plugins.basic.utility.addRGeneratedAnnotation\nimport com.rubik.picker.container.ContextPickCase\nimport com.rubik.context.router.RouterRegister\nimport com.rubik.publish.publishArtifactName\nimport com.squareup.kotlinpoet.*\nimport java.io.File\n\n/**\n *  Generate rubik Initializer.\n *\n *  @since 1.3\n */\nclass RubikInitializerSourceFile(\n    private val contextPickCases: List<ContextPickCase>,\n    private val generatedDir: File\n) {\n    fun generate() {\n        FileSpec.builder(\n            Constants.Router.GENERATE_PACKAGE_NAME,\n            Constants.Router.GENERATE_RUBIK_INITIALIZER_FILE_NAME\n        ).generateRubikInit(\n            contextPickCases\n        ).build().writeTo(generatedDir)\n    }\n\n    private fun FileSpec.Builder.generateRubikInit(contextPickCases: List<ContextPickCase>) = apply {\n        val aggregateNormal = mutableListOf<String>()\n        val aggregateReflect = mutableListOf<String>()\n        val nameBox = NameBox()\n        contextPickCases.forEach { value ->\n            if (value.context.enableProvideRoute) {\n                when (value.pickCase.register) {\n                    RouterRegister.NEW_INSTANCE -> {\n                        val className =\n                            Constants.Aggregate.Declare.makeAggregateClassName(value.context.publishArtifactName)\n                        val memberName = MemberName(\n                            Constants.Aggregate.Declare.makeAggregatePackageName(value.context.uri),\n                            className\n                        )\n                        val useName = nameBox.useName(className)\n                        if (useName != className) {\n                            addAliasedImport(memberName, useName)\n                        }\n                        addImport(memberName.packageName, memberName.simpleName)\n                        aggregateNormal.add(useName)\n                    }\n                    RouterRegister.REFLECT_INSTANCE -> {\n                        val className =\n                            Constants.Aggregate.Declare.makeAggregateClassName(value.context.publishArtifactName)\n                        val memberName = MemberName(\n                            Constants.Aggregate.Declare.makeAggregatePackageName(value.context.uri),\n                            className\n                        )\n                        aggregateReflect.add(memberName.canonicalName)\n                    }\n                    else -> {}\n                }\n            }\n        }\n\n        addFunction(\n            FunSpec.builder(\n                Constants.Router.INIT_FUNCTION_NAME\n            ).receiver(\n                ClassName.bestGuess(Constants.Router.RUBIK_CLASS_NAME)\n            ).addNormalRegisterStatement(\n                aggregateNormal\n            ).addReflectRegisterStatement(\n                aggregateReflect\n            ).addRGeneratedAnnotation(\n                \"init\"\n            ).addAnnotation(\n                AnnotationSpec.builder(ClassName.bestGuess(Constants.Router.KEEP_ANNOTATION_CLASS_NAME))\n                    .build()\n            ).addKdoc(\n                Constants.KDoc.init()\n            ).build()\n        )\n    }\n\n    private fun FunSpec.Builder.addNormalRegisterStatement(names: List<String>) = apply {\n        names.forEach { className ->\n            addStatement(\"$className.${Constants.Aggregate.REGISTER_FUNCTION_NAME}()\")\n        }\n    }\n\n    private fun FunSpec.Builder.addReflectRegisterStatement(names: List<String>) = apply {\n        names.forEach { className ->\n            addStatement(\"${Constants.Router.METHOD_REGISTER_NAME}(\\\"$className\\\")\")\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/resources/META-INF/gradle-plugins/rubik-analyst.properties",
    "content": "implementation-class=com.rubik.plugins.analyst.AnalystPlugin\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/resources/META-INF/gradle-plugins/rubik-context.properties",
    "content": "implementation-class=com.rubik.plugins.context.ContextPlugin\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/resources/META-INF/gradle-plugins/rubik-shell.properties",
    "content": "implementation-class=com.rubik.plugins.shell.ShellPlugin\n"
  },
  {
    "path": "rubik/rubik_plugins/src/main/resources/META-INF/gradle-plugins/rubik.properties",
    "content": "implementation-class=com.rubik.plugins.MainPlugin"
  },
  {
    "path": "rubik/rubik_publish/build.gradle",
    "content": "apply plugin: 'java-library'\napply plugin: 'kotlin'\n\nsourceSets {\n    main {\n        java {\n            srcDirs = ['src/main/java', kotlin_version_suffix == publishK1_7Suffix ? 'src/k1_7/java' : 'src/k1_5/java']\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation gradleApi()\n    implementation localGroovy()\n\n    implementation \"com.android.tools.build:gradle:$agbt_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n    implementation project(':rubik:rubik_context')\n\n    implementation deps.ktnail.x\n    implementation deps.ktnail.gradle\n\n}\n\ntasks.withType(JavaCompile) {\n    options.encoding = \"UTF-8\"\n}\n\ncompileKotlin {\n    kotlinOptions.freeCompilerArgs += ['-module-name', \"kmd.mars.rubik.publishing\"]\n}\n"
  },
  {
    "path": "rubik/rubik_publish/src/k1_5/java/ResetKotlinCompileTask.kt",
    "content": "package com.rubik.publish.task.provider\n\nimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile\nimport java.io.File\n\nfun KotlinCompile.resetDestinationDir(dir: File) {\n    this.destinationDir = dir\n}\n\nfun KotlinCompile.resetSource(sourceDir: File) {\n    source = project.fileTree(sourceDir)\n}"
  },
  {
    "path": "rubik/rubik_publish/src/k1_7/java/ResetKotlinCompileTask.kt",
    "content": "package com.rubik.publish.task.provider\n\nimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile\nimport java.io.File\n\nfun KotlinCompile.resetDestinationDir(dir: File) {\n    destinationDirectory.set(dir)\n}\n\nfun KotlinCompile.resetSource(sourceDir: File) {\n    setSource(project.fileTree(sourceDir))\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/ByPluginVersion.kt",
    "content": "const val BY_PLUGIN_VERSION = \"1.10.0.0-AGBT4_2-K1_5-LOCAL\"\n// KTNail plugin update.\n//   by [sync].\n//   at timestamp : 2024-05-22 13:57:17.\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/exception/RubikNoClassesToJarException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.exception\n\n/**\n * Thrown when making a jar with no classes.\n *\n * @since 1.4\n */\ninternal class RubikNoClassesToJarException(private val absolutePath: String) : RuntimeException() {\n    override fun toString() =\n        \"RubikNoClassesToJarException making a jar with no classes in dir:${absolutePath}! \"\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/exception/RubikNoKaptTaskFoundException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when your project no kapt task found.\n *\n * @since 1.6\n */\ninternal class RubikNoKaptTaskFoundException(private val variant:String?) : RuntimeException(){\n    override fun toString() =\n        \"RubikNoKaptTaskFoundException can not find kapt task for variant[$variant]\"\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/exception/RubikNoKotlinCompileFoundException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.exception\n\n/**\n * Thrown when can not find kotlin compile task.\n *\n * @since 1.6\n */\ninternal class RubikNoKotlinCompileFoundException(private val variant:String?) : RuntimeException(){\n    override fun toString() =\n        \"RubikNoKaptTaskFoundException can not find kotlin compile task for variant[$variant]，make sure your project has kotlin support!\"\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/exception/RubikNoSourceToCompileException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.exception\n\n/**\n * Thrown when compiling kotlin sources, but no .kts.\n *\n * @since 1.6\n */\ninternal class RubikNoSourceToCompileException(private val absolutePath: String) : RuntimeException() {\n    override fun toString() =\n        \"RubikNoSourceToCompileException compiling kotlin sources, but no .kts in dir:${absolutePath}! \"\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/exception/RubikPublishVersionNotSetException.kt",
    "content": "package com.rubik.publish.exception\n\n\n/**\n * Thrown when publishing but no publish_version set.\n *\n * @since 1.7\n */\ninternal class RubikPublishVersionNotSetException(val uri: String) : RuntimeException() {\n    override fun toString() =\n        \"RubikPublishVersionNotSetException  component<${uri}> no publish_version set , you \" +\n                \"may be trying to publish component, or your component is auto \" +\n                \"generating Aggregate/ComponentId ! \"\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/exception/RubikTaskStateError.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.exception\n\nimport java.lang.RuntimeException\n\n/**\n * Thrown when turn task state error.\n *\n * @since 1.9\n */\ninternal class RubikTaskStateError(\n    private val from: String,\n    private val to: String\n) : RuntimeException() {\n    override fun toString() =\n        \"RubikTaskStateError Cannot switch from state:${from} to state:${to}! \"\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/extension/ContextRecordExtension.kt",
    "content": "package com.rubik.publish.extension\n\nimport com.rubik.context.publication.BuildType\nimport com.rubik.publish.record.ContextPublicationRecords\nimport com.rubik.publish.record.PublicationRecord\nimport groovy.lang.Closure\nimport org.gradle.api.Project\nimport org.gradle.util.ConfigureUtil\n\nopen class ContextRecordExtension(\n    val project: Project\n) {\n    val records = ContextPublicationRecords()\n\n    fun latest(closure: Closure<PublicationContextRecordExtension>) {\n        PublicationContextRecordExtension { record ->\n            record.dev = false\n            records.latest.add(record)\n        }.apply {\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    fun latestDev(closure: Closure<PublicationContextRecordExtension>) {\n        PublicationContextRecordExtension { record ->\n            record.dev = true\n            records.latest.add(record)\n        }.apply {\n            ConfigureUtil.configure(closure, this)\n        }\n    }\n\n    fun history(\n        vararg publications: String\n    ) {\n        publications.forEach { history->\n            records.history.add(history)\n        }\n    }\n}\n\nopen class PublicationContextRecordExtension(\n    val result: (PublicationRecord) -> Unit\n) {\n    fun component(publication: String, closure: Closure<PublicationRecord>) {\n        PublicationRecord(publication).apply{\n            ConfigureUtil.configure(closure, this)\n            result(this)\n        }\n    }\n    fun contextLibs(closure: Closure<PublicationRecord>) {\n        PublicationRecord(BuildType.CONTEXT_LIB_BUILD_TYPE_NAME).apply{\n            ConfigureUtil.configure(closure, this)\n            result(this)\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/extra/Context.kt",
    "content": "package com.rubik.publish\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.x.pascalToCamel\nimport com.ktnail.x.toPascal\nimport com.ktnail.x.uriToPascal\nimport com.rubik.context.extra.Context\nimport com.rubik.context.Ext\nimport com.rubik.context.extra.globalConfig\nimport com.rubik.publish.extra.publicationRecords\nimport com.rubik.publish.exception.RubikPublishVersionNotSetException\nimport com.rubik.publish.publication.Component.Companion.nameToComponentArtifactId\nimport com.rubik.publish.publication.Lib.Companion.nameToLibArtifactId\nimport com.rubik.publish.publication.Lib.Companion.versionToCodeVersion\nimport com.rubik.publish.publication.Lib.Companion.versionToDevVersion\nimport com.rubik.publish.record.getPublishVersion\nimport com.rubik.context.publication.BuildType as ContextBuildType\n\n// publish\nval Context.allowAutoVersion\n    get() = source.allowAutoVersion && project.propertyOr(Ext.RUBIK_AUTO_USE_PUBLICATION_RECORD, true)\n\nprivate fun Context.configPublishVersion(tag: String? = null) =\n    project.properties[Ext.R_PUB_VERSION]?.toString()\n        ?: source.publishVersion\n        ?: tag?.let { globalConfig.publishTagVersion(it) }\n        ?: globalConfig.publishVersion(uri)\n        ?: if (allowAutoVersion) publicationRecords.getPublishVersion(uri) else null\n\nfun Context.publishVersion(publicationType: PublicationType?, byTag: String? = null) =\n    when (publicationType) {\n        PublicationType.FORMAL -> configPublishVersion(byTag)\n        PublicationType.DEV -> configPublishVersion(byTag)?.versionToDevVersion()\n        else -> configPublishVersion(byTag)\n    } ?: throw  RubikPublishVersionNotSetException(uri)\n\nfun Context.doNotPublishVersion() =\n    configPublishVersion()?.versionToCodeVersion() ?: throw RubikPublishVersionNotSetException(uri)\n\nval Context.publishArtifactName\n    get() = name\nval Context.publishTaskArtifactName\n    get() = name.uriToPascal()\nval Context.publishDevArtifactName\n    get() = toPascal(name, \"Dev\")\nval Context.publishGroupId\n    get() = group\n\nfun Context.publishLibArtifactId(libType: String) = name.nameToLibArtifactId(libType)\nfun Context.publishComponentArtifactId(variantName: String) =\n    name.nameToComponentArtifactId(variantName)\n\nfun Context.buildTypeName() =\n    publishArtifactName.uriToPascal().pascalToCamel() + com.rubik.context.publication.BuildType.CONTEXT_LIB_BUILD_TYPE_NAME\n\nfun Context.compilerBuildTypeName() =\n    publishArtifactName.uriToPascal().pascalToCamel() + ContextBuildType.CONTEXT_LIB_COMPILER_BUILD_TYPE_NAME\n\nval Context.useResetCompiler: Boolean\n    get() = project.propertyOr(Ext.RUBIK_USE_RESET_COMPILER, true) && !source.publishOriginalValue"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/extra/Injector.kt",
    "content": "package com.rubik.publish.extra\n\nimport com.ktnail.gradle.maven.MavenDependency\nimport com.rubik.context.extra.Context\nimport com.rubik.context.extra.rubikMainProject\nimport com.rubik.context.utility.Module\nimport com.rubik.context.utility.ModuleInjector\nimport com.rubik.publish.record.PublicationRecords\nimport com.rubik.publish.task.PublishContextTasksContainer\nimport com.rubik.publish.task.name.PublishTaskName\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport com.rubik.publish.task.target.TaskTargetContainer\nimport org.gradle.api.Project\n\ninterface PublishModuleInjector : ModuleInjector {\n    val publicationRecords: PublicationRecords\n    val publishTasksContainer: PublishContextTasksContainer\n    val taskTargetContainer: TaskTargetContainer\n    fun contextToDependLibMavenDependencies(\n        context: Context, version: String, dev: Boolean?\n    ): List<Pair<String, MavenDependency>>\n}\n\nobject PublishModule : Module<PublishModuleInjector>()\n\nval publicationRecords: PublicationRecords\n    get() = PublishModule.content.publicationRecords\n\nval publishTasksContainer: PublishContextTasksContainer\n    get() = PublishModule.content.publishTasksContainer\n\nval Project.targetTaskName: PublishTaskName?\n    get() = PublishModule.content.taskTargetContainer.let { container->\n        container.projectTargetTaskName(this)?:   container.projectTargetTaskName(this.rubikMainProject)\n    }\n\nvar Context.target: ContextTaskTarget\n    set(value) { PublishModule.content.taskTargetContainer.taskTargets[uri] = value }\n    get() = PublishModule.content.taskTargetContainer.taskTargets[uri] ?: ContextTaskTarget.doNotPublish(this)\n\nfun Context.toDependLibMavenDependencies(\n    version: String,\n    dev: Boolean?\n): List<Pair<String, MavenDependency>> = PublishModule.content.contextToDependLibMavenDependencies(this, version, dev)"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/extra/Rubik.kt",
    "content": "package com.rubik.publish.extra\n\nimport com.ktnail.gradle.exception.MavenRepositoryNotSetException\nimport com.ktnail.gradle.maven.MavenConfig\nimport com.ktnail.gradle.p\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.x.Logger\nimport com.ktnail.x.camelToPascal\nimport com.ktnail.x.toCamel\nimport com.rubik.context.Ext\nimport com.rubik.context.log.LogTags\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport java.io.File\nimport java.net.URI\n\nfun Project.rubikTask(name: PublishTaskName): Task =\n    task(name.fullName) {}.apply {\n        group = name.group\n        Logger.p(LogTags.CREATE_TASK, this@rubikTask) { \" CREATE $group TASK (${name.fullName})\" }\n    }\n\nfun Project.getKaptTask(variantName: String) =\n    tasks.findByName(toCamel(\"kapt\", variantName.camelToPascal(), \"kotlin\"))\n\nval Project.publicationRecordDirRoot: File\n    get() = File(project.propertyOr(Ext.RUBIK_PUBLICATION_RECORD_FILES_DIR) {\n        project.rootProject.rootDir.absolutePath + File.separator + \"rubik_libs\"\n    })\n\nval Project.rubikMavenRepository: URI\n    get() = uri(propertyOr(Ext.RUBIK_MAVEN_REPOSITORY) { throw MavenRepositoryNotSetException() })\n\nval Project.rubikMavenLocalRepository: URI\n    get() = uri(propertyOr(Ext.RUBIK_MAVEN_LOCAL_REPOSITORY) { \"./rubik_maven_local\" })\n\nval Project.mavenConfig: MavenConfig\n    get() = MavenConfig(\n        project.rubikMavenRepository,\n        propertyOr(Ext.RUBIK_MAVEN_USERNAME) { throw MavenRepositoryNotSetException() },\n        propertyOr(Ext.RUBIK_MAVEN_PASSWORD) { throw MavenRepositoryNotSetException() },\n        rubikMavenLocalRepository\n    )"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/log/LogTags.kt",
    "content": "package com.rubik.publish.log\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.ktnail.x.LogTag\nimport com.ktnail.x.Logger\n\nobject LogTags {\n    val PUBLISH = LogTag(\"<RUBIK> PUBLISH \", Logger.Level.DEFAULT)\n\n    private val RUBIK_STEP_TASK_GRAPHIC =\n        LogTag(\"<< - RUBIK_STEP_CHANGED - >> < - TASK_GRAPHIC - >  \", Logger.Level.LOW)\n    private val RUBIK_STEP_PUBLISH =\n        LogTag(\"<< - RUBIK_STEP_CHANGED - >> < - PUBLISH - >  \", Logger.Level.DEFAULT)\n\n    fun logTaskGraphicFinish(type: String,name:String) =\n        Logger.dta(RUBIK_STEP_TASK_GRAPHIC) {\n            \"  Type:[${type}] Name:[${name}] FINISH ! \\n\"\n        }\n\n    fun logPublishFinish(path: String, publicationType: PublicationType?) =\n        Logger.dta(RUBIK_STEP_PUBLISH) {\n            \" $path DEV:${publicationType == PublicationType.DEV}  SUCCEEDED !!! \\n\"\n        }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/publication/Component.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.publication\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.DependencyType\nimport com.ktnail.gradle.flavorDependencyType\nimport com.ktnail.gradle.maven.MavenDependency\nimport com.ktnail.gradle.maven.Publication\nimport com.ktnail.gradle.p\nimport com.ktnail.x.*\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.log.LogTags\nimport com.rubik.publish.publishComponentArtifactId\nimport com.rubik.publish.publishGroupId\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport com.rubik.publish.extra.target\nimport com.rubik.publish.extra.toDependLibMavenDependencies\nimport org.gradle.api.Project\nimport java.io.File\n\n/**\n * Model of business code of contexts.\n *\n * @since 1.4\n */\nclass Component(\n    val project: Project,\n    private val context: Context,\n    baseName: String,\n    variant: BaseVariant,\n    override val versionCreator: VersionCreator,\n    override val publicationFile: File\n) : Publication() {\n\n    override val publicationName = toPascal(baseName, \"component\", variant.name.camelToPascal())\n\n    override val artifactId = context.publishComponentArtifactId(variant.name)\n\n    override val groupId = context.publishGroupId\n\n    override val sourceFile: File? = null\n\n    override val addDependencyTypes = mutableListOf<String>().apply {\n        add(DependencyType.API)\n        add(DependencyType.IMPLEMENTATION)\n        variant.name.camelToPascal().pascalToWords().forEach { flavorOrBuildType->\n            add(flavorOrBuildType.flavorDependencyType(DependencyType.API))\n            add(flavorOrBuildType.flavorDependencyType(DependencyType.IMPLEMENTATION))\n        }\n    }\n\n    override val exceptDependencies: List<MavenDependency>\n        get() = context.id.packed.mapNotNull { dep ->\n            val variant = dep.variant\n            val context = dep.context\n            if (null != variant) {\n                val group  = context.publishGroupId\n                val artifact = context.publishComponentArtifactId (variant)\n                Logger.p(LogTags.PUBLISH, project) { \" EXCEPT DEPENDENCY:[$group:$artifact]\" }\n                MavenDependency(group, artifact)\n            } else null\n        }\n\n    override val extraDependencies: List<MavenDependency>?\n        get() = if (context.target.publishingBoth) {\n            val dev = (context.target as? ContextTaskTarget.PublishContextTarget)?.devWhenPublishingComponent\n            mutableListOf<MavenDependency>().apply {\n                context.toDependLibMavenDependencies(version, dev).forEach { (type, dependency) ->\n                    if (type == DependencyType.API || type == DependencyType.IMPLEMENTATION)\n                        add(dependency)\n                }\n            }\n        } else null\n\n    companion object {\n        fun String.nameToComponentArtifactId(variantName: String) = toSnake(\n            false, \"-\", this, \"component\", variantName.pascalToSnake(false)\n        ).replace(\"_\", \"-\")\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/publication/Jar.kt",
    "content": "package com.rubik.publish.publication\n\nimport com.rubik.context.folder.getLibsTmpDirPath\nimport com.rubik.publish.task.provider.JarTaskProvider\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport java.io.File\n\ninterface Jar {\n    val artifactId :String\n    val jarToDir: File\n    val jarFromDir: File\n    val jarTaskName :String\n}\n\nfun Jar.getJarTask(project: Project): Task =\n    JarTaskProvider(project).getByLib(this)\n\nfun Jar.jarToFile(libTmpDirRoot: File, uri: String, typeName: String) = File(\n    \"${\n        getLibsTmpDirPath(\n            libTmpDirRoot,\n            uri,\n            typeName\n        )\n    }${File.separator}${artifactId}.jar\"\n)\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/publication/Lib.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.publication\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.maven.MavenDependency\nimport com.ktnail.gradle.maven.Publication\nimport com.ktnail.x.*\nimport com.rubik.context.extra.Context\nimport com.rubik.context.publication.BuildType\nimport com.rubik.context.publication.LibType\nimport com.rubik.context.folder.getGeneratedSourceDir\nimport com.rubik.context.folder.getLibClassesTmpDir\nimport com.rubik.context.folder.getLibsTmpDir\nimport com.rubik.publish.publishGroupId\nimport com.rubik.publish.publishLibArtifactId\nimport com.rubik.publish.task.provider.CopySourceTaskProvider\nimport com.rubik.publish.task.provider.KotlinCompileTaskProvider\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile\nimport java.io.File\n\n/**\n * Model of context lib.\n *\n * @since 1.4\n */\nclass Lib(\n    val context: Context,\n    private val project: Project,\n    private val libType: String,\n    baseName: String,\n    val variant: BaseVariant,\n    override val versionCreator: VersionCreator,\n    private val libTmpDirRoot: File\n) : Publication(), Jar {\n    override val publicationName = toPascal(baseName, libType.snakeToPascal(), BuildType.CONTEXT_LIB_BUILD_TYPE_NAME)\n\n    override val artifactId = context.publishLibArtifactId(libType)\n\n    override val groupId = context.publishGroupId\n\n    override val publicationFile = jarToFile(libTmpDirRoot, context.uri, libType)\n\n    fun getKotlinCompileTask(project: Project, compilerVariant: BaseVariant): Task =\n        KotlinCompileTaskProvider(project).getByLib(this, compilerVariant.name)\n\n    // source\n    val sourceDir = getGeneratedSourceDir(project, variant.name, context.uri)\n\n    fun getCopySourceTask(project: Project): Task =\n        source.let { CopySourceTaskProvider(project).getByLib(this) }\n\n    val source: SourceCode?\n        get() = when (libType) {\n            LibType.CONTEXT -> SourceCode(\n                context,\n                project,\n                LibType.CONTEXT_SOURCES,\n                variant,\n                sourceDir,\n                libTmpDirRoot\n            )\n            else -> null\n        }\n\n    override val sourceFile: File?\n        get() = source?.jarToFile(libTmpDirRoot, context.uri, LibType.CONTEXT_SOURCES)\n\n    // pom\n    override val addDependencyTypes = emptyList<String>()\n\n    override val exceptDependencies: List<MavenDependency>? = null\n\n    override val extraDependencies: List<MavenDependency>? = null\n\n    // jar\n    override val jarToDir = getLibsTmpDir(libTmpDirRoot, context.uri, libType)\n\n    override val jarFromDir = getLibClassesTmpDir(project, libType, variant.name, context.uri)\n\n    override val jarTaskName = toCamel(\"jar\", \"rubik\", variant.name.camelToPascal(), libType.snakeToCamel())\n\n    companion object {\n        fun String.nameToLibArtifactId(libType: String) = toSnake(false, \"-\" ,this, \"lib\", libType).replace(\"_\", \"-\")\n        fun String.versionToDevVersion() = \"${this}-DEV\"\n        fun String.versionToCodeVersion() = \"${this}-CODE\"\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/publication/SourceCode.kt",
    "content": "package com.rubik.publish.publication\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.x.camelToPascal\nimport com.ktnail.x.snakeToCamel\nimport com.ktnail.x.toCamel\nimport com.rubik.context.extra.Context\nimport com.rubik.context.Ext\nimport com.rubik.context.folder.getLibsTmpDir\nimport com.rubik.publish.publishLibArtifactId\nimport com.rubik.publish.task.provider.JarTaskProvider\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport java.io.File\n\nclass SourceCode(\n    val context: Context,\n    val project: Project,\n    typeName: String,\n    val variant: BaseVariant,\n    override val jarFromDir: File,\n    libTmpDirRoot: File\n) : Jar {\n    override val artifactId = context.publishLibArtifactId(typeName)\n\n    override val jarToDir =  getLibsTmpDir(libTmpDirRoot, context.uri, typeName)\n\n    override val jarTaskName: String =\n        toCamel(\"jar\", \"rubik\", variant.name.camelToPascal(), typeName.snakeToCamel())\n\n    fun getJarSourceTask(project: Project): Task? =\n        if (project.propertyOr(Ext.RUBIK_PUBLISH_CONTEXT_LIB_SOURCE, true))\n            JarTaskProvider(project).getByLib(this)\n        else null\n}\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/record/ContextPublicationRecords.kt",
    "content": "package com.rubik.publish.record\n\nimport BY_PLUGIN_VERSION\nimport com.ktnail.x.now\nimport com.ktnail.x.sysMyName\nimport com.rubik.context.publication.BuildType\nimport com.rubik.publish.record.generate.file.RubikPublicationRecordFiles\nimport com.rubik.publish.record.version.StandardVersion\nimport org.gradle.api.Project\n\ntypealias PublicationRecords = MutableMap<String, ContextPublicationRecords>\n\nclass ContextPublicationRecords {\n    val latest = mutableListOf<PublicationRecord>()\n    val history = mutableListOf<String>()\n\n    val isEmpty\n        get() = latest.isEmpty()\n\n    val formalLatest: List<PublicationRecord>\n        get() = latest.filter { record -> !record.dev && record.state != RecordStatus.FAIL_OUT }\n\n    val devLatest: List<PublicationRecord>\n        get() = latest.filter { record -> record.dev && record.state != RecordStatus.FAIL_OUT }\n\n    fun update(record: PublicationRecord) {\n        latest.find { latestRecord -> latestRecord.dev == record.dev && latestRecord.key == record.key }?.let { out ->\n            out.state = RecordStatus.FAIL_OUT\n            if (!out.dev)\n                history.add(0, out.toHistory())\n        }\n        latest.add(record)\n    }\n\n    fun biggestLatestVersion(): StandardVersion? {\n        return latest.fold<PublicationRecord, StandardVersion?>(null) { acc, record ->\n            if (record.state == RecordStatus.NEW_UPDATE || record.dev) {\n                acc\n            } else if (null == acc) {\n                record.standardVersion\n            } else {\n                record.standardVersion.biggerOne(acc)\n            }\n        }\n    }\n\n    fun latestVersion(key: String, dev: Boolean): String? =\n        latest.find { record -> record.dev == dev && record.key == key && record.state != RecordStatus.NEW_UPDATE }?.version\n\n}\n\nfun PublicationRecords.updateContextLibs(\n    project: Project,\n    uri: String,\n    version: String,\n    dev: Boolean,\n    generate: Boolean = false\n) {\n    update(project, uri, BuildType.CONTEXT_LIB_BUILD_TYPE_NAME, version, dev, generate)\n}\n\nfun PublicationRecords.updateComponent(\n    project: Project,\n    uri: String,\n    variant: String,\n    version: String,\n    dev: Boolean,\n    generate: Boolean = false\n) {\n    update(project, uri, variant, version, dev, generate)\n}\nprivate fun PublicationRecords.update(\n    project: Project,\n    uri: String,\n    key: String,\n    version: String,\n    dev: Boolean,\n    generate: Boolean\n) {\n    getOrPut(uri) {\n        ContextPublicationRecords()\n    }.let { contextRecord ->\n        val task = \"PluginVersion:[$BY_PLUGIN_VERSION] Task:[${project.gradle.startParameter.taskNames.joinToString(\",\")}]\"\n        val user = sysMyName()\n        val time = now()\n        contextRecord.update(PublicationRecord(key, version, task, user, time, dev))\n        if (generate) {\n            RubikPublicationRecordFiles.generate(project, mutableMapOf(uri to contextRecord))\n        }\n    }\n}\n\nfun PublicationRecords.getPublishVersion(uri: String): String? {\n    return this[uri]?.biggestLatestVersion()?.plusOne()\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/record/PublicationRecord.kt",
    "content": "package com.rubik.publish.record\n\nimport com.ktnail.x.formatBy\nimport com.rubik.context.publication.BuildType\nimport com.rubik.publish.record.version.StandardVersion\n\nopen class PublicationRecord(\n    val variant: String\n) {\n    var version: String? = null\n    var task: String? = null\n    var user: String? = null\n    var time: Long? = null\n    var dev = false\n\n    var state = RecordStatus.LOAD_FROM_CONFIG\n\n    constructor(\n        variant: String,\n        version: String,\n        task: String,\n        user: String,\n        timestamp: Long,\n        dev:Boolean\n    ) : this(variant) {\n        this.version = version\n        this.task = task\n        this.user = user\n        this.time = timestamp\n        this.dev = dev\n        this.state = RecordStatus.NEW_UPDATE\n    }\n\n    val standardVersion: StandardVersion\n        get() = StandardVersion(version ?: \"\")\n\n    val key: String\n        get() = variant\n\n    val formatTime\n        get() = time?.formatBy(\"yyyy-MM-dd HH:mm:ss\")\n\n    fun toHistory() = \"[$version] - ${\n        if (variant == BuildType.CONTEXT_LIB_BUILD_TYPE_NAME) \"ContextLibs\"\n        else \"Component:[$variant]\"\n    } - Time:[${formatTime}] - User:[${user}] - $task\"\n\n}\n\nenum class RecordStatus {\n    LOAD_FROM_CONFIG,\n    NEW_UPDATE,\n    FAIL_OUT\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/record/generate/file/RubikPublicationRecordFiles.kt",
    "content": "package com.rubik.publish.record.generate.file\n\nimport BY_PLUGIN_VERSION\nimport com.ktnail.gradle.propertyOfT\nimport com.ktnail.x.*\nimport com.rubik.context.Ext\nimport com.rubik.context.extra.rubikExtensionName\nimport com.rubik.context.publication.BuildType\nimport com.rubik.publish.extra.publicationRecordDirRoot\nimport com.rubik.publish.extra.publicationRecords\nimport com.rubik.publish.record.ContextPublicationRecords\nimport com.rubik.publish.record.PublicationRecord\nimport com.rubik.publish.record.PublicationRecords\nimport org.gradle.api.Project\nimport java.io.File\n\n/**\n *  Generate rubik publication record files.\n *\n *  @since 1.10\n */\nclass RubikPublicationRecordFiles(\n    private val project: Project,\n    private val records: PublicationRecords,\n    private val generatedDir: File\n) {\n    companion object{\n        fun generate(\n            project: Project,\n            pubRecords: PublicationRecords? = null\n        ) {\n            RubikPublicationRecordFiles(\n                project,\n                pubRecords ?: publicationRecords,\n                project.publicationRecordDirRoot\n            ).generate()\n        }\n    }\n\n    fun generate() {\n        records.forEach { (uri, contextRecords) ->\n            doGenerate(\n                uri,\n                contextRecords,\n                File(generatedDir.absolutePath + File.separator + \"rubik-${uri.uriToSnake()}-publication-records.gradle\")\n            )\n        }\n    }\n\n    private fun doGenerate(uri: String, contextRecords: ContextPublicationRecords, file: File) {\n        if (!contextRecords.isEmpty) {\n            val lines = mutableListOf<String>()\n            lines.addAll(KDoc.publicationRecord(uri))\n            lines.add(\"${project.rubikExtensionName} {\")\n            lines.addLevel(1, \"publications('${uri}') {\")\n            lines.addRecords(contextRecords.formalLatest, \"latest\")\n            lines.addRecords(contextRecords.devLatest, \"latestDev\")\n            lines.addHistory(contextRecords.history)\n            lines.addLevel(1, \"}\")\n            lines.add(\"}\")\n            file.replace { tmp->\n                tmp.writeLines(lines)\n            }\n        }\n    }\n\n    private fun MutableList<String>.addRecords(\n        list: List<PublicationRecord>,\n        functionName: String\n    ) {\n        if (list.isNotEmpty()) {\n            addLevel(2,\"$functionName {\")\n            list.sortedBy { record -> record.time }.reversed().forEach { record ->\n                if (record.key == BuildType.CONTEXT_LIB_BUILD_TYPE_NAME)\n                    addLevel(3, \"contextLibs {\")\n                else\n                    addLevel(3, \"component('${record.key}') {\")\n                addLevel(4,\"version = '${record.version}' \")\n                addLevel(4,\"time = ${record.time} /* ${record.formatTime} */\")\n                addLevel(4,\"user = '${record.user}' \")\n                addLevel(4,\"task = '${record.task}' \")\n                addLevel(3, \"}\")\n            }\n            addLevel(2, \"}\")\n        }\n    }\n\n    private fun MutableList<String>.addHistory(\n        history: MutableList<String>\n    ) {\n        if (history.isNotEmpty()) {\n            val configSubTo = project.propertyOfT<Int>(Ext.RUBIK_PUBLICATION_RECORD_HISTORY_MAX_SIZE) ?: 10\n            val subHistory = history.subList(0, if (history.size > configSubTo) configSubTo else history.size)\n            if(subHistory.isNotEmpty()){\n                addLevel(2, \"history (\")\n                subHistory.forEachIndexed() { index, record ->\n                    addLevel(3, if (index != subHistory.size - 1) \"'${record}',\" else \"'${record}'\")\n                }\n                addLevel(2, \")\")\n            }\n        }\n    }\n\n    object KDoc {\n        fun publicationRecord(uri: String) =\n            updateFileKDoc(\"generated by Rubik Gradle Plugin (${BY_PLUGIN_VERSION}).\", null, \"uri\" to \"[$uri]\").kdocToLines()\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/record/version/StandardVersion.kt",
    "content": "package com.rubik.publish.record.version\n\ndata class StandardVersion(val numbers: List<Int>) {\n    constructor(version: String) : this(version.split(\".\").map { str -> str.toIntOrNull() ?: 0 }.let { numbers -> numbers.ifEmpty { listOf(0) } })\n\n    override fun toString() = numbers.joinToString(\".\")\n\n    fun biggerOne(other: StandardVersion): StandardVersion {\n        val shortOne: StandardVersion\n        val longOne: StandardVersion\n        if (numbers.size < other.numbers.size) {\n            shortOne = this\n            longOne = other\n        } else {\n            shortOne = other\n            longOne = this\n        }\n\n        for (i in shortOne.numbers.indices) {\n            if (shortOne.numbers[i] > longOne.numbers[i])\n                return shortOne\n            if (longOne.numbers[i] > shortOne.numbers[i])\n                return longOne\n        }\n\n        return longOne\n    }\n\n    fun plusOne(): String {\n        val last = numbers.last() + 1\n        val list = numbers.subList(0, numbers.size - 1).toMutableList()\n        list.add(last)\n        return StandardVersion(list).toString()\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/GlobalPublishTasksController.kt",
    "content": "package com.rubik.publish.task\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.publish.task.global.*\nimport org.gradle.api.Project\n\n/**\n * Task graphic of all context libs in project,\n * graph assemble all task & publish all task.\n *\n * @since 1.5\n */\nclass GlobalPublishTasksController(\n    val project: Project\n) {\n    private val allContextLibsTasks =\n        AllContextLibsTask(project, PublicationType.FORMAL) to AllContextLibsTask(project, PublicationType.DEV)\n    private val tagContextLibsTasks =\n        mutableMapOf<String, PublishTaskPair<TagContextLibsTask>>()\n\n    private val allComponentTasks =\n        AllComponentTask(project, PublicationType.FORMAL) to AllComponentTask(project, PublicationType.DEV)\n    private val tagComponentTasks =\n        mutableMapOf<String, PublishTaskPair<TagComponentTask>>()\n\n    private val allComponentAndContextLibsTasks =\n        AllComponentAndContextLibsTask(project, PublicationType.FORMAL) to AllComponentAndContextLibsTask(project, PublicationType.DEV)\n    private val tagComponentAndContextLibsTasks =\n        mutableMapOf<String, PublishTaskPair<TagComponentAndContextLibsTask>>()\n\n    fun initTags(tags: Set<String>) {\n        tags.forEach { tag ->\n            tagContextLibsTasks.getOrPut(tag) {\n                TagContextLibsTask(project, tag, PublicationType.FORMAL) to TagContextLibsTask(project, tag, PublicationType.DEV)\n            }\n            tagComponentTasks.getOrPut(tag) {\n                TagComponentTask(project, tag, PublicationType.FORMAL) to TagComponentTask(project, tag, PublicationType.DEV)\n\n            }\n            tagComponentAndContextLibsTasks.getOrPut(tag) {\n                TagComponentAndContextLibsTask(project, tag, PublicationType.FORMAL) to TagComponentAndContextLibsTask(project, tag, PublicationType.DEV)\n\n            }\n        }\n    }\n\n    fun contextTasks(taskGroup: PublishContextTaskGroup) {\n        taskGroup.libTasks?.let { tasks ->\n            allContextLibsTasks.linkExecuteDependsOn(tasks)\n            taskGroup.tags?.forEach { tag ->\n                tagContextLibsTasks[tag]?.linkExecuteDependsOn(tasks)\n            }\n        }\n        taskGroup.componentTasks?.let { tasks ->\n            allComponentTasks.linkExecuteDependsOn(tasks)\n            taskGroup.tags?.forEach { tag ->\n                tagComponentTasks[tag]?.linkExecuteDependsOn(tasks)\n            }\n        }\n        taskGroup.bothTasks?.let { tasks ->\n            allComponentAndContextLibsTasks.linkExecuteDependsOn(tasks)\n            taskGroup.tags?.forEach { tag ->\n                tagComponentAndContextLibsTasks[tag]?.linkExecuteDependsOn(tasks)\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/PublishContextTask.kt",
    "content": "package com.rubik.publish.task\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.ktnail.gradle.task.linkDependsOn\nimport com.ktnail.gradle.whenExecuted\nimport com.ktnail.x.VersionCreator\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.extra.rubikTask\nimport com.rubik.publish.extra.targetTaskName\nimport com.rubik.publish.doNotPublishVersion\nimport com.rubik.publish.log.LogTags\nimport com.rubik.publish.publishArtifactName\nimport com.rubik.publish.publishDevArtifactName\nimport com.rubik.publish.publishVersion\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nabstract class PublishTask(\n    val project: Project,\n    val name: PublishTaskName,\n    val publicationType: PublicationType\n) {\n    private val targetTaskName\n        get() = project.targetTaskName\n\n    val gradleTask = project.rubikTask(name)\n\n    open val startTaskNames: Array<PublishTaskName>\n        get() = arrayOf(name)\n\n    /**\n     *   is the task you chose to execute\n     */\n    val targetExecute: Boolean\n        get() = null != startTaskNames.find { name -> name.fullName == targetTaskName?.fullName }\n\n    /**\n     *   this task will be execute this time\n     */\n    var needExecute: Boolean = false\n        get() = targetExecute || field\n\n    // graphic\n    private var graphiced = false\n\n    open fun onGraphic() {}\n\n    private fun graphic() {\n        needExecute = true\n        if (!graphiced) {\n            graphiced = true\n            onGraphic()\n            LogTags.logTaskGraphicFinish(this::class.java.simpleName, name.fullName)\n        }\n        executeActions.forEach {action->\n            action()\n        }\n        executeActions.clear()\n    }\n\n    fun graphicIfTarget() {\n        if (targetExecute) {\n            graphic()\n        }\n    }\n\n    private fun graphicIfDepends() {\n        project.whenExecuted {\n            graphic()\n        }\n    }\n\n    private val executeActions = mutableListOf<() -> Unit>()\n\n    fun ifExecute(action: () -> Unit) {\n        if (needExecute) {\n            action()\n        } else {\n            executeActions.add(action)\n        }\n    }\n\n    fun linkExecuteDependsOn(other: PublishTask) {\n        gradleTask.linkDependsOn(other.gradleTask)\n        graphicIfDepends()\n        other.graphicIfDepends()\n    }\n\n}\n\nabstract class PublishContextTask(\n    project: Project,\n    val context: Context,\n    name: PublishTaskName,\n    publicationType: PublicationType,\n    val byTag: String?\n) : PublishTask(project, name, publicationType) {\n\n    private val baseVersion\n        get() = if (needExecute) context.publishVersion(publicationType, byTag)\n        else context.doNotPublishVersion()\n\n    val versionCreator = VersionCreator { baseVersion }\n\n    val version\n        get() = versionCreator.version\n\n    val artifactName: String\n        get() =if (publicationType == PublicationType.DEV) context.publishDevArtifactName else context.publishArtifactName\n\n    val tags\n        get() = context.tagNames\n}\n\ntypealias  PublishTaskPair<T> = Pair<T, T>\n\nfun <L : PublishTask, R : PublishTask> PublishTaskPair<R>.linkExecuteDependsOn(other: PublishTaskPair<L>) {\n    if (first.needExecute)\n        first.linkExecuteDependsOn(other.first)\n    if (second.needExecute)\n        second.linkExecuteDependsOn(other.second)\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/PublishContextTaskController.kt",
    "content": "package com.rubik.publish.task\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.arrayProperties\nimport com.ktnail.gradle.forEachVariant\nimport com.ktnail.gradle.maven.PublishingTaskProvider\nimport com.rubik.context.extra.Context\nimport com.rubik.context.Ext\nimport com.rubik.context.extra.isCustomVariant\nimport com.rubik.context.extra.libTmpDirRoot\nimport com.rubik.publish.extra.mavenConfig\nimport com.rubik.publish.task.both.ComponentAndContextLibsTask\nimport com.rubik.publish.task.both.PackingLinkComponentAndContextLibsTask\nimport com.rubik.publish.task.both.VariantComponentAndContextLibsTask\nimport com.rubik.publish.task.component.ComponentTask\nimport com.rubik.publish.task.component.PackingLinkComponentTask\nimport com.rubik.publish.task.component.VariantComponentTask\nimport com.rubik.publish.task.lib.ContextLibTask\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport com.rubik.publish.extra.publishTasksContainer\nimport org.gradle.api.Project\nimport java.io.File\n\nopen class PublishContextTaskController(\n    val project: Project,\n    private val libTmpDirRoot: File = project.libTmpDirRoot\n){\n\n    init {\n        project.afterEvaluate {\n            graphTasks()\n            registerToRoot()\n        }\n    }\n\n    open val tasks = mutableMapOf<String, PublishContextTaskGroup>()\n\n    private val tasksToGraph = mutableListOf<PublishTask>()\n\n    private val publishingTaskProvider = PublishingTaskProvider(project, project.mavenConfig)\n\n    private val exceptBuildTypes = project.arrayProperties(Ext.RUBIK_EXCEPT_COMPONENT_BUILD_TYPES)\n    private val exceptFlavors = project.arrayProperties(Ext.RUBIK_EXCEPT_COMPONENT_FLAVORS)\n\n    fun createTasks(\n        context: Context,\n        target: ContextTaskTarget,\n        onPublishVariantComponent: (VariantComponentTask) -> Unit\n    ) {\n        val libsTasks = createContextLibTask(context, target)\n        var componentTasks: PublishTaskPair<ComponentTask>? = null\n\n        project.forEachVariant { variant ->\n            if (!variant.isCustomVariant && !variant.isExceptedVariant) {\n                createVariantComponentTask(context, target, variant)?.let { variantComponentTasks ->\n                    if (componentTasks == null) {\n                        createComponentTask(context, target)?.let {\n                            componentTasks = it\n                            createPackingLinkComponentTask(context, it)\n                            if (null != libsTasks) {\n                            val bothTasks = createComponentAndContextLibsTask(context, target, libsTasks, it)\n                                createPackingLinkComponentAndContextLibsTask(context, bothTasks)\n                            }\n                        }\n                    }\n\n                    if (null != libsTasks) {\n                        createVariantComponentAndContextLibsTask(context, target, variant, libsTasks, variantComponentTasks)\n                    }\n\n                    componentTasks?.first?.addVariantTask(variantComponentTasks.first)\n                    componentTasks?.second?.addVariantTask(variantComponentTasks.second)\n\n                    variantComponentTasks.first.ifExecute {\n                        onPublishVariantComponent(variantComponentTasks.first)\n                    }\n                    variantComponentTasks.second.ifExecute {\n                        onPublishVariantComponent(variantComponentTasks.second)\n                    }\n                }\n            }\n        }\n    }\n\n    private fun createContextLibTask(\n        context: Context,\n        target: ContextTaskTarget\n    ) = if (context.enableProvideRoute)\n        ContextLibTask(\n            project,\n            context,\n            target,\n            ContextLibTask.AssembleTask(project, context),\n            publishingTaskProvider,\n            libTmpDirRoot\n        ).register()\n    else null\n\n    private fun createVariantComponentTask(\n        context: Context,\n        target: ContextTaskTarget,\n        variant: BaseVariant\n    ) = if (context.enablePublishComponent)\n        VariantComponentTask(\n            project,\n            context,\n            target,\n            variant,\n            publishingTaskProvider\n        ).register()\n    else null\n\n    private fun createComponentTask(\n        context: Context,\n        target: ContextTaskTarget\n    ) = if (context.enablePublishComponent)\n        ComponentTask(\n            project, context,\n            target\n        ).register()\n    else null\n\n    private fun createComponentAndContextLibsTask(\n        context: Context,\n        target: ContextTaskTarget,\n        libTasks: PublishTaskPair<ContextLibTask>,\n        componentTasks: PublishTaskPair<ComponentTask>\n    ) = ComponentAndContextLibsTask(\n            project,\n            context,\n            target,\n            libTasks,\n            componentTasks\n        ).register()\n\n\n    private fun createVariantComponentAndContextLibsTask(\n        context: Context,\n        target: ContextTaskTarget,\n        variant: BaseVariant,\n        libTasks: PublishTaskPair<ContextLibTask>,\n        componentTasks: PublishTaskPair<VariantComponentTask>\n    ) = VariantComponentAndContextLibsTask(\n            project,\n            context,\n            target,\n            variant,\n            libTasks,\n            componentTasks\n        ).register()\n\n\n    private fun createPackingLinkComponentTask(\n        context: Context,\n        componentTasks: PublishTaskPair<ComponentTask>\n    ) = if (context.whoPackingMe.isNotEmpty())\n        PackingLinkComponentTask(\n            project,\n            context,\n            componentTasks\n        ).register()\n    else null\n\n    private fun createPackingLinkComponentAndContextLibsTask(\n        context: Context,\n        bothTasks: PublishTaskPair<ComponentAndContextLibsTask>\n    ) = if (context.whoPackingMe.isNotEmpty())\n        PackingLinkComponentAndContextLibsTask(\n            project,\n            context,\n            bothTasks\n        ).register()\n    else null\n\n    private fun graphTasks() = tasksToGraph.forEach { task ->\n        task.graphicIfTarget()\n    }\n\n    private fun <T : PublishContextTask> PublishTaskPair<T>.register() = apply {\n        if (first.targetExecute)\n            tasksToGraph.add(first)\n        if (second.targetExecute)\n            tasksToGraph.add(second)\n        tasks.getOrPut(first.context.uri) { PublishContextTaskGroup() }.put(this)\n    }\n\n    private fun registerToRoot() {\n        publishTasksContainer.registerContextTasks(tasks)\n    }\n\n    private val BaseVariant.isExceptedVariant: Boolean\n        get() = (exceptBuildTypes.isNotEmpty() && buildType.name in exceptBuildTypes) ||\n                (exceptFlavors.isNotEmpty() && productFlavors.any { flavor -> flavor.name in exceptFlavors })\n\n}\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/PublishContextTaskGroup.kt",
    "content": "package com.rubik.publish.task\n\nimport com.rubik.publish.task.both.ComponentAndContextLibsTask\nimport com.rubik.publish.task.both.PackingLinkComponentAndContextLibsTask\nimport com.rubik.publish.task.component.ComponentTask\nimport com.rubik.publish.task.component.PackingLinkComponentTask\nimport com.rubik.publish.task.lib.ContextLibTask\n\nclass PublishContextTaskGroup {\n    var libTasks: PublishTaskPair<PublishContextTask>? = null\n\n    var componentTasks: PublishTaskPair<PublishContextTask>? = null\n\n    private var componentAndContextLibsTasks: PublishTaskPair<PublishContextTask>? = null\n\n    val bothTasks\n        get() = componentAndContextLibsTasks ?: componentTasks ?: libTasks\n\n    var packingLinkComponentTasks: PublishTaskPair<PublishContextTask>? = null\n\n    private var packingLinkComponentAndContextLibsTasks: PublishTaskPair<PublishContextTask>? = null\n\n    val packingLinkBothTasks\n        get() = packingLinkComponentAndContextLibsTasks ?: packingLinkComponentTasks\n\n    val context get() = bothTasks?.first?.context\n\n    val tags get() = context?.tagNames\n\n    val uri get() = context?.uri\n\n    fun put(tasks: PublishTaskPair<PublishContextTask>) {\n        when (tasks.first) {\n            is ContextLibTask -> libTasks = tasks\n            is ComponentTask -> componentTasks = tasks\n            is ComponentAndContextLibsTask -> componentAndContextLibsTasks = tasks\n            is PackingLinkComponentTask -> packingLinkComponentTasks = tasks\n            is PackingLinkComponentAndContextLibsTask -> packingLinkComponentAndContextLibsTasks = tasks\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/PublishContextTasksContainer.kt",
    "content": "package com.rubik.publish.task\n\nclass PublishContextTasksContainer {\n    // lib & component tasks\n    private val allTasks = mutableMapOf<String, PublishContextTaskGroup>()\n    private val tasksListeners = mutableMapOf<String?, MutableList<(PublishContextTaskGroup) -> Unit>>()\n\n    fun registerContextTasks(\n        taskGroups: Map<String, PublishContextTaskGroup>\n    ) {\n        taskGroups.forEach { (uri, tasks) ->\n            if (!allTasks.containsKey(uri)) {\n                allTasks[uri] = tasks\n                tasksListeners[null]?.forEach { action ->\n                    action(tasks)\n                }\n                tasksListeners[uri]?.forEach { action ->\n                    action(tasks)\n                }\n                tasksListeners.remove(uri)\n            }\n        }\n    }\n\n    fun listenTasksRegistered(action: (PublishContextTaskGroup) -> Unit) {\n        allTasks.forEach { (_, task) ->\n            action(task)\n        }\n        tasksListeners.getOrPut(null){\n            mutableListOf()\n        }.add(action)\n    }\n\n    fun listenTasksRegistered(uris: List<String>, action: (PublishContextTaskGroup) -> Unit) {\n        uris.forEach { uri ->\n            val task = allTasks[uri]\n            if (null != task)\n                action(task)\n            else\n                tasksListeners.getOrPut(uri) {\n                    mutableListOf()\n                }.add(action)\n        }\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/both/ComponentAndContextLibsTask.kt",
    "content": "package com.rubik.publish.task.both\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.task.PublishContextTask\nimport com.rubik.publish.task.PublishTaskPair\nimport com.rubik.publish.task.component.ComponentTask\nimport com.rubik.publish.task.lib.ContextLibTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport org.gradle.api.Project\n\nclass ComponentAndContextLibsTask(\n    project: Project,\n    context: Context,\n    publicationType: PublicationType,\n    byTag: String?,\n    val libTask: ContextLibTask,\n    val componentTask: ComponentTask\n) : PublishContextTask(\n    project,\n    context,\n    PublishTaskName.publish(Publication.COMPONENT_AND_CONTEXT_LIBS, context, null, publicationType == PublicationType.DEV),\n    publicationType,\n    byTag\n) {\n    companion object {\n        operator fun invoke(\n            project: Project,\n            context: Context,\n            target: ContextTaskTarget,\n            libTasks: PublishTaskPair<ContextLibTask>,\n            componentTasks: PublishTaskPair<ComponentTask>\n        ) = ComponentAndContextLibsTask(\n            project, context, PublicationType.FORMAL,\n            target.publishByTag,\n            libTasks.first,\n            componentTasks.first\n        ) to ComponentAndContextLibsTask(\n            project, context, PublicationType.DEV,\n            target.publishByTag,\n            libTasks.second,\n            componentTasks.second\n        )\n    }\n\n    override fun onGraphic() {\n        ComponentAndContextLibsTaskGraphic(this).graph()\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/both/ComponentAndContextLibsTaskGraphic.kt",
    "content": "package com.rubik.publish.task.both\n\nimport com.ktnail.gradle.task.TaskGraphic\n\n/**\n * Task graphic of business code of contexts,\n * graph publish tasks.\n *\n * @since 1.9\n */\nclass ComponentAndContextLibsTaskGraphic(\n    tasks: ComponentAndContextLibsTask\n) : TaskGraphic() {\n    init {\n        whenGraph {\n            tasks.componentTask.variantTasks.lastOrNull()?.linkExecuteDependsOn(tasks.libTask)\n            tasks.linkExecuteDependsOn(tasks.componentTask)\n            tasks.linkExecuteDependsOn(tasks.libTask)\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/both/PackingLinkComponentAndContextLibsTask.kt",
    "content": "package com.rubik.publish.task.both\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.extra.publishTasksContainer\nimport com.rubik.publish.task.PublishContextTask\nimport com.rubik.publish.task.PublishTaskPair\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass PackingLinkComponentAndContextLibsTask(\n    project: Project,\n    context: Context,\n    publicationType: PublicationType,\n    private val bothTask: PublishContextTask\n) : PublishContextTask(\n    project,\n    context,\n    PublishTaskName.publishPackingLink(Publication.COMPONENT_AND_CONTEXT_LIBS, bothTask.context, publicationType == PublicationType.DEV),\n    publicationType,\n    null\n){\n    companion object {\n        operator fun invoke(\n            project: Project,\n            context: Context,\n            bothTasks: PublishTaskPair<PublishContextTask>\n        ) = PackingLinkComponentAndContextLibsTask(\n            project,\n            context,\n            PublicationType.FORMAL,\n            bothTasks.first\n        ) to PackingLinkComponentAndContextLibsTask(\n            project,\n            context,\n            PublicationType.DEV,\n            bothTasks.second\n        )\n    }\n\n    override fun onGraphic() {\n        linkExecuteDependsOn(bothTask)\n        publishTasksContainer.listenTasksRegistered(\n            context.whoPackingMe.map { context -> context.uri }\n        ) { packingMeTaskGroup ->\n            if (packingMeTaskGroup.context?.whoPackingMe.isNullOrEmpty()) {\n                if (publicationType == PublicationType.FORMAL)\n                    packingMeTaskGroup.bothTasks?.first\n                else packingMeTaskGroup.bothTasks?.second\n            } else {\n                if (publicationType == PublicationType.FORMAL)\n                    packingMeTaskGroup.packingLinkBothTasks?.first\n                else packingMeTaskGroup.packingLinkBothTasks?.second\n            }?.let { depTask ->\n                bothTask.linkExecuteDependsOn(depTask)\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/both/VariantComponentAndContextLibsTask.kt",
    "content": "package com.rubik.publish.task.both\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.task.PublishContextTask\nimport com.rubik.publish.task.PublishTaskPair\nimport com.rubik.publish.task.component.VariantComponentTask\nimport com.rubik.publish.task.lib.ContextLibTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport org.gradle.api.Project\n\nclass VariantComponentAndContextLibsTask(\n    project: Project,\n    context: Context,\n    publicationType: PublicationType,\n    byTag: String?,\n    val variant: BaseVariant,\n    val libTask: ContextLibTask,\n    val componentTask: VariantComponentTask\n) : PublishContextTask(\n    project,\n    context,\n    PublishTaskName.publish(Publication.COMPONENT_AND_CONTEXT_LIBS, context, variant.name, publicationType == PublicationType.DEV),\n    publicationType,\n    byTag\n) {\n    companion object {\n        operator fun invoke(\n            project: Project,\n            context: Context,\n            target: ContextTaskTarget,\n            variant: BaseVariant,\n            libTasks: PublishTaskPair<ContextLibTask>,\n            componentTasks: PublishTaskPair<VariantComponentTask>\n            ) = VariantComponentAndContextLibsTask(\n            project, context, PublicationType.FORMAL,\n            target.publishByTag, variant,\n            libTasks.first,\n            componentTasks.first\n        ) to VariantComponentAndContextLibsTask(\n            project, context, PublicationType.DEV,\n            target.publishByTag, variant,\n            libTasks.second,\n            componentTasks.second\n        )\n    }\n\n    override fun onGraphic() {\n        VariantComponentAndContextLibsTaskGraphic(this).graph()\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/both/VariantComponentAndContextLibsTaskGraphic.kt",
    "content": "package com.rubik.publish.task.both\n\nimport com.ktnail.gradle.task.TaskGraphic\n\n/**\n * Task graphic of business code of contexts,\n * graph publish tasks.\n *\n * @since 1.9\n */\nclass VariantComponentAndContextLibsTaskGraphic(\n    tasks: VariantComponentAndContextLibsTask\n) : TaskGraphic() {\n    init {\n        whenGraph {\n            tasks.componentTask.linkExecuteDependsOn(tasks.libTask)\n            tasks.linkExecuteDependsOn(tasks.componentTask)\n            tasks.linkExecuteDependsOn(tasks.libTask)\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/component/ComponentTask.kt",
    "content": "package com.rubik.publish.task.component\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.task.PublishContextTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport org.gradle.api.Project\n\nclass ComponentTask(\n    project: Project,\n    context: Context,\n    publicationType: PublicationType,\n    byTag: String?\n) : PublishContextTask(\n    project,\n    context,\n    PublishTaskName.publish(Publication.COMPONENT, context, null,publicationType == PublicationType.DEV),\n    publicationType,\n    byTag\n) {\n    companion object {\n        operator fun invoke(\n            project: Project,\n            context: Context,\n            target: ContextTaskTarget\n        ) = ComponentTask(\n            project,\n            context,\n            PublicationType.FORMAL,\n            target.publishByTag\n        ) to ComponentTask(\n            project,\n            context,\n            PublicationType.DEV,\n            target.publishByTag\n        )\n    }\n\n    val variantTasks: MutableList<VariantComponentTask> = mutableListOf()\n\n    fun addVariantTask(task: VariantComponentTask) {\n        variantTasks.add(task)\n    }\n\n    override fun onGraphic() {\n        ComponentTaskGraphic(this).graph()\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/component/ComponentTaskGraphic.kt",
    "content": "package com.rubik.publish.task.component\n\nimport com.ktnail.gradle.task.TaskGraphic\nimport com.rubik.publish.task.PublishContextTask\n\n/**\n * Task graphic of business code of contexts,\n * graph publish tasks.\n *\n * @since 1.9\n */\nclass ComponentTaskGraphic(\n    componentTask: ComponentTask\n) : TaskGraphic() {\n    init {\n        whenGraph {\n            componentTask.variantTasks.fold<PublishContextTask,PublishContextTask>(componentTask) { acc, task ->\n                task.apply {\n                    acc.linkExecuteDependsOn(this)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/component/PackingLinkComponentTask.kt",
    "content": "package com.rubik.publish.task.component\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.extra.publishTasksContainer\nimport com.rubik.publish.task.PublishContextTask\nimport com.rubik.publish.task.PublishTaskPair\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass PackingLinkComponentTask(\n    project: Project,\n    context: Context,\n    publicationType: PublicationType,\n    val componentTask: ComponentTask\n) : PublishContextTask(\n    project,\n    context,\n    PublishTaskName.publishPackingLink(Publication.COMPONENT, componentTask.context, publicationType == PublicationType.DEV),\n    publicationType,\n    null\n) {\n    companion object {\n        operator fun invoke(\n            project: Project,\n            context: Context,\n            componentTasks: PublishTaskPair<ComponentTask>\n        ) = PackingLinkComponentTask(\n            project,\n            context,\n            PublicationType.FORMAL,\n            componentTasks.first\n        ) to PackingLinkComponentTask(\n            project,\n            context,\n            PublicationType.DEV,\n            componentTasks.second\n        )\n    }\n\n    override fun onGraphic() {\n        linkExecuteDependsOn(componentTask)\n        publishTasksContainer.listenTasksRegistered(\n            context.whoPackingMe.map { context -> context.uri }\n        ) { packingMeTaskGroup ->\n            if (packingMeTaskGroup.context?.whoPackingMe.isNullOrEmpty()) {\n                if (publicationType == PublicationType.FORMAL)\n                    packingMeTaskGroup.componentTasks?.first\n                else packingMeTaskGroup.componentTasks?.second\n            } else {\n                if (publicationType == PublicationType.FORMAL)\n                    packingMeTaskGroup.packingLinkComponentTasks?.first\n                else packingMeTaskGroup.packingLinkComponentTasks?.second\n            }?.let { depTask ->\n                componentTask.linkExecuteDependsOn(depTask)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/component/VariantComponentTask.kt",
    "content": "package com.rubik.publish.task.component\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.maven.PublicationType\nimport com.ktnail.gradle.maven.PublishingTaskProvider\nimport com.ktnail.gradle.outputAar\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.task.PublishContextTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport org.gradle.api.Project\n\nclass VariantComponentTask(\n    project: Project,\n    context: Context,\n    publicationType: PublicationType,\n    byTag: String?,\n    val variant: BaseVariant,\n    private val publishingTaskProvider: PublishingTaskProvider\n) : PublishContextTask(\n    project,\n    context,\n    PublishTaskName.publish(Publication.COMPONENT, context, variant.name, publicationType == PublicationType.DEV),\n    publicationType,\n    byTag\n) {\n    companion object {\n        operator fun invoke(\n            project: Project,\n            context: Context,\n            target: ContextTaskTarget,\n            variant: BaseVariant,\n            publishingTaskProvider: PublishingTaskProvider\n        ) = VariantComponentTask(\n            project,\n            context,\n            PublicationType.FORMAL,\n            target.publishByTag, variant, publishingTaskProvider\n        ) to VariantComponentTask(\n            project,\n            context,\n            PublicationType.DEV,\n            target.publishByTag, variant, publishingTaskProvider\n        )\n    }\n\n    override fun onGraphic() {\n        variant.outputAar?.let { output ->\n            VariantComponentTaskGraphic(\n                project,\n                this,\n                publishingTaskProvider,\n                output\n            ).graph()\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/component/VariantComponentTaskGraphic.kt",
    "content": "package com.rubik.publish.task.component\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.ktnail.gradle.maven.PublishingTaskProvider\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.gradle.task.TaskGraphic\nimport com.ktnail.gradle.task.linkDependsOn\nimport com.ktnail.gradle.task.linkDependsTasks\nimport com.rubik.context.Ext\nimport com.rubik.publish.extra.publicationRecords\nimport com.rubik.publish.publication.Component\nimport com.rubik.publish.log.LogTags\nimport com.rubik.publish.record.updateComponent\nimport org.gradle.api.Project\nimport org.gradle.api.plugins.BasePlugin\nimport java.io.File\n\n/**\n * Task graphic of business code of contexts,\n * graph publish tasks.\n *\n * @since 1.4\n */\nclass VariantComponentTaskGraphic(\n    project: Project,\n    task: VariantComponentTask,\n    publishingTaskProvider: PublishingTaskProvider,\n    file: File\n) : TaskGraphic() {\n    private val component = Component(\n        project,\n        task.context,\n        task.artifactName,\n        task.variant,\n        task.versionCreator,\n        file\n    )\n\n    init {\n        val publishingTasks = publishingTaskProvider.getTask(component, task.publicationType == PublicationType.DEV)\n\n        val publishingTask = publishingTasks.publishingTask.apply {\n            doLast {\n                LogTags.logPublishFinish(\n                    \"${component.groupId}:${component.artifactId}:${component.version}\", task.publicationType\n                )\n                if (project.propertyOr(Ext.RUBIK_AUTO_UPDATE_PUBLICATION_RECORD, true))\n                    publicationRecords.updateComponent(\n                        project,\n                        task.context.uri,\n                        task.variant.name,\n                        component.version,\n                        task.publicationType == PublicationType.DEV,\n                        generate = true\n                    )\n            }\n        }\n\n        val createVersionTask = publishingTasks.createVersionTask\n\n        val generatePomFileTask = publishingTasks.generatePomFileTask\n\n        whenGraph {\n            /*  clean <->> preBuildTask */\n            if (project.propertyOr(Ext.RUBIK_CLEAN_BEFORE_TASK, true))\n                task.variant.preBuildProvider.get().linkDependsOn(project.tasks.getByName(BasePlugin.CLEAN_TASK_NAME))\n            /*  assembleProvider  <->>  createVersionTask  <->>  generatePomFileTask  <->>  publishingTask  <->>  startTask  */\n            linkDependsTasks(\n                task.variant.assembleProvider.get(),\n                createVersionTask,\n                generatePomFileTask,\n                publishingTask,\n                task.gradleTask\n            )\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/global/AllComponentAndContextLibsTask.kt",
    "content": "package com.rubik.publish.task.global\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.publish.task.PublishTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass AllComponentAndContextLibsTask(\n    project: Project,\n    publicationType: PublicationType\n) : PublishTask(\n    project,\n    PublishTaskName.publishAll(Publication.COMPONENT_AND_CONTEXT_LIBS, publicationType == PublicationType.DEV),\n    publicationType\n)"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/global/AllComponentTask.kt",
    "content": "package com.rubik.publish.task.global\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.publish.task.PublishTask\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\nimport com.rubik.publish.task.name.Publication\n\nclass AllComponentTask(\n    project: Project,\n    publicationType: PublicationType\n) : PublishTask(\n    project,\n    PublishTaskName.publishAll(Publication.COMPONENT, publicationType == PublicationType.DEV),\n    publicationType\n)"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/global/AllContextLibsTask.kt",
    "content": "package com.rubik.publish.task.global\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.publish.task.PublishTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass AllContextLibsTask(\n    project: Project,\n    publicationType: PublicationType\n) : PublishTask(\n    project,\n    PublishTaskName.publishAll(Publication.CONTEXT_LIBS, publicationType == PublicationType.DEV),\n    publicationType\n)"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/global/TagComponentAndContextLibsTask.kt",
    "content": "package com.rubik.publish.task.global\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.publish.task.PublishTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass TagComponentAndContextLibsTask(\n    project: Project,\n    tag: String,\n    publicationType: PublicationType\n) : PublishTask(\n    project,\n    PublishTaskName.publishTag(Publication.COMPONENT_AND_CONTEXT_LIBS, tag, publicationType == PublicationType.DEV),\n    publicationType\n)"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/global/TagComponentTask.kt",
    "content": "package com.rubik.publish.task.global\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.publish.task.PublishTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass TagComponentTask(\n    project: Project,\n    tag: String,\n    publicationType: PublicationType\n) : PublishTask(\n    project,\n    PublishTaskName.publishTag(Publication.COMPONENT, tag, publicationType == PublicationType.DEV),\n    publicationType\n)"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/global/TagContextLibsTask.kt",
    "content": "package com.rubik.publish.task.global\n\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.publish.task.PublishTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass TagContextLibsTask(\n    project: Project,\n    tag: String,\n    publicationType: PublicationType\n) : PublishTask(\n    project,\n    PublishTaskName.publishTag(Publication.CONTEXT_LIBS, tag, publicationType == PublicationType.DEV),\n    publicationType\n)"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/lib/ContextLibTask.kt",
    "content": "package com.rubik.publish.task.lib\n\nimport com.ktnail.gradle.firstVariant\nimport com.ktnail.gradle.maven.PublicationType\nimport com.ktnail.gradle.maven.PublishingTaskProvider\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.extra.rubikTask\nimport com.rubik.publish.buildTypeName\nimport com.rubik.publish.compilerBuildTypeName\nimport com.rubik.publish.useResetCompiler\nimport com.rubik.publish.task.PublishContextTask\nimport com.rubik.publish.task.name.Publication\nimport com.rubik.publish.task.name.PublishTaskName\nimport com.rubik.publish.task.target.ContextTaskTarget\nimport org.gradle.api.Project\nimport java.io.File\n\nclass ContextLibTask(\n    project: Project,\n    context: Context,\n    publicationType: PublicationType,\n    byTag: String?,\n    val assembleTask: AssembleTask,\n    private val publishingTaskProvider: PublishingTaskProvider,\n    private val libTmpDirRoot: File\n) : PublishContextTask(\n    project,\n    context,\n    PublishTaskName.publish(Publication.CONTEXT_LIBS, context, null, publicationType == PublicationType.DEV),\n    publicationType,\n    byTag\n) {\n    companion object {\n        operator fun invoke(\n            project: Project,\n            context: Context,\n            target: ContextTaskTarget,\n            assembleTask: AssembleTask,\n            publishingTaskProvider: PublishingTaskProvider,\n            libTmpDirRoot: File\n        ) = (ContextLibTask(\n            project,\n            context,\n            PublicationType.FORMAL,\n            target.publishByTag,\n            assembleTask,\n            publishingTaskProvider,\n            libTmpDirRoot\n        ) to ContextLibTask(\n            project,\n            context,\n            PublicationType.DEV,\n            target.publishByTag,\n            assembleTask,\n            publishingTaskProvider,\n            libTmpDirRoot\n        ))\n    }\n\n    override val startTaskNames =\n        if (publicationType == PublicationType.FORMAL) arrayOf(assembleTask.name, name)\n        else arrayOf(name)\n\n    override fun onGraphic() {\n        val graphic = ContextLibTaskGraphic(\n            project,\n            this,\n            publishingTaskProvider,\n            context\n        )\n        project.firstVariant(context.buildTypeName()) { variant ->\n            if (context.useResetCompiler) {\n                project.firstVariant(context.compilerBuildTypeName()) { compilerVariant ->\n                    graphic.graph(variant, compilerVariant, libTmpDirRoot)\n                }\n            } else {\n                graphic.graph(variant, null, libTmpDirRoot)\n            }\n        }\n    }\n\n    class AssembleTask(\n        project: Project,\n        context: Context\n    ) {\n        val name = PublishTaskName.assemble(Publication.CONTEXT_LIBS, context, null)\n        val gradleTask = project.rubikTask(name)\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/lib/ContextLibTaskGraphic.kt",
    "content": "package com.rubik.publish.task.lib\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.maven.PublicationType\nimport com.ktnail.gradle.maven.PublishingTaskProvider\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.gradle.task.TaskGraphic\nimport com.ktnail.gradle.task.bindState\nimport com.ktnail.gradle.task.linkDependsOn\nimport com.ktnail.gradle.task.linkDependsTasks\nimport com.rubik.context.extra.Context\nimport com.rubik.context.Ext\nimport com.rubik.context.publication.LibType\nimport com.rubik.publish.extra.getKaptTask\nimport com.rubik.publish.extra.publicationRecords\nimport com.rubik.publish.exception.RubikNoKaptTaskFoundException\nimport com.rubik.publish.log.LogTags\nimport com.rubik.publish.publication.Lib\nimport com.rubik.publish.publication.getJarTask\nimport com.rubik.publish.record.updateContextLibs\nimport com.rubik.publish.task.lib.state.ContextLibStateMachine\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport org.gradle.api.plugins.BasePlugin\nimport java.io.File\n\n/**\n * Task graphic of context libs,\n * graph assemble task、publish tasks、compile task & jar task.\n *\n * @since 1.4\n */\nclass ContextLibTaskGraphic(\n    private val project: Project,\n    private val libTask: ContextLibTask,\n    private val publishingTaskProvider: PublishingTaskProvider,\n    private val context: Context\n) : TaskGraphic() {\n\n    private val stateMachine = ContextLibStateMachine(project)\n\n    fun graph(variant: BaseVariant, compilerVariant: BaseVariant?, libTmpDirRoot: File) {\n\n        libTask.assembleTask.gradleTask.bindState(stateMachine, ContextLibStateMachine.States.ASSEMBLE_FINISH)\n        libTask.gradleTask.bindState(stateMachine, ContextLibStateMachine.States.PUBLISH_FINISH)\n\n        graphLib(\n            Lib(\n                context,\n                project,\n                LibType.CONTEXT,\n                libTask.artifactName,\n                variant,\n                libTask.versionCreator,\n                libTmpDirRoot\n            ), compilerVariant\n        )\n\n        if (context.source.publishOriginalValue) {\n            graphLib(\n                Lib(\n                    context,\n                    project,\n                    LibType.ORIGINAL_VALUE,\n                    libTask.artifactName,\n                    variant,\n                    libTask.versionCreator,\n                    libTmpDirRoot\n                ), compilerVariant\n            )\n        }\n        super.graph()\n    }\n\n    private fun graphLib(lib: Lib, compilerVariant: BaseVariant?) {\n        val cleanTask = project.tasks.getByName(BasePlugin.CLEAN_TASK_NAME)\n\n        whenGraph {\n            /*  clean <->> preBuildTask  */\n            val preBuildTask: Task = (compilerVariant?.preBuildProvider ?: lib.variant.preBuildProvider).get()\n            if (project.properties[Ext.RUBIK_CLEAN_BEFORE_TASK] != false)\n                preBuildTask.linkDependsOn(cleanTask)\n        }\n\n        val sourceTask = lib.getCopySourceTask(project)\n        val jarTask = lib.getJarTask(project)\n        val jarSourceTask = lib.source?.getJarSourceTask(project)\n\n        if (null != compilerVariant) {\n            graphByCompiler(lib, compilerVariant, jarTask, sourceTask, jarSourceTask)\n        } else {\n            graphByTransform(lib, jarTask, sourceTask, jarSourceTask)\n        }\n\n        val publishingTasks = publishingTaskProvider.getTask(lib, libTask.publicationType == PublicationType.DEV)\n\n        val publishingTask = publishingTasks.publishingTask.apply {\n            doLast {\n                LogTags.logPublishFinish(\n                    \"${lib.groupId}:${lib.artifactId}:${lib.version}\", libTask.publicationType\n                )\n                if (project.propertyOr(Ext.RUBIK_AUTO_UPDATE_PUBLICATION_RECORD, true))\n                    publicationRecords.updateContextLibs(\n                        project,\n                        context.uri,\n                        lib.version,\n                        libTask.publicationType == PublicationType.DEV,\n                        generate = true\n                    )\n\n\n            }\n        }\n\n        val createVersionTask = publishingTasks.createVersionTask\n\n        val generatePomFileTask = publishingTasks.generatePomFileTask\n\n        whenGraph {\n            /*\n             * assembleTask    <->>  createVersionTask  <->>  generatePomFileTask  <->>  publishingTask  <->>  startTask\n             *     ^                                                                                               ^\n             */\n            linkDependsTasks(\n                libTask.assembleTask.gradleTask,\n                createVersionTask,\n                generatePomFileTask,\n                publishingTask.bindState(\n                    stateMachine,\n                    ContextLibStateMachine.States.PUBLISHING\n                ),\n                libTask.gradleTask\n            )\n\n        }\n    }\n\n    private fun graphByTransform(\n        lib: Lib,\n        jarTask: Task,\n        sourceTask: Task?,\n        jarSourceTask: Task?\n    ){\n        whenGraph {\n            /*\n             * assembleTask           <->>           jarTask    <->> assembleLibTask\n             * assembleTask <->>  sourceTask <->> jarSourceTask <->> assembleLibTask\n             *                                                             ^\n             */\n            val assembleTask = lib.variant.assembleProvider.get()\n            linkDependsTasks(assembleTask, jarTask, libTask.assembleTask.gradleTask)\n\n            if (null != sourceTask && null != jarSourceTask) {\n                linkDependsTasks(\n                    assembleTask.bindState(stateMachine, ContextLibStateMachine.States.ByTransform.ASSEMBLE_AND_TRANSFORM),\n                    sourceTask,\n                    jarSourceTask.bindState(stateMachine, ContextLibStateMachine.States.ByTransform.PACKING_JAR),\n                    libTask.assembleTask.gradleTask\n                )\n            }\n        }\n    }\n\n    private fun graphByCompiler(\n        lib: Lib,\n        compilerVariant: BaseVariant,\n        jarTask: Task,\n        sourceTask: Task,\n        jarSourceTask: Task?\n    ) {\n        whenGraph {\n            /*\n             * kaptTask <->>  sourceTask\n             *\n             * sourceTask  <->> compileTask  <->>  jarTask   <->>  assembleLibTask\n             * sourceTask          <->>       jarSourceTask  <->>  assembleLibTask\n             *                                                            ^\n             */\n            val compileTask = lib.getKotlinCompileTask(project, compilerVariant)\n\n            val kaptTask = (project.getKaptTask(lib.variant.name) ?: throw RubikNoKaptTaskFoundException(lib.variant.name))\n\n            sourceTask.linkDependsOn(\n                kaptTask.bindState(stateMachine, ContextLibStateMachine.States.ByCompiler.ANNOTATION_PROCESSING)\n            )\n\n            linkDependsTasks(\n                sourceTask.bindState(stateMachine, ContextLibStateMachine.States.ByCompiler.MOVING_SOURCE),\n                compileTask.bindState(stateMachine, ContextLibStateMachine.States.ByCompiler.COMPILING),\n                jarTask.bindState(stateMachine, ContextLibStateMachine.States.ByCompiler.PACKING_JAR),\n                libTask.assembleTask.gradleTask\n            )\n\n            jarSourceTask?.let {\n                linkDependsTasks(sourceTask, jarSourceTask, libTask.assembleTask.gradleTask)\n            }\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/lib/state/ContextLibStateMachine.kt",
    "content": "package com.rubik.publish.task.lib.state\n\nimport com.ktnail.x.Logger\nimport com.ktnail.gradle.*\nimport com.ktnail.gradle.task.TaskStateMachine\nimport com.rubik.context.Ext\nimport com.rubik.publish.exception.RubikTaskStateError\nimport org.gradle.api.Project\n\nclass ContextLibStateMachine(private val project: Project) : TaskStateMachine {\n    object States {\n        const val READY = \"READY\"\n        const val ASSEMBLE_FINISH = \"ASSEMBLE_FINISH\"\n        const val PUBLISHING = \"PUBLISHING\"\n        const val PUBLISH_FINISH = \"PUBLISH_FINISH\"\n\n        object ByCompiler {\n            const val ANNOTATION_PROCESSING = \"StateByCompiler_ANNOTATION_PROCESSING\"\n            const val MOVING_SOURCE = \"StateByCompiler_MOVING_SOURCE\"\n            const val COMPILING = \"StateByCompiler_COMPILING\"\n            const val PACKING_JAR = \"StateByCompiler_PACKING_JAR\"\n        }\n\n        object ByTransform {\n            const val ASSEMBLE_AND_TRANSFORM = \"StateByTransform_ASSEMBLE_AND_TRANSFORM\"\n            const val PACKING_JAR = \"StateByTransform_PACKING_JAR\"\n        }\n    }\n\n    private var state = States.READY\n\n    override fun turnToNextState(nextState: String) {\n        if (project.propertyOr(Ext.RUBIK_CHECK_CONTEXT_LIB_TASKS_STATE, true) && !checkNextState(nextState)) {\n            throw RubikTaskStateError(state, nextState)\n        } else {\n            Logger.p(LogTags.TASK_GRAPHIC, null) {\n                \" CONTEXT_LIB TASK SWITCH from STATE:$state to STATE:$nextState !\"\n            }\n            state = nextState\n        }\n    }\n\n   private fun checkNextState(nextState: String) :Boolean{\n        return when (state) {\n            States.READY -> {\n                nextState in arrayOf(\n                    States.ByCompiler.ANNOTATION_PROCESSING,\n                    States.ByTransform.ASSEMBLE_AND_TRANSFORM,\n                    States.ByCompiler.MOVING_SOURCE  // FROM-CACHE\n                )\n            }\n\n            States.ByCompiler.ANNOTATION_PROCESSING -> {\n                nextState == States.ByCompiler.MOVING_SOURCE\n            }\n            States.ByCompiler.MOVING_SOURCE -> {\n                nextState in arrayOf(\n                    States.ByCompiler.COMPILING,\n                    States.ByCompiler.PACKING_JAR,  // FROM-CACHE\n                    States.ASSEMBLE_FINISH // UP-TO-DATE\n                )\n\n            }\n            States.ByCompiler.COMPILING -> {\n                nextState in arrayOf(\n                    States.ByCompiler.PACKING_JAR,\n                    States.ASSEMBLE_FINISH // UP-TO-DATE\n                )\n            }\n            States.ByCompiler.PACKING_JAR -> {\n                nextState == States.ASSEMBLE_FINISH\n            }\n\n\n            States.ByTransform.ASSEMBLE_AND_TRANSFORM -> {\n                nextState in arrayOf(\n                    States.ByTransform.PACKING_JAR,\n                    States.ASSEMBLE_FINISH // UP-TO-DATE\n                )\n            }\n            States.ByTransform.PACKING_JAR -> {\n                nextState == States.ASSEMBLE_FINISH\n            }\n\n            States.ASSEMBLE_FINISH -> {\n                nextState == States.PUBLISHING\n            }\n            States.PUBLISHING -> {\n                nextState == States.PUBLISH_FINISH\n            }\n            else -> false\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/name/PublishByMeaning.kt",
    "content": "package com.rubik.publish.task.name\n\nsealed class PublishByMeaning {\n    abstract fun toPartTaskName(): String\n\n    abstract fun toLog(): String\n\n    /**\n    task name simple :\n    RUBIK-publish-ContextLibs-All\n     */\n    class All : PublishByMeaning() {\n        override fun toPartTaskName() = PublishBy.ALL.value\n        override fun toLog(): String = \"ALL\"\n    }\n\n    /**\n    task name simple :\n    RUBIK-publish-ContextLibs-ByTag-tag1\n     */\n    class ByTag(val tag: String) : PublishByMeaning() {\n        override fun toPartTaskName() = PublishBy.BY_TAG.value + PublishTaskNameMeaning.SEPARATOR + tag\n        override fun toLog(): String = \"TAG(${tag})\"\n    }\n\n    /**\n    task name simple :\n    RUBIK-publish-ContextLibs-myname\n    RUBIK-PUBLISH-Component-myname-variant\n     */\n    open class ByName(val name: String, val variant: String?) : PublishByMeaning() {\n        override fun toPartTaskName() = if (null != variant) name + PublishTaskNameMeaning.SEPARATOR + variant else name\n        override fun toLog(): String = \"NAME(${name}) variant($variant)\"\n    }\n\n    /**\n    task name simple :\n    RUBIK-publish-Component-myname-PackingLink\n     */\n    class PackingLink(name: String) : ByName(name, null) {\n        override fun toPartTaskName() = name + PublishTaskNameMeaning.SEPARATOR + PublishBy.PACKING_LINK.value\n        override fun toLog(): String = \"PackingLink(${name})\"\n    }\n\n}\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/name/PublishTaskName.kt",
    "content": "package com.rubik.publish.task.name\n\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.publishTaskArtifactName\n\n\nclass PublishTaskName(\n    val fullName: String,\n    val meaning: PublishTaskNameMeaning\n) {\n    companion object {\n        object GroupNames{\n            const val LIBS_BY_NAME = \"rubik-context-lib\"\n            const val COMPONENT_BY_NAME = \"rubik-component\"\n            const val BY_NAME = \"rubik-both\"\n\n            const val LIBS_BY_NAME_DEV = \"rubik-context-lib-dev\"\n            const val COMPONENT_BY_NAME_DEV = \"rubik-component-dev\"\n            const val BY_NAME_DEV = \"rubik-both-dev\"\n\n            const val ALL = \"rubik-all\"\n            fun byTag(tag: String) = \"rubik-tag-${tag}\"\n        }\n\n        fun fromFullName(fullName: String): PublishTaskName? {\n            val meaning = PublishTaskNameMeaning.fromFullName(fullName)\n            return if (null != meaning)\n                PublishTaskName(fullName, meaning)\n            else\n                null\n        }\n\n        fun publishAll(\n            publication: Publication,\n            dev: Boolean = false\n        ): PublishTaskName {\n            return PublishTaskNameMeaning(\n                action = if (dev) Action.PUBLISH_DEV else Action.PUBLISH,\n                publication = publication,\n                publishBy = PublishByMeaning.All()\n            ).toTaskName().apply {\n                group = GroupNames.ALL\n            }\n        }\n\n        fun publishTag(\n            publication: Publication,\n            tag: String,\n            dev: Boolean = false\n        ): PublishTaskName {\n            return PublishTaskNameMeaning(\n                action = if (dev) Action.PUBLISH_DEV else Action.PUBLISH,\n                publication = publication,\n                publishBy = PublishByMeaning.ByTag(tag)\n            ).toTaskName().apply {\n                group = GroupNames.byTag(tag)\n            }\n        }\n\n        fun publishPackingLink(\n            publication: Publication,\n            context: Context,\n            dev: Boolean = false\n        ): PublishTaskName {\n            return PublishTaskNameMeaning(\n                action = if (dev) Action.PUBLISH_DEV else Action.PUBLISH,\n                publication = publication,\n                publishBy = PublishByMeaning.PackingLink(context.publishTaskArtifactName)\n            ).toTaskName().apply {\n                group = when{\n                    publication == Publication.CONTEXT_LIBS && !dev -> GroupNames.LIBS_BY_NAME\n                    publication == Publication.CONTEXT_LIBS && dev -> GroupNames.LIBS_BY_NAME_DEV\n                    publication == Publication.COMPONENT && !dev -> GroupNames.COMPONENT_BY_NAME\n                    publication == Publication.COMPONENT && dev -> GroupNames.COMPONENT_BY_NAME_DEV\n                    publication == Publication.COMPONENT_AND_CONTEXT_LIBS && !dev -> GroupNames.BY_NAME\n                    publication == Publication.COMPONENT_AND_CONTEXT_LIBS && dev -> GroupNames.BY_NAME_DEV\n                    else -> \"rubik\"\n                }\n            }\n        }\n\n        fun publish(\n            publication: Publication,\n            context: Context,\n            variant: String?,\n            dev: Boolean = false\n        ): PublishTaskName {\n            return PublishTaskNameMeaning(\n                action = if (dev) Action.PUBLISH_DEV else Action.PUBLISH,\n                publication = publication,\n                publishBy = PublishByMeaning.ByName(context.publishTaskArtifactName, variant)\n            ).toTaskName().apply {\n                group = when{\n                    publication == Publication.CONTEXT_LIBS && !dev -> GroupNames.LIBS_BY_NAME\n                    publication == Publication.CONTEXT_LIBS && dev -> GroupNames.LIBS_BY_NAME_DEV\n                    publication == Publication.COMPONENT && !dev -> GroupNames.COMPONENT_BY_NAME\n                    publication == Publication.COMPONENT && dev -> GroupNames.COMPONENT_BY_NAME_DEV\n                    publication == Publication.COMPONENT_AND_CONTEXT_LIBS && !dev -> GroupNames.BY_NAME\n                    publication == Publication.COMPONENT_AND_CONTEXT_LIBS && dev -> GroupNames.BY_NAME_DEV\n                    else -> \"rubik\"\n                }\n            }\n        }\n\n        fun assemble(\n            publication: Publication,\n            context: Context,\n            buildType: String?\n        ): PublishTaskName {\n            return PublishTaskNameMeaning(\n                action = Action.ASSEMBLE,\n                publication = publication,\n                publishBy = PublishByMeaning.ByName(context.publishTaskArtifactName, buildType)\n            ).toTaskName()\n        }\n    }\n\n    var group: String = \"rubik\"\n\n    fun toLog(): String = \"$fullName\\n         -- ${meaning.toLog()}\"\n\n}\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/name/PublishTaskNameMeaning.kt",
    "content": "package com.rubik.publish.task.name\n\nimport com.ktnail.gradle.maven.PublicationType\n\nclass PublishTaskNameMeaning(\n    val action: Action,\n    val publication: Publication,\n    val publishBy: PublishByMeaning\n) {\n    companion object {\n\n        const val SEPARATOR = \"-\"\n        private const val PREFIX = \"RUBIK\"\n\n        fun fromFullName(fullName: String): PublishTaskNameMeaning? {\n            val nameSplit = fullName.split(SEPARATOR)\n            return if (nameSplit.size >= 4 && nameSplit[0] == PREFIX) {\n                val action = Action.values().firstOrNull { action -> action.value == nameSplit[1] }\n                val publication = Publication.values().firstOrNull { publication -> publication.value == nameSplit[2] }\n                if (action != null && publication != null) {\n                    val publishByOrName = nameSplit[3]\n                    when {\n                        publishByOrName == PublishBy.ALL.value -> {\n                            PublishTaskNameMeaning(action, publication, PublishByMeaning.All())\n                        }\n                        publishByOrName.startsWith(PublishBy.BY_TAG.value) && nameSplit.size >= 5 -> {\n                            val tag = nameSplit[4]\n                            PublishTaskNameMeaning(action, publication, PublishByMeaning.ByTag(tag))\n                        }\n                        else ->{\n                            val variantOrPublishBy = nameSplit.getOrNull(4)\n                            if (variantOrPublishBy == PublishBy.PACKING_LINK.value)\n                                PublishTaskNameMeaning(action, publication, PublishByMeaning.PackingLink(publishByOrName))\n                            else\n                                PublishTaskNameMeaning(action, publication, PublishByMeaning.ByName(publishByOrName, variantOrPublishBy))\n                        }\n                    }\n                } else null\n            } else null\n        }\n    }\n\n    val publicationType: PublicationType\n        get() = if (action == Action.PUBLISH_DEV) PublicationType.DEV else PublicationType.FORMAL\n\n    fun toTaskName(): PublishTaskName {\n        val fullName = PREFIX + SEPARATOR +\n                action.value + SEPARATOR +\n                publication.value + SEPARATOR +\n                publishBy.toPartTaskName()\n        return PublishTaskName(fullName, this)\n    }\n\n    fun toLog(): String = \" NAME_MEANING : action:${action.value} publication:${publication.value} By:${publishBy.toLog()}\"\n\n}\n\nenum class Action(val value: String) {\n    ASSEMBLE(\"assemble\"),\n    PUBLISH(\"publish\"),\n    PUBLISH_DEV(\"publishDEV\")\n}\n\nenum class Publication(val value: String) {\n    CONTEXT_LIBS(\"ContextLibs\"),\n    COMPONENT(\"Component\"),\n    COMPONENT_AND_CONTEXT_LIBS(\"ComponentAndContextLibs\");\n\n    fun contains(other: Publication): Boolean =\n        when (this) {\n            COMPONENT_AND_CONTEXT_LIBS -> other.containsComponent() || other.containsContextLibs()\n            else -> other == this\n        }\n\n    fun containsContextLibs(): Boolean =\n        this == CONTEXT_LIBS || this == COMPONENT_AND_CONTEXT_LIBS\n\n    fun containsComponent(): Boolean =\n        this == COMPONENT || this == COMPONENT_AND_CONTEXT_LIBS\n}\n\nenum class PublishBy(val value: String) {\n    ALL(\"All\"),\n    BY_TAG(\"ByTag\"),\n    BY_NAME(\"ByName\"),\n    PACKING_LINK(\"PackingLink\")\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/provider/CopySourceTaskProvider.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.task.provider\n\nimport com.ktnail.gradle.propertyOr\nimport com.ktnail.x.camelToPascal\nimport com.ktnail.x.emptyRecursively\nimport com.ktnail.x.toCamel\nimport com.rubik.context.Ext\nimport com.rubik.context.extra.rubikTask\nimport com.rubik.publish.exception.RubikNoSourceToCompileException\nimport com.rubik.publish.publication.Lib\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport java.io.File\n\nclass CopySourceTaskProvider(val project: Project) {\n    fun getByLib(lib: Lib): Task =\n        project.rubikTask(\n            toCamel(\n                \"copy\",\n                \"source\",\n                \"rubik\",\n                lib.variant.name.camelToPascal(),\n                \"context\",\n                \"sources\"\n            )\n        ) {\n            it.doFirst {\n                val kaptSourceRootDir = project.propertyOr(Ext.RUBIK_KAPT_SOURCE_FOLDER) { \"generated/source/kaptKotlin\" }\n                val kaptSourceDir = File(project.buildDir, kaptSourceRootDir + File.separator + lib.variant.name + File.separator + \"rubik\")\n                if (kaptSourceDir.emptyRecursively())\n                    throw RubikNoSourceToCompileException(kaptSourceDir.absolutePath)\n                else\n                    lib.sourceDir.let { sourceDir ->\n                        sourceDir.deleteRecursively()\n                        kaptSourceDir.copyRecursively(File(sourceDir, \"rubik\").apply { mkdirs() })\n                    }\n            }\n        }\n\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/provider/JarTaskProvider.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.task.provider\n\nimport com.ktnail.x.emptyRecursively\nimport com.rubik.context.extra.rubikTask\nimport com.rubik.publish.exception.RubikNoClassesToJarException\nimport com.rubik.publish.publication.Jar\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport org.gradle.jvm.tasks.Jar as JarPackage\n\nclass JarTaskProvider(val project: Project) {\n    fun getByLib(lib: Jar): Task {\n        return project.rubikTask(\n            lib.jarTaskName,\n            JarPackage::class.java\n        ) { task ->\n            task.from(lib.jarFromDir)\n            task.archiveBaseName.set(lib.artifactId)\n            task.destinationDirectory.set(lib.jarToDir)\n        }.doFirst {\n            if (lib.jarFromDir.emptyRecursively()) {\n                throw RubikNoClassesToJarException(lib.jarFromDir.absolutePath)\n            }\n            lib.jarToDir.deleteRecursively()\n            lib.jarToDir.mkdirs()\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/provider/KotlinCompileTaskProvider.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.publish.task.provider\n\nimport com.ktnail.x.emptyRecursively\nimport com.ktnail.x.toCamel\nimport com.ktnail.gradle.*\nimport com.ktnail.gradle.task.linkDependsOn\nimport com.rubik.context.extra.rubikTask\nimport com.rubik.publish.exception.RubikNoKotlinCompileFoundException\nimport com.rubik.publish.exception.RubikNoSourceToCompileException\nimport com.rubik.publish.publication.Lib\nimport org.gradle.api.Project\nimport org.gradle.api.Task\nimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n\nclass KotlinCompileTaskProvider(val project: Project) {\n    fun getByLib(lib: Lib, compilerVariantName: String): Task {\n        return (project.getKotlinCompileTaskByVariant(compilerVariantName)\n            ?: throw RubikNoKotlinCompileFoundException(\n                compilerVariantName\n            )).apply {\n            linkDependsOn(getRedirectDestinationTask(lib))\n            doFirst {\n                resetSource(lib.sourceDir)\n                if (lib.sourceDir.emptyRecursively()) {\n                    throw RubikNoSourceToCompileException(lib.sourceDir.absolutePath)\n                }\n            }\n        }\n    }\n\n    private fun KotlinCompile.getRedirectDestinationTask(lib: Lib): Task {\n        return project.rubikTask(toCamel(\"redirect\", \"destination\", \"dir\", \"rubik\", name)) {\n            it.doFirst {\n                lib.jarFromDir.deleteRecursively()\n                lib.jarFromDir.mkdirs()\n                resetDestinationDir(lib.jarFromDir)\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/target/TaskTarget.kt",
    "content": "package com.rubik.publish.task.target\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.ktnail.gradle.maven.PublicationType\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.task.name.PublishByMeaning\nimport com.rubik.publish.task.name.PublishTaskName\n\nsealed class ContextTaskTarget {\n    companion object {\n        fun doNotPublish(\n            context: Context\n        ): ContextTaskTarget = DoNotPublishContextTarget(context)\n\n        fun publish(\n            context: Context,\n            targetTaskName: PublishTaskName,\n            publishByTag: String?\n        ): ContextTaskTarget = PublishContextTarget(context, targetTaskName, publishByTag)\n    }\n\n    abstract val context: Context\n\n    abstract val targetTaskName: PublishTaskName?\n\n    abstract val publishingContextLibs: Boolean\n\n    abstract val publicationType: PublicationType?\n\n    abstract val publishingComponent: Boolean\n\n    abstract val publishByTag: String?\n\n    val publishingSth\n        get() = publishingContextLibs || publishingComponent\n\n    val publishingBoth\n        get() = publishingContextLibs && publishingComponent\n\n    val publishingContextLibsOnly\n        get() = publishingContextLibs && !publishingComponent\n\n    val publishingComponentOnly\n        get() = !publishingContextLibs && publishingComponent\n\n    val publishingDev\n        get() = publicationType == PublicationType.DEV\n\n    fun publishingVariant(variant: BaseVariant) =\n        publishingSth && (targetTaskName?.meaning?.publishBy as? PublishByMeaning.ByName)?.variant == variant.name\n\n    class PublishContextTarget(\n        override val context: Context,\n        override val targetTaskName: PublishTaskName,\n        override val publishByTag: String?\n    ) : ContextTaskTarget() {\n        override val publishingContextLibs: Boolean\n            get() = targetTaskName.meaning.publication.containsContextLibs() && context.enableProvideRoute\n\n        override val publishingComponent: Boolean\n            get() = targetTaskName.meaning.publication.containsComponent() && context.enablePublishComponent\n\n        override val publicationType: PublicationType\n            get() = targetTaskName.meaning.publicationType\n\n        val devWhenPublishingComponent\n            get() = if (publishingComponent && publicationType == PublicationType.FORMAL) false else null\n\n    }\n\n    class DoNotPublishContextTarget(\n        override val context: Context\n    ) : ContextTaskTarget() {\n        override val targetTaskName: PublishTaskName? = null\n\n        override val publicationType: PublicationType? = null\n\n        override val publishingContextLibs: Boolean = false\n\n        override val publishingComponent: Boolean = false\n\n        override val publishByTag: String? = null\n    }\n\n    fun toLog(): String = \" ContextLibs:[${publishingContextLibs}] Component:[${publishingComponent}] $publicationType\"\n\n}\n\n"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/target/TaskTargetContainer.kt",
    "content": "package com.rubik.publish.task.target\n\nimport com.ktnail.gradle.mapFirstTaskTarget\nimport com.ktnail.gradle.p\nimport com.ktnail.x.Logger\nimport com.rubik.publish.log.LogTags\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass TaskTargetContainer {\n    private val taskTargetNames = mutableMapOf<String, PublishTaskName>()\n    val taskTargets = mutableMapOf<String, ContextTaskTarget>()\n\n    // todo Context.extra 中的 target\n    fun projectTargetTaskName(project: Project): PublishTaskName? =\n        taskTargetNames[project.path] ?: project.targetTaskNameInProject?.apply {\n            taskTargetNames[project.path] = this\n        }\n\n    private val Project.targetTaskNameInProject\n        get() = mapFirstTaskTarget { taskName ->\n            PublishTaskName.fromFullName(taskName)\n        }?.also { name ->\n            Logger.p(LogTags.PUBLISH, this) { \" START TASK NAME ($path) :${name.toLog()}\" }\n        }\n}"
  },
  {
    "path": "rubik/rubik_publish/src/main/java/com/rubik/publish/task/target/TaskTargetController.kt",
    "content": "package com.rubik.publish.task.target\n\nimport com.ktnail.gradle.p\nimport com.ktnail.x.Logger\nimport com.rubik.context.extra.Context\nimport com.rubik.publish.publishTaskArtifactName\nimport com.rubik.context.extra.contextsContainer\nimport com.rubik.publish.extra.target\nimport com.rubik.publish.extra.targetTaskName\nimport com.rubik.publish.log.LogTags\nimport com.rubik.publish.task.name.PublishByMeaning\nimport com.rubik.publish.task.name.PublishTaskName\nimport org.gradle.api.Project\n\nclass TaskTargetController(private val rootProject: Project) {\n\n    fun checkTaskTarget(subProject: Project, context: Context) =\n        subProject.targetTaskName?.let { taskName ->\n            doCheck(context, taskName).apply {\n                context.target = this\n                Logger.p(LogTags.PUBLISH, rootProject) { \" TASK TARGET:[${context.uri}] \" + this.toLog() }\n            }\n        } ?: ContextTaskTarget.doNotPublish(context)\n\n    private fun doCheck(\n        context: Context,\n        publishTaskName: PublishTaskName\n    ): ContextTaskTarget {\n        return when (val publishBy: PublishByMeaning = publishTaskName.meaning.publishBy) {\n            is PublishByMeaning.PackingLink -> {\n                if (publishBy.name == context.publishTaskArtifactName || context.isPackingName(publishBy.name))\n                    ContextTaskTarget.publish(context, publishTaskName, null)\n                else null\n            }\n            is PublishByMeaning.All -> ContextTaskTarget.publish(context, publishTaskName, null)\n            is PublishByMeaning.ByTag -> {\n                val findTag = context.tagNames.firstOrNull { tag -> publishBy.tag == tag }\n                if (null != findTag) ContextTaskTarget.publish(context, publishTaskName, findTag)\n                else null\n            }\n            is PublishByMeaning.ByName-> {\n                if (publishBy.name == context.publishTaskArtifactName)\n                    ContextTaskTarget.publish(context, publishTaskName, null)\n                else null\n            }\n        } ?: ContextTaskTarget.doNotPublish(context)\n    }\n\n\n    private fun Context.isPackingName(name: String) =\n        contextsContainer.obtainPackingLink(this).any { packed -> name == packed.publishTaskArtifactName }\n\n}"
  },
  {
    "path": "rubik/rubik_router/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\napply plugin: 'maven-publish'\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n        consumerProguardFiles 'consumer-rules.pro'\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n        rubikRelease {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    kotlinOptions.freeCompilerArgs += ['-module-name', \"kmd.mars.rubik.router\"]\n    lintOptions {\n        abortOnError false\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation \"org.jetbrains.kotlin:kotlin-reflect:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.core:core-ktx:1.3.2'\n    implementation 'com.google.code.gson:gson:2.8.5'\n\n    implementation deps.ktnail.x\n\n    //    api project(':rubik_annotations')\n    api deps.rubik.annotations\n}\n\npublishing {\n    publications {\n        rubikRouter(MavenPublication) {\n            groupId 'com.rubik'\n            artifactId 'router'\n            version pubs.rubik.router\n            description 'rubik'\n            artifact(\"build/intermediates/aar_main_jar/rubikRelease/classes.jar\")\n            pom.withXml {\n                def dependenciesNode = asNode().appendNode('dependencies')\n                configurations.api.allDependencies.each {\n                    if (it.group != null && (it.name != null || \"unspecified\" == it.name) && it.version != null) {\n                        def dependencyNode = dependenciesNode.appendNode('dependency')\n                        dependencyNode.appendNode('groupId', it.group)\n                        dependencyNode.appendNode('artifactId', it.name)\n                        dependencyNode.appendNode('version', it.version)\n                    }\n                }\n                configurations.implementation.allDependencies.each {\n                    if (it.group != null && (it.name != null || \"unspecified\" == it.name) && it.version != null) {\n                        def dependencyNode = dependenciesNode.appendNode('dependency')\n                        dependencyNode.appendNode('groupId', it.group)\n                        dependencyNode.appendNode('artifactId', it.name)\n                        dependencyNode.appendNode('version', it.version)\n                    }\n                }\n            }\n        }\n    }\n\n    apply from: '../rubik_maven_repositories.gradle'\n    addRubikMavenRepos(repositories)\n}"
  },
  {
    "path": "rubik/rubik_router/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "rubik/rubik_router/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\n"
  },
  {
    "path": "rubik/rubik_router/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.rubik.router\" />\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/Rubik.kt",
    "content": "package com.rubik\n\nimport com.rubik.context.Aggregatable\nimport com.rubik.context.AggregateFactory\nimport com.rubik.context.RouteActions\nimport com.rubik.logger.Logger\nimport com.rubik.route.exception.BadAggregatableClassException\nimport com.rubik.router.annotations.RInvariant\nimport com.rubik.router.exception.BadRubikVersionException\nimport com.rubik.router.exception.RubikAggregateNotFoundException\nimport com.rubik.router.exception.RubikNotInitException\nimport com.rubik.router.safeRoute\nimport kotlin.reflect.full.companionObjectInstance\n\n/**\n *  The rubik router object.\n *\n *  @since 1.0\n */\nobject Rubik {\n    /**\n     * The logger of rubik router.\n     */\n    fun logger(block: Logger.() -> Unit) {\n        block(Logger)\n    }\n\n    object Properties{\n        var autoParcel = true\n    }\n\n    private var aggregateFactories: MutableMap<String, () -> Aggregatable> = mutableMapOf()\n    private var aggregateFactoriesByMsg: MutableMap<String, MutableSet<() -> Aggregatable>> = mutableMapOf()\n\n    /**\n     * register AggregateFactory to rubik router.\n     */\n   internal fun registerAggregateFactory(factory: AggregateFactory) {\n        try {\n            if (!aggregateFactories.containsKey(factory.URI)) {\n                aggregateFactories[factory.URI] = factory.CREATOR\n                factory.EVENT_MSGS.forEach { msg ->\n                    aggregateFactoriesByMsg.getOrPut(msg) {\n                        mutableSetOf()\n                    }.add(factory.CREATOR)\n                }\n            }\n        } catch (e: Exception) {\n            Logger.e(\" RUBIK register on uri: ${factory.URI} with exception : $e\", e)\n        }\n    }\n\n    /**\n     * register Aggregatable to rubik router by name.\n     */\n    @RInvariant\n    fun registerAggregatable(className: String) {\n        try {\n            (Class.forName(className).kotlin.companionObjectInstance as? AggregateFactory).let {\n                    companion ->\n                if (null == companion)\n                    throw BadAggregatableClassException(className)\n                else\n                    companion.register()\n            }\n        } catch (e: Exception) {\n            Logger.e(\" RUBIK register on className: $className with exception : $e\", e)\n        }\n    }\n\n    @RInvariant\n    fun createAggregate(uri: String): Aggregatable? {\n        if (aggregateFactories.isEmpty()) {\n            throw RubikNotInitException()\n        }\n        return aggregateFactories[uri]?.invoke()\n    }\n\n    internal fun createAggregatesByMsg(msg: String): List<Aggregatable> {\n        if (aggregateFactories.isEmpty()) {\n            throw RubikNotInitException()\n        }\n        return aggregateFactoriesByMsg[msg]?.map { creator ->\n            creator()\n        } ?: listOf()\n    }\n\n    @RInvariant\n    inline fun <reified T : RouteActions> findActions(uri: String): T {\n        return (createAggregate(uri) as? T) ?: throw RubikAggregateNotFoundException(uri)\n    }\n\n    @RInvariant\n    inline fun <reified T : RouteActions> safeFindActions(uri: String): T? {\n       return safeRoute {\n           (createAggregate(uri) as? T) ?: throw RubikAggregateNotFoundException(uri)\n        }\n    }\n\n    internal fun touchUri(uri: String): Boolean {\n        return aggregateFactories.containsKey(uri)\n    }\n\n    internal fun checkRouterVersionLogic(checkRouterVersion: Int) {\n        if (checkRouterVersion < 900) {\n            throw BadRubikVersionException(\"low version context or code [$checkRouterVersion] using a higher version router , this router version is 1.9.0 [900] + !\")\n        }\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/activity/Launcher.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.activity\n\nimport android.app.Activity\nimport android.content.Intent\nimport com.rubik.route.*\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * Launcher a Android Activity.\n *\n * @since: 1.0\n */\n@RInvariant\nclass Launcher {\n    fun launch(\n        clazz: Class<out Activity>,\n        queries: Queries,\n        pathQueries: List<Query>? = null,\n        results: ResultGroups? = null\n    ) {\n        (queries as? LaunchQueries)?.let { launchQueries ->\n            launchQueries.context?.let { context ->\n                Intent(context, clazz).let { intent ->\n                    launchQueries.flags?.let { flag ->\n                        intent.addFlags(flag)\n                    }\n                    intent.putQueriesExtras(launchQueries)\n                    pathQueries?.let { pathQueries ->\n                        intent.putPathQueriesExtras(pathQueries)\n                    }\n                    launchQueries.requestCode.let { requestCode ->\n                        when {\n                            null != launchQueries.fragment -> if (null != requestCode) {\n                                launchQueries.fragment?.startActivityForResult(intent, requestCode)\n                            } else {\n                                launchQueries.fragment?.startActivity(intent)\n                            }\n                            null != launchQueries.activity -> if (null != requestCode) {\n                                launchQueries.activity?.startActivityForResult(intent, requestCode)\n                            } else {\n                                launchQueries.activity?.startActivity(intent)\n                            }\n                            else -> {\n                                context.startActivity(intent)\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nprivate fun Intent.putQueriesExtras(queries: Queries) {\n    putExtras(queries.toBundle())\n}\n\nprivate fun Intent.putPathQueriesExtras(pathQueries: List<Query>) {\n    pathQueries.forEachIndexed { _, query ->\n        putExtra(query.name, query.value?.toString())\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/query/BundleQueriesBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.query\n\nimport android.os.Parcelable\nimport com.rubik.route.QueryType\n\nopen class BundleQueriesBuilder : BundleQueriesFrameable<Unit>, QueriesBuilder() {\n    override fun String.withValue(value: Any?) {\n        addQuery(this, value, QueryType.VALUE)\n    }\n\n    override infix fun String.withSerializable(value: Any?) {\n        addQuery(this, value, QueryType.SERIALIZABLE)\n    }\n\n    override infix fun String.withParcelable(value: Parcelable?) {\n        addQuery(this, value, QueryType.PARCELABLE)\n    }\n\n    override infix fun String.withParcelable(value: Array<out Parcelable>?) {\n        addQuery(this, value, QueryType.PARCELABLE)\n    }\n\n    override infix fun String.withParcelable(value: ArrayList<out Parcelable>?) {\n        addQuery(this, value, QueryType.PARCELABLE)\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/query/DSLLaunchQueriesBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.query\n\nimport android.app.Activity\nimport android.content.Context\nimport androidx.fragment.app.Fragment\nimport com.rubik.route.LaunchQueries\n\nclass DSLLaunchQueriesBuilder(context: Context?) :BundleQueriesBuilder(), DSLLaunchQueriesFrameable {\n    override val queries: LaunchQueries = LaunchQueries()\n\n    init {\n        queries.context = context\n    }\n\n    constructor(activity: Activity) : this(activity.applicationContext) {\n        queries.activity = activity\n    }\n\n    constructor(fragment: Fragment) : this(fragment.context) {\n        queries.fragment = fragment\n    }\n\n    override var flags: Int? = null\n        set(value) {\n            queries.flags = value\n            field = value\n        }\n\n    override var requestCode: Int? = null\n        set(value) {\n            queries.requestCode = value\n            field = value\n        }\n\n\n}\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/query/LinkedLaunchQueriesBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.query\n\nimport android.app.Activity\nimport android.content.Context\nimport androidx.fragment.app.Fragment\nimport com.rubik.route.LaunchQueries\n\nclass LinkedLaunchQueriesBuilder :BundleQueriesBuilder(), LinkedLaunchQueriesFrameable<Unit> {\n    override val queries: LaunchQueries = LaunchQueries()\n\n    override fun launchBy(context: Context) {\n        queries.context = context\n    }\n\n    override fun launchBy(activity: Activity) {\n        queries.activity = activity\n        queries.context = activity.applicationContext\n    }\n\n    override fun launchBy(fragment: Fragment) {\n        queries.fragment = fragment\n        queries.context = fragment.context\n    }\n\n    override fun launchRequestCode(requestCode: Int) {\n        queries.requestCode = requestCode\n    }\n\n    override fun launchFlags(flags: Int) {\n        queries.flags = flags\n    }\n\n}\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/query/QueriesBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.query\n\nimport com.rubik.route.Queries\nimport com.rubik.route.Query\nimport com.rubik.route.QueryType\n\nopen class QueriesBuilder : QueriesFrameable<Unit>, QueriesBuildable {\n    open val queries: Queries = Queries()\n\n    override fun buildQueries() = queries\n\n    protected fun addQuery(name: String, value: Any?, type: QueryType = QueryType.ANY) {\n        queries.add(Query(name, value, type))\n    }\n\n    override infix fun String.with(value: Any?) {\n        addQuery(this, value)\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/query/QueriesFrameable.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.query\n\nimport android.app.Activity\nimport android.content.Context\nimport android.os.Parcelable\nimport androidx.fragment.app.Fragment\nimport com.rubik.route.Queries\n\ninterface QueriesBuildable {\n    fun buildQueries(): Queries\n}\n\ninterface QueriesFrameable<T> {\n    infix fun String.with(value: Any?): T\n}\n\ninterface BundleQueriesFrameable<T> : QueriesFrameable<T> {\n    infix fun String.withValue(value: Any?): T\n    infix fun String.withSerializable(value: Any?): T\n    infix fun String.withParcelable(value: Parcelable?): T\n    infix fun String.withParcelable(value: Array<out Parcelable>?): T\n    infix fun String.withParcelable(value: ArrayList<out Parcelable>?): T\n}\n\ninterface DSLLaunchQueriesFrameable : BundleQueriesFrameable<Unit> {\n    var requestCode: Int?\n    var flags: Int?\n}\n\ninterface LinkedLaunchQueriesFrameable<T> : BundleQueriesFrameable<T> {\n    fun launchBy(context: Context): T\n    fun launchBy(activity: Activity): T\n    fun launchBy(fragment: Fragment): T\n    fun launchRequestCode(requestCode: Int): T\n    fun launchFlags(flags: Int): T\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/result/ResultsBuildable.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.result\n\ninterface ResultsBuildable<T> {\n    fun result(\n        onReceive: (Any?) -> Unit\n    ): T\n\n    fun result(\n        onReceive: (Any?, Any?) -> Unit\n    ): T\n\n    fun result(\n        onReceive: (Any?, Any?, Any?) -> Unit\n    ): T\n\n    fun result(\n        onReceive: (Any?, Any?, Any?, Any?) -> Unit\n    ): T\n\n    fun result(\n        onReceive: (Any?, Any?, Any?, Any?, Any?) -> Unit\n    ): T\n\n    fun result(\n        onReceive: (Any?, Any?, Any?, Any?, Any?, Any?) -> Unit\n    ): T\n\n    fun result(\n        onReceive: (Any?, Any?, Any?, Any?, Any?, Any?, Any?) -> Unit\n    ): T\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/router/BasicRouterBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.router\n\nimport com.ktnail.x.uri.Uri\nimport com.ktnail.x.uri.toUri\nimport com.rubik.builder.query.QueriesBuildable\nimport com.rubik.route.ResultGroups\nimport com.rubik.route.Results\nimport com.rubik.route.exception.BadUriException\nimport com.rubik.router.Router\n\nabstract class BasicRouterBuilder : RouterBuildable {\n    protected abstract val queriesBuilder: QueriesBuildable\n    protected abstract fun createUri(): String\n\n    private val resultGroups: ResultGroups = ResultGroups()\n    private var checkRouterVersion: Int? = null\n\n    private fun buildUri(): Uri {\n        val uri = createUri()\n        return uri.toUri() ?: throw BadUriException(uri)\n    }\n\n    override fun checkRouterVersion(version: Int) = apply {\n        checkRouterVersion = version\n    }\n\n    override fun receiveResults(receive: (Results) -> Unit) = apply {\n        resultGroups.load(Results(receive))\n    }\n\n    override fun build() = Router(buildUri(), queriesBuilder.buildQueries(), resultGroups, checkRouterVersion)\n\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/router/DSLApiRouterBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.router\n\nimport com.rubik.builder.query.QueriesBuilder\nimport com.rubik.builder.query.QueriesFrameable\nimport com.rubik.router.annotations.RInvariant\n\n@RInvariant\nclass DSLApiRouterBuilder : BasicRouterBuilder() ,DSLRouterBuildable{\n    override val queriesBuilder = QueriesBuilder()\n    override fun createUri(): String = uri\n\n    // DSL\n    override var uri: String = \"\"\n\n    override fun query(block: QueriesFrameable<Unit>.() -> Unit) {\n        queriesBuilder.apply(block)\n    }\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/router/DSLLaunchRouterBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.router\n\nimport com.rubik.builder.query.DSLLaunchQueriesBuilder\nimport com.rubik.builder.query.DSLLaunchQueriesFrameable\n\nclass DSLLaunchRouterBuilder(override val queriesBuilder: DSLLaunchQueriesBuilder) : BasicRouterBuilder(), DSLLaunchRouterBuildable {\n\n    override fun createUri(): String =uri\n\n    // DSL\n    override var uri: String = \"\"\n\n    override fun query(block: DSLLaunchQueriesFrameable.() -> Unit) {\n        queriesBuilder.apply(block)\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/router/LinkedApiRouterBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.router\n\nimport com.rubik.builder.query.QueriesBuilder\nimport com.rubik.route.mapping.caseToTypeOfT\nimport java.lang.reflect.Type\n\nclass LinkedApiRouterBuilder : BasicRouterBuilder(), LinkedApiRouterBuildable {\n    override val queriesBuilder = QueriesBuilder()\n    override fun createUri(): String = uri\n    private var uri: String = \"\"\n\n    // linked\n    override fun uri(uri: String) = apply {\n        this.uri = uri\n    }\n\n    override fun String.with(value: Any?) = this@LinkedApiRouterBuilder.apply {\n        queriesBuilder.apply {\n            this@with with value\n        }\n    }\n\n    override fun result(onReceive: (Any?) -> Unit) = apply {\n        receiveResults { results ->\n            onReceive(\n                results.value(0)\n            )\n        }\n    }\n\n    override fun result(onReceive: (Any?, Any?) -> Unit) = apply {\n        receiveResults { results ->\n            onReceive(\n                results.value(0),\n                results.value(1)\n            )\n        }\n    }\n\n    override fun result(\n        onReceive: (Any?, Any?, Any?) -> Unit\n    ) = apply {\n        receiveResults { results ->\n            onReceive(\n                results.value(0),\n                results.value(1),\n                results.value(2)\n            )\n        }\n    }\n\n    override fun result(\n        onReceive: (Any?, Any?, Any?, Any?) -> Unit\n    ) = apply {\n        receiveResults { results ->\n            onReceive(\n                results.value(0),\n                results.value(1),\n                results.value(2),\n                results.value(3)\n\n            )\n        }\n    }\n\n    override fun result(\n        onReceive: (Any?, Any?, Any?, Any?, Any?) -> Unit\n    ) = apply {\n        receiveResults { results ->\n            onReceive(\n                results.value(0),\n                results.value(1),\n                results.value(2),\n                results.value(3),\n                results.value(4)\n            )\n        }\n    }\n\n    override fun result(\n        onReceive: (Any?, Any?, Any?, Any?, Any?, Any?) -> Unit\n    ) = apply {\n        receiveResults { results ->\n            onReceive(\n                results.value(0),\n                results.value(1),\n                results.value(2),\n                results.value(3),\n                results.value(4),\n                results.value(5)\n            )\n        }\n    }\n\n    override fun result(\n        onReceive: (Any?, Any?, Any?, Any?, Any?, Any?, Any?) -> Unit\n    ) = apply {\n        receiveResults { results ->\n            onReceive(\n                results.value(0),\n                results.value(1),\n                results.value(2),\n                results.value(3),\n                results.value(4),\n                results.value(5),\n                results.value(6)\n            )\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/router/LinkedLaunchRouterBuilder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.router\n\nimport android.app.Activity\nimport android.content.Context\nimport android.os.Parcelable\nimport androidx.fragment.app.Fragment\nimport com.rubik.builder.query.LinkedLaunchQueriesBuilder\n\nclass LinkedLaunchRouterBuilder : BasicRouterBuilder(), LinkedLaunchRouterBuildable {\n    override val queriesBuilder = LinkedLaunchQueriesBuilder()\n    override fun createUri(): String = uri\n    private var uri: String = \"\"\n\n    // linked\n    override fun uri(uri: String) = apply {\n        this.uri = uri\n    }\n\n    override fun launchBy(context: Context) = apply {\n        queriesBuilder.queries.context = context\n    }\n\n    override fun launchBy(activity: Activity) = apply {\n        queriesBuilder.queries.activity = activity\n        queriesBuilder.queries.context = activity.applicationContext\n    }\n\n    override fun launchBy(fragment: Fragment) = apply {\n        queriesBuilder.queries.fragment = fragment\n        queriesBuilder.queries.context = fragment.context\n    }\n\n    override fun launchRequestCode(requestCode: Int) = apply {\n        queriesBuilder.queries.requestCode = requestCode\n    }\n\n    override fun launchFlags(flags: Int) = apply {\n        queriesBuilder.queries.flags = flags\n    }\n\n\n    override fun String.withSerializable(value: Any?)= this@LinkedLaunchRouterBuilder.apply {\n        queriesBuilder.apply {\n            this@withSerializable withSerializable value\n        }\n    }\n    override fun String.withParcelable(value: Parcelable?)= this@LinkedLaunchRouterBuilder.apply {\n        queriesBuilder.apply {\n            this@withParcelable withParcelable value\n        }\n    }\n\n    override fun String.withParcelable(value: Array<out Parcelable>?)= this@LinkedLaunchRouterBuilder.apply {\n        queriesBuilder.apply {\n            this@withParcelable withParcelable value\n        }\n    }\n\n    override fun String.withParcelable(value: ArrayList<out Parcelable>?)= this@LinkedLaunchRouterBuilder.apply {\n        queriesBuilder.apply {\n            this@withParcelable withParcelable value\n        }\n    }\n\n    override fun String.with(value: Any?) = this@LinkedLaunchRouterBuilder.apply {\n        queriesBuilder.apply {\n            this@with with value\n        }\n    }\n\n    override fun String.withValue(value: Any?) = this@LinkedLaunchRouterBuilder.apply {\n        queriesBuilder.apply {\n            this@withValue withValue value\n        }\n    }\n\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/builder/router/RouterBuildable.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.builder.router\n\nimport com.rubik.builder.query.DSLLaunchQueriesFrameable\nimport com.rubik.builder.query.LinkedLaunchQueriesFrameable\nimport com.rubik.builder.query.QueriesFrameable\nimport com.rubik.builder.result.ResultsBuildable\nimport com.rubik.route.Results\nimport com.rubik.router.Router\nimport com.rubik.router.annotations.RInvariant\n\ninterface RouterBuildable {\n    fun checkRouterVersion(version: Int): RouterBuildable\n    @RInvariant\n    fun receiveResults(receive: (Results) -> Unit): RouterBuildable\n    fun build(): Router\n}\n\ninterface DSLRouterBuildable : RouterBuildable {\n    var uri: String\n    fun query(block: QueriesFrameable<Unit>.() -> Unit)\n}\n\ninterface DSLLaunchRouterBuildable : RouterBuildable {\n    var uri: String\n    fun query(block: DSLLaunchQueriesFrameable.() -> Unit)\n}\n\ninterface LinkedApiRouterBuildable : RouterBuildable, QueriesFrameable<LinkedApiRouterBuildable>, ResultsBuildable<LinkedApiRouterBuildable> {\n    fun uri(uri: String): LinkedApiRouterBuildable\n}\n\ninterface LinkedLaunchRouterBuildable : LinkedLaunchQueriesFrameable<LinkedLaunchRouterBuildable> {\n    fun uri(uri: String): LinkedLaunchRouterBuildable\n}\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/context/Aggregatable.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.context\n\nimport com.rubik.Rubik\nimport com.rubik.route.Queries\nimport com.rubik.route.Query\nimport com.rubik.route.ResultGroups\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * Aggregate router function and router event of Context.\n * The specific implementation will be automatically generated by rubik-kapt.\n *\n * @since: 1.0\n */\ninterface Aggregatable {\n    /**\n     * Will invoking when route to a RRouter function.\n     */\n    fun onRoute(path: String, queries: Queries, results: ResultGroups)\n    /**\n     * Will invoking when route to a REvent function.\n     */\n    fun onEvent(msg: String, queries: Queries)\n}\n\nabstract class AggregateFactory {\n    abstract val URI: String\n    open val DEPENDENCIES: List<String> = listOf()\n    abstract val EVENT_MSGS: List<String>\n    abstract val CREATOR: () -> Aggregatable\n\n    @RInvariant\n    fun register() {\n        Rubik.registerAggregateFactory(this)\n    }\n}\n\nfun Aggregatable.doEvent(msg: String, vararg args: Any) {\n    onEvent(msg, Queries().apply {\n        args.forEachIndexed { index, value ->\n            add(Query(\"rubik_aggregate_live_arg${index}\", value))\n        }\n    })\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/context/LifeCycleEvent.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.context\n\nobject LifeCycleEvent {\n    const val INIT = \"LifeCycleEvent_Init\"\n    const val DESTROY = \"LifeCycleEvent_Destroy\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/context/RouteActions.kt",
    "content": "package com.rubik.context\n\ninterface RouteActions"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/identity/IdentityChecker.kt",
    "content": "package com.rubik.identity\n\nimport com.rubik.identity.exception.*\nimport com.rubik.logger.Logger\nimport com.rubik.router.annotations.RInvariant\n\nclass IdentityChecker {\n    private val contexts = mutableMapOf<String,RContextId>()\n    private val components = mutableMapOf<String,Pair<RComponentId,RAggregateId?>>()\n\n    fun addContextId(contextId: RContextId) {\n        if(contexts.containsKey(contextId.uri))\n            throw DuplicateContextException(contextId.uri)\n        contexts[contextId.uri] = contextId\n    }\n\n    fun addComponentId(componentId: RComponentId, aggregateId: RAggregateId?) {\n        aggregateId?.let {\n            if (componentId.uri != aggregateId.uri)\n                throw UriNotConformException(componentId, aggregateId)\n        }\n        if(components.containsKey(componentId.uri))\n            throw DuplicateComponentException(componentId.uri)\n        components[componentId.uri] = componentId to aggregateId\n    }\n\n\n    @RInvariant\n    fun addContextId(uri: String, contextClassName: String) {\n        val context = try {\n            Class.forName(contextClassName).newInstance() as? RContextId\n        } catch (e: ClassNotFoundException) {\n            Logger.e(\" RUBIK IdentityChecker addContext className: $contextClassName with exception : $e\", e)\n            null\n        } ?: RContextId(uri, MayBeNotSupport())\n        addContextId(context)\n    }\n\n    @RInvariant\n    fun addComponentId(uri: String, componentClassName: String, aggregateClassName: String?) {\n        val component =  try {\n            Class.forName(componentClassName).newInstance() as? RComponentId\n        } catch (e: ClassNotFoundException) {\n            Logger.e(\" RUBIK IdentityChecker addComponent className: $componentClassName with exception : $e\", e)\n            null\n        } ?: RComponentId(uri, MayBeNotSupport(), listOf(), listOf())\n        val aggregate = aggregateClassName?.let {\n            try {\n                Class.forName(aggregateClassName).newInstance() as? RAggregateId\n            } catch (e: ClassNotFoundException) {\n                Logger.e(\" RUBIK IdentityChecker addComponent className: $aggregateClassName with exception : $e\", e)\n                null\n            } ?: RAggregateId(uri, MayBeNotSupport())\n        }\n        addComponentId(component, aggregate)\n    }\n\n    fun check(\n        checkAggregateAndContextLib: Boolean = true,\n        checkComponentAndAggregate: Boolean = true,\n        checkTouching: Boolean = true,\n        checkPacking: Boolean = true\n    ) {\n        Logger.d(\" ==============================================================\")\n        Logger.d(\" RUBIK IdentityChecker START :\")\n        Logger.d(\" checkAggregateAndContextLib : $checkAggregateAndContextLib\")\n        Logger.d(\" checkComponentAndAggregate : $checkComponentAndAggregate\")\n        Logger.d(\" checkTouching : $checkTouching\")\n        Logger.d(\" checkPacking : $checkPacking\")\n\n        val exceptions = mutableListOf<RIdentityCheckFailedException>()\n\n        components.forEach { (_, entry) ->\n            val component = entry.first\n            val aggregate = entry.second\n\n            Logger.d(\" ==============================================================\")\n            Logger.d(\" ---------  COMPONENT :${component.uri } mark:${component.mark}\")\n\n            aggregate?.let {\n                if (checkAggregateAndContextLib) checkAggregateAndContextLib(exceptions, aggregate)\n\n                if (checkComponentAndAggregate) checkComponentAndAggregate(exceptions, component, aggregate)\n            }\n\n            if (checkTouching) checkTouchingOfComponent(exceptions, component)\n\n            if (checkPacking) checkPackingOfComponent(exceptions, component)\n\n            Logger.d(\" ==============================================================\")\n        }\n\n        Logger.d(\" ==============================================================\")\n        if (exceptions.isEmpty()) {\n            Logger.d(\" RUBIK IdentityChecker CHECK FINISH !\")\n        } else {\n            Logger.e(\" RUBIK IdentityChecker CHECK FAILED !\", null)\n            exceptions.forEach { exception->\n                Logger.e(\" RUBIK IdentityChecker CHECK FAILED ON :\", exception)\n                throw exception\n            }\n        }\n        Logger.d(\" ==============================================================\")\n    }\n\n    private fun checkComponentAndAggregate(\n        exceptions: MutableList<RIdentityCheckFailedException>,\n        component: RComponentId,\n        aggregate: RAggregateId\n    ) {\n        // check component and aggregate\n        Logger.d(\" ---------  AGGREGATE :${aggregate.uri} mark:${aggregate.mark.toStringWithToken()}\")\n        Logger.d(\" ------------  ! CHECKING - COMPONENT and AGGREGATE !\")\n\n        if (!component.checkVersion(aggregate))\n            RIdentityCheckFailedException(component, aggregate).let { exception ->\n                Logger.e(\" ------------ --- ! FAILED - $exception FAILED!\", null)\n                exceptions.add(exception)\n            }\n    }\n\n    private fun checkAggregateAndContextLib(\n        exceptions: MutableList<RIdentityCheckFailedException>,\n        aggregate: RAggregateId\n    ) {\n        // check aggregates and context lib\n        val context =\n            contexts[aggregate.uri] ?: throw RIdentityNotFoundException(aggregate.uri, \"Context\")\n\n        Logger.d(\" ---------  --- with CONTEXT :${context.uri} mark:${context.mark.toStringWithToken()}\")\n        Logger.d(\" ------------  ! CHECKING - AGGREGATE and CONTEXT !\")\n\n        if (!context.checkToken(aggregate))\n            RIdentityCheckFailedException(aggregate, context).let { exception ->\n                Logger.e(\" ------------ --- ! FAILED - $exception FAILED!\", null)\n                exceptions.add(exception)\n            }\n    }\n\n    private fun checkTouchingOfComponent(\n        exceptions: MutableList<RIdentityCheckFailedException>,\n        component: RComponentId\n    ) {\n        // check component touching\n        component.dependencies.forEach { dependencyContext ->\n            val defContext = contexts[dependencyContext.uri] ?: throw RIdentityNotFoundException(dependencyContext.uri, \"Context\")\n\n            Logger.d(\" ---------  --- DEPENDENCY :${dependencyContext.uri } mark:${dependencyContext.mark}\")\n            Logger.d(\" ---------  --- --- with CONTEXT :${defContext.uri } mark:${defContext.mark}\")\n            Logger.d(\" ------------  ! CHECKING - DEPENDENCY !\")\n\n            if (!dependencyContext.checkVersion(defContext))\n                RIdentityCheckFailedException(component, defContext).let { exception ->\n                    Logger.e(\" ------------ --- ! FAILED - $exception FAILED!\", null)\n                    exceptions.add(exception)\n                }\n        }\n    }\n\n    private fun checkPackingOfComponent(\n        exceptions: MutableList<RIdentityCheckFailedException>,\n        component: RComponentId\n    ) {\n        // check component packed\n        component.packed.forEach { packedComponent ->\n            val defComponent = components[packedComponent.uri]?.first ?: throw RIdentityNotFoundException(packedComponent.uri, \"Component\")\n\n            Logger.d(\" ---------  --- PACKED :${packedComponent.uri } mark:${packedComponent.mark}\")\n            Logger.d(\" ---------  --- --- with COMPONENT :${defComponent.uri } mark:${defComponent.mark}\")\n            Logger.d(\" ------------  ! CHECKING CHECKING - PACKED !\")\n\n            if (!packedComponent.checkVersion(defComponent))\n                RIdentityCheckFailedException(component, defComponent).let { exception ->\n                    Logger.e(\" ------------ --- ! FAILED - $exception FAILED!\", null)\n                    exceptions.add(exception)\n                }\n        }\n    }\n\n    private fun RIdentity.preCheck(): Boolean {\n        return when {\n            mark is MayBeNotSupport -> {\n                Logger.e(\" RUBIK IdentityChecker [$uri] maybe not Support Identity or not Packing\", null)\n                true\n            }\n            mark.version.isCodeVersion() -> {\n                Logger.e(\" RUBIK IdentityChecker [$uri] is code version:[${mark.version}] MayBe in ProjectMode\", null)\n                false\n            }\n            else -> false\n        }\n    }\n\n    private fun RIdentity.checkVersion(other: RIdentity) =\n        this.preCheck() || other.preCheck() || mark.checkVersion(other.mark)\n\n    private fun RIdentity.preCheckVersion(other: RIdentity): Boolean {\n        if (!mark.checkVersion(other.mark))\n            Logger.e(\" RUBIK IdentityChecker [$uri] version (${mark.version}) and (${other.mark.version}) was not match\", null)\n        return false // always false just warming\n    }\n\n\n    private fun RIdentity.checkToken(other: RIdentity) =\n        this.preCheck() || other.preCheck() || preCheckVersion(other) || mark.checkToken(other.mark)\n\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/identity/RIdentity.kt",
    "content": "package com.rubik.identity\n\nimport com.ktnail.x.md5\nimport com.rubik.router.annotations.RInvariant\n\nabstract class RIdentity {\n    abstract val uri: String\n    abstract val mark :RMark\n    override fun toString() = \" [$uri] \\n - id:$mark \\n \"\n}\n\nopen class RMark(\n    val version: String,\n    val token: String? = null,\n    val variant: String? = null,\n    val md5: String? = null\n){\n    fun checkVersion(other: RMark): Boolean {\n        return version == other.version || version.checkIfAutoVersion(other.version) || other.version.checkIfAutoVersion(version)\n        // && variant == other.variant\n    }\n\n    private fun String.checkIfAutoVersion(other: String): Boolean {\n        return if (isCodeVersion()) {\n            if (other.isDevVersion()) {\n                codeVersionToVersion() == other.devVersionToVersion()\n            } else {\n                codeVersionToVersion() == other\n            }\n        } else false\n    }\n\n    fun checkToken(other: RMark): Boolean =\n        null != token && null != other.token && token.processOldVersionToken() == other.token.processOldVersionToken()\n\n    private fun String.processOldVersionToken() = if (startsWith(\"<CTX>\")) md5() else this\n\n    fun checkMd5(other: RMark) = null != md5 && null != other.md5 && md5 == other.md5\n\n    override fun toString() = \" version:${version} \" +\n            (if (null != variant) \" variant:${variant} \" else \"\") +\n            (if (null != token) \" token: HAS \" else \"\") +\n            (if (null != md5) \" md5:${md5} \" else \"\")\n\n    fun toStringWithToken() = \" version:${version} \" +\n            (if (null != variant) \" variant:${variant} \" else \"\") +\n            (if (null != token) \" token:${token} \" else \"\") +\n            (if (null != md5) \" md5:${md5} \" else \"\")\n}\n\n@RInvariant\nopen class RComponentId(\n    override val uri: String,\n    override val mark: RMark,\n    val dependencies: List<RContextId>,\n    val packed: List<RComponentId>\n) : RIdentity() {\n    constructor(\n        uri: String,\n        version: String,\n        variant: String,\n        dependencies: List<RContextId>,\n        packed: List<RComponentId>\n    ) : this(\n        uri,\n        RMark(version = version, variant = variant),\n        dependencies,\n        packed\n    )\n\n    constructor(\n        uri: String,\n        version: String,\n        variant: String\n    ) : this(\n        uri,\n        RMark(version = version, variant = variant),\n        listOf(),\n        listOf()\n    )\n    override fun toString() = \" RComponent ${super.toString()}\"\n}\n\n\nopen class RAggregateId(\n    override val uri: String,\n    override val mark: RMark\n) : RIdentity() {\n    constructor(uri: String, version: String) : this(uri, RMark(version = version))\n    constructor(uri: String, version: String, token: String) : this(uri, RMark(version = version, token = token))\n    override fun toString() = \" RAggregate ${super.toString()}\"\n}\n\nopen class RContextId(\n    override val uri: String,\n    override val mark: RMark\n) : RIdentity() {\n    constructor(uri: String, version: String) : this(uri, RMark(version = version))\n    constructor(uri: String, version: String, token: String) : this(uri, RMark(version = version, token = token))\n    override fun toString() = \" RContext ${super.toString()}\"\n}\n\ninternal class MayBeNotSupport : RMark(version = \"\") {\n    override fun toString() = \" MayBeNotSupport ${super.toString()}\"\n}\n\ninternal fun String.isCodeVersion() = endsWith(\"-AUTO\") || endsWith(\"-CODE\")\ninternal fun String.isDevVersion() = endsWith(\"-DEV\")\ninternal fun String.codeVersionToVersion() = removeSuffix(\"-AUTO\").removeSuffix(\"-CODE\")\ninternal fun String.devVersionToVersion() = removeSuffix(\"-DEV\")\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/identity/exception/DuplicateComponentException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.identity.exception\n\n/**\n * Thrown when using a duplicated uri to check component.\n *\n * @since 1.9\n */\ninternal class DuplicateComponentException(val uri: String?) : Exception() {\n    override fun toString() = \"DuplicateComponentException on uri:$uri\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/identity/exception/DuplicateContextException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.identity.exception\n\n/**\n * Thrown when using a duplicated uri to check context.\n *\n * @since 1.9\n */\ninternal class DuplicateContextException(val uri: String?) : Exception() {\n    override fun toString() = \"DuplicateContextException on uri:$uri\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/identity/exception/RIdentityCheckFailedException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.identity.exception\n\nimport com.rubik.identity.RIdentity\n\n/**\n * Thrown when check two RIdentity failed .\n *\n * @since 1.9\n */\ninternal class RIdentityCheckFailedException(\n    private val from: RIdentity,\n    private val to: RIdentity\n) : Exception() {\n    override fun toString() = \"RIdentityCheckFailedException\\n\" +\n            \"> from:$from\\n\" +\n            \"> to:$to\\n\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/identity/exception/RIdentityNotFoundException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.identity.exception\n\n/**\n * Thrown when RIdentity was not found .\n *\n * @since 1.9\n */\ninternal class RIdentityNotFoundException(\n    private val uri: String,\n    private val type: String\n) : Exception() {\n    override fun toString() = \"RIdentityNotFoundException $type not found with uri:${uri}\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/identity/exception/UriNotConformException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.identity.exception\n\nimport com.rubik.identity.RIdentity\n\n/**\n * Thrown when using a different uri to check RPackage.\n *\n * @since 1.9\n */\ninternal class UriNotConformException(\n    private val from: RIdentity,\n    private val to: RIdentity\n) : Exception() {\n    override fun toString() = \"UriNotConformException use different uri on:$from and $to\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/logger/Logger.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.logger\n\nobject Logger {\n    var bigLogEnable = false\n    var d: (String) -> Unit = {}\n    var e: (String, Throwable?) -> Unit = { _, _ -> }\n    var da: (String, () -> String) -> Unit = { tag, msgAction ->\n        if (bigLogEnable){\n            d(tag + \"|\" + msgAction())\n        }\n    }\n    var ea: (String, () -> String, (() -> Throwable)?) -> Unit = { tag, msgAction, ecptAction ->\n        e(tag + \"|\" + if (bigLogEnable){msgAction()} else {\" bigLogDisable \"}, ecptAction?.let { ecptAction() })\n    }\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/LaunchQueries.kt",
    "content": "package com.rubik.route\n\nimport android.app.Activity\nimport android.content.Context\nimport androidx.fragment.app.Fragment\n\n/**\n * The Queries for rubik to launch a activity.\n *\n * @since 1.0\n */\nclass LaunchQueries : Queries() {\n    var context: Context? = null\n    var flags: Int? = null\n    var requestCode: Int? = null\n    var activity: Activity? = null\n    var fragment: Fragment? = null\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/Object.kt",
    "content": "package com.rubik.route\n\n/**\n * The Object of rubik router.\n * Provide the mapping of original data type.\n *\n * @since 1.10\n */\n\ninterface Object\n\nabstract class SubObject(\n    val originalObject: Any?\n) : Object\n\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/Queries.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route\n\nimport android.os.Binder\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.util.Size\nimport android.util.SizeF\nimport com.rubik.route.exception.BadQueryException\nimport com.rubik.route.mapping.putJson\nimport java.io.Serializable\n\n/**\n * The Queries of rubik router.\n *\n * @see Query\n *\n * @since 1.0\n */\nopen class Queries {\n    private val valuesList: MutableList<Query> = mutableListOf()\n\n    fun add(query: Query) {\n        valuesList.add(query)\n    }\n\n    fun addAll(values: List<Query>) {\n        valuesList.addAll(values)\n    }\n\n    operator fun get(index: Int, name: String? = null): Query {\n        return name?.let {\n            valuesList.findLast { query -> query.name == name }\n        } ?: valuesList.getOrNull(index) ?: throw BadQueryException(index, name)\n    }\n\n    fun value(\n        index: Int,\n        name: String? = null\n    ): Any? {\n        return this[index, name].value\n    }\n\n    fun toBundle() = Bundle(valuesList.size).apply {\n        valuesList.forEachIndexed { _, query ->\n            val key = query.name\n            val value = query.value\n            when (query.type) {\n                QueryType.VALUE -> {\n                    putJson(key, value)\n                }\n                QueryType.PARCELABLE -> {\n                    if (!putParcelableQuery(key, value)) {\n                        putJson(key, value)\n                    }\n                }\n                QueryType.SERIALIZABLE -> {\n                    if (!putSerializableQuery(key, value)) {\n                        putJson(key, value)\n                    }\n                }\n                else ->{\n                    when (value) {\n                        null -> putString(key, null) // Any nullable type will suffice.\n\n                        // Scalars\n                        is Boolean -> putBoolean(key, value)\n                        is Byte -> putByte(key, value)\n                        is Char -> putChar(key, value)\n                        is Double -> putDouble(key, value)\n                        is Float -> putFloat(key, value)\n                        is Int -> putInt(key, value)\n                        is Long -> putLong(key, value)\n                        is Short -> putShort(key, value)\n\n                        // References\n                        is Bundle -> putBundle(key, value)\n                        is CharSequence -> putCharSequence(key, value)\n\n                        // Scalar arrays\n                        is BooleanArray -> putBooleanArray(key, value)\n                        is ByteArray -> putByteArray(key, value)\n                        is CharArray -> putCharArray(key, value)\n                        is DoubleArray -> putDoubleArray(key, value)\n                        is FloatArray -> putFloatArray(key, value)\n                        is IntArray -> putIntArray(key, value)\n                        is LongArray -> putLongArray(key, value)\n                        is ShortArray -> putShortArray(key, value)\n\n                        // Reference arrays\n                        is Array<*> -> {\n                            if (!putReferenceArraysQuery(key, value)) {\n                                putJson(key, value)\n                            }\n                        }\n\n                        else -> {\n                            if (Build.VERSION.SDK_INT >= 18 && value is Binder) {\n                                putBinder(key, value)\n                            } else if (Build.VERSION.SDK_INT >= 21 && value is Size) {\n                                putSize(key, value)\n                            } else if (Build.VERSION.SDK_INT >= 21 && value is SizeF) {\n                                putSizeF(key, value)\n                            } else {\n                                putJson(key, value)\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun Bundle.putParcelableQuery(key: String, value: Any?): Boolean {\n        when (value) {\n            is Parcelable -> {\n                putParcelable(key, value)\n                return true\n            }\n            is Array<*> -> {\n                value::class.java.componentType?.let { componentType ->\n                    if (Parcelable::class.java.isAssignableFrom(componentType)) {\n                        @Suppress(\"UNCHECKED_CAST\")  // Checked by reflection.\n                        putParcelableArray(key, value as? Array<Parcelable>)\n                        return true\n                    }\n                }\n            }\n            is ArrayList<*> -> {\n                @Suppress(\"UNCHECKED_CAST\")  // Checked by catch.\n                putParcelableArrayList(key, value as? ArrayList<Parcelable>)\n                return true\n            }\n        }\n        return false\n    }\n\n    private fun Bundle.putSerializableQuery(key: String, value: Any?) :Boolean{\n        return if (value is Serializable) { // all arrays are serializable.\n            putSerializable(key, value)\n            true\n        } else {\n            false\n        }\n    }\n\n    private fun Bundle.putReferenceArraysQuery(key: String, value: Array<*>) :Boolean{\n        value::class.java.componentType?.let {componentType->\n            @Suppress(\"UNCHECKED_CAST\") // Checked by reflection.\n            when {\n                String::class.java.isAssignableFrom(componentType) -> {\n                    putStringArray(key, value as? Array<String>)\n                    return true\n                }\n                CharSequence::class.java.isAssignableFrom(componentType) -> {\n                    putCharSequenceArray(key, value as? Array<CharSequence>)\n                    return true\n                }\n                else -> {}\n            }\n        }\n        return false\n    }\n}\n\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/Query.kt",
    "content": "package com.rubik.route\n\n/**\n * The Query of rubik router.\n * Provide the mapping of original data type.\n *\n * @since 1.0\n */\nclass Query(\n    val name: String,\n    val value: Any?,\n    val type: QueryType = QueryType.ANY\n)\n\nenum class QueryType {\n    ANY,\n    PARCELABLE,\n    SERIALIZABLE,\n    VALUE\n}\n\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/Result.kt",
    "content": "package com.rubik.route\n\n/**\n * The Result of rubik router.\n * Provide the mapping of original data type.\n *\n * @since 1.0\n */\ndata class Result(\n    val value: Any?\n)\n\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/ResultGroups.kt",
    "content": "package com.rubik.route\n\nclass ResultGroups {\n    private val groups: MutableList<Results> = mutableListOf()\n\n    fun load(results: Results) {\n        groups.add(results)\n    }\n\n    fun set(index: Int, vararg results: Result) {\n        groups.getOrNull(index)?.set(*results)\n    }\n\n}\n\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/Results.kt",
    "content": "package com.rubik.route\n\nimport com.rubik.route.exception.BadResultException\n\n/**\n * The Results of rubik router.\n *\n * @see Result\n *\n * @since 1.0\n */\nclass Results(private val receiver: ((Results) -> Unit)?) {\n    private val results: MutableList<Result> = mutableListOf()\n\n    operator fun get(index: Int): Result {\n        return results.getOrNull(index) ?: throw BadResultException(index)\n    }\n\n    operator fun set(index: Int, value: Result) {\n        results[index] = value\n        receiver?.invoke(this)\n    }\n\n    fun set(vararg value: Result){\n        results.clear()\n        results.addAll(value)\n        receiver?.invoke(this)\n    }\n\n    fun value(\n        index: Int\n    ): Any? {\n        return this[index].value\n    }\n}\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/BadAggregatableClassException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\n/**\n * Thrown when given name is not a Aggregatable.\n *\n * @since 1.7\n */\ninternal class BadAggregatableClassException(private val name: String) : Exception() {\n    override fun toString() = \"BadAggregatableClassException class:$name is not a Aggregatable !\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/BadPathOrVersionException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * Thrown when using a bad path or version to router..\n *\n * @since 1.0\n */\n@RInvariant\nclass BadPathOrVersionException(val path: String) : Exception() {\n    override fun toString() = \"BadPathOrVersionException on path:$path\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/BadQueryException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\n/**\n * Thrown when using a bad query to router.\n *\n * @since 1.0\n */\ninternal class BadQueryException(private val index: Int, private val name: String?) : Exception() {\n    override fun toString() = \"BadQueryException on index:$index name:$name\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/BadResultException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\n/**\n * Thrown when using a bad result to router.\n *\n * @since 1.0\n */\ninternal class BadResultException(private var index: Int) : Exception() {\n    override fun toString() = \"BadResultException on index:$index\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/BadTypeException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * Thrown when casing value type type error when router.\n *\n * @since 1.0\n */\n@RInvariant\nclass BadTypeException(private val type: String= \"unknow\") : Exception() {\n    override fun toString() = \"BadTypeException on type:$type\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/BadUriException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\n/**\n * Thrown when using a bad path or version to router..\n *\n * @since 1.8\n */\ninternal class BadUriException(val uri: String?) : Exception() {\n    override fun toString() = \"BadUriException on uri:$uri\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/BadValueException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * Thrown when value not expect type when router.\n *\n * @since 1.0\n */\n@RInvariant\nclass BadValueException(private val toType: String ,private val from: Any?) : Exception() {\n    override fun toString() = \"BadValueException expect:$toType but:${if (null == from) \"null\" else from::class.java.name}\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/DuplicateRegisteredUriException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\n/**\n * Thrown when using a duplicated uri to register context.\n *\n * @since 1.9\n */\ninternal class DuplicateRegisteredUriException(val uri: String?) : Exception() {\n    override fun toString() = \"DuplicateRegisteredUriException on uri:$uri\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/exception/ParcelableNoCreatorException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.exception\n\n/**\n * Thrown when guess a value is parcelable, but no Creator found.\n *\n * @since 1.8\n */\ninternal class ParcelableNoCreatorException(private val clazz: String) : Exception() {\n    override fun toString() = \"ParcelableNoCreatorException guess [${clazz}] is parcelable, but no CREATOR found !\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/mapping/Bundle.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.mapping\n\nimport android.content.Intent\nimport android.os.Bundle\nimport com.rubik.router.annotations.RInvariant\nimport java.lang.reflect.Type\n\nconst val KEY_JSON_VALUE_PREFIX = \"R_KEY_JSON_VALUE_\"\n\ninternal fun Bundle.isJsonExtras(key: String) = !getString(\"${KEY_JSON_VALUE_PREFIX}${key}\").isNullOrBlank()\n\ninternal fun Bundle.putJson(key: String, value: Any?) {\n    putString(\"${KEY_JSON_VALUE_PREFIX}$key\", value.toJson())\n}\n\n@RInvariant\nfun Intent.query(name: String, type: Type): Any? = extras?.query(name, type)\n\n@RInvariant\nfun Bundle.query(name: String, type: Type): Any? {\n    return this.run {\n        if (isJsonExtras(name)) {\n            (getString(\"${KEY_JSON_VALUE_PREFIX}${name}\") ?: \"\").jsonToType(type)\n        } else {\n            get(name).caseToTypeOfT()\n        }\n    }\n}\n\nfun <T> Intent.valueProperty(name: String, type: Type): T? = extras?.valueProperty(name, type)\n\nfun <T> Bundle.valueProperty(name: String, type: Type): T? {\n    return this.run {\n        if (isJsonExtras(name)) {\n            (getString(\"${KEY_JSON_VALUE_PREFIX}${name}\") ?: \"\").jsonToType<T>(type)\n        } else null\n    }\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/mapping/JsonMapping.kt",
    "content": "package com.rubik.route.mapping\n\nimport com.google.gson.Gson\nimport java.lang.reflect.Type\n\nval GSON = Gson()\n\ninternal fun Any?.toJson() = GSON.toJson(this) ?: \"\"\n\ninternal fun <T> String.jsonToType(type: Type): T = GSON.fromJson(this, type)\ninternal fun <T> Any?.toJsonToType(type: Type): T = this.toJson().jsonToType(type)"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/mapping/LiveDataMapping.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.route.mapping\n\nimport androidx.lifecycle.*\nimport com.rubik.logger.Logger\nimport java.lang.reflect.Type\n\ninternal fun Any.toLiveData(type: Type): Any? {\n    return if (this is LiveData<*>)\n        type.firstTypeArgument?.let { liveType ->\n            Transformations.map(this) { value ->\n                value.toType(liveType)\n            }.apply {\n                Logger.da(\" RUBIK \") { \" liveData rvalue : $this\" }\n            }\n        }\n    else\n        null\n}\n\n\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/mapping/ParcelMapping.kt",
    "content": "package com.rubik.route.mapping\n\nimport android.os.Parcel\nimport android.os.Parcelable\nimport com.rubik.logger.Logger\nimport com.rubik.route.exception.ParcelableNoCreatorException\nimport java.lang.reflect.GenericArrayType\nimport java.lang.reflect.Modifier\nimport java.lang.reflect.ParameterizedType\nimport java.lang.reflect.Type\nimport java.lang.reflect.Array as RefArray\n\ninternal fun Any.toParcelable(type: Type): Any? {\n    return toParcelableRValue(type) ?: toParcelableList(type) ?: toParcelableArray(type)\n}\n\nprivate fun Any.toParcelableRValue(type: Type): Any? {\n    if (this is Parcelable) {\n        val creator = type.parcelableCreator\n        if (null != creator) {\n            Parcel.obtain().let { parcel ->\n                parcel.setDataPosition(0)\n                this.writeToParcel(parcel, 0)\n                parcel.setDataPosition(0)\n                return (creator.createFromParcel(parcel)).apply {\n                    parcel.recycle()\n                    Logger.da(\" RUBIK \") { \" parcel rvalue : $this\" }\n                }\n            }\n        } else {\n            throw ParcelableNoCreatorException(type.toString())\n        }\n    }\n    return null\n}\n\n\nprivate fun Any.toParcelableArray(type: Type): Any? {\n    if (this is Array<*> && type is GenericArrayType) {\n        val genericType = type.genericComponentType as? Class<*>\n        if (null != genericType) {\n            val creator = genericType.parcelableCreator\n            if (null != creator) {\n//                val result = RefArray.newInstance(genericType, size)\n                val result = creator.newArray(size)\n                Parcel.obtain().let { parcel ->\n                    this.forEachIndexed { index, value ->\n                        parcel.setDataPosition(index)\n                        (value as? Parcelable)?.writeToParcel(parcel, 0)\n                        parcel.setDataPosition(index)\n                        creator.createFromParcel(parcel)?.let {\n                            RefArray.set(result, index, it)\n                        }\n                    }\n                    return result.apply {\n                        parcel.recycle()\n                        Logger.da(\" RUBIK \") { \" parcel array(${this.size}): $this\" }\n                    }\n                }\n            }\n        }\n    }\n    return null\n}\n\n\nprivate fun Any.toParcelableList(type: Type): Any? {\n    if (this is List<*> && type is ParameterizedType) {\n        val creator = type.firstTypeArgument?.parcelableCreator\n        if (null != creator) {\n            val result = mutableListOf<Any?>()\n            Parcel.obtain().let { parcel ->\n                this.forEachIndexed { index, value ->\n                    parcel.setDataPosition(index)\n                    (value as? Parcelable)?.writeToParcel(parcel, 0)\n                    parcel.setDataPosition(index)\n                    creator.createFromParcel(parcel)?.let {\n                        result.add(index, it)\n                    }\n                }\n                return result.apply {\n                    parcel.recycle()\n                    Logger.da(\" RUBIK \") { \" parcel list(${this.size}): $this\" }\n                }\n            }\n        }\n    }\n    return null\n}\n\nprivate val Type.parcelableCreator: Parcelable.Creator<*>?\n    get() {\n        val creator = try {\n            (this as? Class<*>)?.getField(\"CREATOR\")\n        } catch (e: NoSuchFieldException) {\n            null\n        }\n        return if (null != creator && Modifier.isStatic(creator.modifiers)) {\n            creator.get(null) as? Parcelable.Creator<*>\n        } else {\n            null\n        }\n    }"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/route/mapping/TypeMapping.kt",
    "content": "package com.rubik.route.mapping\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.Transformations\nimport com.google.gson.reflect.TypeToken\nimport com.rubik.Rubik\nimport com.rubik.route.exception.BadTypeException\nimport com.rubik.route.exception.BadValueException\nimport com.rubik.router.annotations.RInvariant\nimport java.lang.reflect.ParameterizedType\nimport java.lang.reflect.Type\nimport java.lang.reflect.WildcardType\n\n@RInvariant\ninline fun <reified T> Any?.toTypeOfT(): T = toType(typeOfT<T>()).castToTypeOfT()\n\n@RInvariant\ninline fun <reified T> typeOfT() = object : TypeToken<T>() {}.type ?: throw BadTypeException()\n\n@RInvariant\ninline fun <reified T> Any?.castToTypeOfT(): T = if (this is T) this else throw BadValueException(T::class.java.name, this)\n\nfun Any?.toType(type: Type): Any? = when {\n    null == this -> null\n    Rubik.Properties.autoParcel -> toParcelable(type) ?: toLiveData(type) ?: toJsonToType(type)\n    else -> toLiveData(type) ?: toJsonToType(type)\n}\n\ninternal val Type.typeArguments: List<Type>\n    get() = mutableListOf<Type>().also { result ->\n        if (this is ParameterizedType)\n            actualTypeArguments.mapNotNull { type ->\n                (if (type is WildcardType) type.lowerBounds.getOrNull(0) ?: type.upperBounds.getOrNull(0) else type)?.let { wildcardType ->\n                    result.add(wildcardType)\n                }\n            }\n    }\n\ninternal val Type.firstTypeArgument: Type?\n    get() = typeArguments.getOrNull(0)\n\n\nfun <F, T> F.mapToType(mapping: (F) -> T): T = mapping(this)\nfun <F, T> List<F>.mapToType(mapping: (F) -> T): List<T> = map(mapping)\nfun <F, T, K> Map<K, F>.mapToType(mapping: (F) -> T): Map<K, T> = mapValues { (_, v) -> v.mapToType(mapping) }\nfun <F, T> Set<F>.mapToType(mapping: (F) -> T): Set<T> = map(mapping).toSet()\nfun <F, T> LiveData<F>.mapToType(mapping: (F) -> T): LiveData<T> = Transformations.map(this){ v -> v.mapToType(mapping) }\n@RInvariant\ninline fun <F, reified T> Array<F>.mapToType(mapping: (F) -> T): Array<T> = map(mapping).toTypedArray()\n\n\n@Deprecated(message = \"change function name \", replaceWith = ReplaceWith(\"replace function name\", \"com.rubik.route.mapping.castToTypeOfT\"))\n@RInvariant\ninline fun <reified T> Any?.caseToTypeOfT(): T = if (this is T) this else throw BadValueException(T::class.java.name, this)\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/Router.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport com.ktnail.x.uri.Uri\nimport com.rubik.Rubik\nimport com.rubik.builder.query.BundleQueriesBuilder\nimport com.rubik.builder.query.BundleQueriesFrameable\nimport com.rubik.builder.query.DSLLaunchQueriesBuilder\nimport com.rubik.builder.router.*\nimport com.rubik.context.Aggregatable\nimport com.rubik.context.doEvent\nimport com.rubik.logger.Logger\nimport com.rubik.route.Queries\nimport com.rubik.route.ResultGroups\nimport com.rubik.route.Results\nimport com.rubik.route.mapping.caseToTypeOfT\nimport com.rubik.route.mapping.query\nimport com.rubik.route.mapping.typeOfT\nimport com.rubik.route.mapping.valueProperty\nimport com.rubik.router.annotations.RInvariant\nimport com.rubik.router.exception.RubikAggregateNotFoundException\nimport java.lang.reflect.Type\n\nclass Router internal constructor(\n    private val uri: Uri,\n    private val queries: Queries,\n    private val resultGroups: ResultGroups,\n    private val checkRouterVersion: Int? = null\n) {\n\n    private val path\n        get() = uri.versionPath\n\n    fun route() {\n        safeRoute {\n            checkRouterVersion()\n            findAggregate(uri.basicUri).onRoute(path, queries, resultGroups)\n        }\n    }\n\n    /**\n     * route and get the result.\n     */\n    fun routeForResult(type: Type? = null): Any? {\n        return safeRouteAny { routeSync().value(0).caseToTypeOfT() }\n    }\n\n    @RInvariant\n    fun routeSync(): Results {\n        val results = Results(null)\n        safeRoute {\n            checkRouterVersion()\n            resultGroups.load(results)\n            findAggregate(uri.basicUri).onRoute(path, queries, resultGroups)\n        }\n        return results\n    }\n\n    private fun findAggregate(uri: String): Aggregatable {\n        return Rubik.createAggregate(uri) ?: throw RubikAggregateNotFoundException(uri)\n    }\n\n    private fun checkRouterVersion() {\n        if (null != checkRouterVersion) Rubik.checkRouterVersionLogic(checkRouterVersion)\n    }\n\n    private fun safeRoute(body: () -> Unit) {\n        return try {\n            body()\n        } catch (e: Exception) {\n            Logger.e(\" RUBIK navigation on uri: $uri with exception : $e\", e)\n        }\n    }\n\n    companion object {\n        // event\n        /**\n         * start to sending a event message.\n         */\n        @JvmStatic\n        fun doEvent(msg: String, vararg args: Any) {\n            Rubik.createAggregatesByMsg(msg).forEachIndexed { _, aggregate -> aggregate.doEvent(msg, *args) }\n        }\n\n        /**\n         * start to sending a event message.\n         */\n        fun doEvent(msg: String, context: Context, vararg arg: Any) {\n            doEvent(msg, *(listOf<Any>(context) + arg.toList()).toTypedArray())\n        }\n\n        // touch\n        /**\n         * touch other context by uri.\n         *\n         * @param  action invoke if can touch the context.\n         */\n        @JvmStatic\n        fun touch(uri: String, action: () -> Unit) = TouchHolder(uri).touch(action)\n\n        // builder\n        /**\n         * get a builder to build a route.\n         */\n        @JvmStatic\n        fun builder(): LinkedApiRouterBuildable = LinkedApiRouterBuilder()\n\n        /**\n         * get a builder to build a route for starting a Activity.\n         */\n        @JvmStatic\n        fun builder(context: Context): LinkedLaunchRouterBuilder =\n            LinkedLaunchRouterBuilder().launchBy(context)\n\n        /**\n         * get a builder to build a route for starting a Activity by given Activity.\n         */\n        @JvmStatic\n        fun builder(activity: Activity): LinkedLaunchRouterBuilder =\n            LinkedLaunchRouterBuilder().launchBy(activity)\n\n        /**\n         * get a builder to build a route for starting a Activity by given Fragment.\n         */\n        @JvmStatic\n        fun builder(fragment: Fragment): LinkedLaunchRouterBuilder =\n            LinkedLaunchRouterBuilder().launchBy(fragment)\n\n        // property\n        /**\n         * get a property value in Intent by name.\n         */\n        @JvmStatic\n        fun <T> valueProperty(intent: Intent, name: String, type: Type): T? =\n            intent.valueProperty(name, type)\n\n        /**\n         * get a property value in Bundle by name.\n         */\n        @JvmStatic\n        fun <T> valueProperty(bundle: Bundle, name: String, type: Type): T? =\n            bundle.valueProperty(name, type)\n    }\n}\n\n// event\n/**\n * start to sending a event message.\n */\nfun Context.doEventWithContext(msg: String, vararg args: Any) = Router.doEvent(msg, this, *args)\n\n/**\n * start to sending a event message.\n */\nfun doEvent(msg: String, vararg args: Any) = Router.doEvent(msg, *args)\n\n// touch\n/**\n * touch other context by uri.\n *\n * @param  action invoke if can touch the context.\n */\nfun touch(uri: String, action: () -> Unit) = Router.touch(uri, action)\n\n// navigate\n/**\n * navigate to a router path , using DSL code style.\n */\nfun navigate(body: DSLRouterBuildable.() -> Unit): Unit =\n    DSLApiRouterBuilder().apply(body).build().route()\n\n/**\n * navigate to a router path , using DSL code style.\n */\nfun Context.navigate(body: DSLLaunchRouterBuildable.() -> Unit): Unit =\n    DSLLaunchRouterBuilder(DSLLaunchQueriesBuilder(this)).apply(body).build().route()\n\n/**\n * navigate to a router path , using DSL code style , by given Activity.\n */\nfun Activity.navigate(body: DSLLaunchRouterBuildable.() -> Unit): Unit =\n    DSLLaunchRouterBuilder(DSLLaunchQueriesBuilder(this)).apply(body).build().route()\n\n/**\n * navigate to a router path , using DSL code style , by given Fragment.\n */\nfun Fragment.navigate(body: DSLLaunchRouterBuildable.() -> Unit): Unit =\n    DSLLaunchRouterBuilder(DSLLaunchQueriesBuilder(this)).apply(body).build().route()\n\n/**\n * navigate to a router path , using DSL code style , And receive results synchronously.\n */\n@RInvariant\ninline fun <reified T> navigateForResult(noinline body: DSLRouterBuildable.() -> Unit): T? {\n    return safeRoute<T> {\n        DSLApiRouterBuilder().apply(body).build().routeSync().value(0).caseToTypeOfT()\n    }\n}\n\n// bundle/property\n/**\n * get a property value in Intent by name.\n */\n@RInvariant\ninline fun <reified T> Bundle.property(name: String): T? = query(name, typeOfT<T>()).caseToTypeOfT()\n\n@RInvariant\ninline fun <reified T> Activity.property(name: String): T? =\n    intent?.query(name, typeOfT<T>()).caseToTypeOfT()\n\n@RInvariant\ninline fun <reified T> Fragment.property(name: String): T? = activity?.property(name)\n\n/**\n * add queries to bundle.\n */\nfun bundleQueries(block: BundleQueriesFrameable<Unit>.() -> Unit) =\n    BundleQueriesBuilder().apply(block).queries.toBundle()\n\n@RInvariant\nfun <T> safeRoute(body: () -> T): T? {\n    return try {\n        return body()\n    } catch (e: Exception) {\n        Logger.e(\" RUBIK navigation with exception : $e\", e)\n        null\n    }\n}\n\nfun safeRouteAny(body: () -> Any): Any? {\n    return try {\n        return body()\n    } catch (e: Exception) {\n        Logger.e(\" RUBIK navigation with exception : $e\", e)\n        null\n    }\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/RouterResult.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router\n\nimport com.rubik.builder.router.RouterBuildable\nimport com.rubik.route.mapping.caseToTypeOfT\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * The result callback of RouterBuildable, with 1 parameter.\n *\n * @see com.rubik.builder.result.ResultsBuildable\n *\n * @since 1.6\n */\n@RInvariant\ninline fun <reified R1> RouterBuildable.result(\n    noinline onReceive: (R1) -> Unit\n) =\n    receiveResults { results ->\n        onReceive(\n            results.value(0).caseToTypeOfT()\n        )\n    }\n\n/**\n * The result callback of RouterBuildable, with 2 parameter.\n *\n * @see com.rubik.builder.result.ResultsBuildable\n *\n * @since 1.6\n */\n@RInvariant\ninline fun <reified R1, reified R2> RouterBuildable.result(\n    noinline onReceive: (R1, R2) -> Unit\n) =\n    receiveResults { results ->\n        onReceive(\n            results.value(0).caseToTypeOfT(),\n            results.value(1).caseToTypeOfT()\n        )\n    }\n\n/**\n * The result callback of RouterBuildable, with 3 parameter.\n *\n * @see com.rubik.builder.result.ResultsBuildable\n *\n * @since 1.6\n */\n@RInvariant\ninline fun <reified R1, reified R2, reified R3> RouterBuildable.result(\n    noinline onReceive: (R1, R2, R3) -> Unit\n) =\n    receiveResults { results ->\n        onReceive(\n            results.value(0).caseToTypeOfT(),\n            results.value(1).caseToTypeOfT(),\n            results.value(2).caseToTypeOfT()\n        )\n    }\n\n/**\n * The result callback of RouterBuildable, with 4 parameter.\n *\n * @see com.rubik.builder.result.ResultsBuildable\n *\n * @since 1.6\n */\n@RInvariant\ninline fun <reified R1, reified R2, reified R3, reified R4> RouterBuildable.result(\n    noinline onReceive: (R1, R2, R3, R4) -> Unit\n) =\n    receiveResults { results ->\n        onReceive(\n            results.value(0).caseToTypeOfT(),\n            results.value(1).caseToTypeOfT(),\n            results.value(2).caseToTypeOfT(),\n            results.value(3).caseToTypeOfT()\n        )\n    }\n\n/**\n * The result callback of RouterBuildable, with 5 parameter.\n *\n * @see com.rubik.builder.result.ResultsBuildable\n *\n * @since 1.6\n */\n@RInvariant\ninline fun <reified R1, reified R2, reified R3, reified R4, reified R5> RouterBuildable.result(\n    noinline onReceive: (R1, R2, R3, R4, R5) -> Unit\n) =\n    receiveResults { results ->\n        onReceive(\n            results.value(0).caseToTypeOfT(),\n            results.value(1).caseToTypeOfT(),\n            results.value(2).caseToTypeOfT(),\n            results.value(3).caseToTypeOfT(),\n            results.value(4).caseToTypeOfT()\n        )\n    }\n\n/**\n * The result callback of RouterBuildable, with 6 parameter.\n *\n * @see com.rubik.builder.result.ResultsBuildable\n *\n * @since 1.6\n */\n@RInvariant\ninline fun <reified R1, reified R2, reified R3, reified R4, reified R5, reified R6> RouterBuildable.result(\n    noinline onReceive: (R1, R2, R3, R4, R5, R6) -> Unit\n) =\n    receiveResults { results ->\n        onReceive(\n            results.value(0).caseToTypeOfT(),\n            results.value(1).caseToTypeOfT(),\n            results.value(2).caseToTypeOfT(),\n            results.value(3).caseToTypeOfT(),\n            results.value(4).caseToTypeOfT(),\n            results.value(5).caseToTypeOfT()\n        )\n    }"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/TouchHolder.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router\n\nimport com.rubik.Rubik\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * A Holder for rubik context to touch other.\n *\n * @since 1.6\n */\n@RInvariant\nopen class TouchHolder(private val uri: String) {\n    private var touched: Boolean? = null\n\n    private fun tryTouch() {\n        if (null == touched)\n            touched = Rubik.touchUri(uri)\n    }\n\n    /**\n     * Do touch other context action.\n     *\n     * @param action invoke if can touch this context.\n     */\n    @RInvariant\n    fun touch(action: () -> Unit) = apply {\n        tryTouch()\n        if (touched == true) {\n            action()\n        }\n    }\n\n    /**\n     * Do touch other context action.\n     *\n     * @param action invoke if can not touch this context.\n     */\n    @RInvariant\n    fun miss(action: () -> Unit) = apply {\n        tryTouch()\n        if (touched == false) {\n            action()\n        }\n    }\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/annotations/RInvariant.kt",
    "content": "package com.rubik.router.annotations\n\nannotation class RInvariant\n"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/exception/BadRubikVersionException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router.exception\n\n/**\n * Thrown when using a wrong rubik version.\n *\n * @since 1.2\n */\ninternal class BadRubikVersionException(private val msg: String) : Exception() {\n    override fun toString() = \"BadRubikVersionException using a wrong rubik version :$msg\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/exception/BadUriException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router.exception\n\nimport android.net.Uri\n\n/**\n * Thrown when using a bad uri.\n *\n * @since 1.0\n */\ninternal class BadUriException(private val uri: Uri) : Exception() {\n    override fun toString() = \"BadUriException on uri:$uri\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/exception/RContextNotFoundException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router.exception\n\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * Thrown when can not find rubik context by uri.\n *\n * @since 1.0\n */\n@RInvariant\nclass RContextNotFoundException(private val uri: String) : Exception(){\n    override fun toString() = \"RContextNotFoundException on uri:$uri\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/exception/RubikAggregateNotFoundException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router.exception\n\nimport com.rubik.router.annotations.RInvariant\n\n/**\n * Thrown when can not find rubik context by uri.\n *\n * @since 1.9\n */\n@RInvariant\nclass RubikAggregateNotFoundException(private val uri: String) : Exception(){\n    override fun toString() = \"RubikAggregateNotFoundException on uri:$uri\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/exception/RubikNotInitException.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router.exception\n\n/**\n * Thrown when rubik router was not initialized.\n *\n * @since 1.0\n */\ninternal class RubikNotInitException : Exception(){\n    override fun toString() = \"RubikNotInitException please call Rubik.init() first!\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/java/com/rubik/router/uri/Path.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.router.uri\n\nimport com.rubik.route.Query\n\n/**\n * In order build path by string parameters.\n * @since 1.1\n */\nclass Path(private val originPath: String) {\n    private val parameterRegex = Regex(\"\\\\{([^}]*)\\\\}\")\n\n    fun setParameters(values: Array<out String>): String {\n        return originPath.setFirstParameters(0, values)\n    }\n\n    private fun String.setFirstParameters(index: Int, values: Array<out String>): String {\n        return if (contains(parameterRegex))\n            replaceFirst((parameterRegex), values[index]).setFirstParameters(index + 1, values)\n        else\n            this\n    }\n\n    fun matching(parametersPath: String): Boolean = if (parametersPath == originPath)\n        true\n    else\n        Regex(originPath.replace(parameterRegex, \".*\")).matches(parametersPath)\n\n    fun getParameters(parametersPath: String): List<Query> {\n        return if (parametersPath != originPath && matching(parametersPath)) {\n            val parameters = mutableListOf<Query>()\n            var tmpNamePath = originPath.escapeNaked()\n            var tmpValuePath = parametersPath.escapeNaked()\n            tmpNamePath.split(parameterRegex).let { parts ->\n                parts.forEachIndexed { index, part ->\n                    if (index < parts.size - 1) {\n                        tmpNamePath = tmpNamePath.removePrefix(part)\n                        tmpValuePath = tmpValuePath.removePrefix(part)\n                        val name = tmpNamePath.substring(0, tmpNamePath.indexOf(parts[index + 1]))\n                        val value = tmpValuePath.substring(0, tmpValuePath.indexOf(parts[index + 1]))\n                        tmpNamePath = tmpNamePath.removePrefix(name)\n                        tmpValuePath = tmpValuePath.removePrefix(value)\n                        parameters.add(Query(name.removeSurrounding(\"{\", \"}\"), value))\n                    }\n                }\n            }\n            parameters\n        } else {\n            listOf()\n        }\n    }\n\n    private fun String.escapeNaked(): String = \"START${this}END\"\n}"
  },
  {
    "path": "rubik/rubik_router/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Rubik</string>\n</resources>\n"
  },
  {
    "path": "rubik_libs_repository/rubik-demo_com_mars_rubik_test_detail-publication-records.gradle",
    "content": "/**\n * generated by Rubik Gradle Plugin (1.10.0.0-AGBT4_2-K1_5-LOCAL).\n * \n * uri: [demo://com.mars.rubik-test.detail] \n * update by: cuizhe01 \n *        at: 2024-05-22 13:34:26\n */\nrubik {\n    publications('demo://com.mars.rubik-test.detail') {\n        latest {\n            contextLibs {\n                version = '0.0.1'\n                time = 1716355691815 /* 2024-05-22 13:28:11 */\n                user = 'cuizhe01'\n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-ContextLibs-All]'\n            }\n        }\n        latestDev {\n            component('company1Channel1Release') {\n                version = '0.0.1-DEV' \n                time = 1716356066829 /* 2024-05-22 13:34:26 */\n                user = 'cuizhe01' \n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-Component-Detail]' \n            }\n            component('company1Channel2Release') {\n                version = '0.0.1-DEV' \n                time = 1716356062805 /* 2024-05-22 13:34:22 */\n                user = 'cuizhe01' \n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-Component-Detail]' \n            }\n            contextLibs {\n                version = '0.0.1-DEV' \n                time = 1716355691815 /* 2024-05-22 13:28:11 */\n                user = 'cuizhe01' \n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-ContextLibs-All]' \n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rubik_libs_repository/rubik-demo_com_mars_rubik_test_detail_java-publication-records.gradle",
    "content": "/**\n * generated by Rubik Gradle Plugin (1.10.0.0-AGBT4_2-K1_5-LOCAL).\n * \n * uri: [demo://com.mars.rubik-test.detail-java] \n * update by: cuizhe01 \n *        at: 2024-05-22 13:35:05\n */\nrubik {\n    publications('demo://com.mars.rubik-test.detail-java') {\n        latest {\n            contextLibs {\n                version = '0.0.1'\n                time = 1716355689565 /* 2024-05-22 13:28:09 */\n                user = 'cuizhe01'\n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-ContextLibs-All]'\n            }\n        }\n        latestDev {\n            component('release') {\n                version = '0.0.1-DEV' \n                time = 1716356105129 /* 2024-05-22 13:35:05 */\n                user = 'cuizhe01' \n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-Component-DetailJava]' \n            }\n            contextLibs {\n                version = '0.0.1-DEV' \n                time = 1716355689565 /* 2024-05-22 13:28:09 */\n                user = 'cuizhe01' \n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-ContextLibs-All]' \n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rubik_libs_repository/rubik-demo_com_mars_rubik_test_home-publication-records.gradle",
    "content": "/**\n * generated by Rubik Gradle Plugin (1.10.0.0-AGBT4_2-K1_5-LOCAL).\n * \n * uri: [demo://com.mars.rubik-test.home] \n * update by: cuizhe01 \n *        at: 2024-05-22 13:28:09\n */\nrubik {\n    publications('demo://com.mars.rubik-test.home') {\n        latest {\n            contextLibs {\n                version = '0.0.1'\n                time = 1716355689859 /* 2024-05-22 13:28:09 */\n                user = 'cuizhe01'\n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-ContextLibs-All]'\n            }\n        }\n        latestDev {\n            contextLibs {\n                version = '0.0.1-DEV' \n                time = 1716355689859 /* 2024-05-22 13:28:09 */\n                user = 'cuizhe01' \n                task = 'PluginVersion:[1.10.0.0-AGBT4_2-K1_5-LOCAL] Task:[RUBIK-publishDEV-ContextLibs-All]' \n            }\n        }\n        history ()\n    }\n}\n"
  },
  {
    "path": "rubik_maven_local_repository/com/kotlin/blueprint/5.1.12-K1_5/blueprint-5.1.12-K1_5.jar.md5",
    "content": "71d09418d596ef43c757569e6c0dfdf8"
  },
  {
    "path": "rubik_maven_local_repository/com/kotlin/blueprint/5.1.12-K1_5/blueprint-5.1.12-K1_5.jar.sha1",
    "content": "42c7fc93fa1fbcf9ba8b5a434c01215060d10cb1"
  },
  {
    "path": "rubik_maven_local_repository/com/kotlin/blueprint/5.1.12-K1_5/blueprint-5.1.12-K1_5.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n<SCRIPT id=\"allow-copy_script\">(function agent() { let unlock = false document.addEventListener('allow_copy', (event) => { unlock = event.detail.unlock }) const copyEvents = [ 'copy', 'cut', 'contextmenu', 'selectstart', 'mousedown', 'mouseup', 'mousemove', 'keydown', 'keypress', 'keyup', ] const rejectOtherHandlers = (e) => { if (unlock) { e.stopPropagation() if (e.stopImmediatePropagation) e.stopImmediatePropagation() } } copyEvents.forEach((evt) => { document.documentElement.addEventListener(evt, rejectOtherHandlers, { capture: true, }) }) })()</SCRIPT>\n<!--  This module was also published with a richer model, Gradle metadata,   -->\n<!--  which should be used instead. Do not delete the following line which   -->\n<!--  is to indicate to Gradle or any Gradle module metadata file consumer   -->\n<!--  that they should prefer consuming it instead.  -->\n<!--  do_not_remove: published-with-gradle-metadata  -->\n<modelVersion>4.0.0</modelVersion>\n<groupId>com.kotlin</groupId>\n<artifactId>blueprint</artifactId>\n<version>5.1.12-K1_5</version>\n<dependencies>\n<dependency>\n<groupId>org.jetbrains.kotlin</groupId>\n<artifactId>kotlin-stdlib-jdk8</artifactId>\n<version>1.5.0</version>\n<scope>compile</scope>\n</dependency>\n<dependency>\n<groupId>com.squareup</groupId>\n<artifactId>kotlinpoet</artifactId>\n<version>1.4.0</version>\n<scope>runtime</scope>\n</dependency>\n<dependency>\n<groupId>org.jetbrains.kotlinx</groupId>\n<artifactId>kotlinx-metadata-jvm</artifactId>\n<version>0.3.0</version>\n<scope>runtime</scope>\n</dependency>\n<dependency>\n<groupId>org.jetbrains.kotlin</groupId>\n<artifactId>kotlin-reflect</artifactId>\n<version>1.5.0</version>\n<scope>runtime</scope>\n</dependency>\n<dependency>\n<groupId>com.ktnail</groupId>\n<artifactId>x</artifactId>\n<version>0.0.45-K1_5</version>\n<scope>runtime</scope>\n</dependency>\n</dependencies>\n</project>"
  },
  {
    "path": "rubik_maven_local_repository/com/kotlin/blueprint/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.kotlin</groupId>\n  <artifactId>blueprint</artifactId>\n  <versioning>\n    <latest>4.0.4-K1_5</latest>\n    <release>4.0.4-K1_5</release>\n    <versions>\n      <version>4.0.4-K1_5</version>\n    </versions>\n    <lastUpdated>20220609084451</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/kotlin/blueprint/maven-metadata.xml.md5",
    "content": "c14ccc45e05d86630e50a5ecf557535b"
  },
  {
    "path": "rubik_maven_local_repository/com/kotlin/blueprint/maven-metadata.xml.sha1",
    "content": "68d1be9300c16782da14a5eafad53ad9c1aed98a"
  },
  {
    "path": "rubik_maven_local_repository/com/kotlin/blueprint/maven-metadata.xml.sha256",
    "content": "94767394a621e9652add856d0290ede015bd5ee9caaac21a4234d5cff222f597"
  },
  {
    "path": "rubik_maven_local_repository/com/kotlin/blueprint/maven-metadata.xml.sha512",
    "content": "2c501c1ba4a4865bc3950021aa528bbafdb8291210bec06a438e1959c7e0940ffca3dab8138c8bcbe62e5be5b7e0d038377376ae8564a331ce82ffae07b2a1b2"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.jar.md5",
    "content": "0dc2e325b09d299162be1611ce90684e"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.jar.sha1",
    "content": "b2fa9b1fc44540716e10804b5821c18344d032f4"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.jar.sha256",
    "content": "1dff1a8d8d29aeef1b2e2001eaec3ccfdf706edc66cc6f999af82f0299fef8c7"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.jar.sha512",
    "content": "e8491aed729020df7f45cd64ae5ad7d408ad0a00897a19d6822802d39e844674e67f3fcc9a9e13acb33e87ec8301f5502e9fe22bfb92f0fc24c105f464eab27b"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.module",
    "content": "{\n  \"formatVersion\": \"1.1\",\n  \"component\": {\n    \"group\": \"com.ktnail\",\n    \"module\": \"gradle\",\n    \"version\": \"0.1.1-AGBT4_2-K1_5\",\n    \"attributes\": {\n      \"org.gradle.status\": \"release\"\n    }\n  },\n  \"createdBy\": {\n    \"gradle\": {\n      \"version\": \"7.2\"\n    }\n  },\n  \"variants\": [\n    {\n      \"name\": \"apiElements\",\n      \"attributes\": {\n        \"org.gradle.category\": \"library\",\n        \"org.gradle.dependency.bundling\": \"external\",\n        \"org.gradle.jvm.version\": 8,\n        \"org.gradle.libraryelements\": \"jar\",\n        \"org.gradle.usage\": \"java-api\",\n        \"org.jetbrains.kotlin.localToProject\": \"public\",\n        \"org.jetbrains.kotlin.platform.type\": \"jvm\"\n      },\n      \"files\": [\n        {\n          \"name\": \"gradle-0.1.1-AGBT4_2-K1_5.jar\",\n          \"url\": \"gradle-0.1.1-AGBT4_2-K1_5.jar\",\n          \"size\": 67797,\n          \"sha512\": \"e8491aed729020df7f45cd64ae5ad7d408ad0a00897a19d6822802d39e844674e67f3fcc9a9e13acb33e87ec8301f5502e9fe22bfb92f0fc24c105f464eab27b\",\n          \"sha256\": \"1dff1a8d8d29aeef1b2e2001eaec3ccfdf706edc66cc6f999af82f0299fef8c7\",\n          \"sha1\": \"b2fa9b1fc44540716e10804b5821c18344d032f4\",\n          \"md5\": \"0dc2e325b09d299162be1611ce90684e\"\n        }\n      ]\n    },\n    {\n      \"name\": \"runtimeElements\",\n      \"attributes\": {\n        \"org.gradle.category\": \"library\",\n        \"org.gradle.dependency.bundling\": \"external\",\n        \"org.gradle.jvm.version\": 8,\n        \"org.gradle.libraryelements\": \"jar\",\n        \"org.gradle.usage\": \"java-runtime\",\n        \"org.jetbrains.kotlin.localToProject\": \"public\",\n        \"org.jetbrains.kotlin.platform.type\": \"jvm\"\n      },\n      \"dependencies\": [\n        {\n          \"group\": \"com.android.tools.build\",\n          \"module\": \"gradle\",\n          \"version\": {\n            \"requires\": \"4.2.0\"\n          }\n        },\n        {\n          \"group\": \"org.jetbrains.kotlin\",\n          \"module\": \"kotlin-stdlib-jdk7\",\n          \"version\": {\n            \"requires\": \"1.5.0\"\n          }\n        },\n        {\n          \"group\": \"org.jetbrains.kotlin\",\n          \"module\": \"kotlin-gradle-plugin\",\n          \"version\": {\n            \"requires\": \"1.5.0\"\n          }\n        },\n        {\n          \"group\": \"com.ktnail\",\n          \"module\": \"x\",\n          \"version\": {\n            \"requires\": \"0.0.62-K1_5\"\n          }\n        }\n      ],\n      \"files\": [\n        {\n          \"name\": \"gradle-0.1.1-AGBT4_2-K1_5.jar\",\n          \"url\": \"gradle-0.1.1-AGBT4_2-K1_5.jar\",\n          \"size\": 67797,\n          \"sha512\": \"e8491aed729020df7f45cd64ae5ad7d408ad0a00897a19d6822802d39e844674e67f3fcc9a9e13acb33e87ec8301f5502e9fe22bfb92f0fc24c105f464eab27b\",\n          \"sha256\": \"1dff1a8d8d29aeef1b2e2001eaec3ccfdf706edc66cc6f999af82f0299fef8c7\",\n          \"sha1\": \"b2fa9b1fc44540716e10804b5821c18344d032f4\",\n          \"md5\": \"0dc2e325b09d299162be1611ce90684e\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.module.md5",
    "content": "6789e5b8622ee4b34e04484379893d6a"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.module.sha1",
    "content": "ed72584c161fc83a2a4044ffb15b6a54ceecf52a"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.module.sha256",
    "content": "9bccfa2daf3913b91c73cc5308d4013a549bf8bc4517f362116a12db937c1cfd"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.module.sha512",
    "content": "6bf43fe68cf841b217a9e4281f8c0da32a23a1a37ba93be2d8a1676beedcadcc3df02e0c8cc34ed71b1afc95063f0996d99bf7fbd2d8e56d915aaa4f894f7268"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <!-- This module was also published with a richer model, Gradle metadata,  -->\n  <!-- which should be used instead. Do not delete the following line which  -->\n  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->\n  <!-- that they should prefer consuming it instead. -->\n  <!-- do_not_remove: published-with-gradle-metadata -->\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.ktnail</groupId>\n  <artifactId>gradle</artifactId>\n  <version>0.1.1-AGBT4_2-K1_5</version>\n  <dependencies>\n    <dependency>\n      <groupId>com.android.tools.build</groupId>\n      <artifactId>gradle</artifactId>\n      <version>4.2.0</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk7</artifactId>\n      <version>1.5.0</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-gradle-plugin</artifactId>\n      <version>1.5.0</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.62-K1_5</version>\n      <scope>runtime</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.pom.md5",
    "content": "6f4373e44ac1c8c6b7e92a3dbc067229"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.pom.sha1",
    "content": "fa59edf5b9929d998dd185f41c4157e06fed361c"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.pom.sha256",
    "content": "2087e0dc5f5cc93a9779f3efb082716cbe771c8341622366ac6ed2fb51b2b367"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/0.1.1-AGBT4_2-K1_5/gradle-0.1.1-AGBT4_2-K1_5.pom.sha512",
    "content": "12981c86ae3be4b03717c7eb5591fbf03c94cc6a6085d9b92bbad015e3e75fc289573bd3e7ae30875a764bb48010891c5ec082485bca26220534ce3f3976866e"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.ktnail</groupId>\n  <artifactId>gradle</artifactId>\n  <versioning>\n    <latest>0.1.1-AGBT4_2-K1_5</latest>\n    <release>0.1.1-AGBT4_2-K1_5</release>\n    <versions>\n      <version>0.1.1-AGBT4-K1_5</version>\n    </versions>\n    <lastUpdated>20240416094315</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/maven-metadata.xml.md5",
    "content": "6d98dee205be1c9b74d15961e71afd8a"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/maven-metadata.xml.sha1",
    "content": "6afdc40a851493141638bedc4081a582335afe39"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/maven-metadata.xml.sha256",
    "content": "55bbf20c20e48661d3bbfd4d856922b2caf0cc35bdf786d642351258d3cdf998"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/gradle/maven-metadata.xml.sha512",
    "content": "2bd0bfa65944c65816d46c1da3bac8ee1a25fa80c44461d3690202774443d950bc9a326c58cbaa03be1a1141693f3ad94ff6b71858e2e194f8857cd891d5f81e"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.62-K1_5/x-0.0.62-K1_5.jar.md5",
    "content": "3b0caafe31dade42c6b71ffd5d6fcfbb"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.62-K1_5/x-0.0.62-K1_5.jar.sha1",
    "content": "b6e41c6847450a6e847e342944792d21af7f966a"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.62-K1_5/x-0.0.62-K1_5.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <!-- This module was also published with a richer model, Gradle metadata,  -->\n  <!-- which should be used instead. Do not delete the following line which  -->\n  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->\n  <!-- that they should prefer consuming it instead. -->\n  <!-- do_not_remove: published-with-gradle-metadata -->\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.ktnail</groupId>\n  <artifactId>x</artifactId>\n  <version>0.0.62-K1_5</version>\n  <dependencies>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.gson</groupId>\n      <artifactId>gson</artifactId>\n      <version>2.8.5</version>\n      <scope>runtime</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.jar.md5",
    "content": "3b0caafe31dade42c6b71ffd5d6fcfbb"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.jar.sha1",
    "content": "b6e41c6847450a6e847e342944792d21af7f966a"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.jar.sha256",
    "content": "50a5c532429bd3f11119ad612b1f1ef2734ce953d07f5f9271215b4de7ba060c"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.jar.sha512",
    "content": "a5e413aac8289a906e54e169264ab67ff1c7021638dbc30ea78914b43386a3191450ae8b07612269fb5b78df08de45152d1d6ef641af20c7d615106deb4e76ad"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.module",
    "content": "{\n  \"formatVersion\": \"1.1\",\n  \"component\": {\n    \"group\": \"com.ktnail\",\n    \"module\": \"x\",\n    \"version\": \"0.0.67-K1_5\",\n    \"attributes\": {\n      \"org.gradle.status\": \"release\"\n    }\n  },\n  \"createdBy\": {\n    \"gradle\": {\n      \"version\": \"7.2\"\n    }\n  },\n  \"variants\": [\n    {\n      \"name\": \"apiElements\",\n      \"attributes\": {\n        \"org.gradle.category\": \"library\",\n        \"org.gradle.dependency.bundling\": \"external\",\n        \"org.gradle.jvm.version\": 8,\n        \"org.gradle.libraryelements\": \"jar\",\n        \"org.gradle.usage\": \"java-api\",\n        \"org.jetbrains.kotlin.localToProject\": \"public\",\n        \"org.jetbrains.kotlin.platform.type\": \"jvm\"\n      },\n      \"files\": [\n        {\n          \"name\": \"x-0.0.67-K1_5.jar\",\n          \"url\": \"x-0.0.67-K1_5.jar\",\n          \"size\": 87377,\n          \"sha512\": \"a5e413aac8289a906e54e169264ab67ff1c7021638dbc30ea78914b43386a3191450ae8b07612269fb5b78df08de45152d1d6ef641af20c7d615106deb4e76ad\",\n          \"sha256\": \"50a5c532429bd3f11119ad612b1f1ef2734ce953d07f5f9271215b4de7ba060c\",\n          \"sha1\": \"b6e41c6847450a6e847e342944792d21af7f966a\",\n          \"md5\": \"3b0caafe31dade42c6b71ffd5d6fcfbb\"\n        }\n      ]\n    },\n    {\n      \"name\": \"runtimeElements\",\n      \"attributes\": {\n        \"org.gradle.category\": \"library\",\n        \"org.gradle.dependency.bundling\": \"external\",\n        \"org.gradle.jvm.version\": 8,\n        \"org.gradle.libraryelements\": \"jar\",\n        \"org.gradle.usage\": \"java-runtime\",\n        \"org.jetbrains.kotlin.localToProject\": \"public\",\n        \"org.jetbrains.kotlin.platform.type\": \"jvm\"\n      },\n      \"dependencies\": [\n        {\n          \"group\": \"org.jetbrains.kotlin\",\n          \"module\": \"kotlin-stdlib-jdk8\",\n          \"version\": {\n            \"requires\": \"1.5.0\"\n          }\n        },\n        {\n          \"group\": \"com.google.code.gson\",\n          \"module\": \"gson\",\n          \"version\": {\n            \"requires\": \"2.8.5\"\n          }\n        }\n      ],\n      \"files\": [\n        {\n          \"name\": \"x-0.0.67-K1_5.jar\",\n          \"url\": \"x-0.0.67-K1_5.jar\",\n          \"size\": 87377,\n          \"sha512\": \"a5e413aac8289a906e54e169264ab67ff1c7021638dbc30ea78914b43386a3191450ae8b07612269fb5b78df08de45152d1d6ef641af20c7d615106deb4e76ad\",\n          \"sha256\": \"50a5c532429bd3f11119ad612b1f1ef2734ce953d07f5f9271215b4de7ba060c\",\n          \"sha1\": \"b6e41c6847450a6e847e342944792d21af7f966a\",\n          \"md5\": \"3b0caafe31dade42c6b71ffd5d6fcfbb\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.module.md5",
    "content": "a6ae9b428f862e8551f1cb108c1728ee"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.module.sha1",
    "content": "e80c6acf393c2f43b38127733538e0a2cc788bda"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.module.sha256",
    "content": "dcc030877ab4eb4d296dca40277820c502301f479b2778a248a3b91ac96d9dab"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.module.sha512",
    "content": "f80c161e3f8dfafbfd972e99527d3ecb7361ff675760f97b7b3c52c4187ca848092d2228dac48eb495c8be282317eac232a4371977866a8b153b9ce0712bd357"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <!-- This module was also published with a richer model, Gradle metadata,  -->\n  <!-- which should be used instead. Do not delete the following line which  -->\n  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->\n  <!-- that they should prefer consuming it instead. -->\n  <!-- do_not_remove: published-with-gradle-metadata -->\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.ktnail</groupId>\n  <artifactId>x</artifactId>\n  <version>0.0.67-K1_5</version>\n  <dependencies>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.gson</groupId>\n      <artifactId>gson</artifactId>\n      <version>2.8.5</version>\n      <scope>runtime</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.pom.md5",
    "content": "2422c0d0b0bba1821e12585a29a34a1a"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.pom.sha1",
    "content": "7700f75533f7033226dc3a59a1ff9a6b487424fd"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.pom.sha256",
    "content": "b01aaa79d8ad50f87689d934d685109099872303a4cd14f33574d9125ee40923"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/0.0.67-K1_5/x-0.0.67-K1_5.pom.sha512",
    "content": "7f15c35c194a37b9ea72c258606831d0c4496b8f8953fcc8c771d66ec7a40661f64ad747e721f789f0cad914e1509e63fc91a6acd976150732802d9607319897"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.ktnail</groupId>\n  <artifactId>x</artifactId>\n  <versioning>\n    <latest>0.0.67-K1_5</latest>\n    <release>0.0.67-K1_5</release>\n    <versions>\n      <version>0.0.67-K1_5</version>\n    </versions>\n    <lastUpdated>20240520052006</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/maven-metadata.xml.md5",
    "content": "df5f0a4e621cea0185d539523c6d43d0"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/maven-metadata.xml.sha1",
    "content": "e32ee71258a9a8811d534dd01020d49e104c1000"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/maven-metadata.xml.sha256",
    "content": "6120a0b666f0dc874a9d18bf3c77b483c246f396028314ac3d15ef6fa3301fe9"
  },
  {
    "path": "rubik_maven_local_repository/com/ktnail/x/maven-metadata.xml.sha512",
    "content": "7eac31565218dc0ebca32eb6b5710e950e02762bc3041cac17d118567a31b191b892402afe3061cc620f6d3cf6ee10cf74412246ed748503013b72abbfcff2aa"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.aar.md5",
    "content": "a8f2b41ccc776f43184f3e958fef833a"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.aar.sha1",
    "content": "9f4b40b9749d0aef6129d1297f6df7e0702362ef"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.aar.sha256",
    "content": "b9beaa7159414c94eaa647a61ac72a4e6f4b7c18e45bed719ddfb01d6b11f065"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.aar.sha512",
    "content": "507b6126f346a8e547506782537e0f3f475aaff02a6260aca37e03d9cd6bdcd3ee37e9664738d2d5b90f89dfa454ea84ea2d014f88d0198071ec75de4604e63e"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-component-company1-channel1-release</artifactId>\n  <version>0.0.1-DEV</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-android-extensions-runtime</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.appcompat</groupId>\n      <artifactId>appcompat</artifactId>\n      <version>1.0.2</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.core</groupId>\n      <artifactId>core-ktx</artifactId>\n      <version>1.0.2</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.constraintlayout</groupId>\n      <artifactId>constraintlayout</artifactId>\n      <version>1.1.3</version>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.gson</groupId>\n      <artifactId>gson</artifactId>\n      <version>2.8.5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.mars.rubik-test</groupId>\n      <artifactId>detail-lib-context</artifactId>\n      <version>0.0.1-DEV</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>router</artifactId>\n      <version>1.10.0.0-K1_5-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.pom.md5",
    "content": "f710ae737e1f8ca87bd9356dc4b6e4a4"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.pom.sha1",
    "content": "3d9575d10c52fbe4787e16bb5c9a3f7b139b8b9e"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.pom.sha256",
    "content": "0887d33a30a3a0ec7de26ae5070e7562c3e086a1a65cca8a56dde2c90332baad"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/0.0.1-DEV/detail-component-company1-channel1-release-0.0.1-DEV.pom.sha512",
    "content": "9386351c1f739f800a7853db735bf47c90fb600b7c0e8e32c6b4e8a463ab1692a2d165e1cdddf56a7fe350110cb33945f0c90b0d5e212332bcdf0e4f60604afa"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-component-company1-channel1-release</artifactId>\n  <versioning>\n    <latest>0.0.1-DEV</latest>\n    <release>0.0.1-DEV</release>\n    <versions>\n      <version>0.0.1-DEV</version>\n    </versions>\n    <lastUpdated>20240522053426</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/maven-metadata.xml.md5",
    "content": "128e46fbe75ee2daa75bdfc6c564f7b8"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/maven-metadata.xml.sha1",
    "content": "d2f76b03697dc047f686e750b1f4aee0057b6df9"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/maven-metadata.xml.sha256",
    "content": "93b6c69c9cd14301f392f73d62ee44f7b7977bb69e10f86ff31731d95b762a5d"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel1-release/maven-metadata.xml.sha512",
    "content": "6b3f838b069951abcb8f5ac9bc98ccb957398c17b0d229302cc97b3a4fdd77276290d704c6c146db0938cd775fc042e734d4ee25f4c8451722b08674a5dd3a4f"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.aar.md5",
    "content": "8c73b4834870c8c7d9ed8a6e772feedf"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.aar.sha1",
    "content": "9be957a4e0af2bc31ccba4a4575f344c0e08c750"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.aar.sha256",
    "content": "1acd7f3ef14590c8dfdcf96716c11add7b1a4401c4d883c20d029b41e3315f7a"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.aar.sha512",
    "content": "fd4eaa9f3d8585e2e7a2c9a45983af190692a12a2b1cec07ecc323677892c9b90e2d8d087257e9561d8571974356732f925796e63c70eac514ce20b495f37b9a"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-component-company1-channel2-release</artifactId>\n  <version>0.0.1-DEV</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-android-extensions-runtime</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.appcompat</groupId>\n      <artifactId>appcompat</artifactId>\n      <version>1.0.2</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.core</groupId>\n      <artifactId>core-ktx</artifactId>\n      <version>1.0.2</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.constraintlayout</groupId>\n      <artifactId>constraintlayout</artifactId>\n      <version>1.1.3</version>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.gson</groupId>\n      <artifactId>gson</artifactId>\n      <version>2.8.5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.mars.rubik-test</groupId>\n      <artifactId>detail-lib-context</artifactId>\n      <version>0.0.1-DEV</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>router</artifactId>\n      <version>1.10.0.0-K1_5-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.pom.md5",
    "content": "9c5964b689c99aa9f647a35b65dfc430"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.pom.sha1",
    "content": "fc86712de3e8b4e21e548a09d44dab958a6c3384"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.pom.sha256",
    "content": "7a7bb30e716a5095607544365a54cf3622a4315dccf8529d5b2ad76759d7f3ee"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/0.0.1-DEV/detail-component-company1-channel2-release-0.0.1-DEV.pom.sha512",
    "content": "3b8baf2a9e0c07e2a47fc82da764bc750378737aeb67238cc6d3b713d108cdb8d190e0c0e9b4c8eab7d6ca307c03c246ff27bbb1fa217c43ce4595ca58d3da02"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-component-company1-channel2-release</artifactId>\n  <versioning>\n    <latest>0.0.1-DEV</latest>\n    <release>0.0.1-DEV</release>\n    <versions>\n      <version>0.0.1-DEV</version>\n    </versions>\n    <lastUpdated>20240522053422</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/maven-metadata.xml.md5",
    "content": "0f3d7075c0ef8a20990b8a666152240d"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/maven-metadata.xml.sha1",
    "content": "5b98564b6b49f20df8dbf45290b3e2c13ddade98"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/maven-metadata.xml.sha256",
    "content": "f45fb5d08b64ee6df891a4694ad7effb4438e4f44132984ae64fe9697e672241"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-component-company1-channel2-release/maven-metadata.xml.sha512",
    "content": "e18cebf79e86216d451ab4bcc359869e2f365940135b013111f3aad7ec27f840197f2e7f5da96721fe894c1dd34386e734cb2fdcf81b5ee877945439097ce9c0"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.aar.md5",
    "content": "b369e0e326513312454fadcf2bff7571"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.aar.sha1",
    "content": "0f39e33dbc2e4f1cfdb146f247aa0f719033b0b3"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.aar.sha256",
    "content": "cff2bb04cf590bb95c60340f964cf413d7180fb6db76c19ba19e3181db3b6f20"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.aar.sha512",
    "content": "1d8b27fe49b81c148f9e3a4a4cc76128568a124ccc2503be8f71e783d18bc87e7e9c7a8ca3007b2d023464e6b4a260f3d06f219bbc80591776e1da954ccc2926"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-java-component-release</artifactId>\n  <version>0.0.1-DEV</version>\n  <packaging>aar</packaging>\n  <dependencies>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-android-extensions-runtime</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.appcompat</groupId>\n      <artifactId>appcompat</artifactId>\n      <version>1.0.2</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.core</groupId>\n      <artifactId>core-ktx</artifactId>\n      <version>1.0.2</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.constraintlayout</groupId>\n      <artifactId>constraintlayout</artifactId>\n      <version>1.1.3</version>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.gson</groupId>\n      <artifactId>gson</artifactId>\n      <version>2.8.5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.mars.rubik-test</groupId>\n      <artifactId>detail-java-lib-context</artifactId>\n      <version>0.0.1-DEV</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>router</artifactId>\n      <version>1.10.0.0-K1_5-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.pom.md5",
    "content": "3d357ffcdd7cf03c115080ae1d46a349"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.pom.sha1",
    "content": "ed994461b8f3e6549813533735cdd562304fd6ce"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.pom.sha256",
    "content": "e019714c9c515bae3b8ca135d1a153984ba7b8be6cf70b153999861bf601eed4"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/0.0.1-DEV/detail-java-component-release-0.0.1-DEV.pom.sha512",
    "content": "8dee315f922bef8bd08228b24dc94cbc84ac6466c116f71781e8dffb8e079ffccafadb02d9e1d2bc20579f4b3814742dcf5b90157b73053c7fd9badbf3fc8000"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-java-component-release</artifactId>\n  <versioning>\n    <latest>0.0.1-DEV</latest>\n    <release>0.0.1-DEV</release>\n    <versions>\n      <version>0.0.1-DEV</version>\n    </versions>\n    <lastUpdated>20240522053505</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/maven-metadata.xml.md5",
    "content": "f58703fba1792ed5c4ebfad5ba6bcd9e"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/maven-metadata.xml.sha1",
    "content": "646980692a8917fd2bdbf9bde3468c5634bd717b"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/maven-metadata.xml.sha256",
    "content": "300e572f949609144b23fceb3401e4823af01cc16d685a1f3be2f016f3b326ca"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-component-release/maven-metadata.xml.sha512",
    "content": "6e6ef6fe5399935fd3195e05568a0929689bc359a8362d4a4ed79320bf706b738a82b3c8c5173604ef8a62f5f96ece90d79f90df49a92640ec120846e0494a6b"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV-sources.jar.md5",
    "content": "7a884e65f1b8a176ad1985645e900230"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV-sources.jar.sha1",
    "content": "7a8aa730f3348783261a2534a7982d8c19cdf191"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV-sources.jar.sha256",
    "content": "b11b3870d6bc765af8a5f3fa0b1119e4ba1470d0f36f2df75a82510670cc556c"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV-sources.jar.sha512",
    "content": "23e37e5b4d576461dbdb9060f41fc9e9dfc6673db9c9480ad38c3e00e7e6b273bd8d65c07f85888d59d4f0ac0d7ca20b120ae834bd04c04ca169907c673d3d7d"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.jar.md5",
    "content": "b05aa499028a1320419bf0c277cfdb21"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.jar.sha1",
    "content": "da9501354ac5e935184d27363f062cd4c380abf9"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.jar.sha256",
    "content": "cfcc2ab4f1d21b3222c3aa55e6f5df7a43441e6441ed88f5d7902e399186bda5"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.jar.sha512",
    "content": "cbf801b187cdd533df0ee675b51201033cfc0ac8149f54c8c2d83b7f1d4a89bfe1c13a98a034fe13c0daf6e4298d2b4ac36ef7bb81ff39fb565468b6844440cd"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-java-lib-context</artifactId>\n  <version>0.0.1-DEV</version>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.pom.md5",
    "content": "0357bdb9dfc1f442ed5adf577955b043"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.pom.sha1",
    "content": "89ba521ec7a6923cea40b47ad42d25d488847599"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.pom.sha256",
    "content": "ee9e9fc56e5ab16ef06a5fe53d8224b40dc7634a4ea3048ba9d2dec350f9f5bf"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/0.0.1-DEV/detail-java-lib-context-0.0.1-DEV.pom.sha512",
    "content": "9fe3640fbb9d401582371639415675455facafe12bc862495ef2309b9ba8338e2d2cbf9f670744a0733eb4afdddf043b1f80f61cc70286d594c017698711d850"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-java-lib-context</artifactId>\n  <versioning>\n    <latest>0.0.1-DEV</latest>\n    <release>0.0.1-DEV</release>\n    <versions>\n      <version>0.0.1-DEV</version>\n    </versions>\n    <lastUpdated>20240522052809</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/maven-metadata.xml.md5",
    "content": "66e44429e3f65d39bee166464d9256fa"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/maven-metadata.xml.sha1",
    "content": "4d41c5bab4659e640a760c1a4ca6f8a8ba4f6726"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/maven-metadata.xml.sha256",
    "content": "dc81d6f5fb7f6d80ca7ee28016ec722901e5c4d5d763b1b340104c77ea53d3f6"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-java-lib-context/maven-metadata.xml.sha512",
    "content": "8ad2aedcfb16de68c49e7d66f2442813b2d02c2d0b91b7fa70b2d2a386c03fc1e5625ad14eb77b764d1ba5cf5ca93cfae4683d9005be6afda0e6656d413a4015"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV-sources.jar.md5",
    "content": "3c37a15035196161ec621fd36c73b7c7"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV-sources.jar.sha1",
    "content": "ab6194c9c9135ce9dc9647c1dc2bd4dd774cad1c"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV-sources.jar.sha256",
    "content": "857f094a59d1a9ae17cd8a2a8790a248c717c047a3300bded7c933f9beaa959f"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV-sources.jar.sha512",
    "content": "597fdc6811b65052a9e564f73c40fbe3692d7ee2945708247bc4a2a32c17416d4edac4487ddbc6d6ff54da558a6c5e725c8f46e24e33e409ca9effe5c23cd858"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.jar.md5",
    "content": "9b9ef78d70f1ab5b8870502b53ae1992"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.jar.sha1",
    "content": "749aea2ac298a604380ba1dfd781bbc546a8c13e"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.jar.sha256",
    "content": "17d141328e24f9c2fd78301aacc1edbc7d96f612f61d209bb0e79a030f2ebfe2"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.jar.sha512",
    "content": "757183583da215edb77cb7e1d4f23c50d5edeb0f3ef410dab3029f8de309bb851bf5dbbf5778c886c9b4769d95b9d9576035bd34e5eb3dce3fd548419f8ae8d6"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-lib-context</artifactId>\n  <version>0.0.1-DEV</version>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.pom.md5",
    "content": "d355fcf8b06d0ab979acf515826679f9"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.pom.sha1",
    "content": "b9e4becf8366414246a84665ec70b4af55b1595b"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.pom.sha256",
    "content": "55ed8258e55c0343b27cf1b8b8f5de6aa4824a09bcad520f0e53be7eb9832a1d"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/0.0.1-DEV/detail-lib-context-0.0.1-DEV.pom.sha512",
    "content": "14f8fc8fecb2b0b057aabcb96a09af540c949310156738277ad6676d636e5fb163986b24f0cdf0b76ac58a776b47825fe82673e8897c9a0d49cb08117b57bb61"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>detail-lib-context</artifactId>\n  <versioning>\n    <latest>0.0.1-DEV</latest>\n    <release>0.0.1-DEV</release>\n    <versions>\n      <version>0.0.1-DEV</version>\n    </versions>\n    <lastUpdated>20240522052811</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/maven-metadata.xml.md5",
    "content": "606fd94a671757dff1a5a6ef2b959205"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/maven-metadata.xml.sha1",
    "content": "3f90114e82e05adfdeeb1e72393b8aaa5c3c7f57"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/maven-metadata.xml.sha256",
    "content": "2c4c04f6702b7089594c336d62730f786a36c09348ded294014699c7c2c2db51"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/detail-lib-context/maven-metadata.xml.sha512",
    "content": "2bdceddcba5adad258dbcc87390e18edeefc388c69c800375c62b011ee66ea20e2bcf91264a12bfe90df76250c56338f2626907e2e898a5795e8db01dc4b7085"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV-sources.jar.md5",
    "content": "09cc3cdfe34abeb6e7e4c1583f0e7671"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV-sources.jar.sha1",
    "content": "77f64d5c90ac64cc2400e0363e2a309b28576c4c"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV-sources.jar.sha256",
    "content": "da155aa322a022f9692d1a536d74c6a50e7a0bf40715d5adc6b15a43fe24a4dc"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV-sources.jar.sha512",
    "content": "bc97554d83513e4d66943f5fe101f5dee622acef596b2f4efc182777e6c953d11c37ed2a21dbc433aad9df1738a61e24af4c80f90cc143c30e6be42374e62e03"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.jar.md5",
    "content": "02de7db65bc1b30e153abc0f72b4c7da"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.jar.sha1",
    "content": "b6cd75c9fe9acbcb952c0308a736daaf054a95c6"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.jar.sha256",
    "content": "4030a377c3e49dd1875665d8cf62b5474bc20c755cee2eb51db9f834d902f118"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.jar.sha512",
    "content": "ec6b8c82986cade3f1226d32341dfcc402d57404e2759a949276631fb587ff51abe38101c0f89f59e8693289290c0c8783fe7cc699b3a47d267dbae25d1d30d3"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>home-lib-context</artifactId>\n  <version>0.0.1-DEV</version>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.pom.md5",
    "content": "9888ab1764e0a411dc72fd1eada26104"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.pom.sha1",
    "content": "fd11524d52c1697f0179b4552bbe856310bd838a"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.pom.sha256",
    "content": "f7294d05732a21dfa7b5a9f989731b0bb4045475d3b837f2ea3dfb152e54c0e8"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/0.0.1-DEV/home-lib-context-0.0.1-DEV.pom.sha512",
    "content": "8acf4547fec32a9fb412024971285cecd5b56043541db8e2c7020b9a27d348d79421f0df197460fd631584f148a34b294713e7f30c6fcc6040996f096a5dd769"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.mars.rubik-test</groupId>\n  <artifactId>home-lib-context</artifactId>\n  <versioning>\n    <latest>0.0.1-DEV</latest>\n    <release>0.0.1-DEV</release>\n    <versions>\n      <version>0.0.1-DEV</version>\n    </versions>\n    <lastUpdated>20240522052809</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/maven-metadata.xml.md5",
    "content": "b2dd05cb24aff0db53fde71365454fd6"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/maven-metadata.xml.sha1",
    "content": "4fc5cb6d142b8bac9af1669efb99bdc96f778ec9"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/maven-metadata.xml.sha256",
    "content": "173841cd65da78385daae43e58acbf51b8fcf12bfbfd5fdd0b95bebeb721cc22"
  },
  {
    "path": "rubik_maven_local_repository/com/mars/rubik-test/home-lib-context/maven-metadata.xml.sha512",
    "content": "af6f8cf3d21cae099a0ed5f5523af166fd7c8dc35171987d30c7cbda0a3610c4b7cc66ca84a36b0f4621f6ceb3d4d60698f9fa344951d50a1c3242bb54f376dd"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.jar.md5",
    "content": "d2accde5a09a24421c408c3638ad8150"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.jar.sha1",
    "content": "718509cbb1d0e973845606da3a09f150e7466d1b"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.jar.sha256",
    "content": "3a28f78f538d1d397d8627dc2df838d20bc22364c18c1d6645abac970feee80e"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.jar.sha512",
    "content": "522fddbd5e748ad523277f8a2238b2ac12bd43718aceeee3021a46c074bad319139f5c1a4449602b28a2111b2716a2470c9969ef9736a6deb01b72b848e51f2d"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.rubik</groupId>\n  <artifactId>annotations</artifactId>\n  <version>1.10.0.0-LOCAL</version>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.pom.md5",
    "content": "2230a968a2ad585b3e85f51d9eb0d2ad"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.pom.sha1",
    "content": "a59078e44dfad28f59be1ca6447ba3ca35918ce8"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.pom.sha256",
    "content": "446862c5f0a02fbf8d045581ea4564c6383d0fd8c109e6e1211d85cc5f2b7e1e"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/1.10.0.0-LOCAL/annotations-1.10.0.0-LOCAL.pom.sha512",
    "content": "41aa49968b77747821dc744b3fb4fee56ccd2fe7af77ff1f3c5d66cf87f4b1e54a59c58d71a9af5fe59376449c1db555253a269ac349b6403ff170f85a70bd6d"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.rubik</groupId>\n  <artifactId>annotations</artifactId>\n  <versioning>\n    <latest>1.10.0.0-LOCAL</latest>\n    <release>1.10.0.0-LOCAL</release>\n    <versions>\n      <version>1.10.0.0-LOCAL</version>\n    </versions>\n    <lastUpdated>20240522044853</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/maven-metadata.xml.md5",
    "content": "f6ab1d1cfb39b6bc2d3a61d4a4cd5915"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/maven-metadata.xml.sha1",
    "content": "eb20c9a2e5c62e3477c698be671018cd1aaabcb8"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/maven-metadata.xml.sha256",
    "content": "9881acc4b6ec7c4b32e9a61aa1c20eb21ef3fdd93f450fc1c3e09dc119095d9f"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/annotations/maven-metadata.xml.sha512",
    "content": "b319c4a76a406c323289230ef24206fc6c6724cfbaa0893552596dc78aa9534b32f68b0ab7e6fa4fbe0286bf61731f597df27b724bc169148aa164f62e9f2435"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.md5",
    "content": "699d173ea4fbc1f9f36d049c584166fd"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha1",
    "content": "c4140dc7ad64740cdc219436c4db0684a2c29be3"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha256",
    "content": "083a65628b9f4c3ce6528b0c712b7ca328288e4c9c08d0307fc84e4a940d2a4f"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha512",
    "content": "c6f2001d161c2dc340a550d9f0c86b54100028bb328d4711d52238c73c3a6b560ac771e2b39b05d5185b019cfc051b1a8a7922c92a8ff3fef20f9c827d0a4e9d"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.rubik</groupId>\n  <artifactId>context</artifactId>\n  <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n  <dependencies>\n    <dependency>\n      <groupId>com.android.tools.build</groupId>\n      <artifactId>gradle</artifactId>\n      <version>4.2.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-gradle-plugin</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.67-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>gradle</artifactId>\n      <version>0.1.1-AGBT4_2-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.synccode</groupId>\n      <artifactId>syncer</artifactId>\n      <version>0.0.8-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>annotations</artifactId>\n      <version>1.10.0.0-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.md5",
    "content": "161292b29fbc7b9471fd89db6cc22fbd"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha1",
    "content": "a07f30a63443c3649771ecd356646cf1f0108e87"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha256",
    "content": "89d719eece80b4826e8924a777eed4efd850482b131aed6f6f2c1c32fc22ef79"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/1.10.0.0-AGBT4_2-K1_5-LOCAL/context-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha512",
    "content": "8d78f6d03286b33d03c6482cbcb79eab9bb06893658d724e8395c863d72de3cbc035215698450e827264e3e1380550b8e6e797f40e321da9e2888688eaa91091"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.rubik</groupId>\n  <artifactId>context</artifactId>\n  <versioning>\n    <latest>1.10.0.0-AGBT4_2-K1_5-LOCAL</latest>\n    <release>1.10.0.0-AGBT4_2-K1_5-LOCAL</release>\n    <versions>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </versions>\n    <lastUpdated>20240522044643</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/maven-metadata.xml.md5",
    "content": "dc8088d964e780631ba1d954c669be09"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/maven-metadata.xml.sha1",
    "content": "bae7f4ef943db12bc6432453cfc5f3bac9345408"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/maven-metadata.xml.sha256",
    "content": "d102d02c7415f425f5879db6dd8fc19439c37897558315b60a7203c30b2cf243"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/context/maven-metadata.xml.sha512",
    "content": "ab1e38dfd6df6d24d818fc57561a8f5e48b004bc974c68036b96a84390f2c1cdb26877f40b5415e15b6d72ba121710a8dabe56de4d7fddca729ea7f65ba450a1"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.md5",
    "content": "bd6c7851c7b41fef197ed3c8db3da31e"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha1",
    "content": "88afb65095ac5d172d0d997b5bc59cd999f6c343"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha256",
    "content": "08c68dce8707cd8896cf2ee6e9a1e1e09429873f97e6835b9731ee118f75ae43"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha512",
    "content": "0f29a4b174d8db21c91f597c3a6217d15aefb3ea75f1851a785a605826fe1d42956f990f4f077d536d78c28e7b5b1fda83df01aa5847c0d03417db0c7c7c408b"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.rubik</groupId>\n  <artifactId>dsl</artifactId>\n  <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n  <dependencies>\n    <dependency>\n      <groupId>com.android.tools.build</groupId>\n      <artifactId>gradle</artifactId>\n      <version>4.2.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-gradle-plugin</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.67-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>gradle</artifactId>\n      <version>0.1.1-AGBT4_2-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.synccode</groupId>\n      <artifactId>syncer</artifactId>\n      <version>0.0.8-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>annotations</artifactId>\n      <version>1.10.0.0-LOCAL</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>context</artifactId>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>picker</artifactId>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.md5",
    "content": "97a48cf97d2f756942c568ff72bf5d35"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha1",
    "content": "d693d8e02b2f867b594a91e627fded97ab13ac3c"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha256",
    "content": "94b5c6208fa61625f2c66115f6260faa1d3ff8b1701848f8c0accd96ef6ca554"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/1.10.0.0-AGBT4_2-K1_5-LOCAL/dsl-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha512",
    "content": "6eb7438bc6503f6f5c2144957ea6ecb4573d164ff6ce9a56bf791566cc5896bc420c676719ed1f1b2ae5ed0a17e4865b9e0d0ee6b227fda763dd21f46087f898"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.rubik</groupId>\n  <artifactId>dsl</artifactId>\n  <versioning>\n    <latest>1.10.0.0-AGBT4_2-K1_5-LOCAL</latest>\n    <release>1.10.0.0-AGBT4_2-K1_5-LOCAL</release>\n    <versions>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </versions>\n    <lastUpdated>20240522044643</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/maven-metadata.xml.md5",
    "content": "b6c21229a61294d406852d0c0eec8b96"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/maven-metadata.xml.sha1",
    "content": "acf36610ad0f40d902d4ab6d23e7f7effcbdb068"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/maven-metadata.xml.sha256",
    "content": "12348433a24ebec487e08a2a10918c1a3ed520a208e55258eb8b53ac19c0b9d0"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/dsl/maven-metadata.xml.sha512",
    "content": "08965dacf36a967fdfb7dc0dadbe6fe20b2fc96578ab2b15df7728e18200fab5415841f827e861849e94473e3b29b7b1b56645733b44a77449a65d69e4690b7e"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.jar.md5",
    "content": "afd9b6eefc328aae97ee09137b8d2129"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.jar.sha1",
    "content": "d6149eccedecfef845f8f1d130adce0d163a9e5a"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.jar.sha256",
    "content": "da8ad2bb93c241369595939d37ec123169d87572585cd5783d379875b74db872"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.jar.sha512",
    "content": "bb79c12f4df71e59a774d7510d7e2c1ffca86826adb29cb829f064a9655b9787727eab5d7a6592c6d90bad01eb80e4cf1018acb089ed3bb53b92660675bc59cc"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.rubik</groupId>\n  <artifactId>kapt</artifactId>\n  <version>1.10.0.0-K1_5-LOCAL</version>\n  <dependencies>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n      <scope>compile</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup</groupId>\n      <artifactId>kotlinpoet</artifactId>\n      <version>1.4.0</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.auto.service</groupId>\n      <artifactId>auto-service</artifactId>\n      <version>1.0-rc6</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-reflect</artifactId>\n      <version>1.5.0</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.gson</groupId>\n      <artifactId>gson</artifactId>\n      <version>2.8.5</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.67-K1_5</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.kotlin</groupId>\n      <artifactId>blueprint</artifactId>\n      <version>5.1.12-K1_5</version>\n      <scope>runtime</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.pom.md5",
    "content": "970a558dead1383558d5663bc59befc8"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.pom.sha1",
    "content": "bb384770650b086636836c7dc56c780d04d3ec54"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.pom.sha256",
    "content": "e7d91a15b1259d3c8e7233a756965551a72af9248c48a1ef7530556ea5d8198d"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/1.10.0.0-K1_5-LOCAL/kapt-1.10.0.0-K1_5-LOCAL.pom.sha512",
    "content": "993b257c51883f95903a9ca59eba6a1fadc310504c58b1b0fc6e1c190c57cea33aab2c5da2f2507dec551678f1dafedb91defc58bb30356ec0eace6e2e76c092"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.rubik</groupId>\n  <artifactId>kapt</artifactId>\n  <versioning>\n    <latest>1.10.0.0-K1_5-LOCAL</latest>\n    <release>1.10.0.0-K1_5-LOCAL</release>\n    <versions>\n      <version>1.10.0.0-K1_5-LOCAL</version>\n    </versions>\n    <lastUpdated>20240522044950</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/maven-metadata.xml.md5",
    "content": "972b81e3a2c1347fd6da59233565de41"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/maven-metadata.xml.sha1",
    "content": "bb295c4b376e8f32b0a859537d2dff090948e6bb"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/maven-metadata.xml.sha256",
    "content": "910e9d43a34b0a427ce69f29f6d32e49da3b186613bd8b19a25232c69f504510"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/kapt/maven-metadata.xml.sha512",
    "content": "33d3f469663825f9ff7ac8e2df7deb8de30f3e774be2695de3e31e8d8003cdfcfb95d5df3b1f900acea6aeb105ffa8718865102b8122337d6ed14bfde1e7cb7c"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.md5",
    "content": "c1736231c37e6fde542e6a5a8a98f26b"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha1",
    "content": "ec9a98df8797deb0bd8335561a7de4744c8f9488"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha256",
    "content": "607caa23f600bc5f65380030f3a7ee3808245c09a742586e8961d4f4fe109da6"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha512",
    "content": "23568e4626e4bfaf37dd028d13f4fbe5a7a9562afdbf8ac9ad5e14263a762e7a707c386d3316a1506b230324cb301c9fa3e4d31bbeef609e7f95634cc0f3519a"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.rubik</groupId>\n  <artifactId>picker</artifactId>\n  <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n  <dependencies>\n    <dependency>\n      <groupId>com.android.tools.build</groupId>\n      <artifactId>gradle</artifactId>\n      <version>4.2.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-gradle-plugin</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.67-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>gradle</artifactId>\n      <version>0.1.1-AGBT4_2-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>context</artifactId>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.md5",
    "content": "9ff88f9a52619ce404580b7bb850971d"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha1",
    "content": "fa7611efd96777d9202964d36b4ae769dc103359"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha256",
    "content": "282457c46e223419bd07f5ce8dcb5155197893f11467c61dd54ba98d94833218"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/1.10.0.0-AGBT4_2-K1_5-LOCAL/picker-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha512",
    "content": "52c9ed0ee379f91c438527762b5da89401323ba008fe596daec05d874539350a4d9ced4e4c37a44451b69de14e927c80e52d5524d52c12d9ddd9c3bc702c25d8"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.rubik</groupId>\n  <artifactId>picker</artifactId>\n  <versioning>\n    <latest>1.10.0.0-AGBT4_2-K1_5-LOCAL</latest>\n    <release>1.10.0.0-AGBT4_2-K1_5-LOCAL</release>\n    <versions>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </versions>\n    <lastUpdated>20240522044643</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/maven-metadata.xml.md5",
    "content": "3bbfa7b17af3948334e6f4f5bbfe4e8b"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/maven-metadata.xml.sha1",
    "content": "60a5f6e8bffadb7e0f0883465f9b7dd4707d7354"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/maven-metadata.xml.sha256",
    "content": "3912cd02339dbaf36c8d1638fc29983c286d83914828617d95269cb51f38c6a0"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/picker/maven-metadata.xml.sha512",
    "content": "b762292d6ef7ac63dd592106d534e3fd017362dde0c569c0d99845ac985c57a809a16ed8aa6f9ea7d1e882ecbb7afa1ee4c4365a7e6512596832c68076a804e0"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.md5",
    "content": "c578b62e4982fab19e52033c7d2f6f15"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha1",
    "content": "8b1355dee7d311c0290b4307bdb807e438df35ab"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha256",
    "content": "5c281977be5cad7632d97a95daa02651521a9b9f09f1f8b240cd497003951873"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha512",
    "content": "668dce7d09367c82bbe8dd12b5a013eff6c88c05c64b116e178343d6ee3196393411342e7fdd931e53c4e8050878f00d821469f5090f63a26c0edc006d28d0b6"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.rubik</groupId>\n  <artifactId>plugins</artifactId>\n  <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n  <dependencies>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-android-extensions-runtime</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>com.android.tools.build</groupId>\n      <artifactId>gradle</artifactId>\n      <version>4.2.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-gradle-plugin</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>com.squareup</groupId>\n      <artifactId>kotlinpoet</artifactId>\n      <version>1.4.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.javassist</groupId>\n      <artifactId>javassist</artifactId>\n      <version>3.27.0-GA</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>annotations</artifactId>\n      <version>1.10.0.0-LOCAL</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.67-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>gradle</artifactId>\n      <version>0.1.1-AGBT4_2-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>context</artifactId>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>picker</artifactId>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>dsl</artifactId>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>publish</artifactId>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.md5",
    "content": "1fe93b88a65fd08410fa37cbe0c77ee1"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha1",
    "content": "017c4ec44ca778e502f2fac10339587b066586de"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha256",
    "content": "4daa3c5e39ab8c1dacedbfa0eb7bfcc26c9fd2f8e4d1062a891547fd45a6a399"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/1.10.0.0-AGBT4_2-K1_5-LOCAL/plugins-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha512",
    "content": "4a1574c35d8c67c0ebdd064378a60b28fe2cd848aee2ddfa5424e64b480fba30b3edcc2bd609f19249be1038db7183611b5d9a82f2080c60d3c2dd34edb39952"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.rubik</groupId>\n  <artifactId>plugins</artifactId>\n  <versioning>\n    <latest>1.10.0.0-AGBT4_2-K1_5-LOCAL</latest>\n    <release>1.10.0.0-AGBT4_2-K1_5-LOCAL</release>\n    <versions>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </versions>\n    <lastUpdated>20240522044648</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/maven-metadata.xml.md5",
    "content": "1bba8378c5c923f0c46333bf8a6a6b5b"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/maven-metadata.xml.sha1",
    "content": "2d8d7c2ed16e4b21cc0dc9812bb46677156f8408"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/maven-metadata.xml.sha256",
    "content": "9b87086f4d985815055df2eb754dc120a61fe13841736f3191d06b2379b4fcd4"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/plugins/maven-metadata.xml.sha512",
    "content": "b121f4330d6b8cde1db3c71354800d097209973d8c06c5db1e9bfb141a99645fefd6f56c0e213237dc28f625b7ab244a4ae8c67a28b46ff07eda7ab4ed426d9b"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.md5",
    "content": "c2c66b4678c7bdc21b0aa251ffc130d8"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha1",
    "content": "0edf553c8ff4b82d0dbb257e4bd315d9fb336d1d"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha256",
    "content": "d4e37216247790c516ac59499450db2459bdbf9b70195b11364284bb776975e3"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.jar.sha512",
    "content": "c3f18c9845fda156b8d45c48044203781d54741a608120f6034f525fcb782a99447713a84b2d41d231e8f5646ae70386bfd433d4bf0fa33b2792fbdc7fe5c3af"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.rubik</groupId>\n  <artifactId>publish</artifactId>\n  <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n  <dependencies>\n    <dependency>\n      <groupId>com.android.tools.build</groupId>\n      <artifactId>gradle</artifactId>\n      <version>4.2.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-gradle-plugin</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.67-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>gradle</artifactId>\n      <version>0.1.1-AGBT4_2-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>context</artifactId>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.md5",
    "content": "67273a5ee1a9bd20e8b043ee8793cd0b"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha1",
    "content": "effc27df59f6a279b8a6e92499f51bf6756d2f75"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha256",
    "content": "a336586c69c66dcb21485f0d07910a6ca905425a9fef518b4e2ef4f596f4b8df"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/1.10.0.0-AGBT4_2-K1_5-LOCAL/publish-1.10.0.0-AGBT4_2-K1_5-LOCAL.pom.sha512",
    "content": "540d2c647980588e8c0fa9b2c0acab3f6c6153169444ad3dbacfe486d7198b7cc8086bc9226f8ce4a62f3f35b3acfe751acec002ea1c3dc8edd0e71b743f80d8"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.rubik</groupId>\n  <artifactId>publish</artifactId>\n  <versioning>\n    <latest>1.10.0.0-AGBT4_2-K1_5-LOCAL</latest>\n    <release>1.10.0.0-AGBT4_2-K1_5-LOCAL</release>\n    <versions>\n      <version>1.10.0.0-AGBT4_2-K1_5-LOCAL</version>\n    </versions>\n    <lastUpdated>20240522044648</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/maven-metadata.xml.md5",
    "content": "205fbc3e4f62fdb98e333b7c4294d919"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/maven-metadata.xml.sha1",
    "content": "4a17e66d1951c1c8dd1f74924de39c29498e3125"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/maven-metadata.xml.sha256",
    "content": "9bc1e375345069fd994b3127a168520659a803fddfd18f4b615d78b277e1499c"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/publish/maven-metadata.xml.sha512",
    "content": "ca18f972c94390079122cbf6e1c0353e2f88b89dde0765ce535550c8225f682d86e1a094d35390512d5c498e11b3fde373b3d5f83c6e78b4f933f447903c7a33"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.jar.md5",
    "content": "ac2d272e2f49a9fdd8a6b73efd03c7a4"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.jar.sha1",
    "content": "e8bd16782c0295b04d3a45f61aa19cf0a56809f7"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.jar.sha256",
    "content": "ace9360c21916b8aa100fbeb55a510038ca100c9f78e4b45f2b5245db862aed7"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.jar.sha512",
    "content": "f1fcb88507bf124466ec11f5ddc5143488b2404a755668afa4b3da055089aa90abec858cc1bb0de8dc82e32d50247b6adc1b700b645bc2393871d907091fe8cc"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.rubik</groupId>\n  <artifactId>router</artifactId>\n  <version>1.10.0.0-K1_5-LOCAL</version>\n  <dependencies>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>annotations</artifactId>\n      <version>1.10.0.0-LOCAL</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-android-extensions-runtime</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-reflect</artifactId>\n      <version>1.5.0</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.appcompat</groupId>\n      <artifactId>appcompat</artifactId>\n      <version>1.0.2</version>\n    </dependency>\n    <dependency>\n      <groupId>androidx.core</groupId>\n      <artifactId>core-ktx</artifactId>\n      <version>1.3.2</version>\n    </dependency>\n    <dependency>\n      <groupId>com.google.code.gson</groupId>\n      <artifactId>gson</artifactId>\n      <version>2.8.5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.67-K1_5</version>\n    </dependency>\n    <dependency>\n      <groupId>com.rubik</groupId>\n      <artifactId>annotations</artifactId>\n      <version>1.10.0.0-LOCAL</version>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.pom.md5",
    "content": "ffa6b41dd86652982396ec8d6d1d6e07"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.pom.sha1",
    "content": "c24482cdc38142543cf41256e9ea77127a59fc1c"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.pom.sha256",
    "content": "675e2d605af2ca6f2496e54da9260bc76259a74689c24fb4c2a791fddc8f7af3"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/1.10.0.0-K1_5-LOCAL/router-1.10.0.0-K1_5-LOCAL.pom.sha512",
    "content": "8f65b4e2a09d815a6455bdba6571345e8b5412a2dbec6336c3ff32641be16dfaa9f5d1fd846a323f4ec7d7e66d8ea6b2bdda3b5727b5325e7d9474598e2f0466"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.rubik</groupId>\n  <artifactId>router</artifactId>\n  <versioning>\n    <latest>1.10.0.0-K1_5-LOCAL</latest>\n    <release>1.10.0.0-K1_5-LOCAL</release>\n    <versions>\n      <version>1.10.0.0-K1_5-LOCAL</version>\n    </versions>\n    <lastUpdated>20240522045053</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/maven-metadata.xml.md5",
    "content": "c6d226bec6c0248bc255e87bee7db22f"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/maven-metadata.xml.sha1",
    "content": "6cdde04fda4b4ac709a8cbb23f2fefa477198eed"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/maven-metadata.xml.sha256",
    "content": "5e1b7347fbe165f1271f5e85c76441594b50be0ff6ddc9657c99afc8ca015d9b"
  },
  {
    "path": "rubik_maven_local_repository/com/rubik/router/maven-metadata.xml.sha512",
    "content": "2e46bbe5c546e47ba6307751c9460ab9f745d6d90bb51fd9badbef5c890a23340593c9f1346488033748e0f24b41b75ecec4ae6ef950741d87eaf033b2db5503"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.jar.md5",
    "content": "e8f819ae4c533db083cc0fc6cd853d02"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.jar.sha1",
    "content": "8f334171759c3d4c836689e3414fe97eda6707eb"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.jar.sha256",
    "content": "32ad4a4e86ba797ac3893e335ca7516363b786c83c2c9ec86098036411bccf87"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.jar.sha512",
    "content": "707b15101f37771276fa7e861c068e25ac7ef38cba22f40f53a2ce4de771d3d1246b266de78242437f74b780eb30234f2ffd3d9371dc56edcb3bea5c0e8f7dca"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.module",
    "content": "{\n  \"formatVersion\": \"1.1\",\n  \"component\": {\n    \"group\": \"com.synccode\",\n    \"module\": \"syncer\",\n    \"version\": \"0.0.8-K1_5\",\n    \"attributes\": {\n      \"org.gradle.status\": \"release\"\n    }\n  },\n  \"createdBy\": {\n    \"gradle\": {\n      \"version\": \"6.7.1\",\n      \"buildId\": \"p55bypxrkjaldfvorgp2bmalee\"\n    }\n  },\n  \"variants\": [\n    {\n      \"name\": \"apiElements\",\n      \"attributes\": {\n        \"org.gradle.category\": \"library\",\n        \"org.gradle.dependency.bundling\": \"external\",\n        \"org.gradle.jvm.version\": 8,\n        \"org.gradle.libraryelements\": \"jar\",\n        \"org.gradle.usage\": \"java-api\",\n        \"org.jetbrains.kotlin.localToProject\": \"public\",\n        \"org.jetbrains.kotlin.platform.type\": \"jvm\"\n      },\n      \"files\": [\n        {\n          \"name\": \"syncer-0.0.8-K1_5.jar\",\n          \"url\": \"syncer-0.0.8-K1_5.jar\",\n          \"size\": 7770,\n          \"sha512\": \"707b15101f37771276fa7e861c068e25ac7ef38cba22f40f53a2ce4de771d3d1246b266de78242437f74b780eb30234f2ffd3d9371dc56edcb3bea5c0e8f7dca\",\n          \"sha256\": \"32ad4a4e86ba797ac3893e335ca7516363b786c83c2c9ec86098036411bccf87\",\n          \"sha1\": \"8f334171759c3d4c836689e3414fe97eda6707eb\",\n          \"md5\": \"e8f819ae4c533db083cc0fc6cd853d02\"\n        }\n      ]\n    },\n    {\n      \"name\": \"runtimeElements\",\n      \"attributes\": {\n        \"org.gradle.category\": \"library\",\n        \"org.gradle.dependency.bundling\": \"external\",\n        \"org.gradle.jvm.version\": 8,\n        \"org.gradle.libraryelements\": \"jar\",\n        \"org.gradle.usage\": \"java-runtime\",\n        \"org.jetbrains.kotlin.localToProject\": \"public\",\n        \"org.jetbrains.kotlin.platform.type\": \"jvm\"\n      },\n      \"dependencies\": [\n        {\n          \"group\": \"org.jetbrains.kotlin\",\n          \"module\": \"kotlin-stdlib-jdk8\",\n          \"version\": {\n            \"requires\": \"1.5.0\"\n          }\n        },\n        {\n          \"group\": \"com.ktnail\",\n          \"module\": \"x\",\n          \"version\": {\n            \"requires\": \"0.0.45-K1_5\"\n          }\n        }\n      ],\n      \"files\": [\n        {\n          \"name\": \"syncer-0.0.8-K1_5.jar\",\n          \"url\": \"syncer-0.0.8-K1_5.jar\",\n          \"size\": 7770,\n          \"sha512\": \"707b15101f37771276fa7e861c068e25ac7ef38cba22f40f53a2ce4de771d3d1246b266de78242437f74b780eb30234f2ffd3d9371dc56edcb3bea5c0e8f7dca\",\n          \"sha256\": \"32ad4a4e86ba797ac3893e335ca7516363b786c83c2c9ec86098036411bccf87\",\n          \"sha1\": \"8f334171759c3d4c836689e3414fe97eda6707eb\",\n          \"md5\": \"e8f819ae4c533db083cc0fc6cd853d02\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.module.md5",
    "content": "812c793dfe366386493230baa49a322b"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.module.sha1",
    "content": "8027e3a61ca054bda6f035e2ed1e912c77ff7d7d"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.module.sha256",
    "content": "6cc8a102525a50c511adee94fa8819ccbf089537c23c5f5322d3ad9b23e6a53b"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.module.sha512",
    "content": "54ed37788fa03b2d0d4569b2bec9e033cc0eb23144593fd299c4f1e31bb5e0051d6b8758b3460d36b887883b75add65e8ab3300e5066ea6907b4a9ea8d84ab29"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.pom",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <!-- This module was also published with a richer model, Gradle metadata,  -->\n  <!-- which should be used instead. Do not delete the following line which  -->\n  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->\n  <!-- that they should prefer consuming it instead. -->\n  <!-- do_not_remove: published-with-gradle-metadata -->\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.synccode</groupId>\n  <artifactId>syncer</artifactId>\n  <version>0.0.8-K1_5</version>\n  <dependencies>\n    <dependency>\n      <groupId>org.jetbrains.kotlin</groupId>\n      <artifactId>kotlin-stdlib-jdk8</artifactId>\n      <version>1.5.0</version>\n      <scope>runtime</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.ktnail</groupId>\n      <artifactId>x</artifactId>\n      <version>0.0.45-K1_5</version>\n      <scope>runtime</scope>\n    </dependency>\n  </dependencies>\n</project>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.pom.md5",
    "content": "9e0a38cc4690e69e1e27fc145a630999"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.pom.sha1",
    "content": "715574925bcb26e113412bbae1f0dcdb001158ea"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.pom.sha256",
    "content": "07e83f961bee8d04c9f147e6648bc9a698e364fa5a0a6aa3055cd195ee65fa21"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/0.0.8-K1_5/syncer-0.0.8-K1_5.pom.sha512",
    "content": "a104937bb7a44ffbfa35e60bbd83971bceb4ba3e16c6fb4dda623b689139122171db087de50d931b0d68a771e12e6e664c879e8ae7ab757a8a8be5dcbf4d0974"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/maven-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metadata>\n  <groupId>com.synccode</groupId>\n  <artifactId>syncer</artifactId>\n  <versioning>\n    <latest>0.0.8-K1_5</latest>\n    <release>0.0.8-K1_5</release>\n    <versions>\n      <version>0.0.8-K1_5</version>\n    </versions>\n    <lastUpdated>20230808105141</lastUpdated>\n  </versioning>\n</metadata>\n"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/maven-metadata.xml.md5",
    "content": "15f80d58a7493cdf0d1ad7b6fa0b2314"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/maven-metadata.xml.sha1",
    "content": "98a0d3f9db0d9d6d10d4d647b1eadd25419a587a"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/maven-metadata.xml.sha256",
    "content": "dc076e595d447265afaf5453051a2ed9c80f82a84c9882e1e715cd3d893a6a02"
  },
  {
    "path": "rubik_maven_local_repository/com/synccode/syncer/maven-metadata.xml.sha512",
    "content": "8d1846fd01823b4b4b31da745ab59615796fc0e70ab12720300b12ea59d762c887a4b4953933e680fb7b34144c70ecd897988ee3a3a1a8644fd3522cfb47acac"
  },
  {
    "path": "settings-rubik.gradle",
    "content": "/**\n * generated Rubik by Rubik Gradle Plugin (1.10.99.999T-AGBT4_2-K1_3-LOCAL).\n * \n * update by: cuizhe01 \n *        at: 2023-08-07 21:05:57\n */\ninclude ':demo:demo_component_detail'\ninclude ':demo:demo_component_detail_java'\ninclude ':demo:demo_component_home'\ninclude ':demo:demo_until_library_b'\ninclude ':demo:demo_until_library_c_java'\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':rubik:rubik_annotations',\n        ':rubik:rubik_router',\n        ':rubik:rubik_kapt',\n        ':rubik:rubik_plugins',\n        ':rubik:rubik_dsl',\n        ':rubik:rubik_publish',\n        ':rubik:rubik_picker',\n        ':rubik:rubik_context'\n\ninclude ':demo:demo_root_app'\ninclude ':demo:demo_until_library_a'\n\nrootProject.name = 'K-Component'\n\napply from: 'settings-rubik.gradle'\n"
  },
  {
    "path": "test_app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\n\nandroid {\n    compileSdkVersion 30\n    buildToolsVersion \"30.0.0\"\n\n    defaultConfig {\n        applicationId \"com.baidu.kcomponent\"\n        minSdkVersion 23\n        targetSdkVersion 30\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.core:core-ktx:1.0.2'\n    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'\n\n    implementation rubik_router_version\n\n    androidTestImplementation 'androidx.test:core:1.3.0'\n    androidTestImplementation 'androidx.test:runner:1.3.0'\n    androidTestImplementation 'androidx.test:rules:1.3.0'\n    androidTestImplementation 'androidx.test.ext:junit:1.1.2'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'\n\n}\n"
  },
  {
    "path": "test_app/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": "test_app/src/androidTest/java/com/rubik/test/EventTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.rule.ActivityTestRule\nimport com.rubik.context.LifeCycleEvent\nimport com.rubik.router.*\nimport com.rubik.test.router.TestAggregate\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass EventTest {\n\n    @get:Rule\n    var activityRule = ActivityTestRule(TestActivity::class.java)\n\n    @Before\n    fun init(){\n        TestAggregate.register()\n    }\n\n    @Test\n    fun useInitEvent() {\n        Router.doEvent(LifeCycleEvent.INIT)\n    }\n\n    @Test\n    fun useDestroyEvent(){\n        Router.doEvent(LifeCycleEvent.DESTROY)\n\n    }\n\n    @Test\n    fun useContextInitEvent() {\n        activityRule.activity.applicationContext.doEvent(\"context_init\")\n    }\n\n    @Test\n    fun useContextDestroyEvent(){\n        activityRule.activity.applicationContext.doEvent(\"context_destroy\")\n    }\n\n\n}"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/LaunchTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport android.content.Intent\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.rule.ActivityTestRule\nimport com.rubik.activity.Launcher\nimport com.rubik.route.LaunchQueries\nimport com.rubik.route.Query\nimport com.rubik.router.navigate\nimport com.rubik.test.router.TestAggregate\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass LaunchTest {\n\n    @get:Rule\n    var activityRule = ActivityTestRule(TestActivity::class.java)\n\n    @Before\n    fun init(){\n        TestAggregate.register()\n    }\n\n    @Test\n    fun useLaunchQueries() {\n        activityRule.activity.navigate {\n            uri = \"test://agg.test/activity/launch\"\n            query {\n                \"p1\" with 1\n            }\n        }\n    }\n\n    @Test\n    fun useLaunch(){\n        Launcher().launch(\n            TestActivity::class.java,\n            LaunchQueries().apply {\n                context = activityRule.activity.applicationContext\n                flags = Intent.FLAG_ACTIVITY_NEW_TASK\n            },\n            null,\n            null\n        )\n    }\n\n    @Test\n    fun useLaunchQuery(){\n        Launcher().launch(\n            TestActivity::class.java,\n            LaunchQueries().apply {\n                context = activityRule.activity.applicationContext\n                flags = Intent.FLAG_ACTIVITY_NEW_TASK\n                add(Query(\"from\", \"useLaunchQuery\"))\n            },\n            null,\n            null\n        )\n    }\n\n    @Test\n    fun useLaunchPathQuery(){\n        Launcher().launch(\n            TestActivity::class.java,\n            LaunchQueries().apply {\n                context = activityRule.activity.applicationContext\n                flags = Intent.FLAG_ACTIVITY_NEW_TASK\n            },\n            listOf(Query(\"from\", \"useLaunchPathQuery\")),\n            null\n        )\n    }\n}"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/PathTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.rubik.route.Result\nimport com.rubik.router.navigate\nimport com.rubik.router.result\nimport com.rubik.router.uri.Path\nimport com.rubik.test.router.TestAggregate\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass PathTest {\n    @Before\n    fun init(){\n        TestAggregate.register()\n    }\n\n    @Test\n    fun usePathQueryRouter() {\n        navigate {\n            uri = \"test://agg.test/path-queries/one/two/xxx\"\n            result<String, String, String> { r1, r2, r3 ->\n                Assert.assertEquals(r1, \"one\")\n                Assert.assertEquals(r2, \"two\")\n                Assert.assertEquals(r3, \"xxx\")\n            }\n        }\n    }\n\n    @Test\n    fun usePathQueries() {\n        val queries = Path(\"path-queries/?{name}/#{value}/action={type}.jsp\").getParameters(\"path-queries/?zhangsan/#student123/action=get@String.jsp\")\n        Assert.assertEquals(queries[0].value.toString(), \"zhangsan\")\n        Assert.assertEquals(queries[1].value.toString(), \"student123\")\n        Assert.assertEquals(queries[2].value.toString(), \"get@String\")\n    }\n\n}"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/RouterBuilderTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.rubik.router.Router\nimport com.rubik.router.navigate\nimport com.rubik.router.navigateForResult\nimport com.rubik.router.result\nimport com.rubik.test.router.TestAggregate\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass RouterBuilderTest {\n    @Before\n    fun init(){\n        TestAggregate.register()\n    }\n\n    @Test\n    fun useBadUri() {\n        val result = Router.builder()\n            .uri(\"a://b/c\")\n            .apply {\n                \"p1\" with 1\n            }\n            .build().routeForResult(Integer.TYPE)\n        Assert.assertSame(result, 2)\n    }\n\n    @Test\n    fun useRouterAdd1() {\n        Router.builder()\n            .uri(\"test://agg.test/int/add1\")\n            .apply {\n                \"p1\" with 1\n            }.result<Int> { result ->\n                Assert.assertSame(result, 2)\n            }\n            .build().route()\n    }\n\n    @Test\n    fun useRouterAdd2() {\n        Router.builder()\n            .uri(\"test://agg.test/int/add2\")\n            .apply {\n                \"p1\" with 1\n            }.result<Int> { result ->\n                Assert.assertSame(result, 3)\n            }\n            .build().route()\n    }\n\n    @Test\n    fun useRouterAdd1ForResult() {\n        val result = Router.builder()\n            .uri(\"test://agg.test/int/add1\")\n            .apply {\n                \"p1\" with 1\n            }\n            .build().routeForResult(Integer.TYPE)\n        Assert.assertSame(result, 2)\n\n    }\n\n    @Test\n    fun useRouterAdd2ForResult() {\n        val result = Router.builder()\n            .uri(\"test://agg.test/int/add2\")\n            .apply {\n                \"p1\" with 1\n            }\n            .build().routeForResult(Integer.TYPE)\n        Assert.assertSame(result, 3)\n    }\n}"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/RouterResultTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.rubik.router.navigate\nimport com.rubik.router.result\nimport com.rubik.test.router.TestAggregate\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass RouterResultTest {\n    @Before\n    fun init(){\n        TestAggregate.register()\n    }\n\n    @Test\n    fun useRouterResult3() {\n        navigate {\n            uri = \"test://agg.test/result/get3\"\n            result<String, String, String> { r1, r2, r3 ->\n                Assert.assertSame(r1, \"r1\")\n                Assert.assertSame(r2, \"r2\")\n                Assert.assertSame(r3, \"r3\")\n            }\n        }\n    }\n\n    @Test\n    fun useRouterResult4() {\n        navigate {\n            uri = \"test://agg.test/result/get4\"\n            result<String, String, String, String> { r1, r2, r3, r4->\n                Assert.assertSame(r1, \"r1\")\n                Assert.assertSame(r2, \"r2\")\n                Assert.assertSame(r3, \"r3\")\n                Assert.assertSame(r4, \"r4\")\n            }\n        }\n    }\n\n    @Test\n    fun useRouterResult5() {\n        navigate {\n            uri = \"test://agg.test/result/get5\"\n            result<String, String, String, String, String> { r1, r2, r3, r4, r5 ->\n                Assert.assertSame(r1, \"r1\")\n                Assert.assertSame(r2, \"r2\")\n                Assert.assertSame(r3, \"r3\")\n                Assert.assertSame(r4, \"r4\")\n                Assert.assertSame(r5, \"r5\")\n            }\n        }\n    }\n}"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/RouterTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.rubik.router.navigate\nimport com.rubik.router.navigateForResult\nimport com.rubik.router.result\nimport com.rubik.test.router.TestAggregate\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass RouterTest {\n    @Before\n    fun init(){\n        TestAggregate.register()\n    }\n\n    @Test\n    fun useBadUri() {\n        val result = navigateForResult<Int> {\n            uri = \"a://b/c\"\n            query {\n                \"p1\" with 1\n            }\n        }\n        Assert.assertSame(result, 2)\n    }\n\n    @Test\n    fun useRouterAdd1() {\n        navigate {\n            uri = \"test://agg.test/int/add1\"\n            query {\n                \"p1\" with 1\n            }\n            result<Int> { result ->\n                Assert.assertSame(result, 2)\n            }\n        }\n    }\n\n    @Test\n    fun useRouterAdd2() {\n        navigate {\n            uri = \"test://agg.test/int/add2\"\n            query {\n                \"p1\" with 1\n            }\n            result<Int> { result ->\n                Assert.assertSame(result, 3)\n            }\n        }\n    }\n\n    @Test\n    fun useRouterAdd1ForResult() {\n        val result = navigateForResult<Int> {\n            uri = \"test://agg.test/int/add1\"\n            query {\n                \"p1\" with 1\n            }\n        }\n        Assert.assertSame(result, 2)\n    }\n\n    @Test\n    fun useRouterAdd2ForResult() {\n        val result = navigateForResult<Int> {\n            uri = \"test://agg.test/int/add2\"\n            query {\n                \"p1\" with 1\n            }\n        }\n        Assert.assertSame(result, 3)\n    }\n}"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/RubikTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.rubik.Rubik\nimport com.rubik.logger.Logger\nimport com.rubik.register\nimport com.rubik.router.navigate\nimport com.rubik.router.result\nimport com.rubik.test.router.TestSimpleAggregateFactory\nimport org.junit.Assert\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass RubikTest {\n\n    @Test\n    fun useRubikLogger() {\n        Rubik.logger {\n            d = { log -> log(log) }\n        }\n        Logger.d(\"abc\")\n    }\n\n    @Test\n    fun useRegisterAggregateFactory() {\n        Rubik.registerAggregateFactory(TestSimpleAggregateFactory())\n\n        navigate {\n            uri = \"a://b/c\"\n            result<Int> { result ->\n                Assert.assertSame(result, 100)\n            }\n        }\n    }\n\n    @Test\n    fun useRegisterAggregateFactoryExt() {\n        TestSimpleAggregateFactory().register()\n\n        navigate {\n            uri = \"a://b/c\"\n            result<Int> { result ->\n                Assert.assertSame(result, 100)\n            }\n        }\n    }\n\n    @Test\n    fun useRegisterAggregatable() {\n        Rubik.registerAggregatable(\"com.rubik.test.router.TestAggregate\")\n\n        navigate {\n            uri = \"a://b/c\"\n            result<Int> { result ->\n                Assert.assertSame(result, 100)\n            }\n        }\n    }\n}\n\n\nfun log(msg: String) {\n    println(\"RubikTest $msg \")\n}"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/TouchTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.rubik.router.*\nimport com.rubik.test.router.TestAggregate\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass TouchTest {\n\n    @Before\n    fun init(){\n        TestAggregate.register()\n    }\n\n    @Test\n    fun useTouch() {\n        touch(\"test://agg.test\") {\n            log(\"touched\")\n        }\n    }\n\n    @Test\n    fun useMiss() {\n        touch(\"test://agg.miss\") {\n            log(\"touched\")\n        }.miss {\n            log(\"missed\")\n        }\n    }\n\n    @Test\n    fun useRouterTouch() {\n        Router.touch(\"test://agg.test\") {\n            log(\"Router touched\")\n        }\n    }\n\n    @Test\n    fun useRouterMiss() {\n        Router.touch(\"test://agg.miss\") {\n            log(\"Router touched\")\n        }.miss {\n            log(\"Router missed\")\n        }\n    }\n\n    @Test\n    fun useTouchHolder() {\n        TouchHolder(\"test://agg.test\").touch{\n            log(\"Holder touched\")\n        }\n    }\n\n    @Test\n    fun useTouchHolderMiss() {\n        TouchHolder(\"test://agg.miss\").touch{\n            log(\"Holder touched\")\n        }.miss {\n            log(\"Holder missed\")\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/router/TestAggregate.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test.router\n\nimport androidx.annotation.Keep\nimport com.rubik.context.Aggregatable\nimport com.rubik.context.AggregateCompanion\nimport com.rubik.context.LifeCycleEvent\nimport com.rubik.route.LaunchQueries\nimport com.rubik.route.Queries\nimport com.rubik.route.Result\nimport com.rubik.route.Results\nimport com.rubik.router.uri.Path\nimport com.rubik.test.log\n\n\n@Keep\nclass TestAggregate : Aggregatable {\n    override fun onEvent(msg: String, queries: Queries) {\n        when(msg){\n            LifeCycleEvent.INIT ->  {\n                log(\" EVENT LifeCycleEvent_INIT \")\n            }\n            LifeCycleEvent.DESTROY ->  {\n                log(\" EVENT LifeCycleEvent_DESTROY \")\n            }\n            \"context_init\" ->  {\n                log(\" EVENT context_init : ${queries[0].value}\")\n            }\n            \"context_destroy\"->  {\n                log(\" EVENT context_destroy : ${queries[0].value}\")\n            }\n            else -> {\n                log(\" EVENT OTHER\")\n            }\n        }\n    }\n\n    override fun onRoute(\n        path: String,\n        queries: Queries,\n        results: List<Results>\n    ) {\n        when {\n            \"int/add1\" == path -> {\n                val p = queries.toType<Int>(0, null)\n                results.getOrNull(0)?.setOne(Result(p + 1))\n            }\n            \"int/add2\" == path ->  {\n                val p = queries.toType<Int>(0, null)\n                results.getOrNull(0)?.setOne(Result(p + 2))\n            }\n            \"activity/launch\" == path ->  {\n                log(\" launch context ${ (queries as? LaunchQueries)?.context}\")\n            }\n            \"result/get3\" == path ->  {\n                results.getOrNull(0)?.setAll(Result(\"r1\"), Result(\"r2\"), Result(\"r3\"))\n            }\n            \"result/get4\" == path ->  {\n                results.getOrNull(0)?.setAll(Result(\"r1\"), Result(\"r2\"), Result(\"r3\"), Result(\"r4\"))\n            }\n            \"result/get5\" == path ->  {\n                results.getOrNull(0)?.setAll(Result(\"r1\"), Result(\"r2\"), Result(\"r3\"), Result(\"r4\"), Result(\"r5\"))\n            }\n            Path(\"path-queries/{0}/{1}/{2}\").matching(path) -> {\n                Path(\"path-queries/{0}/{1}/{2}\").getParameters(path).let {queries->\n                    results.getOrNull(0)?.setAll(\n                        Result(queries[0].value.toString()),\n                        Result(queries[1].value.toString()),\n                        Result(queries[2].value.toString())\n                    )\n                }\n            }\n            else -> { throw com.rubik.route.exception.BadPathOrVersionException(path)}\n        }\n    }\n\n    @Keep\n    companion object : AggregateCompanion() {\n        override val URI: String = \"test://agg.test\"\n\n        override val DEPENDENCIES: List<String> = listOf()\n\n        override val EVENT_MSGS: List<String> = listOf(\"LifeCycleEvent_Init\",\"LifeCycleEvent_Destroy\")\n\n        override val CREATOR: Function0<Aggregatable> = { TestAggregate() }\n    }\n}\n"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/router/TestSimpleAggregate.kt",
    "content": "package com.rubik.test.router\n\nimport com.rubik.context.Aggregatable\nimport com.rubik.context.AggregateCompanion\nimport com.rubik.route.Queries\nimport com.rubik.route.Result\nimport com.rubik.route.Results\n\nclass TestSimpleAggregate : Aggregatable {\n    override fun onEvent(msg: String, queries: Queries) {\n        print(msg + queries)\n    }\n\n    override fun onRoute(path: String, queries: Queries, results: List<Results>) {\n        print(path + queries + results)\n        results.getOrNull(0)?.setOne(Result(100))\n    }\n\n    companion object : AggregateCompanion() {\n        override val URI: String = \"a://b\"\n\n        override val DEPENDENCIES: List<String> = listOf()\n\n        override val EVENT_MSGS: List<String> = listOf()\n\n        override val CREATOR = { TestSimpleAggregate() }\n    }\n}"
  },
  {
    "path": "test_app/src/androidTest/java/com/rubik/test/router/TestSimpleAggregateFactory.kt",
    "content": "package com.rubik.test.router\n\nimport com.rubik.context.Aggregatable\nimport com.rubik.context.AggregateFactory\n\nclass TestSimpleAggregateFactory : AggregateFactory {\n    override fun create(uri: String): Aggregatable? {\n        return TestSimpleAggregate()\n    }\n\n    override fun createByMsg(msg: String): List<Aggregatable> {\n        return listOf(TestSimpleAggregate())\n    }\n\n    override fun touch(uri: String): Boolean {\n        return true\n    }\n\n    override fun touchByMsg(msg: String): Boolean {\n        return true\n    }\n\n}"
  },
  {
    "path": "test_app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.rubik.test\">\n\n<application\n    android:icon=\"@mipmap/ic_launcher\"\n    android:label=\"@string/app_name\"\n    android:roundIcon=\"@mipmap/ic_launcher_round\"\n    android:supportsRtl=\"true\"\n    android:theme=\"@style/AppTheme\">\n    <activity android:name=\".TestActivity\">\n        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n    </activity>\n</application>\n\n</manifest>"
  },
  {
    "path": "test_app/src/main/java/com/rubik/test/TestActivity.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport com.rubik.router.property\n\nclass TestActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_test)\n        log(\" TestActivity onCreate from:${property<String>(\"from\")}\" )\n    }\n\n    private fun log(msg: String) {\n        println(\"RubikTest $msg \")\n    }\n}\n"
  },
  {
    "path": "test_app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\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=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "test_app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "test_app/src/main/res/layout/activity_test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".TestActivity\">\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\"\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\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "test_app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "test_app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "test_app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#008577</color>\n    <color name=\"colorPrimaryDark\">#00574B</color>\n    <color name=\"colorAccent\">#D81B60</color>\n</resources>\n"
  },
  {
    "path": "test_app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">TEST_APP</string>\n</resources>\n"
  },
  {
    "path": "test_app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "test_app/src/test/java/com/rubik/test/ExampleUnitTest.kt",
    "content": "/**\n * Copyright (C) Baidu 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 */\npackage com.rubik.test\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\nclass ExampleUnitTest {\n    @Test\n    fun addition_isCorrect() {\n        assertEquals(4, 2 + 2)\n    }\n}"
  },
  {
    "path": "version-adapter.gradle",
    "content": "ext.useLocalMaven = true\next.useGithubMaven = false\n\next.publishTaskPrefix = \"publish-LINK-\"\next.publishK1_3Suffix = \"-K1_3\"\next.publishK1_5Suffix = \"-K1_5\"\next.publishK1_7Suffix = \"-K1_7\"\next.publishAGBT4_2Suffix = \"-AGBT4_2\"\next.publishAGBT4Suffix = \"-AGBT4\"\next.publishLocalSuffix = \"-LOCAL\"\n\next.k1_3Version = '1.3.72'\next.k1_5Version = '1.5.0'\next.k1_7Version = '1.7.10'\next.AGBT4Version = '4.0.1'\next.AGBT4_2Version = '4.2.0'\n\n// default\next.kotlin_version = k1_5Version\next.kotlin_version_suffix = ext.publishK1_5Suffix\next.agbt_version = AGBT4_2Version\next.agbt_version_suffix = ext.publishAGBT4_2Suffix\n\ngradle.startParameter.taskNames.forEach { name ->\n    if (name.startsWith(publishTaskPrefix)) {\n        if (name.contains(publishK1_3Suffix)) {\n            ext.kotlin_version = k1_3Version\n            ext.kotlin_version_suffix = ext.publishK1_3Suffix\n        } else if (name.contains(publishK1_5Suffix)) {\n            ext.kotlin_version = k1_5Version\n            ext.kotlin_version_suffix = ext.publishK1_5Suffix\n        } else if (name.contains(publishK1_7Suffix)) {\n            ext.kotlin_version = k1_7Version\n            ext.kotlin_version_suffix = ext.publishK1_7Suffix\n        }\n        if (name.contains(publishAGBT4_2Suffix)) {\n            ext.agbt_version = AGBT4_2Version\n            ext.agbt_version_suffix = ext.publishAGBT4_2Suffix\n        } else if (name.contains(publishAGBT4Suffix)) {\n            ext.agbt_version = AGBT4Version\n            ext.agbt_version_suffix = ext.publishAGBT4Suffix\n        }\n        ext.useLocalMaven = name.contains(publishLocalSuffix)\n    }\n}\n\nif (ext.useLocalMaven) {\n    ext.local_version_suffix = ext.publishLocalSuffix\n} else {\n    ext.local_version_suffix = ''\n}"
  },
  {
    "path": "versions.gradle",
    "content": "//  version for dependency local\next.router_dep = \"1.10.0.0\"\next.kapt_dep = \"1.10.0.0\"\next.plugins_dep = \"1.10.0.0\"\next.annotations_dep = \"1.10.0.0\"\n\n//  version for publish\next.router_pub = \"1.10.0.0\"\next.kapt_pub = \"1.10.0.0\"\next.plugins_pub = \"1.10.0.0\"\next.annotations_pub = \"1.10.0.0\"\n\n// version for dependency\next.blueprint = \"5.1.12\"\next.knt_x = \"0.0.67\"\next.knt_gradle = \"0.1.1\"\next.synccode = \"0.0.8\"\n\next.pubs = [:]\next.deps = [:]\n\ndef rubikPubs = [:]\nrubikPubs.router = router_pub + kotlin_version_suffix + local_version_suffix\nrubikPubs.kapt = kapt_pub + kotlin_version_suffix + local_version_suffix\nrubikPubs.plugins = plugins_pub + agbt_version_suffix + kotlin_version_suffix + local_version_suffix\n//rubikPubs.context = plugins_pub + kotlin_version_suffix + local_version_suffix\nrubikPubs.annotations = annotations_pub + local_version_suffix\npubs.rubik = rubikPubs\n\ndef rubikDeps = [:]\nrubikDeps.router = \"com.rubik:router:\" + router_dep + kotlin_version_suffix + local_version_suffix\nrubikDeps.kapt = \"com.rubik:kapt:\" + kapt_dep + kotlin_version_suffix + local_version_suffix\nrubikDeps.plugins = \"com.rubik:plugins:\" + plugins_dep + agbt_version_suffix + kotlin_version_suffix + local_version_suffix\nrubikDeps.annotations = \"com.rubik:annotations:\" + annotations_dep + local_version_suffix\ndeps.rubik = rubikDeps\n\ndef synccodeDeps = [:]\nsynccodeDeps.syncer = \"com.synccode:syncer:\" + synccode + kotlin_version_suffix\ndeps.synccode = synccodeDeps\n\n\ndef kotlinDeps = [:]\nkotlinDeps.blueprint = \"com.kotlin:blueprint:\" + blueprint + kotlin_version_suffix\ndeps.kotlin = kotlinDeps\n\ndef ktnailDeps = [:]\nktnailDeps.x = \"com.ktnail:x:\" + knt_x + kotlin_version_suffix\nktnailDeps.gradle = \"com.ktnail:gradle:\" + knt_gradle + agbt_version_suffix + kotlin_version_suffix\ndeps.ktnail = ktnailDeps\n\n\next.rubik_kapt_version = deps.rubik.kapt\next.rubik_router_version = deps.rubik.router\next.rubik_plugins_version = deps.rubik.plugins\n\ndef addRepos(RepositoryHandler handler) {\n    handler.maven {\n        url uri(rubik_maven_local_repository)\n        allowInsecureProtocol = true\n    }\n    handler.maven {\n        url 'http://maven.aliyun.com/nexus/content/groups/public/'\n        allowInsecureProtocol = true\n    }\n//    handler.maven { url rubik_github_maven_repository }\n    handler.google()\n    handler.jcenter()\n    handler.mavenCentral()\n}\n\next.addRepos = this.&addRepos"
  }
]