reproto 0.1.2__py3-none-any.whl → 0.1.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. .git/COMMIT_EDITMSG +1 -30
  2. .git/index +0 -0
  3. .git/logs/HEAD +4 -0
  4. .git/logs/refs/heads/iyue +4 -0
  5. .git/logs/refs/remotes/gitlab/iyue +4 -0
  6. .git/logs/refs/remotes/origin/iyue +4 -0
  7. .git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872 +0 -0
  8. .git/objects/00/885cebf557ff261574deb93cb96449d06db01c +0 -0
  9. .git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa +0 -0
  10. .git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa +0 -0
  11. .git/objects/08/760c38a9f9a4b5d4de0a1df0d197b27c1592d6 +0 -0
  12. .git/objects/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f +0 -0
  13. .git/objects/22/316ec4a32601c236f997552e9600b7b40e3162 +0 -0
  14. .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8 +2 -0
  15. .git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314 +0 -0
  16. .git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1 +0 -0
  17. .git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 +0 -0
  18. .git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16 +0 -0
  19. .git/objects/33/633c9df669ff8cf38638717937a54990814268 +0 -0
  20. .git/objects/39/993e3600bf4ab82aa361b738ee97a108787450 +0 -0
  21. .git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd +0 -0
  22. .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a +0 -0
  23. .git/objects/3f/ac4973433ec0116d2348fe7a748a0002702efb +0 -0
  24. .git/objects/40/c6c8816b3ebd8cac4fa36f20454c84aa5929d1 +0 -0
  25. .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555 +3 -0
  26. .git/objects/5d/3e5b3d75b03eba63deda0dcac7ca304d41e4da +0 -0
  27. .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17 +1 -0
  28. .git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785 +0 -0
  29. .git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5 +0 -0
  30. .git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926 +0 -0
  31. .git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6 +0 -0
  32. .git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403 +0 -0
  33. .git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd +0 -0
  34. .git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9 +0 -0
  35. .git/objects/90/6b05fdb9211a7d32515bb2da31e58e4ca89916 +0 -0
  36. .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054 +0 -0
  37. .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487 +0 -0
  38. .git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12 +4 -0
  39. .git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6 +0 -0
  40. .git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec +0 -0
  41. .git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6 +0 -0
  42. .git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8 +0 -0
  43. .git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e +0 -0
  44. .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9 +0 -0
  45. .git/objects/b2/a941b669991d7e0f9bdc35f1014897a933f4e2 +1 -0
  46. .git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976 +0 -0
  47. .git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6 +0 -0
  48. .git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b +0 -0
  49. .git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e +0 -0
  50. .git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e +0 -0
  51. .git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd +0 -0
  52. .git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626 +0 -0
  53. .git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a +0 -0
  54. .git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588 +0 -0
  55. .git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42 +0 -0
  56. .git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b +0 -0
  57. .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31 +0 -0
  58. .git/objects/e6/5ff9bea681f0b8f409ec27761935883c1f0cc9 +0 -0
  59. .git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7 +0 -0
  60. .git/refs/heads/iyue +1 -1
  61. .git/refs/remotes/gitlab/iyue +1 -1
  62. .git/refs/remotes/origin/iyue +1 -1
  63. README.md +104 -190
  64. core/__init__.py +23 -0
  65. core/info_decoder.py +13 -4
  66. core/reconstructor.py +25 -16
  67. generation/__init__.py +17 -0
  68. generation/proto_generator.py +11 -5
  69. main.py +59 -56
  70. models/__init__.py +31 -24
  71. parsing/__init__.py +22 -0
  72. parsing/enum_parser.py +10 -2
  73. parsing/java_parser.py +7 -1
  74. pyproject.toml +2 -1
  75. reproto-0.1.4.dist-info/METADATA +210 -0
  76. {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/RECORD +85 -31
  77. requirements.txt +3 -1
  78. utils/__init__.py +55 -0
  79. utils/builtin_proto.py +8 -1
  80. utils/file_cache.py +8 -1
  81. utils/report_utils.py +71 -0
  82. utils/type_index.py +8 -1
  83. utils/version_checker.py +311 -0
  84. core/bytecode_parser.py +0 -274
  85. reproto-0.1.2.dist-info/METADATA +0 -295
  86. {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/WHEEL +0 -0
  87. {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,210 @@
1
+ Metadata-Version: 2.3
2
+ Name: reproto
3
+ Version: 0.1.4
4
+ Summary: 一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
5
+ License: Proprietary
6
+ Keywords: protobuf,reverse-engineering,android,jadx,proto
7
+ Author: iyue
8
+ Author-email: ys1231@126.com
9
+ Requires-Python: >=3.12,<4.0
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: Other/Proprietary License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Topic :: Software Development :: Code Generators
17
+ Classifier: Topic :: Software Development :: Disassemblers
18
+ Requires-Dist: loguru (>=0.7.3)
19
+ Requires-Dist: packaging (>=25.0,<26.0)
20
+ Project-URL: Homepage, https://github.com/ys1231/reproto
21
+ Project-URL: Repository, https://github.com/ys1231/reproto.git
22
+ Description-Content-Type: text/markdown
23
+
24
+ # Protobuf Reconstructor
25
+
26
+ 🔧 **从JADX反编译的Java源码自动重构Protobuf .proto文件**
27
+
28
+ 一个强大的逆向工程工具,能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构。
29
+
30
+ ## ✨ 特性
31
+
32
+ - 🎯 **精准解析**: 基于Google Protobuf Lite字节码的逆向工程
33
+ - 🔄 **递归依赖**: 自动发现和处理所有依赖的消息和枚举类型
34
+ - 📦 **完整支持**: 支持oneof、repeated、map、枚举等所有Protobuf特性
35
+ - 🌐 **通用性**: 适用于任何Android应用,无需硬编码映射
36
+ - 🧠 **智能推断**: 从Java源码直接读取类型信息,确保高准确性
37
+ - 📝 **标准输出**: 严格遵循Google Proto Style Guide
38
+
39
+ ## 🛠️ 安装
40
+
41
+ ### 方式一:拉取代码
42
+ ```bash
43
+ # 克隆项目
44
+ git clone <repository_url>
45
+ cd reproto
46
+
47
+ # 安装依赖
48
+ pip install -r requirements.txt
49
+ ```
50
+
51
+ ### 方式二:pip安装
52
+ ```bash
53
+ # 从本地构建安装
54
+ pip install .
55
+
56
+ # 在线安装
57
+ pip install reproto
58
+ ```
59
+
60
+ ## 📖 使用
61
+
62
+ ### 命令行使用
63
+ ```bash
64
+ # 基本用法 python main.py or 命令 reproto
65
+ reproto <java_sources_dir> <root_class> <output_dir> [--verbose]
66
+
67
+ # 示例:重构普通类
68
+ reproto ./out_jadx/sources com.example.messaging.v1.models.MessageData ./protos_generated
69
+
70
+ # 示例:重构内部类(注意:包含$的类名需要用单引号包裹)
71
+ reproto ./out_jadx/sources 'com.example.account.v1.Models$Onboarded' ./output
72
+
73
+ # 详细输出
74
+ reproto ./out_jadx/sources com.example.Model ./output --verbose
75
+ ```
76
+
77
+ ### 代码使用
78
+ ```python
79
+ # 作为包使用
80
+ from core import ProtoReconstructor
81
+ from utils.logger import setup_logger
82
+ from pathlib import Path
83
+
84
+ # 初始化
85
+ setup_logger("./logs")
86
+ sources_dir = Path("./out_jadx/sources")
87
+ output_dir = Path("./protos_generated")
88
+
89
+ # 创建重构器并执行
90
+ reconstructor = ProtoReconstructor(sources_dir, output_dir)
91
+ results = reconstructor.reconstruct_from_root("com.example.Model")
92
+
93
+ # 查看结果
94
+ for class_name, definition in results.items():
95
+ print(f"生成: {class_name} -> {definition.proto_filename}")
96
+ ```
97
+
98
+ ### 参数说明
99
+ - `java_sources_dir`: JADX反编译的Java源码目录路径
100
+ - `root_class`: 要重构的根类完整类名
101
+ - `output_dir`: 生成的proto文件输出目录路径
102
+ - `--verbose`: 显示详细处理信息
103
+
104
+ ## ⚠️ 注意事项
105
+
106
+ ### 重要提醒
107
+ - **内部类命名**: 包含`$`符号的类名(如内部类)必须用**单引号包裹**
108
+ ```bash
109
+ # ✅ 正确
110
+ reproto ./sources 'com.example.Outer$Inner' ./output
111
+
112
+ # ❌ 错误
113
+ reproto ./sources com.example.Outer$Inner ./output
114
+ ```
115
+
116
+ ### 使用建议
117
+ 1. **JADX反编译**: 先使用JADX反编译APK文件
118
+ ```bash
119
+ jadx -d out_jadx app.apk
120
+ ```
121
+
122
+ 2. **类名查找**: 在JADX GUI中找到目标Protobuf类的完整类名
123
+
124
+ 3. **输出目录**: 确保输出目录有写入权限
125
+
126
+ 4. **日志查看**: 使用`--verbose`参数查看详细处理过程
127
+
128
+ ## 📊 输出示例
129
+
130
+ ### 输入:Java源码
131
+ ```java
132
+ public final class SearchResult extends GeneratedMessageLite {
133
+ private MapFieldLite<String, Contact> contacts_;
134
+ private Internal.ProtobufList<String> phoneNumbers_;
135
+
136
+ public static final int CONTACTS_FIELD_NUMBER = 1;
137
+ public static final int PHONE_NUMBERS_FIELD_NUMBER = 2;
138
+ }
139
+ ```
140
+
141
+ ### 输出:Proto文件
142
+ ```protobuf
143
+ syntax = "proto3";
144
+
145
+ package com.example.search.v1.models;
146
+
147
+ option java_package = "com.example.search.v1.models";
148
+ option java_multiple_files = true;
149
+
150
+ message SearchResult {
151
+ map<string, Contact> contacts = 1;
152
+ repeated string phone_numbers = 2;
153
+ }
154
+ ```
155
+
156
+ ## 🛠️ 支持的特性
157
+
158
+ ### Protobuf类型支持
159
+ - ✅ 基础类型:`string`, `int32`, `int64`, `bool`, `float`, `double`
160
+ - ✅ 消息类型:嵌套消息和引用消息
161
+ - ✅ 枚举类型:完整的枚举值解析
162
+ - ✅ 重复字段:`repeated` 类型
163
+ - ✅ 映射字段:`map<key, value>` 类型
164
+ - ✅ Oneof字段:互斥字段组
165
+ - ✅ Google Well-Known Types
166
+
167
+ ### 特殊Java类型
168
+ - `MapFieldLite<K, V>` → `map<K, V>`
169
+ - `Internal.ProtobufList<T>` → `repeated T`
170
+ - `Internal.IntList` → `repeated enum` (枚举列表)
171
+
172
+ ## 📁 项目结构
173
+
174
+ ```
175
+ reproto/
176
+ ├── main.py # 主程序入口
177
+ ├── core/ # 核心组件
178
+ │ ├── reconstructor.py # 主协调器
179
+ │ └── info_decoder.py # 字节码解码器
180
+ ├── parsing/ # 解析模块
181
+ │ ├── java_parser.py # Java文件解析器
182
+ │ └── enum_parser.py # 枚举解析器
183
+ ├── generation/ # 生成模块
184
+ │ └── proto_generator.py # Proto文件生成器
185
+ ├── models/ # 数据模型
186
+ │ └── message_definition.py # 消息和枚举定义
187
+ ├── utils/ # 工具函数
188
+ │ ├── logger.py # 日志系统
189
+ │ ├── file_cache.py # 文件缓存系统
190
+ │ ├── type_utils.py # 类型处理工具
191
+ │ └── report_utils.py # 结果统计工具
192
+ └── include/ # Google Protobuf标准文件
193
+ └── google/protobuf/ # Well-Known Types
194
+ ```
195
+
196
+ ## 🔧 开发
197
+
198
+ ```bash
199
+ # 使用Poetry管理依赖
200
+ poetry install
201
+ poetry shell
202
+
203
+ # 运行测试
204
+ reproto ../out_jadx/sources com.example.TestClass ../test_output --verbose
205
+ ```
206
+
207
+ ---
208
+
209
+ **🚀 立即开始重构你的Protobuf文件!**
210
+
@@ -1,4 +1,4 @@
1
- .git/COMMIT_EDITMSG,sha256=ZMxpH6pUokSXJnvPbcBeiLQoVYGBv8788wLQgPcFiNA,1448
1
+ .git/COMMIT_EDITMSG,sha256=wCgfHzkY9fUofZeu8jlYfbP-HbC3oGukMStB0V5cK6A,36
2
2
  .git/FETCH_HEAD,sha256=1W_vttZCTHf9DXnCOhWjilD3kVx9WT2Xu85YBetV3ok,191
3
3
  .git/HEAD,sha256=ly8yuQLWQE8njkYAapHLPJ1xVg6_fMgQjCoHqKvFIdw,21
4
4
  .git/config,sha256=9ZAySfDWBdI-K9eOXyrEQOhiX68AiaP0Z4CLzH07H10,399
@@ -17,18 +17,24 @@
17
17
  .git/hooks/push-to-checkout.sample,sha256=pT0HQXmLKHxt16-mSu5HPzBeZdP0lGO7nXQI7DsSv18,2783
18
18
  .git/hooks/sendemail-validate.sample,sha256=ROv8kj3FRmvACWAvDs8Ge5xlRZq_6IaN3Em3jmztepI,2308
19
19
  .git/hooks/update.sample,sha256=jV8vqD4QPPCLV-qmdSHfkZT0XL28s32lKtWGCXoU0QY,3650
20
- .git/index,sha256=BER3aCt6YwpTb83kAomV29Y3J8N9jcywkFQVsXY1Xb8,4051
20
+ .git/index,sha256=S46Qz5JK2xQ0R0ZrtoDcknobMIA09k7V7jW1eWmpSLg,4139
21
21
  .git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
22
- .git/logs/HEAD,sha256=-CcVfS3LpVa-2MqX9JK7LnQRWoK7vCUcDLJeq3pM4uU,2713
23
- .git/logs/refs/heads/iyue,sha256=-CcVfS3LpVa-2MqX9JK7LnQRWoK7vCUcDLJeq3pM4uU,2713
24
- .git/logs/refs/remotes/gitlab/iyue,sha256=jeolLO8iLbjBoFjZN__vHDb7FKx23J926MSII56UAJ4,1904
22
+ .git/logs/HEAD,sha256=ShXoDgUWGsr0BPUm81Uouu_5ALGmN02XxzUf3jvSnLU,3402
23
+ .git/logs/refs/heads/iyue,sha256=ShXoDgUWGsr0BPUm81Uouu_5ALGmN02XxzUf3jvSnLU,3402
24
+ .git/logs/refs/remotes/gitlab/iyue,sha256=eLuTgGW3hvFMkBfE_puyd-tyfv9f9kT1mY5V73UrSGU,2448
25
25
  .git/logs/refs/remotes/origin/HEAD,sha256=4vCPTgC0N80jhmkFXNUlYvHtGllYJkQTGZEn6LlqZgs,163
26
- .git/logs/refs/remotes/origin/iyue,sha256=uT9xHigXpK42G5YW12Vz_w51KYtge70zwBhUL0_mYtE,1904
26
+ .git/logs/refs/remotes/origin/iyue,sha256=iPHY1VFHyGvSPN64fqG9pSZG6n6R2JBkUiJL3S3CITQ,2448
27
+ .git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872,sha256=qvjEp_xD7FT8C2qIxFzoHETfgdG_Ilj-ZKMURK0woik,2268
28
+ .git/objects/00/885cebf557ff261574deb93cb96449d06db01c,sha256=AFzclJZweg-CmVNt99YI3Ho9dqghj1vsZrPI4Jy9mkI,288
29
+ .git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa,sha256=M92vMZ87NltwEsn7mZuk87PtBP687n4-ET0qrPtk7Tg,507
27
30
  .git/objects/03/3fab23ccc74b707a31f6f37dc5df42c100aac0,sha256=QeXQ9x_0kJVZzjaA6G8MSPxwkIdZxg3bQpOt3gPmUio,3536
31
+ .git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa,sha256=JWG_MmB15Ez0qpSsbn7QUORFRbzUVxt7KpR7tlikJsQ,2257
28
32
  .git/objects/07/b71df33935c14ddf99e3480c04eca4685028bc,sha256=jk2YdZfFLF0_L6dtC5g3NXzhkuPzW8x5n5F2pD-Ih4s,1032
33
+ .git/objects/08/760c38a9f9a4b5d4de0a1df0d197b27c1592d6,sha256=DJ3Kc3LZiZssb0pkrP5g0WeztOvZa8jm0Bk7NVmEbJg,752
29
34
  .git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc,sha256=wyFL5jJ16f0xCpL1MB5EiJvs2opieE0hMEmyDpUV3ps,9356
30
35
  .git/objects/0b/e20ea749c6ae1075ae98f9426e00b0a4a235af,sha256=oRIrMdIqLj8tPUctDVp0A3INeadtii7UAn40HVOJQDY,19177
31
36
  .git/objects/0c/7b11b535a18f311aedadbe91e14fc9fe6b50d9,sha256=1nmf96foQAXQrObKn9gOPugLMlpj7soMif1MBARmKd8,427
37
+ .git/objects/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f,sha256=eA2WMZnt5zYXRw6O8u_slLMZxbwvOoOR9EAX8I2iDM0,168
32
38
  .git/objects/13/5f50fea51c72f977f48d06a7584aba0f61e260,sha256=ecYtHQ_j-MSBN5YdAbHdDdfuJB4WJudHggEe9zUA0FY,1239
33
39
  .git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1,sha256=rTCuhPM5LYusLIMDv7CLC557SlRFvvbBzgr4jwrjMVg,426
34
40
  .git/objects/15/eb3f02479e633439ec83c143e703f8448043a1,sha256=duJXtvq_NNhYKG7WdejXgoMlyHIaCUG5jv9SJpU_orc,14711
@@ -39,28 +45,41 @@
39
45
  .git/objects/1e/46816d16e7c9db7575f1964403c3daa105be5c,sha256=Wqo7uWsh11BefjHvh2CEqowaA6zmNR-TcvNJv6WYjr4,459
40
46
  .git/objects/20/cf56ec106bcd66420dd000279f983571b918b6,sha256=0dwZwG7CpR7yYYNvgYDxHLPj2P7eRLK7fTW_En419pk,166
41
47
  .git/objects/21/55b64d52922c88527c102d62f23e5c2abbae79,sha256=6LLW2HrSfqqVwvO59yc-EcUp6MHw6zfHwu8TB775dII,13853
48
+ .git/objects/22/316ec4a32601c236f997552e9600b7b40e3162,sha256=YNjEPm2QQ9kRVdHdMyVyXMniijMSWKEg6iSnyeP1bnU,3409
42
49
  .git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0,sha256=hYW2b3t3bVGNh4pqyyA7DMlyF4LfNZco5NwedWMwwuI,3700
50
+ .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8,sha256=V9cd-XeITtK7Mq7ecpJpWGpi23_5Ny-qnsY4jRHWdDQ,606
43
51
  .git/objects/26/1f67f3b731b32f6d77de9dd7be2d61e2a14ace,sha256=mcasCBpCulVy2N-X_d2hg8567PdhZRof4ea5nYoelJM,96
44
52
  .git/objects/27/24208ca2442e8ab9b453d0eb230fa41243b270,sha256=3nPNI4PWt3CdzVHzOVuTD522nSv9SS1T2U1kPBBt40I,50
45
53
  .git/objects/29/4708b82b343e04e7a6685f5cd1287f3d17f7a9,sha256=YE3F4zucGeMHEw7bTEvQc0uJEUUCfEgw-mZTWupuNhA,96
54
+ .git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314,sha256=rG2er-EGko6WdUiYq106KxXwc-kQDXj8FAqt931D3nw,459
46
55
  .git/objects/2b/64656ce2df6259c822733b03f26eb828fe9269,sha256=62hS2mVKecw3uXd8yGs7djzHNeouyhbP6KhR1gGYosg,166
47
56
  .git/objects/2c/fcddd7eebeb4eee0562dc384a79366bc7b04bb,sha256=FHxE2giqoo-1IB9Q8i_XQUypGvQbRlRnTK0sbsNDcJE,96
48
57
  .git/objects/2d/2b812ca27c477f9e1b2c2706a5eb795ffcf8eb,sha256=hATm5xxgdr9nhfzRX98_KBaPYdY9BbWNuTmJO7__Oxk,5518
58
+ .git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1,sha256=4F5UqKkv_Lg1gt2nwo6_WklFZxldCeEGbmwpSOSVvrs,122
49
59
  .git/objects/2d/a515dbb88d31400d5b84d41caf270e9309232d,sha256=cP9jUGnu5pVr9ks-YJZSEjsgb7GKD2XEr8XvQosqs2s,122
60
+ .git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8,sha256=TB1KNq7_JLKvNuYVyzJDi0sD8jvM3mmFqy4exWpiQxs,780
50
61
  .git/objects/2e/2c1c42f5ac5d665cc672d3792078b756d9ab0e,sha256=5LG3jHGORJeswNw0lz5dc6QSsxztyMstbRDADhZDnZY,166
62
+ .git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16,sha256=8MrOQUbawLupyywR0LMr9ldryJuFnShbWE11kaI9Qsw,97
51
63
  .git/objects/33/181441ab38eded005db356da89b54c7d29f452,sha256=iIM6a2aGs_TGZjxHKnkYYyZj_hA77nAF7r2lMOtN1VA,2021
52
64
  .git/objects/33/52dfa8f5d9eb46cc98ea7ccecf02e4d9df95f7,sha256=KNAvQNdSalt8CxCZVVb8e6KBC4zqVtusT5MriFLPbIQ,4409
65
+ .git/objects/33/633c9df669ff8cf38638717937a54990814268,sha256=T-g8iQIgxPSszRTJtvY9SLL6b6PPTLFwI99ZRIxuODY,252
53
66
  .git/objects/34/192f0df5f5b694c881d086019eda349608d222,sha256=zcWIY4oDFz6n17MRjbwFrN1o-HEY0--gqK96dohmZfE,4901
54
67
  .git/objects/35/8bace20b731ff1bbb256d2a0158dfc84720978,sha256=hEPGT0bRzT1GlXErWRWJ7ogflTWj3SutlHRKCBH1TII,426
55
68
  .git/objects/38/907894973091f8e9b224a13fe596e1cb309cf5,sha256=XBdeTonV9fezxtk3kzI6DmEPb3WftSPaIWT30MKKw1E,802
69
+ .git/objects/39/993e3600bf4ab82aa361b738ee97a108787450,sha256=-hGYJt8FRCO90QesR_7HwxAo5gqkNWXOyOlKyVuctxc,17191
70
+ .git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd,sha256=C2MsAjEcFMNDimrinw_yA4EvTmYGRkHkoTHOCv4dhf8,5608
56
71
  .git/objects/3c/6f0120229cc2cd8123efbeb7f186eb0a485f29,sha256=iyh7Xt-m7vou3slm58k8xSl3Cn2yYXTuv5WziSWHrW0,802
57
72
  .git/objects/3c/c3ca375694d43e35cdc88d4a5d067e510df427,sha256=A79FHqMtws8sYqMG9CmHWbEPaxF8htYc_E2wVuMi2u4,6570
58
73
  .git/objects/3d/3cc6aab4eefed46c77dda27503bebcce88962c,sha256=6NOdtY3stGMa7_trzPhvb2T21Ng0WqFIJhkPhsW-ACU,420
74
+ .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a,sha256=kBQ8krCCjNFnKOXS4OPkX60C7wQdUWtNJB1zs-LrPVc,2656
59
75
  .git/objects/3e/d953d5ed2c66722045f5e39d068696a0853b4f,sha256=GelU4l-EVo8Y5rXSksIEnewIasEr9N54pTJcgrY3VVk,166
76
+ .git/objects/3f/ac4973433ec0116d2348fe7a748a0002702efb,sha256=xKKUEGEH8hWB4mhKhvJkSC23j4xwJJcr4Vo99kNPquQ,155
60
77
  .git/objects/3f/b8830f516342a0ae1cb7c34b65016827cb9570,sha256=j36c6Wtp0Lp9HVP1xvV-2c25opLFzd3kzuxRHirgb9Y,803
61
78
  .git/objects/40/84f4567d983a977c49598b7d886e46b13ff50b,sha256=R3w6EvxpJRcVuJvbCslrGDK07kcOjECGGosj5tO-JBo,426
79
+ .git/objects/40/c6c8816b3ebd8cac4fa36f20454c84aa5929d1,sha256=pcWmJXs3mDGeHCLW7AA0PkCRA_bcOIuhjD9e4fYzmVk,322
62
80
  .git/objects/41/f40c22247de377be99e30784229f3f128508a2,sha256=3k-QVtbIvbMHt2cHrPJ0oh4TckwD6Pux6_v5J-EJhvY,2189
63
81
  .git/objects/44/4af3a0d68ba81976f67c7b638c9b0db4640709,sha256=s__MvPzT4Ndsip8kgkfMh-Y0oZ28tv2kVqaz_ExQKvU,166
82
+ .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555,sha256=4AN9Jlc9SttC8DK9ADUjw9wTEYnASrz4HubQCpVgXVc,417
64
83
  .git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37,sha256=KP9dXx-XniZuIEXESlrL_MWWi55zGiFr7xtmp3oD67o,8551
65
84
  .git/objects/48/cb11e75518a53be14146018214110986fade67,sha256=08B_QIXJL2_dGh_r-GmudDgLAmT-Bia0eRYyIbOKvFw,2562
66
85
  .git/objects/4b/43f5f577e1cdc35f8e06d178d8f5c892034061,sha256=eawBjiWutNeKjIzvNonVMMKUVsz_-jn3Uew_NsKQJ-I,1150
@@ -75,11 +94,16 @@
75
94
  .git/objects/5a/11f9d70791e06a0570e01d3dcbbae39cde55db,sha256=wjd8hb5D03icknLFsPqMas6xAFfG30_Wg-PJJH03ezg,13722
76
95
  .git/objects/5b/d4d87753b79e9157817f0c2e6964a731052854,sha256=PK8JbTxqE1VLYE1hCBt6rPI6nSmJKnVnVYbpo42DftU,57
77
96
  .git/objects/5c/715dcb05e32db7a7a3b030f07524bdd8a56849,sha256=wLXhy_1PP8n3Gd6NsvY1eFlK1pjkIjW35im_BD-0yMU,426
97
+ .git/objects/5d/3e5b3d75b03eba63deda0dcac7ca304d41e4da,sha256=ijAKnBWyR_h8s3B-C_j314y0zFiT_fdiQrGr3HiDVIQ,2352
78
98
  .git/objects/5d/e2e9d536c2c0b78e8f9b3b61daa531a55332dc,sha256=Wiyz9xFF5A95FEnxZULmV9TSJf0-erTb_qIhLFIvmag,6558
79
99
  .git/objects/5e/9daac72a48ce60688ab2eeddcc3d9152329e20,sha256=7sVW8qTIBHufxZ3WCnNwmX33RpciuLTPritqr84UmKk,426
100
+ .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17,sha256=zmGY1G58wmmZq2KD_Bu3Sy4-9iKKFiYMK52xOHbYfA0,343
101
+ .git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785,sha256=q08wTKfTUrWaDDDEIiQMxG0rfLK5LyogjwXQTQ88QQI,1986
102
+ .git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5,sha256=r4ZyBKnna37wrE8JwnYWK84WB1OVsnXGU3N8vGnP5mg,18987
80
103
  .git/objects/65/0189fe083bd711e45d463b229a72be619abad2,sha256=A_rjGnyEfF5LPXsd1JWYWya49pffPhLzU4Gkg7p9Fcs,506
81
104
  .git/objects/65/a4f0ada7519f8b1e6a7c7e287541b8effde9fd,sha256=jSGkVjAMcm2nrF6w_0U7lmzoBgwIJaf4P8POOlABxEQ,188
82
105
  .git/objects/66/663db35bfec8ef5f1a5b1c840fde1bb62a0eb8,sha256=5xcSNodjk8EYRqTQHZIX7-0mG35aBsCzOkiqK2sIzRc,252
106
+ .git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926,sha256=dym8X8VQl5GHh61t4umiy4z0oA_ATiKybPr4jIRjJk4,1165
83
107
  .git/objects/66/7291e131d4769e7d028346a0cc7a0c05d500e5,sha256=3D6kzCQW7DkYuwARYA74Tlfzeaiaob9ux4YE6hYohas,4026
84
108
  .git/objects/67/f27f77274917580e687fd00ca18da0660215c1,sha256=dxM9_T9v3VBrSXF3dbH6zsmbGQJn43-_DnHiDYs8108,15542
85
109
  .git/objects/67/f54a4a3ede6749acc7c718ad97a86634215b5e,sha256=n0_tiP-u_DP9uhXCryaz98mNJYcUX8RYiS48FvxIxCA,744
@@ -88,50 +112,78 @@
88
112
  .git/objects/76/311aa8e59d780763e0d66787067cc5d9613a67,sha256=J9Xy8ESXbWUbC_4sA0KumGVKm09tzlqA8C5oJ63a_b4,2167
89
113
  .git/objects/78/3e7e252c20e73e33615c703174766036546ff6,sha256=cQ-PXyvzEYjb2Lr24anO9aGui5IxBxZCYXL6zZRc0xc,810
90
114
  .git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d,sha256=Ju-Yuy5EARcIThU4vkHrZuHQWu3MjXSZYGtBDTWR18c,96
115
+ .git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6,sha256=d9SniNMBerFoLZP7nlahqG6nPtrR6YVMjSSiJm5RRXs,2887
116
+ .git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403,sha256=7jgXb9blUSWiQVPh8rpVxhpRQg9RyQS3zUSC1n7oGbY,17336
91
117
  .git/objects/7e/5935774ee7a85f2523427c9100f9c578ac172f,sha256=ywEI3w5JgIOgFDJ6cxc6NJnLfEr2Cjynke78KmwJhSE,165
118
+ .git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd,sha256=ZCTiAwFMKB3R7tU1zMGM-WZNU3Fy_DeAM2r-ukPIwdQ,284
119
+ .git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9,sha256=073he9D2S-4EPQh6cBs0Xm2dEOxPTwZrGstzcSkJGCE,3897
92
120
  .git/objects/8a/0ed0ed8886fbc823e8d2258fa6d18699e94e25,sha256=VpidpA9wUduTJVrffzMKo4KL6HAhkBBxZEaNdGX9Ejw,122
93
121
  .git/objects/8c/809c42c7ae13007fd885ee7bcffae7acf2c520,sha256=HYoU3_cZUGur3rWrgRvzHRAv0JfrXgc34R8UeGbC5Bc,14180
94
122
  .git/objects/8d/44142ae2d6dbb59d4ebed8587bccd051e5766b,sha256=l1G5ZzQBQW8Lxd3WvGLRcY6quM6dBL4zdNT5ovjv3Dc,802
95
123
  .git/objects/8d/4a5767bef0c342f1660526f9671c0944922c40,sha256=kP0nfEnyNmuEJ4wLQabhPPx60OIa5Dxqn7R9Ni89CqY,1900
96
124
  .git/objects/8d/d857b3d0ab3f5cd2e9173d532ef86e30df8eda,sha256=dTFdFA8EPaLpDuJ4X-hfXjbwiAfKBY-EvFJ77H2mRxY,18883
125
+ .git/objects/90/6b05fdb9211a7d32515bb2da31e58e4ca89916,sha256=s9CyHii7wMQLwnQhCfvRoe2aKSoezlKhOyWfrfP8uPo,821
126
+ .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054,sha256=EyDEXseNoUivqR25-icLPWkaKt2pimwOucf7u4TyAIw,130
97
127
  .git/objects/92/c6018b4fb8e3b6c2f3f3054a56f2bfaca27470,sha256=Oox2busLjPpkXw6To9NfgDMXHuknlICbhyhyTWUT1lU,96
128
+ .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487,sha256=7VYYZiscg3mWnC4xmuQViLHakgctCXCTAonqA_76BAw,283
129
+ .git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12,sha256=GEtc_eOpbXXtFY1zj1dOlStEULevK-Lxr8O7PhjbvOg,431
98
130
  .git/objects/94/ce01b61b90d1fb21d2d339fbeb22e821b6f413,sha256=oSSA97T7TGnstzHDjUrdwzwZO4d1qIUyjo6lz_EbNbM,122
99
131
  .git/objects/95/295a15779ebefd563ec777c3d3cced7e8d0209,sha256=IIN8_K0K-3LAkUI4Ra3DS8yUsfpsqteSDGhgvRpSfZ4,426
100
132
  .git/objects/97/56fe0931216a7c40cbf250e1ab8a6dfd589f13,sha256=Su7Q-bXO0K9QKEGC249NVuUS62xmQs5TgWfEmdbauaI,97
101
133
  .git/objects/97/71dd4958faa94d3db229c129f6af35b508905a,sha256=Tc_ZkUqvJ4rk0QG5Bvwkp4DkMM9DlsmjdMIyDaO1S2k,756
134
+ .git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6,sha256=K1HnCs6nMYhqr8xsnBRqv6rRibDz4wPp8CoMT00hGOc,381
102
135
  .git/objects/9a/e313cdf64cd82416c1238eb493e6396f799f12,sha256=9bPRhebwMVqtGqJUxfVq-TEUxceuOdSvicWe1H8F7Ks,876
103
136
  .git/objects/9e/23448ac58f907d9d123c32bdccedbb3d6741b5,sha256=iqH9u5FAMzeSJ8QgFQnE1D2jPxIWx7b66Vd0RrqetvI,96
104
137
  .git/objects/9e/9978522bc8ca79133d7c11ef8ca3fe3c7eed0a,sha256=FkHx7Pp6DCZ5e4bRo2RjRU875YBgl9tEw7Z_9Rii8cE,13109
105
138
  .git/objects/9f/b57064e0c53ed80af8507acaab718a1e80184e,sha256=DGx0Ie-bppvghrmiV5w7mn24c6YlvHvYLIQsm-_jzsQ,635
106
139
  .git/objects/a0/d192999af7e2cbfa6a9ccd04d720a04e5a06d5,sha256=Zd6l-w5TxqsdgCZqkDz_pr9BWPJGb5bmbDrFlMl2Qx8,882
107
140
  .git/objects/a0/d630c3f6024b196d4ee933ab13a32905efdaaa,sha256=nNyB1T2FVU2vm3f-aAjEl-vBLbxYsKHibRIPhqCX9jQ,426
141
+ .git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec,sha256=_b3Xk8IbERvYune9G8gOgOxFqc2o33xxzzAB_bZNIWM,806
108
142
  .git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3,sha256=Vee0H8dhSj4ERNDSAnRU6vebs0tbY1-lgYr1Nz5X7bc,122
143
+ .git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6,sha256=hgFU3fWeozpZCBrngHHTeUYH3C6lqKBSSz15-OuI_jM,9716
109
144
  .git/objects/a5/b7e4e1b63bfb65288f6553687aaabcfb4d51b1,sha256=9tl9xb48EdvQk9GIg6mEzXSwqUgD6yEVZx-sVxaQVKw,1064
145
+ .git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8,sha256=j-hYLtVwUhhYEY4BLe7J6m51GlpKdbZWUgKJwsEUt1M,389
110
146
  .git/objects/a9/cc7923c34a4c97c5711d6309672f41d46c612a,sha256=NvxVg0v7oBl27tQ8feThD45Gw97gZ6ZbbqVUZbp3CYQ,1041
147
+ .git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e,sha256=eji1dZ5VSnUSuD_KuyL2kD5ZqVTmxl6QzKh37HhFhPI,1068
111
148
  .git/objects/ae/046e08176523e8a98dc7294436319f724db13c,sha256=9hdXV7BKRhfFTOz3FSuoYwGrcjvk2uTPo3CD1czuKcU,803
112
149
  .git/objects/af/c9cc15629847447063e86a82b8b56abb4fc08f,sha256=dzjzk6kncEmUtMbBEhkOuThFWDb4-2AyaFmKHpGU_RI,3155
113
150
  .git/objects/b0/7a43f0462bf25a8b1f4c0ca60c1b533dae1dde,sha256=JWzlC7nXy3RXBUxEcge1_ciMw6q3C5phffVck9MVlJk,404
151
+ .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9,sha256=Tn8y8C287Wd8ZZsQ4FgduAQMlD-ANm8l0i6XeA0J9mc,476
114
152
  .git/objects/b1/db1c131cf32916028342c0037ce8eb57a8eb26,sha256=bgcHj-13lalI3KZLo4PS1xneLz-E1oSxp1qIfCiqSH0,17243
115
153
  .git/objects/b2/8334b94392b8af397a05ed702690fa6c9ab1ca,sha256=QnXhDj4XDoGwytea6h_RgeaoWX3jXffxX6S7DcMzRZo,3461
154
+ .git/objects/b2/a941b669991d7e0f9bdc35f1014897a933f4e2,sha256=ZDcO2IZt7d6zBfixJDRRlhI6ICjNWKeziD4dZsDj2rs,168
116
155
  .git/objects/b3/28dc445ee33220db9359370fc0089a77174101,sha256=cipG_34_tKM5VPfYW2wRCmBYOqlmTBIUjakeph9sfl4,3652
117
156
  .git/objects/b3/d2b3037bede44e7e4d18dc99419f8c712c9c62,sha256=OIWo7wvTTKYZkYkxcZrOtnvfqgGlPezaE6sglITaF_Y,1156
118
157
  .git/objects/b8/7c89dcfce9e244ff5ef6a4bd394de12e8c8092,sha256=kE2ed_VMlop9lFeD9xXhrmql0ybRkMT6SbgWSP-0f7I,1249
158
+ .git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976,sha256=o-hyZsAo9YH-jq5u10qF9Ub07ttduIWahRk7XC15Huo,96
159
+ .git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6,sha256=NL3ke3EzpuAgSXzGAaSX6IyTxnnTtbx-_4PRxUYVnRM,122
119
160
  .git/objects/c3/93db4841dbbb8acf54e9af12b6705c9f5ecde9,sha256=g36XyKIObniMsMBcIzsoG7f82SzOgn_Bdx-V9Rezjbg,3864
120
161
  .git/objects/c3/c8594874dd9ff9c21662fd06cac9b5baadbba0,sha256=5YUWDZ-BMZvyOJksaoiKeZC0N-eRcOJemLb_jNUHcC4,14309
162
+ .git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b,sha256=CiygqPJlDIOMLlTCLtqGjX1-0nLuibvSqApdkzgx_Dk,130
163
+ .git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e,sha256=VLZ8PjQLeTsUdf5hJgRYEVffMMDcVPaND5S6p_G0QQ4,507
164
+ .git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e,sha256=Dml4LNMu14Kq4DUCqcD7PhPdwxCnnVe77BqS9bZYJr8,170
121
165
  .git/objects/c8/2a656fe6b5d479b327cdf5fe3bf60db987a2a2,sha256=YNf8mWKTqJHeBDQCTfOU8b0ZDDSfbAb1fBGGDsySrHk,426
122
166
  .git/objects/c8/cb3bb9552dcf6a368a1418996c4b925db2d8ab,sha256=3AlcdjxamfHKOBmAuectuKNLwOYa1BovnOmVElfwPb4,13097
123
167
  .git/objects/c9/a6ca8f8efee4a5632e9a655ced29f1b708f35e,sha256=IOmxZbePi1cWHt2HzdDNtWy0SYR2XvigDkGK2fyNbWU,4957
124
168
  .git/objects/c9/cdef9ab627b874ffe6455a47583a75bf16496d,sha256=7y908SUa7dmWJyNXDKS_tOdrcfmI6OjZc7zvtL38M5Y,428
169
+ .git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd,sha256=__y7gpz4_Vp-4bf0WIBORv-fmu9OFyi42u7lE5mbpbU,2868
125
170
  .git/objects/cd/2d6c229438c6b1c694b9392a85888d89ef49c1,sha256=IW9iGk3Eb-i_Ht64HQcltVp27ziQHz5IP6k5p57YFtY,122
126
171
  .git/objects/d0/9c84ad2142a187bf26a1714b7041b62e404c8f,sha256=twhhaZbfU_mgu5LIlt9ZeGjp_PT_gri_9H231H5nrNc,2172
172
+ .git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626,sha256=m7rrmOVyAvhOIaRUmhbOzSTY5WKs47KUo7wFsM4XR90,2368
173
+ .git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a,sha256=XiS705YKH6IJsELw5ZgbSeLdKH2qw96denj85BNEJJY,284
174
+ .git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588,sha256=YLEdJmuYNQDi1sYzQr0H1gFdExgTKIsY_Ugosmnzf3Q,314
127
175
  .git/objects/d9/3bd435c8c7ad4efb83dff04d5450fabb9e3faf,sha256=Dfce7XnTEPSLCJamlY36SeWUBiScdITejT2zhr9xwbg,2816
128
176
  .git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a,sha256=3w45hxiT2rn6ljSdgo36fHMMWZt30r5C1FPvbnjq9tc,597
177
+ .git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42,sha256=KAWFa4xuE56xukGPMlcOjxQ6xh1FlSrTYvgGyMypTX0,96
178
+ .git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b,sha256=j1qdeViwHsSkT6l8xwFVDZ82wa2y638a6LsvVrUQnho,2154
129
179
  .git/objects/db/beedb30613f79ae3ff67df1428cf8ade223711,sha256=tTGayiwSvdy-uBiXQKRhNnToZ_dc1BmeXZ2mltuRfxY,3812
130
180
  .git/objects/df/f8f64cee2b97df7d86f73207c5e690f98f0208,sha256=eRT2hUSKxaIPfQVnE9NaRGxbAvBVCSreSOGzVGtd7As,213
131
181
  .git/objects/e2/b7433fbfbfac5bc800a962be2f4adbed145b42,sha256=eqX17kz7wSegBgSYS8q4oMPsZVvNWoDbpCRw7oI5PmE,15527
132
182
  .git/objects/e3/27755808d88c7ae5c06c229cf18bd0519646df,sha256=GQJi0cnGbjOZLiK8-PyTZlVupBaT6g-ar2N-RJp0NN4,9619
133
183
  .git/objects/e4/1e5aa2bc3074c2014d01ab1f603f69c327a83f,sha256=5daI7Vb9ehvOwoqgaBAKilm6Z6YdA4Rk4MFjJChbWpA,379
184
+ .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31,sha256=YJmX3vsaaoauuSFWAJqD3wriTdWueanhd_r5zroQqY8,232
134
185
  .git/objects/e5/83e7c40be934d16a1fa2e973487b395d930f42,sha256=BLXKgjdPyjn2Y-x-OQfbdg5JXCq3Nrnvwh5PfGMpmxQ,1848
186
+ .git/objects/e6/5ff9bea681f0b8f409ec27761935883c1f0cc9,sha256=7ffpb5T9vtoe8pe6pXi4mytBTBsoyIxQfkAwwZNdeGA,458
135
187
  .git/objects/e8/1433b6ad92206cdadbee1f474b4f99383314cb,sha256=mRMdmx6wCs6b-63QL72Iutm2AUVCOIYs7J5XbAsLluc,426
136
188
  .git/objects/e8/2f42ea26b8bf4f0bc92c0648ac8f190f14226d,sha256=xtbEwloZnqXdNdViAevzyprosfPQ1P--xAu6URGlaYI,155
137
189
  .git/objects/e9/a15996cb55ac72aeb6611d26e8d22246589943,sha256=sTn6X3xMp3_WYpj1CmP2hDqviX86aJHTCzzi_ZTpBKw,4643
@@ -144,6 +196,7 @@
144
196
  .git/objects/f5/18c69a6e1bf3052b79da01502b2837ea58f0f4,sha256=r98SFbCvw7yeAYTjzkw-2VMhOVbpm79FLZQiC5A1-pw,123
145
197
  .git/objects/f5/1be495b96272fa2e47f30071aed35ac1f0dd2c,sha256=xjweeKCHsLUlfdROM1YxycVfwVexy-_1VhEA8Ki4Rfc,5050
146
198
  .git/objects/f7/25a430eb3364460ba854dbc8809edc21dc6c70,sha256=LdyMmAWGLWbn5G5fC7eAPi4NFOboKcJ6iJJdxENSUCk,2505
199
+ .git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7,sha256=yI_zqHGWaq_FUbEiqDWJcqrceTz2TNfSGcOjk7UeZ3c,97
147
200
  .git/objects/fa/fc981b0d80d8d0323c04365785f66996ed5211,sha256=t9N37kVA7j_i4nz0dDMHOQpvziBu5MUpDlG06Hdj77c,4395
148
201
  .git/objects/fc/e15b9dbffd9f37b1f2d46944ee2d0394df6565,sha256=81qdzKkVZ5C_1oej2Mm0q2RLifilVFolIs95mrUfpg4,163
149
202
  .git/objects/fd/0bc07dc3c95e6168ab6d367d9eca139ac1e539,sha256=29lnkRe3MYSLwu997QipK5TLUYzZuOKhQmO3usm17H0,3002
@@ -152,20 +205,19 @@
152
205
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack,sha256=R4oMXhr-NcPAUBXStCbAaUvGUDW_SBECmPIbiB9Gy48,42003
153
206
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev,sha256=22_3sqyTNB5IbwAK5oCqNz0UxDDqoZ5jcF7p_44Lalo,244
154
207
  .git/packed-refs,sha256=4H0m4wd6q98wZkBk7WfvVeTBuuxQdTE65XxsswYP-oQ,112
155
- .git/refs/heads/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
156
- .git/refs/remotes/gitlab/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
208
+ .git/refs/heads/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
209
+ .git/refs/remotes/gitlab/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
157
210
  .git/refs/remotes/origin/HEAD,sha256=G8pFPTbCqnJ2IkCzz9J-STqOXWU6TrlXfpt1wx5bUWE,30
158
- .git/refs/remotes/origin/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
211
+ .git/refs/remotes/origin/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
159
212
  .gitignore,sha256=HHs2RDf54i9UJ3Z-pqWWCy8wyQLN7FCvz8Zm-RGN65s,2091
160
213
  .python-version,sha256=NxOs_9lT1XG8y-FjlRru-YinX5RcBJt_ulPwgDESZ_o,7
161
214
  ARCHITECTURE.md,sha256=HiUhP4wGzy4lD01MpHjOgAhuAUwpNsEac3tZaE65kos,12047
162
- README.md,sha256=khO65a7VGeyjyUxxXpu1W_EosoPLzJyWCol6jDVzw9k,8484
163
- core/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
164
- core/bytecode_parser.py,sha256=bv01quLoLeKHjswLU86g4w3MeZR9uh7WIJsnV2sGE2g,11399
165
- core/info_decoder.py,sha256=vQtB7JvJ9letQCovGuwmSo6g8Npkpy-W5UCZk5PzIFE,73318
166
- core/reconstructor.py,sha256=9uIbo69iPvuFqfArokf_BwadA2Cd6fZBiqEfITKrgEw,62211
167
- generation/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
168
- generation/proto_generator.py,sha256=DPPng-Nna3sW5d200D-P7vbOE8vx7X3R6cBwhq7cjqY,21958
215
+ README.md,sha256=CNBsu4ulQZ5JiU2aqlU3FsLof6DmpKfMtbhhjdGfp60,5399
216
+ core/__init__.py,sha256=PetkS7P_cuz8h9SSQmEJEQKUaaWf6geQnLKRq9uQzjY,688
217
+ core/info_decoder.py,sha256=WgvTTiVr2_bTtH7ip0Pf0C5OKNn-qeSELYOT10r04Aw,73764
218
+ core/reconstructor.py,sha256=LdSH6Z90xR3XdfOP27t-JMbbKU1RKKKwgL6K3WboMm4,62820
219
+ generation/__init__.py,sha256=fqZNYz3HzZb0TeF9KMiQ-Q0BdWuzKkSJ8hEXF4kzHuQ,427
220
+ generation/proto_generator.py,sha256=QTh2-b4rbY3sQZQFBAunL3rCiumvxzOHEvQ4tCEqSkM,22254
169
221
  include/google/protobuf/any.proto,sha256=vPXebORjsaOP92t3lVqn5YC07BKvNKknsdRcnvsPr2Y,6154
170
222
  include/google/protobuf/api.proto,sha256=naqFihxSn0f51O0bwt8Nq2FUrUL5nPA1Gz2p1Nr_jrA,7729
171
223
  include/google/protobuf/compiler/plugin.proto,sha256=fjnlljCh8BGNcVv9D-NIHBYN4hRP9ZUsXj7SCizk-oI,8556
@@ -181,22 +233,24 @@ include/google/protobuf/struct.proto,sha256=G_B7qLmiTjoDkN3aw60NtBxjKH0lJ4iwI5gi
181
233
  include/google/protobuf/timestamp.proto,sha256=FAUsYELB3S0LUCRfKBLqq26vgtsLbozkg-rlJ_c7bug,6449
182
234
  include/google/protobuf/type.proto,sha256=4jDg5K64fJXp8casv8DHE9s_iAlPFJsVRxelHQIPdQs,6367
183
235
  include/google/protobuf/wrappers.proto,sha256=aHjcdTTPmAXu5WNFzcOLXpyjneziRnEMZjxwB6Z_70k,5392
184
- main.py,sha256=3G649-aTByEjMS4tb1A9wcO9NVUxXVSvdwGTq9hXxBI,7081
185
- models/__init__.py,sha256=WScv63rvEl65y5CWjpb6__hvjNvjpCkl6lz1Z2u0IYc,811
236
+ main.py,sha256=4OP5n4Hl7rVfZ2sAixerKvASJfauWzImUkxhm8W35Vk,6204
237
+ models/__init__.py,sha256=KVthXPEPwpKg45LaaX5EIHu6UMY8eLXMnx4rfJB84Xs,825
186
238
  models/message_definition.py,sha256=AszUZnNPSBn9SMXne5ORDBiGZz1W2pcYmU8ftGC3Mks,4873
187
- parsing/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
188
- parsing/enum_parser.py,sha256=4BjMk1NIYgt2FDZUjTZyOvFfC1uJp_MBZipVdk1tqes,6175
189
- parsing/java_parser.py,sha256=yPUAugI_7x_doQhmAu61OGg1m7-UsHMZLyJKDQ9D8bk,33542
190
- pyproject.toml,sha256=YwQ1oFwF1s_H0hPMqy0JHmqTPuG-z-DFCg05kKLYF-8,1378
191
- requirements.txt,sha256=cQGj3IS6Kj88jbwj_jeKkokMnG-fEezWve91mfW4CJs,96
192
- utils/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
193
- utils/builtin_proto.py,sha256=6KnwpTaI4vdydrEeotPf3NSC4Q0kNxT8a9IALxPnt4E,9117
194
- utils/file_cache.py,sha256=eOBkfrumWg0EU1EfLESnRN1kcidi_MocxV_EWP8lEhQ,5207
239
+ parsing/__init__.py,sha256=WBrRACzmxAN4_k7uUo3KSeywvlTJYp5iVSOnU2gNoF8,596
240
+ parsing/enum_parser.py,sha256=Yf59cDLTwIbPRQsuj0tgYUmmtpjY02llmSZ3XlsCqUk,6492
241
+ parsing/java_parser.py,sha256=PZ5gs2aJqcX8sRlC29QIOsrbI-OCRtaHsxkMyvYnkCA,33774
242
+ pyproject.toml,sha256=BsSlxTI53hy5pLze0sHDK3ajhUbb0Smia9UBAPYj_ms,1398
243
+ requirements.txt,sha256=-RokGvMGfwO1GtN-7eNyyfPFdQzD2gQzvb4sKFRqBlM,154
244
+ utils/__init__.py,sha256=wYvkPeNr30up14CBLK3UxMaGlvgYTjK-npgR2SMXgtU,1960
245
+ utils/builtin_proto.py,sha256=PiRdcJGKr02d8NbbedS14mjl6khtTbUzmlpso4q-NHA,9339
246
+ utils/file_cache.py,sha256=m6-fAQsSBVn8-BodjPsmA2C_OqWjnt6mjUyGhT1pFno,5433
195
247
  utils/file_utils.py,sha256=N1Ei7hmyeOkIyZJFEXyNbtTrfeVF2hP-U8evXAVW2MA,4085
196
248
  utils/logger.py,sha256=473DfzFVXzdGpiRTJGY6bBd-V5G80_P07gQqcvDChpQ,2447
197
- utils/type_index.py,sha256=So8FYyGtR0ff-ZhVHjXUdhXiXQEujlcCEJlj7OPQMsg,12128
249
+ utils/report_utils.py,sha256=ftXU27nscrKUPMVWRnjLwckrt4NVBkKAc4zGmgNHwbc,2873
250
+ utils/type_index.py,sha256=ni9hhR321unTQ9kfgsTum59VEh9nJMlUG0ca3V4rSHk,12354
198
251
  utils/type_utils.py,sha256=H32JSIvq1TmZkAZZesEs4VQVc1VXQuJlSLTINTBVkK4,15947
199
- reproto-0.1.2.dist-info/METADATA,sha256=iO1XYicmF4VNspL0JYzw6J_AqNjsXnIu2OR7UDAdYnE,9433
200
- reproto-0.1.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
201
- reproto-0.1.2.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
202
- reproto-0.1.2.dist-info/RECORD,,
252
+ utils/version_checker.py,sha256=sgC4-DqRXPgdCov-fi60BIPo-5KY3MpvfHYyjQ-Ixbw,10560
253
+ reproto-0.1.4.dist-info/METADATA,sha256=LtxHIh5cKAWDYJWt4R-71pbFQEjTAqov97tPWmj4V2U,6388
254
+ reproto-0.1.4.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
255
+ reproto-0.1.4.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
256
+ reproto-0.1.4.dist-info/RECORD,,
requirements.txt CHANGED
@@ -1,3 +1,5 @@
1
1
  # 项目依赖
2
2
  # 使用 loguru 库来提供强大且易于配置的日志记录功能。
3
- loguru
3
+ loguru
4
+ # 使用 packaging 库来进行版本号比较
5
+ packaging
utils/__init__.py CHANGED
@@ -1,3 +1,58 @@
1
+ """
2
+ 工具模块
3
+
4
+ 包含各种辅助工具和实用程序:
5
+ - 日志系统:统一的日志管理
6
+ - 文件缓存:优化文件I/O性能
7
+ - 类型工具:类型转换和命名规范处理
8
+ - 内置Proto:Google Protobuf标准类型支持
9
+ - 报告工具:重构结果统计和展示
10
+ - 版本检测:通用版本更新检测系统
11
+ """
12
+
13
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
14
+ try:
15
+ # 相对导入(包环境)
16
+ from .logger import setup_logger, get_logger
17
+ from .file_cache import get_file_cache
18
+ from .type_utils import type_mapper, naming_converter, field_name_processor
19
+ from .builtin_proto import get_builtin_manager
20
+ from .type_index import get_type_index
21
+ from .report_utils import print_results_summary
22
+ from .version_checker import (
23
+ VersionChecker, create_version_checker, check_pypi_version,
24
+ check_reproto_version, check_version_on_startup, get_package_version
25
+ )
26
+ except ImportError:
27
+ # 绝对导入(开发环境)
28
+ from utils.logger import setup_logger, get_logger
29
+ from utils.file_cache import get_file_cache
30
+ from utils.type_utils import type_mapper, naming_converter, field_name_processor
31
+ from utils.builtin_proto import get_builtin_manager
32
+ from utils.type_index import get_type_index
33
+ from utils.report_utils import print_results_summary
34
+ from utils.version_checker import (
35
+ VersionChecker, create_version_checker, check_pypi_version,
36
+ check_reproto_version, check_version_on_startup, get_package_version
37
+ )
38
+
39
+ __all__ = [
40
+ 'setup_logger',
41
+ 'get_logger',
42
+ 'get_file_cache',
43
+ 'type_mapper',
44
+ 'naming_converter',
45
+ 'field_name_processor',
46
+ 'get_builtin_manager',
47
+ 'get_type_index',
48
+ 'print_results_summary',
49
+ 'VersionChecker',
50
+ 'create_version_checker',
51
+ 'check_pypi_version',
52
+ 'check_reproto_version',
53
+ 'check_version_on_startup',
54
+ 'get_package_version'
55
+ ]
1
56
 
2
57
 
3
58
 
utils/builtin_proto.py CHANGED
@@ -7,7 +7,14 @@ import os
7
7
  import shutil
8
8
  from pathlib import Path
9
9
  from typing import Dict, Set, Optional
10
- from utils.logger import logger
10
+
11
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
12
+ try:
13
+ # 相对导入(包环境)
14
+ from .logger import logger
15
+ except ImportError:
16
+ # 绝对导入(开发环境)
17
+ from utils.logger import logger
11
18
 
12
19
 
13
20
  def find_include_directory() -> Optional[Path]:
utils/file_cache.py CHANGED
@@ -10,7 +10,14 @@ Author: AI Assistant
10
10
  from pathlib import Path
11
11
  from typing import Optional, Dict
12
12
  import threading
13
- from utils.logger import get_logger
13
+
14
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
15
+ try:
16
+ # 相对导入(包环境)
17
+ from .logger import get_logger
18
+ except ImportError:
19
+ # 绝对导入(开发环境)
20
+ from utils.logger import get_logger
14
21
 
15
22
 
16
23
  class FileContentCache:
utils/report_utils.py ADDED
@@ -0,0 +1,71 @@
1
+ """
2
+ 结果报告工具模块
3
+
4
+ 提供重构结果的统计、报告和展示功能
5
+ """
6
+
7
+ import sys
8
+ from typing import Dict, Any, TYPE_CHECKING
9
+
10
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
11
+ if TYPE_CHECKING:
12
+ try:
13
+ # 相对导入(包环境)
14
+ from ..core.reconstructor import ProtoReconstructor
15
+ except ImportError:
16
+ # 绝对导入(开发环境)
17
+ from core.reconstructor import ProtoReconstructor
18
+
19
+
20
+ def print_results_summary(reconstructor: 'ProtoReconstructor', results: Dict[str, Any], logger, verbose: bool) -> None:
21
+ """
22
+ 打印重构结果的详细统计信息
23
+
24
+ Args:
25
+ reconstructor: 重构器实例
26
+ results: 重构结果字典
27
+ logger: 日志记录器
28
+ verbose: 是否显示详细信息
29
+ """
30
+ if not results:
31
+ logger.error("❌ 没有生成任何proto文件!")
32
+ logger.error("请检查:")
33
+ logger.error(" 1. 根类名是否正确")
34
+ logger.error(" 2. Java源码目录是否包含对应的文件")
35
+ logger.error(" 3. 类是否为protobuf消息类")
36
+
37
+ # 显示详细的失败信息
38
+ if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
39
+ logger.error("失败的类:")
40
+ for failed_class, reason in reconstructor.failed_classes.items():
41
+ logger.error(f" • {failed_class}: {reason}")
42
+
43
+ sys.exit(1)
44
+
45
+ # 统计成功和失败的数量
46
+ success_count = len(results)
47
+ failed_count = len(reconstructor.failed_classes) if hasattr(reconstructor, 'failed_classes') else 0
48
+ total_attempted = success_count + failed_count
49
+
50
+ logger.success("✅ 重构完成!")
51
+ logger.info(f"📊 处理统计: 共尝试处理 {total_attempted} 个类型")
52
+
53
+ # 统计消息和枚举数量
54
+ message_count = sum(1 for r in results.values() if hasattr(r, 'fields'))
55
+ enum_count = sum(1 for r in results.values() if hasattr(r, 'values'))
56
+
57
+ logger.info(f" - ✅ 成功: {success_count} 个 (消息: {message_count}, 枚举: {enum_count})")
58
+
59
+ # 显示失败的类
60
+ if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
61
+ logger.warning(f" - ❌ 失败: {failed_count} 个")
62
+ for failed_class, reason in reconstructor.failed_classes.items():
63
+ logger.warning(f" • {failed_class}: {reason}")
64
+
65
+ # 显示跳过的类
66
+ if hasattr(reconstructor, 'skipped_classes') and reconstructor.skipped_classes:
67
+ skipped_count = len(reconstructor.skipped_classes)
68
+ logger.info(f" - ⏭️ 跳过: {skipped_count} 个 (基础类型或已处理)")
69
+ if verbose:
70
+ for skipped_class, reason in reconstructor.skipped_classes.items():
71
+ logger.info(f" • {skipped_class}: {reason}")