claude-mpm 5.0.2__py3-none-any.whl → 5.4.3__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.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (184) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  3. claude_mpm/agents/PM_INSTRUCTIONS.md +1218 -905
  4. claude_mpm/agents/agent_loader.py +10 -17
  5. claude_mpm/agents/base_agent_loader.py +10 -35
  6. claude_mpm/agents/frontmatter_validator.py +68 -0
  7. claude_mpm/agents/templates/circuit-breakers.md +431 -45
  8. claude_mpm/cli/__init__.py +0 -1
  9. claude_mpm/cli/commands/__init__.py +2 -0
  10. claude_mpm/cli/commands/agent_state_manager.py +67 -23
  11. claude_mpm/cli/commands/agents.py +446 -25
  12. claude_mpm/cli/commands/auto_configure.py +535 -233
  13. claude_mpm/cli/commands/configure.py +1500 -147
  14. claude_mpm/cli/commands/configure_agent_display.py +13 -6
  15. claude_mpm/cli/commands/mpm_init/core.py +158 -1
  16. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  17. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  18. claude_mpm/cli/commands/postmortem.py +401 -0
  19. claude_mpm/cli/commands/run.py +1 -39
  20. claude_mpm/cli/commands/skills.py +322 -19
  21. claude_mpm/cli/commands/summarize.py +413 -0
  22. claude_mpm/cli/executor.py +8 -0
  23. claude_mpm/cli/interactive/agent_wizard.py +302 -195
  24. claude_mpm/cli/parsers/agents_parser.py +137 -0
  25. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  26. claude_mpm/cli/parsers/base_parser.py +9 -0
  27. claude_mpm/cli/parsers/skills_parser.py +7 -0
  28. claude_mpm/cli/startup.py +133 -85
  29. claude_mpm/commands/mpm-agents-auto-configure.md +2 -2
  30. claude_mpm/commands/mpm-agents-list.md +2 -2
  31. claude_mpm/commands/mpm-config-view.md +2 -2
  32. claude_mpm/commands/mpm-help.md +3 -0
  33. claude_mpm/commands/{mpm-ticket-organize.md → mpm-organize.md} +4 -5
  34. claude_mpm/commands/mpm-postmortem.md +123 -0
  35. claude_mpm/commands/mpm-session-resume.md +2 -2
  36. claude_mpm/commands/mpm-ticket-view.md +2 -2
  37. claude_mpm/config/agent_presets.py +312 -82
  38. claude_mpm/config/agent_sources.py +27 -0
  39. claude_mpm/config/skill_presets.py +392 -0
  40. claude_mpm/constants.py +1 -0
  41. claude_mpm/core/claude_runner.py +2 -25
  42. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  43. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  44. claude_mpm/core/interactive_session.py +19 -5
  45. claude_mpm/core/oneshot_session.py +16 -4
  46. claude_mpm/core/output_style_manager.py +173 -43
  47. claude_mpm/core/protocols/__init__.py +23 -0
  48. claude_mpm/core/protocols/runner_protocol.py +103 -0
  49. claude_mpm/core/protocols/session_protocol.py +131 -0
  50. claude_mpm/core/shared/singleton_manager.py +11 -4
  51. claude_mpm/core/socketio_pool.py +3 -3
  52. claude_mpm/core/system_context.py +38 -0
  53. claude_mpm/core/unified_agent_registry.py +134 -16
  54. claude_mpm/core/unified_config.py +22 -0
  55. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  56. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-313.pyc +0 -0
  57. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  58. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  59. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  60. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  61. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  62. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  63. claude_mpm/hooks/claude_hooks/event_handlers.py +35 -2
  64. claude_mpm/hooks/claude_hooks/hook_handler.py +4 -0
  65. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  66. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  67. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  68. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  69. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  70. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  71. claude_mpm/hooks/claude_hooks/services/connection_manager.py +4 -0
  72. claude_mpm/models/agent_definition.py +7 -0
  73. claude_mpm/scripts/launch_monitor.py +93 -13
  74. claude_mpm/services/agents/agent_recommendation_service.py +279 -0
  75. claude_mpm/services/agents/cache_git_manager.py +621 -0
  76. claude_mpm/services/agents/deployment/agent_template_builder.py +3 -2
  77. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +110 -3
  78. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +518 -55
  79. claude_mpm/services/agents/git_source_manager.py +20 -0
  80. claude_mpm/services/agents/sources/git_source_sync_service.py +45 -6
  81. claude_mpm/services/agents/toolchain_detector.py +6 -5
  82. claude_mpm/services/analysis/__init__.py +35 -0
  83. claude_mpm/services/analysis/clone_detector.py +1030 -0
  84. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  85. claude_mpm/services/analysis/postmortem_service.py +765 -0
  86. claude_mpm/services/command_deployment_service.py +106 -5
  87. claude_mpm/services/core/base.py +7 -2
  88. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  89. claude_mpm/services/event_bus/config.py +3 -1
  90. claude_mpm/services/git/git_operations_service.py +8 -8
  91. claude_mpm/services/mcp_config_manager.py +75 -145
  92. claude_mpm/services/mcp_service_verifier.py +6 -3
  93. claude_mpm/services/monitor/daemon.py +37 -10
  94. claude_mpm/services/monitor/daemon_manager.py +134 -21
  95. claude_mpm/services/monitor/server.py +225 -19
  96. claude_mpm/services/project/project_organizer.py +4 -0
  97. claude_mpm/services/runner_configuration_service.py +16 -3
  98. claude_mpm/services/session_management_service.py +16 -4
  99. claude_mpm/services/socketio/event_normalizer.py +15 -1
  100. claude_mpm/services/socketio/server/core.py +160 -21
  101. claude_mpm/services/version_control/git_operations.py +103 -0
  102. claude_mpm/utils/agent_filters.py +261 -0
  103. claude_mpm/utils/gitignore.py +3 -0
  104. claude_mpm/utils/migration.py +372 -0
  105. claude_mpm/utils/progress.py +5 -1
  106. {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/METADATA +69 -84
  107. {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/RECORD +112 -153
  108. {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/entry_points.txt +0 -2
  109. claude_mpm/dashboard/analysis_runner.py +0 -455
  110. claude_mpm/dashboard/index.html +0 -13
  111. claude_mpm/dashboard/open_dashboard.py +0 -66
  112. claude_mpm/dashboard/static/css/activity.css +0 -1958
  113. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  114. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  115. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  116. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  117. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  118. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  119. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  120. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  121. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  122. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  123. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  124. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  125. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  126. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  127. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  128. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  129. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  130. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  131. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  132. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  133. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  134. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  135. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  136. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  137. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  138. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  139. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  140. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  141. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  142. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  143. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  144. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  145. claude_mpm/dashboard/templates/code_simple.html +0 -153
  146. claude_mpm/dashboard/templates/index.html +0 -606
  147. claude_mpm/dashboard/test_dashboard.html +0 -372
  148. claude_mpm/scripts/mcp_server.py +0 -75
  149. claude_mpm/scripts/mcp_wrapper.py +0 -39
  150. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  151. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  152. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  153. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  154. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  155. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  156. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  157. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  158. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  159. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  160. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
  161. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  162. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  163. claude_mpm/services/mcp_gateway/main.py +0 -589
  164. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  165. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  166. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  167. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  168. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  169. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  170. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  171. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  172. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  173. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  174. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  175. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  176. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  177. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  178. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  179. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  180. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  181. /claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +0 -0
  182. {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/WHEEL +0 -0
  183. {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/licenses/LICENSE +0 -0
  184. {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/top_level.txt +0 -0
@@ -1,370 +0,0 @@
1
- /**
2
- * Enhanced Connection Status Styles
3
- * Provides visual feedback for connection state and quality
4
- */
5
-
6
- /* Connection Status Badge Enhancements */
7
- .status-badge {
8
- display: inline-flex;
9
- align-items: center;
10
- gap: 6px;
11
- padding: 6px 12px;
12
- border-radius: 20px;
13
- font-size: 13px;
14
- font-weight: 600;
15
- transition: all 0.3s ease;
16
- position: relative;
17
- overflow: hidden;
18
- }
19
-
20
- .status-badge span {
21
- display: inline-block;
22
- animation: pulse 2s infinite;
23
- }
24
-
25
- /* Connection States */
26
- .status-connecting {
27
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
28
- color: white;
29
- }
30
-
31
- .status-connecting span {
32
- animation: spin 1s linear infinite;
33
- }
34
-
35
- .status-connected {
36
- background: linear-gradient(135deg, #667eea 0%, #4299e1 100%);
37
- color: white;
38
- box-shadow: 0 2px 10px rgba(66, 153, 225, 0.3);
39
- }
40
-
41
- .status-connected span {
42
- color: #68d391;
43
- animation: pulse-connected 2s infinite;
44
- }
45
-
46
- .status-reconnecting {
47
- background: linear-gradient(135deg, #f6d365 0%, #fda085 100%);
48
- color: #744210;
49
- }
50
-
51
- .status-reconnecting span {
52
- animation: spin 1s linear infinite;
53
- }
54
-
55
- .status-disconnected {
56
- background: linear-gradient(135deg, #e3e3e3 0%, #b8b8b8 100%);
57
- color: #4a5568;
58
- }
59
-
60
- .status-stale {
61
- background: linear-gradient(135deg, #ffeaa7 0%, #fdcb6e 100%);
62
- color: #744210;
63
- }
64
-
65
- .status-stale::after {
66
- content: '';
67
- position: absolute;
68
- top: 0;
69
- left: -100%;
70
- width: 100%;
71
- height: 100%;
72
- background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
73
- animation: shimmer 2s infinite;
74
- }
75
-
76
- .status-failed {
77
- background: linear-gradient(135deg, #fc5c7d 0%, #fc5c7d 100%);
78
- color: white;
79
- }
80
-
81
- /* Connection Quality Indicator */
82
- .connection-quality {
83
- display: flex;
84
- align-items: center;
85
- gap: 8px;
86
- padding: 4px 8px;
87
- background: #f7fafc;
88
- border-radius: 8px;
89
- font-size: 12px;
90
- }
91
-
92
- .quality-bar {
93
- width: 60px;
94
- height: 6px;
95
- background: #e2e8f0;
96
- border-radius: 3px;
97
- overflow: hidden;
98
- position: relative;
99
- }
100
-
101
- .quality-fill {
102
- height: 100%;
103
- transition: width 0.3s ease, background 0.3s ease;
104
- border-radius: 3px;
105
- }
106
-
107
- .quality-good .quality-fill {
108
- background: linear-gradient(90deg, #68d391, #48bb78);
109
- }
110
-
111
- .quality-moderate .quality-fill {
112
- background: linear-gradient(90deg, #f6d365, #fda085);
113
- }
114
-
115
- .quality-poor .quality-fill {
116
- background: linear-gradient(90deg, #fc5c7d, #fc5c7d);
117
- }
118
-
119
- .quality-text {
120
- color: #4a5568;
121
- font-weight: 500;
122
- }
123
-
124
- /* Latency Display */
125
- .connection-latency {
126
- display: inline-flex;
127
- align-items: center;
128
- padding: 2px 6px;
129
- border-radius: 4px;
130
- font-size: 11px;
131
- font-weight: 600;
132
- font-family: 'SF Mono', Monaco, monospace;
133
- }
134
-
135
- .latency-good {
136
- background: #c6f6d5;
137
- color: #22543d;
138
- }
139
-
140
- .latency-moderate {
141
- background: #fed7aa;
142
- color: #7c2d12;
143
- }
144
-
145
- .latency-poor {
146
- background: #fed7d7;
147
- color: #742a2a;
148
- }
149
-
150
- /* Connection Metrics Panel */
151
- .connection-metrics {
152
- background: white;
153
- border-radius: 12px;
154
- padding: 16px;
155
- box-shadow: 0 2px 8px rgba(0,0,0,0.08);
156
- margin-top: 16px;
157
- }
158
-
159
- .metrics-grid {
160
- display: grid;
161
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
162
- gap: 12px;
163
- }
164
-
165
- .metric-item {
166
- text-align: center;
167
- padding: 8px;
168
- background: #f7fafc;
169
- border-radius: 8px;
170
- }
171
-
172
- .metric-value {
173
- font-size: 20px;
174
- font-weight: 700;
175
- color: #2d3748;
176
- display: block;
177
- }
178
-
179
- .metric-label {
180
- font-size: 11px;
181
- color: #718096;
182
- text-transform: uppercase;
183
- letter-spacing: 0.5px;
184
- margin-top: 4px;
185
- }
186
-
187
- /* Notification Area */
188
- .connection-notifications {
189
- position: fixed;
190
- top: 20px;
191
- right: 20px;
192
- z-index: 1000;
193
- max-width: 320px;
194
- }
195
-
196
- .notification {
197
- background: white;
198
- padding: 12px 16px;
199
- border-radius: 8px;
200
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
201
- margin-bottom: 8px;
202
- font-size: 14px;
203
- opacity: 1;
204
- transition: opacity 0.3s ease, transform 0.3s ease;
205
- animation: slideIn 0.3s ease;
206
- border-left: 4px solid;
207
- }
208
-
209
- .notification-info {
210
- border-left-color: #4299e1;
211
- }
212
-
213
- .notification-success {
214
- border-left-color: #48bb78;
215
- background: #f0fff4;
216
- }
217
-
218
- .notification-warning {
219
- border-left-color: #ed8936;
220
- background: #fffdf7;
221
- }
222
-
223
- .notification-error {
224
- border-left-color: #f56565;
225
- background: #fff5f5;
226
- }
227
-
228
- /* Connection Health Badge */
229
- .connection-health {
230
- display: inline-flex;
231
- align-items: center;
232
- gap: 6px;
233
- padding: 4px 8px;
234
- background: #f7fafc;
235
- border-radius: 6px;
236
- font-size: 12px;
237
- }
238
-
239
- .health-indicator {
240
- width: 8px;
241
- height: 8px;
242
- border-radius: 50%;
243
- animation: pulse 2s infinite;
244
- }
245
-
246
- .health-excellent {
247
- background: #48bb78;
248
- box-shadow: 0 0 0 2px rgba(72, 187, 120, 0.3);
249
- }
250
-
251
- .health-good {
252
- background: #38b2ac;
253
- box-shadow: 0 0 0 2px rgba(56, 178, 172, 0.3);
254
- }
255
-
256
- .health-fair {
257
- background: #ed8936;
258
- box-shadow: 0 0 0 2px rgba(237, 137, 54, 0.3);
259
- }
260
-
261
- .health-poor {
262
- background: #f56565;
263
- box-shadow: 0 0 0 2px rgba(245, 101, 101, 0.3);
264
- }
265
-
266
- /* Animations */
267
- @keyframes pulse {
268
- 0%, 100% {
269
- opacity: 1;
270
- }
271
- 50% {
272
- opacity: 0.5;
273
- }
274
- }
275
-
276
- @keyframes pulse-connected {
277
- 0%, 100% {
278
- transform: scale(1);
279
- opacity: 1;
280
- }
281
- 50% {
282
- transform: scale(1.2);
283
- opacity: 0.8;
284
- }
285
- }
286
-
287
- @keyframes spin {
288
- from {
289
- transform: rotate(0deg);
290
- }
291
- to {
292
- transform: rotate(360deg);
293
- }
294
- }
295
-
296
- @keyframes shimmer {
297
- to {
298
- left: 100%;
299
- }
300
- }
301
-
302
- @keyframes slideIn {
303
- from {
304
- transform: translateX(100%);
305
- opacity: 0;
306
- }
307
- to {
308
- transform: translateX(0);
309
- opacity: 1;
310
- }
311
- }
312
-
313
- /* Responsive Design */
314
- @media (max-width: 768px) {
315
- .connection-notifications {
316
- right: 10px;
317
- left: 10px;
318
- max-width: none;
319
- }
320
-
321
- .connection-metrics {
322
- padding: 12px;
323
- }
324
-
325
- .metrics-grid {
326
- grid-template-columns: repeat(2, 1fr);
327
- }
328
- }
329
-
330
- /* Dark Mode Support */
331
- @media (prefers-color-scheme: dark) {
332
- .connection-quality {
333
- background: #2d3748;
334
- }
335
-
336
- .quality-bar {
337
- background: #4a5568;
338
- }
339
-
340
- .quality-text {
341
- color: #cbd5e0;
342
- }
343
-
344
- .connection-metrics {
345
- background: #2d3748;
346
- box-shadow: 0 2px 8px rgba(0,0,0,0.3);
347
- }
348
-
349
- .metric-item {
350
- background: #1a202c;
351
- }
352
-
353
- .metric-value {
354
- color: #e2e8f0;
355
- }
356
-
357
- .metric-label {
358
- color: #a0aec0;
359
- }
360
-
361
- .notification {
362
- background: #2d3748;
363
- color: #e2e8f0;
364
- box-shadow: 0 4px 12px rgba(0,0,0,0.3);
365
- }
366
-
367
- .connection-health {
368
- background: #2d3748;
369
- }
370
- }