nodepyx 1.0.0

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 (184) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +399 -0
  3. package/binding.gyp +73 -0
  4. package/dist/core/PyCallable.d.ts +65 -0
  5. package/dist/core/PyCallable.d.ts.map +1 -0
  6. package/dist/core/PyCallable.js +109 -0
  7. package/dist/core/PyCallable.js.map +1 -0
  8. package/dist/core/PyContext.d.ts +76 -0
  9. package/dist/core/PyContext.d.ts.map +1 -0
  10. package/dist/core/PyContext.js +228 -0
  11. package/dist/core/PyContext.js.map +1 -0
  12. package/dist/core/PyIterator.d.ts +84 -0
  13. package/dist/core/PyIterator.d.ts.map +1 -0
  14. package/dist/core/PyIterator.js +243 -0
  15. package/dist/core/PyIterator.js.map +1 -0
  16. package/dist/core/PyModule.d.ts +55 -0
  17. package/dist/core/PyModule.d.ts.map +1 -0
  18. package/dist/core/PyModule.js +172 -0
  19. package/dist/core/PyModule.js.map +1 -0
  20. package/dist/core/PyProxy.d.ts +65 -0
  21. package/dist/core/PyProxy.d.ts.map +1 -0
  22. package/dist/core/PyProxy.js +483 -0
  23. package/dist/core/PyProxy.js.map +1 -0
  24. package/dist/core/PyRuntime.d.ts +105 -0
  25. package/dist/core/PyRuntime.d.ts.map +1 -0
  26. package/dist/core/PyRuntime.js +438 -0
  27. package/dist/core/PyRuntime.js.map +1 -0
  28. package/dist/env/CondaManager.d.ts +118 -0
  29. package/dist/env/CondaManager.d.ts.map +1 -0
  30. package/dist/env/CondaManager.js +401 -0
  31. package/dist/env/CondaManager.js.map +1 -0
  32. package/dist/env/PackageInstaller.d.ts +233 -0
  33. package/dist/env/PackageInstaller.d.ts.map +1 -0
  34. package/dist/env/PackageInstaller.js +609 -0
  35. package/dist/env/PackageInstaller.js.map +1 -0
  36. package/dist/env/PythonDetector.d.ts +103 -0
  37. package/dist/env/PythonDetector.d.ts.map +1 -0
  38. package/dist/env/PythonDetector.js +381 -0
  39. package/dist/env/PythonDetector.js.map +1 -0
  40. package/dist/env/VenvManager.d.ts +117 -0
  41. package/dist/env/VenvManager.d.ts.map +1 -0
  42. package/dist/env/VenvManager.js +331 -0
  43. package/dist/env/VenvManager.js.map +1 -0
  44. package/dist/index.d.ts +169 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +393 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/plugins/Plugin.interface.d.ts +41 -0
  49. package/dist/plugins/Plugin.interface.d.ts.map +1 -0
  50. package/dist/plugins/Plugin.interface.js +12 -0
  51. package/dist/plugins/Plugin.interface.js.map +1 -0
  52. package/dist/plugins/PluginManager.d.ts +26 -0
  53. package/dist/plugins/PluginManager.d.ts.map +1 -0
  54. package/dist/plugins/PluginManager.js +174 -0
  55. package/dist/plugins/PluginManager.js.map +1 -0
  56. package/dist/plugins/builtin/NumpyPlugin.d.ts +17 -0
  57. package/dist/plugins/builtin/NumpyPlugin.d.ts.map +1 -0
  58. package/dist/plugins/builtin/NumpyPlugin.js +41 -0
  59. package/dist/plugins/builtin/NumpyPlugin.js.map +1 -0
  60. package/dist/plugins/builtin/PandasPlugin.d.ts +19 -0
  61. package/dist/plugins/builtin/PandasPlugin.d.ts.map +1 -0
  62. package/dist/plugins/builtin/PandasPlugin.js +57 -0
  63. package/dist/plugins/builtin/PandasPlugin.js.map +1 -0
  64. package/dist/plugins/builtin/TorchPlugin.d.ts +23 -0
  65. package/dist/plugins/builtin/TorchPlugin.d.ts.map +1 -0
  66. package/dist/plugins/builtin/TorchPlugin.js +50 -0
  67. package/dist/plugins/builtin/TorchPlugin.js.map +1 -0
  68. package/dist/plugins/index.d.ts +7 -0
  69. package/dist/plugins/index.d.ts.map +1 -0
  70. package/dist/plugins/index.js +12 -0
  71. package/dist/plugins/index.js.map +1 -0
  72. package/dist/serialization/DataFrameBridge.d.ts +141 -0
  73. package/dist/serialization/DataFrameBridge.d.ts.map +1 -0
  74. package/dist/serialization/DataFrameBridge.js +355 -0
  75. package/dist/serialization/DataFrameBridge.js.map +1 -0
  76. package/dist/serialization/MsgPackSerializer.d.ts +45 -0
  77. package/dist/serialization/MsgPackSerializer.d.ts.map +1 -0
  78. package/dist/serialization/MsgPackSerializer.js +242 -0
  79. package/dist/serialization/MsgPackSerializer.js.map +1 -0
  80. package/dist/serialization/NumpyBridge.d.ts +96 -0
  81. package/dist/serialization/NumpyBridge.d.ts.map +1 -0
  82. package/dist/serialization/NumpyBridge.js +323 -0
  83. package/dist/serialization/NumpyBridge.js.map +1 -0
  84. package/dist/serialization/Serializer.d.ts +78 -0
  85. package/dist/serialization/Serializer.d.ts.map +1 -0
  86. package/dist/serialization/Serializer.js +281 -0
  87. package/dist/serialization/Serializer.js.map +1 -0
  88. package/dist/types/PythonTypeMapper.d.ts +87 -0
  89. package/dist/types/PythonTypeMapper.d.ts.map +1 -0
  90. package/dist/types/PythonTypeMapper.js +449 -0
  91. package/dist/types/PythonTypeMapper.js.map +1 -0
  92. package/dist/types/StubCache.d.ts +109 -0
  93. package/dist/types/StubCache.d.ts.map +1 -0
  94. package/dist/types/StubCache.js +333 -0
  95. package/dist/types/StubCache.js.map +1 -0
  96. package/dist/types/TypeGenerator.d.ts +139 -0
  97. package/dist/types/TypeGenerator.d.ts.map +1 -0
  98. package/dist/types/TypeGenerator.js +372 -0
  99. package/dist/types/TypeGenerator.js.map +1 -0
  100. package/dist/types/addon.d.ts +114 -0
  101. package/dist/types/addon.d.ts.map +1 -0
  102. package/dist/types/addon.js +32 -0
  103. package/dist/types/addon.js.map +1 -0
  104. package/dist/types/config.d.ts +175 -0
  105. package/dist/types/config.d.ts.map +1 -0
  106. package/dist/types/config.js +35 -0
  107. package/dist/types/config.js.map +1 -0
  108. package/dist/types/index.d.ts +10 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/index.js +12 -0
  111. package/dist/types/index.js.map +1 -0
  112. package/dist/types/python.d.ts +235 -0
  113. package/dist/types/python.d.ts.map +1 -0
  114. package/dist/types/python.js +7 -0
  115. package/dist/types/python.js.map +1 -0
  116. package/dist/utils/ErrorTranslator.d.ts +83 -0
  117. package/dist/utils/ErrorTranslator.d.ts.map +1 -0
  118. package/dist/utils/ErrorTranslator.js +210 -0
  119. package/dist/utils/ErrorTranslator.js.map +1 -0
  120. package/dist/utils/Logger.d.ts +27 -0
  121. package/dist/utils/Logger.d.ts.map +1 -0
  122. package/dist/utils/Logger.js +115 -0
  123. package/dist/utils/Logger.js.map +1 -0
  124. package/dist/utils/MemoryMonitor.d.ts +44 -0
  125. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  126. package/dist/utils/MemoryMonitor.js +143 -0
  127. package/dist/utils/MemoryMonitor.js.map +1 -0
  128. package/package.json +177 -0
  129. package/python/error_handler.py +433 -0
  130. package/python/nodepyx_runtime.py +575 -0
  131. package/python/serializer.py +379 -0
  132. package/python/type_inspector.py +288 -0
  133. package/scripts/build-native.js +68 -0
  134. package/scripts/download-prebuilds.js +99 -0
  135. package/scripts/generate-stubs.js +405 -0
  136. package/scripts/install.js +260 -0
  137. package/src/core/PyCallable.ts +137 -0
  138. package/src/core/PyContext.ts +296 -0
  139. package/src/core/PyIterator.ts +294 -0
  140. package/src/core/PyModule.ts +194 -0
  141. package/src/core/PyProxy.ts +605 -0
  142. package/src/core/PyRuntime.ts +504 -0
  143. package/src/env/CondaManager.ts +451 -0
  144. package/src/env/PackageInstaller.ts +738 -0
  145. package/src/env/PythonDetector.ts +414 -0
  146. package/src/env/VenvManager.ts +396 -0
  147. package/src/index.ts +425 -0
  148. package/src/native/gil_guard.cpp +26 -0
  149. package/src/native/gil_guard.h +175 -0
  150. package/src/native/nodepyx_addon.cpp +886 -0
  151. package/src/native/python_bridge.cpp +790 -0
  152. package/src/native/python_bridge.h +257 -0
  153. package/src/native/thread_pool.cpp +336 -0
  154. package/src/native/thread_pool.h +175 -0
  155. package/src/native/type_converter.cpp +901 -0
  156. package/src/native/type_converter.h +272 -0
  157. package/src/nextjs/PyProvider.tsx +123 -0
  158. package/src/nextjs/index.ts +21 -0
  159. package/src/nextjs/usePython.ts +106 -0
  160. package/src/nextjs/withnodepyx.ts +88 -0
  161. package/src/plugins/Plugin.interface.ts +51 -0
  162. package/src/plugins/PluginManager.ts +155 -0
  163. package/src/plugins/builtin/NumpyPlugin.ts +36 -0
  164. package/src/plugins/builtin/PandasPlugin.ts +49 -0
  165. package/src/plugins/builtin/TorchPlugin.ts +56 -0
  166. package/src/plugins/index.ts +7 -0
  167. package/src/serialization/DataFrameBridge.ts +398 -0
  168. package/src/serialization/MsgPackSerializer.ts +220 -0
  169. package/src/serialization/NumpyBridge.ts +332 -0
  170. package/src/serialization/Serializer.ts +320 -0
  171. package/src/types/PythonTypeMapper.ts +495 -0
  172. package/src/types/StubCache.ts +340 -0
  173. package/src/types/TypeGenerator.ts +491 -0
  174. package/src/types/addon.ts +170 -0
  175. package/src/types/config.ts +226 -0
  176. package/src/types/index.ts +55 -0
  177. package/src/types/python.ts +309 -0
  178. package/src/types/stubs/numpy.d.ts +441 -0
  179. package/src/types/stubs/pandas.d.ts +575 -0
  180. package/src/types/stubs/sklearn.d.ts +728 -0
  181. package/src/types/stubs/torch.d.ts +694 -0
  182. package/src/utils/ErrorTranslator.ts +220 -0
  183. package/src/utils/Logger.ts +119 -0
  184. package/src/utils/MemoryMonitor.ts +175 -0
@@ -0,0 +1,609 @@
1
+ "use strict";
2
+ /**
3
+ * nodepyx — PackageInstaller
4
+ *
5
+ * Standalone pip-based package installer that works both inside and outside
6
+ * virtualenv/conda contexts. It is the single place where all pip interaction
7
+ * is concentrated so that VenvManager, CondaManager, and the public nodepyx API
8
+ * all delegate here instead of shelling out to pip themselves.
9
+ *
10
+ * Responsibilities
11
+ * ──────────────────────────────────────────────────────────────────────────────
12
+ * • Resolve the "import name" from the "install name" (e.g. scikit-learn → sklearn)
13
+ * • Check whether a package is already importable before trying to install it
14
+ * • Run pip with the correct flags (--quiet, --no-warn-script-location, etc.)
15
+ * • Support per-package version constraints ("numpy>=1.24,<2")
16
+ * • Support extras ("uvicorn[standard]")
17
+ * • Support index overrides (corporate PyPI mirrors, --extra-index-url)
18
+ * • Upgrade existing installations when requested
19
+ * • Emit structured progress events via EventEmitter
20
+ * • Retry transient network failures up to N times with back-off
21
+ * • Parse pip's JSON output (--report) for installed metadata when available
22
+ * • Return full InstallResult objects describing what happened
23
+ *
24
+ * Usage
25
+ * ──────────────────────────────────────────────────────────────────────────────
26
+ * const installer = new PackageInstaller({ pythonExecutable: '/usr/bin/python3' });
27
+ *
28
+ * const result = await installer.install(['pandas', 'numpy>=1.24', 'torch']);
29
+ * console.log(result.installed); // ['pandas==2.2.2', 'numpy==1.26.4', ...]
30
+ *
31
+ * installer.on('progress', (ev) => console.log(ev.package, ev.status));
32
+ */
33
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ var desc = Object.getOwnPropertyDescriptor(m, k);
36
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
37
+ desc = { enumerable: true, get: function() { return m[k]; } };
38
+ }
39
+ Object.defineProperty(o, k2, desc);
40
+ }) : (function(o, m, k, k2) {
41
+ if (k2 === undefined) k2 = k;
42
+ o[k2] = m[k];
43
+ }));
44
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
45
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
46
+ }) : function(o, v) {
47
+ o["default"] = v;
48
+ });
49
+ var __importStar = (this && this.__importStar) || (function () {
50
+ var ownKeys = function(o) {
51
+ ownKeys = Object.getOwnPropertyNames || function (o) {
52
+ var ar = [];
53
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
54
+ return ar;
55
+ };
56
+ return ownKeys(o);
57
+ };
58
+ return function (mod) {
59
+ if (mod && mod.__esModule) return mod;
60
+ var result = {};
61
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
62
+ __setModuleDefault(result, mod);
63
+ return result;
64
+ };
65
+ })();
66
+ Object.defineProperty(exports, "__esModule", { value: true });
67
+ exports.INSTALL_TO_IMPORT = exports.PackageInstaller = void 0;
68
+ exports.createSystemInstaller = createSystemInstaller;
69
+ exports.createVenvInstaller = createVenvInstaller;
70
+ exports.resolveImportName = resolveImportName;
71
+ exports.extractPackageName = extractPackageName;
72
+ const events_1 = require("events");
73
+ const child_process_1 = require("child_process");
74
+ const fs = __importStar(require("fs"));
75
+ const path = __importStar(require("path"));
76
+ const Logger_1 = require("../utils/Logger");
77
+ const logger = new Logger_1.Logger('PackageInstaller');
78
+ // ─── Import-name alias table ──────────────────────────────────────────────────
79
+ // Maps pip install name → Python import name.
80
+ // Only entries that differ from the install name need to be listed here.
81
+ const INSTALL_TO_IMPORT = {
82
+ 'scikit-learn': 'sklearn',
83
+ 'scikit_learn': 'sklearn',
84
+ 'Pillow': 'PIL',
85
+ 'pillow': 'PIL',
86
+ 'opencv-python': 'cv2',
87
+ 'opencv-python-headless': 'cv2',
88
+ 'opencv_python': 'cv2',
89
+ 'beautifulsoup4': 'bs4',
90
+ 'beautifulsoup': 'bs4',
91
+ 'pyyaml': 'yaml',
92
+ 'PyYAML': 'yaml',
93
+ 'python-dateutil': 'dateutil',
94
+ 'python_dateutil': 'dateutil',
95
+ 'typing-extensions': 'typing_extensions',
96
+ 'typing_extensions': 'typing_extensions',
97
+ 'pyzmq': 'zmq',
98
+ 'Pyzmq': 'zmq',
99
+ 'protobuf': 'google.protobuf',
100
+ 'grpcio': 'grpc',
101
+ 'psutil': 'psutil',
102
+ 'python-dotenv': 'dotenv',
103
+ 'python_dotenv': 'dotenv',
104
+ 'Werkzeug': 'werkzeug',
105
+ 'Flask': 'flask',
106
+ 'Django': 'django',
107
+ 'Jinja2': 'jinja2',
108
+ 'SQLAlchemy': 'sqlalchemy',
109
+ 'alembic': 'alembic',
110
+ 'aiohttp': 'aiohttp',
111
+ 'httpx': 'httpx',
112
+ 'fastapi': 'fastapi',
113
+ 'starlette': 'starlette',
114
+ 'uvicorn': 'uvicorn',
115
+ 'gunicorn': 'gunicorn',
116
+ 'celery': 'celery',
117
+ 'redis': 'redis',
118
+ 'pymongo': 'pymongo',
119
+ 'motor': 'motor',
120
+ 'aiomysql': 'aiomysql',
121
+ 'asyncpg': 'asyncpg',
122
+ 'psycopg2': 'psycopg2',
123
+ 'psycopg2-binary': 'psycopg2',
124
+ 'psycopg2_binary': 'psycopg2',
125
+ 'boto3': 'boto3',
126
+ 'botocore': 'botocore',
127
+ 'google-cloud-storage': 'google.cloud.storage',
128
+ 'google-auth': 'google.auth',
129
+ 'azure-storage-blob': 'azure.storage.blob',
130
+ 'minio': 'minio',
131
+ 'transformers': 'transformers',
132
+ 'datasets': 'datasets',
133
+ 'tokenizers': 'tokenizers',
134
+ 'diffusers': 'diffusers',
135
+ 'accelerate': 'accelerate',
136
+ 'peft': 'peft',
137
+ 'trl': 'trl',
138
+ 'sentence-transformers': 'sentence_transformers',
139
+ 'sentence_transformers': 'sentence_transformers',
140
+ 'faiss-cpu': 'faiss',
141
+ 'faiss-gpu': 'faiss',
142
+ 'annoy': 'annoy',
143
+ 'chromadb': 'chromadb',
144
+ 'pinecone-client': 'pinecone',
145
+ 'weaviate-client': 'weaviate',
146
+ 'langchain': 'langchain',
147
+ 'openai': 'openai',
148
+ 'anthropic': 'anthropic',
149
+ 'tiktoken': 'tiktoken',
150
+ 'matplotlib': 'matplotlib',
151
+ 'seaborn': 'seaborn',
152
+ 'plotly': 'plotly',
153
+ 'bokeh': 'bokeh',
154
+ 'altair': 'altair',
155
+ 'scipy': 'scipy',
156
+ 'statsmodels': 'statsmodels',
157
+ 'lightgbm': 'lightgbm',
158
+ 'xgboost': 'xgboost',
159
+ 'catboost': 'catboost',
160
+ 'shap': 'shap',
161
+ 'lime': 'lime',
162
+ 'sympy': 'sympy',
163
+ 'networkx': 'networkx',
164
+ 'pyarrow': 'pyarrow',
165
+ 'pyarrow[flight]': 'pyarrow',
166
+ 'polars': 'polars',
167
+ 'dask': 'dask',
168
+ 'ray': 'ray',
169
+ 'pydantic': 'pydantic',
170
+ 'pydantic-settings': 'pydantic_settings',
171
+ 'attrs': 'attr',
172
+ 'cattrs': 'cattr',
173
+ 'click': 'click',
174
+ 'typer': 'typer',
175
+ 'rich': 'rich',
176
+ 'tqdm': 'tqdm',
177
+ 'loguru': 'loguru',
178
+ 'structlog': 'structlog',
179
+ 'pendulum': 'pendulum',
180
+ 'arrow': 'arrow',
181
+ 'humanize': 'humanize',
182
+ 'tabulate': 'tabulate',
183
+ 'prettytable': 'prettytable',
184
+ 'orjson': 'orjson',
185
+ 'ujson': 'ujson',
186
+ 'msgpack': 'msgpack',
187
+ 'lz4': 'lz4',
188
+ 'zstandard': 'zstd',
189
+ 'cryptography': 'cryptography',
190
+ 'paramiko': 'paramiko',
191
+ 'fabric': 'fabric',
192
+ 'invoke': 'invoke',
193
+ 'pytest': 'pytest',
194
+ 'hypothesis': 'hypothesis',
195
+ 'mock': 'unittest.mock',
196
+ 'freezegun': 'freezegun',
197
+ 'factory-boy': 'factory',
198
+ 'Faker': 'faker',
199
+ };
200
+ exports.INSTALL_TO_IMPORT = INSTALL_TO_IMPORT;
201
+ // ─── Helpers ───────────────────────────────────────────────────────────────────
202
+ /**
203
+ * Extract the bare package name from a spec string.
204
+ * "numpy>=1.24,<2" → "numpy"
205
+ * "torch==2.3.0+cu121" → "torch"
206
+ * "uvicorn[standard]" → "uvicorn"
207
+ */
208
+ function extractPackageName(spec) {
209
+ // Remove VCS prefixes (git+https://...)
210
+ if (spec.startsWith('git+') || spec.startsWith('hg+') || spec.startsWith('svn+')) {
211
+ const eggIndex = spec.indexOf('#egg=');
212
+ if (eggIndex !== -1) {
213
+ return spec.slice(eggIndex + 5).split('&')[0].trim();
214
+ }
215
+ return spec;
216
+ }
217
+ // Remove extras [...], then split on version specifiers
218
+ return spec.replace(/\[.*?\]/g, '').split(/[><=!~;]/)[0].trim();
219
+ }
220
+ /**
221
+ * Determine the Python import name for a given install spec.
222
+ */
223
+ function resolveImportName(spec, override) {
224
+ if (override) {
225
+ return override;
226
+ }
227
+ const bare = extractPackageName(spec);
228
+ return INSTALL_TO_IMPORT[bare] ?? bare.replace(/-/g, '_');
229
+ }
230
+ /** Escape a string for safe inclusion in a Python one-liner. */
231
+ function escapePy(s) {
232
+ return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
233
+ }
234
+ /** Sleep helper. */
235
+ function sleep(ms) {
236
+ return new Promise((r) => setTimeout(r, ms));
237
+ }
238
+ // ─── PackageInstaller ──────────────────────────────────────────────────────────
239
+ class PackageInstaller extends events_1.EventEmitter {
240
+ _python;
241
+ _opts;
242
+ constructor(options) {
243
+ super();
244
+ this._python = options.pythonExecutable;
245
+ this._opts = {
246
+ pythonExecutable: options.pythonExecutable,
247
+ indexUrl: options.indexUrl ?? '',
248
+ extraIndexUrls: options.extraIndexUrls ?? [],
249
+ trustedHosts: options.trustedHosts ?? [],
250
+ maxRetries: options.maxRetries ?? 3,
251
+ retryDelayMs: options.retryDelayMs ?? 1000,
252
+ cwd: options.cwd ?? process.cwd(),
253
+ env: options.env ?? {},
254
+ timeoutMs: options.timeoutMs ?? 300_000,
255
+ quiet: options.quiet !== false,
256
+ upgrade: options.upgrade ?? false,
257
+ };
258
+ }
259
+ // ── Public API ──────────────────────────────────────────────────────────────
260
+ /**
261
+ * Install one or more packages.
262
+ *
263
+ * @param packages - Array of pip spec strings or PackageSpec objects.
264
+ * @returns InstallResult describing what happened to each package.
265
+ */
266
+ async install(packages) {
267
+ const specs = packages.map((p) => typeof p === 'string' ? { spec: p } : p);
268
+ const result = {
269
+ installed: [],
270
+ alreadyInstalled: [],
271
+ failed: [],
272
+ success: false,
273
+ output: '',
274
+ };
275
+ const toInstall = [];
276
+ // ── 1. Pre-flight: check which are already importable ──────────────────
277
+ for (const spec of specs) {
278
+ const importName = resolveImportName(spec.spec, spec.importName);
279
+ if (!spec.forceReinstall && !this._opts.upgrade && this._isImportable(importName)) {
280
+ logger.debug(`Already importable: ${importName} (${spec.spec})`);
281
+ result.alreadyInstalled.push(spec.spec);
282
+ this._emit('already_installed', spec.spec);
283
+ }
284
+ else {
285
+ toInstall.push(spec);
286
+ }
287
+ }
288
+ if (toInstall.length === 0) {
289
+ result.success = true;
290
+ return result;
291
+ }
292
+ // ── 2. Install in a single pip invocation where possible ──────────────
293
+ // Group specs that do not need individual treatment
294
+ const batchSpecs = toInstall.filter((s) => !s.preRelease);
295
+ const prerelSpecs = toInstall.filter((s) => s.preRelease);
296
+ const outputs = [];
297
+ if (batchSpecs.length > 0) {
298
+ const { out, perPackageResults } = await this._pipInstall(batchSpecs, false);
299
+ outputs.push(out);
300
+ this._mergeResults(result, perPackageResults);
301
+ }
302
+ if (prerelSpecs.length > 0) {
303
+ const { out, perPackageResults } = await this._pipInstall(prerelSpecs, true);
304
+ outputs.push(out);
305
+ this._mergeResults(result, perPackageResults);
306
+ }
307
+ result.output = outputs.join('\n');
308
+ result.success = result.failed.length === 0;
309
+ return result;
310
+ }
311
+ /**
312
+ * Install a single package and return the installed version string.
313
+ * Throws on failure.
314
+ */
315
+ async installOne(spec, options) {
316
+ const result = await this.install([{ spec, ...options }]);
317
+ if (!result.success) {
318
+ const err = result.failed[0];
319
+ throw new Error(`Failed to install ${spec}: ${err?.error ?? 'unknown error'}`);
320
+ }
321
+ return this.getVersion(extractPackageName(spec)) ?? spec;
322
+ }
323
+ /**
324
+ * Upgrade a package to the latest version.
325
+ */
326
+ async upgrade(spec) {
327
+ return this.installOne(spec, { forceReinstall: false });
328
+ }
329
+ /**
330
+ * Uninstall one or more packages.
331
+ */
332
+ async uninstall(packages) {
333
+ if (packages.length === 0) {
334
+ return;
335
+ }
336
+ const args = ['-m', 'pip', 'uninstall', '-y', ...packages];
337
+ logger.info(`Uninstalling: ${packages.join(', ')}`);
338
+ const result = (0, child_process_1.spawnSync)(this._python, args, {
339
+ encoding: 'utf8',
340
+ cwd: this._opts.cwd,
341
+ env: { ...process.env, ...this._opts.env },
342
+ });
343
+ if (result.status !== 0) {
344
+ throw new Error(`pip uninstall failed:\n${result.stderr}`);
345
+ }
346
+ }
347
+ /**
348
+ * Check whether a package is currently importable by Python.
349
+ */
350
+ isImportable(importName) {
351
+ return this._isImportable(importName);
352
+ }
353
+ /**
354
+ * Check whether a package (by install name) is installed and return
355
+ * its version string, or null if not installed.
356
+ */
357
+ getVersion(packageName) {
358
+ const args = ['-m', 'pip', 'show', '--quiet', packageName];
359
+ const r = (0, child_process_1.spawnSync)(this._python, args, {
360
+ encoding: 'utf8',
361
+ env: { ...process.env, ...this._opts.env },
362
+ });
363
+ if (r.status !== 0 || !r.stdout) {
364
+ return null;
365
+ }
366
+ const match = r.stdout.match(/^Version:\s*(.+)$/m);
367
+ return match ? match[1].trim() : null;
368
+ }
369
+ /**
370
+ * Return full metadata for an installed package.
371
+ */
372
+ getMetadata(packageName) {
373
+ const args = ['-m', 'pip', 'show', packageName];
374
+ const r = (0, child_process_1.spawnSync)(this._python, args, {
375
+ encoding: 'utf8',
376
+ env: { ...process.env, ...this._opts.env },
377
+ });
378
+ if (r.status !== 0 || !r.stdout) {
379
+ return null;
380
+ }
381
+ return this._parsePipShow(r.stdout);
382
+ }
383
+ /**
384
+ * List all packages installed in the current Python environment.
385
+ */
386
+ listInstalled() {
387
+ const args = ['-m', 'pip', 'list', '--format=json'];
388
+ const r = (0, child_process_1.spawnSync)(this._python, args, {
389
+ encoding: 'utf8',
390
+ env: { ...process.env, ...this._opts.env },
391
+ });
392
+ if (r.status !== 0 || !r.stdout) {
393
+ return [];
394
+ }
395
+ try {
396
+ return JSON.parse(r.stdout);
397
+ }
398
+ catch {
399
+ return [];
400
+ }
401
+ }
402
+ /**
403
+ * Check which packages from the given list are missing.
404
+ *
405
+ * @param packages - Array of pip spec strings.
406
+ * @returns Array of spec strings that are NOT currently importable.
407
+ */
408
+ getMissing(packages) {
409
+ return packages.filter((spec) => {
410
+ const importName = resolveImportName(spec);
411
+ return !this._isImportable(importName);
412
+ });
413
+ }
414
+ /**
415
+ * Ensure pip itself is up-to-date.
416
+ */
417
+ async upgradePip() {
418
+ logger.info('Upgrading pip...');
419
+ const args = ['-m', 'pip', 'install', '--upgrade', 'pip'];
420
+ const r = (0, child_process_1.spawnSync)(this._python, args, {
421
+ encoding: 'utf8',
422
+ cwd: this._opts.cwd,
423
+ env: { ...process.env, ...this._opts.env },
424
+ });
425
+ if (r.status !== 0) {
426
+ logger.warn(`pip self-upgrade failed (non-fatal):\n${r.stderr}`);
427
+ }
428
+ }
429
+ // ── Private helpers ────────────────────────────────────────────────────────
430
+ /**
431
+ * Run `python -c "import X"` to test importability.
432
+ * This is faster than `pip show` for the common case.
433
+ */
434
+ _isImportable(importName) {
435
+ // Handle dotted names like "google.protobuf"
436
+ const topLevel = importName.split('.')[0];
437
+ const code = `import ${escapePy(topLevel)}`;
438
+ const r = (0, child_process_1.spawnSync)(this._python, ['-c', code], {
439
+ encoding: 'utf8',
440
+ env: { ...process.env, ...this._opts.env },
441
+ });
442
+ return r.status === 0;
443
+ }
444
+ /**
445
+ * Build pip install argument list.
446
+ */
447
+ _buildPipArgs(specs, preRelease) {
448
+ const args = ['-m', 'pip', 'install'];
449
+ if (this._opts.quiet) {
450
+ args.push('--quiet');
451
+ }
452
+ if (this._opts.upgrade) {
453
+ args.push('--upgrade');
454
+ }
455
+ if (preRelease) {
456
+ args.push('--pre');
457
+ }
458
+ args.push('--no-warn-script-location');
459
+ args.push('--disable-pip-version-check');
460
+ if (this._opts.indexUrl) {
461
+ args.push('--index-url', this._opts.indexUrl);
462
+ }
463
+ for (const url of this._opts.extraIndexUrls) {
464
+ args.push('--extra-index-url', url);
465
+ }
466
+ for (const host of this._opts.trustedHosts) {
467
+ args.push('--trusted-host', host);
468
+ }
469
+ for (const s of specs) {
470
+ if (s.forceReinstall) {
471
+ args.push('--force-reinstall');
472
+ }
473
+ args.push(s.spec);
474
+ }
475
+ return args;
476
+ }
477
+ /**
478
+ * Execute pip install with retry logic.
479
+ */
480
+ async _pipInstall(specs, preRelease) {
481
+ const args = this._buildPipArgs(specs, preRelease);
482
+ const specList = specs.map((s) => s.spec).join(', ');
483
+ logger.info(`pip install: ${specList}`);
484
+ specs.forEach((s) => this._emit('installing', s.spec));
485
+ let lastError = '';
486
+ let lastOut = '';
487
+ for (let attempt = 1; attempt <= this._opts.maxRetries; attempt++) {
488
+ const { exitCode, stdout } = await this._runPip(args);
489
+ lastOut = stdout;
490
+ if (exitCode === 0) {
491
+ // Success — resolve versions
492
+ const results = specs.map((s) => {
493
+ const name = extractPackageName(s.spec);
494
+ const version = this.getVersion(name) ?? undefined;
495
+ this._emit('installed', s.spec, version);
496
+ return { spec: s.spec, status: 'installed', version };
497
+ });
498
+ return { out: stdout, perPackageResults: results };
499
+ }
500
+ lastError = stdout;
501
+ const isNetworkError = /connection error|timed out|network/i.test(stdout);
502
+ if (!isNetworkError || attempt === this._opts.maxRetries) {
503
+ break;
504
+ }
505
+ const delay = this._opts.retryDelayMs * 2 ** (attempt - 1);
506
+ logger.warn(`pip attempt ${attempt} failed (network). Retrying in ${delay}ms…`);
507
+ await sleep(delay);
508
+ }
509
+ // Failure path — try each spec individually to isolate the bad one
510
+ const results = [];
511
+ if (specs.length > 1) {
512
+ logger.warn('Batch install failed — falling back to per-package install');
513
+ for (const s of specs) {
514
+ const single = await this._pipInstall([s], preRelease);
515
+ results.push(...single.perPackageResults);
516
+ }
517
+ }
518
+ else {
519
+ const s = specs[0];
520
+ logger.error(`Failed to install ${s.spec}: ${lastError.slice(0, 200)}`);
521
+ this._emit('failed', s.spec, undefined, lastError);
522
+ results.push({ spec: s.spec, status: 'failed', error: lastError });
523
+ }
524
+ return { out: lastOut, perPackageResults: results };
525
+ }
526
+ /**
527
+ * Spawn pip and collect output.
528
+ */
529
+ _runPip(args) {
530
+ return new Promise((resolve) => {
531
+ const proc = (0, child_process_1.spawn)(this._python, args, {
532
+ cwd: this._opts.cwd,
533
+ env: { ...process.env, ...this._opts.env },
534
+ stdio: ['ignore', 'pipe', 'pipe'],
535
+ });
536
+ let stdout = '';
537
+ proc.stdout.on('data', (d) => { stdout += d.toString(); });
538
+ proc.stderr.on('data', (d) => { stdout += d.toString(); });
539
+ const timer = setTimeout(() => {
540
+ proc.kill('SIGKILL');
541
+ stdout += '\n[TIMEOUT]';
542
+ }, this._opts.timeoutMs);
543
+ proc.on('close', (code) => {
544
+ clearTimeout(timer);
545
+ resolve({ exitCode: code ?? 1, stdout });
546
+ });
547
+ });
548
+ }
549
+ /** Merge per-package results into the aggregate InstallResult. */
550
+ _mergeResults(result, perPackage) {
551
+ for (const r of perPackage) {
552
+ if (r.status === 'installed' || r.status === 'upgraded') {
553
+ result.installed.push(r.version ? `${r.spec}==${r.version}` : r.spec);
554
+ }
555
+ else if (r.status === 'already_installed') {
556
+ result.alreadyInstalled.push(r.spec);
557
+ }
558
+ else if (r.status === 'failed') {
559
+ result.failed.push({ spec: r.spec, error: r.error ?? 'unknown' });
560
+ }
561
+ }
562
+ }
563
+ /** Emit a typed progress event. */
564
+ _emit(status, pkg, version, error) {
565
+ const ev = { package: pkg, status, version, error };
566
+ this.emit('progress', ev);
567
+ }
568
+ /** Parse `pip show` output into PackageMetadata. */
569
+ _parsePipShow(raw) {
570
+ const get = (field) => {
571
+ const m = raw.match(new RegExp(`^${field}:\\s*(.*)$`, 'm'));
572
+ return m ? m[1].trim() : '';
573
+ };
574
+ const getList = (field) => {
575
+ const val = get(field);
576
+ return val ? val.split(/,\s*/).filter(Boolean) : [];
577
+ };
578
+ return {
579
+ name: get('Name'),
580
+ version: get('Version'),
581
+ location: get('Location'),
582
+ summary: get('Summary'),
583
+ requires: getList('Requires'),
584
+ requiredBy: getList('Required-by'),
585
+ };
586
+ }
587
+ }
588
+ exports.PackageInstaller = PackageInstaller;
589
+ // ─── Factory helpers ────────────────────────────────────────────────────────────
590
+ /**
591
+ * Create a PackageInstaller for the system Python (or the python3 in PATH).
592
+ */
593
+ function createSystemInstaller(options) {
594
+ const python = process.env['nodepyx_PYTHON'] ?? 'python3';
595
+ return new PackageInstaller({ pythonExecutable: python, ...options });
596
+ }
597
+ /**
598
+ * Create a PackageInstaller tied to a specific virtualenv directory.
599
+ */
600
+ function createVenvInstaller(venvDir, options) {
601
+ const bin = process.platform === 'win32'
602
+ ? path.join(venvDir, 'Scripts', 'python.exe')
603
+ : path.join(venvDir, 'bin', 'python');
604
+ if (!fs.existsSync(bin)) {
605
+ throw new Error(`Virtualenv python not found at: ${bin}`);
606
+ }
607
+ return new PackageInstaller({ pythonExecutable: bin, ...options });
608
+ }
609
+ //# sourceMappingURL=PackageInstaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageInstaller.js","sourceRoot":"","sources":["../../src/env/PackageInstaller.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsqBH,sDAKC;AAKD,kDAYC;AAMQ,8CAAiB;AAAE,gDAAkB;AAhsB9C,mCAAsC;AACtC,iDAAkD;AAClD,uCAA2B;AAC3B,2CAA6B;AAC7B,4CAAyC;AAEzC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,kBAAkB,CAAC,CAAC;AA6G9C,2LAA2L;AAC3L,gDAAgD;AAChD,yEAAyE;AAEzE,MAAM,iBAAiB,GAA2B;IAChD,cAAc,EAAQ,SAAS;IAC/B,cAAc,EAAQ,SAAS;IAC/B,QAAQ,EAAc,KAAK;IAC3B,QAAQ,EAAc,KAAK;IAC3B,eAAe,EAAO,KAAK;IAC3B,wBAAwB,EAAE,KAAK;IAC/B,eAAe,EAAO,KAAK;IAC3B,gBAAgB,EAAM,KAAK;IAC3B,eAAe,EAAO,KAAK;IAC3B,QAAQ,EAAc,MAAM;IAC5B,QAAQ,EAAc,MAAM;IAC5B,iBAAiB,EAAK,UAAU;IAChC,iBAAiB,EAAK,UAAU;IAChC,mBAAmB,EAAG,mBAAmB;IACzC,mBAAmB,EAAG,mBAAmB;IACzC,OAAO,EAAe,KAAK;IAC3B,OAAO,EAAe,KAAK;IAC3B,UAAU,EAAY,iBAAiB;IACvC,QAAQ,EAAc,MAAM;IAC5B,QAAQ,EAAc,QAAQ;IAC9B,eAAe,EAAO,QAAQ;IAC9B,eAAe,EAAO,QAAQ;IAC9B,UAAU,EAAY,UAAU;IAChC,OAAO,EAAe,OAAO;IAC7B,QAAQ,EAAc,QAAQ;IAC9B,QAAQ,EAAc,QAAQ;IAC9B,YAAY,EAAU,YAAY;IAClC,SAAS,EAAa,SAAS;IAC/B,SAAS,EAAa,SAAS;IAC/B,OAAO,EAAe,OAAO;IAC7B,SAAS,EAAa,SAAS;IAC/B,WAAW,EAAW,WAAW;IACjC,SAAS,EAAa,SAAS;IAC/B,UAAU,EAAY,UAAU;IAChC,QAAQ,EAAc,QAAQ;IAC9B,OAAO,EAAe,OAAO;IAC7B,SAAS,EAAa,SAAS;IAC/B,OAAO,EAAe,OAAO;IAC7B,UAAU,EAAY,UAAU;IAChC,SAAS,EAAa,SAAS;IAC/B,UAAU,EAAY,UAAU;IAChC,iBAAiB,EAAK,UAAU;IAChC,iBAAiB,EAAK,UAAU;IAChC,OAAO,EAAe,OAAO;IAC7B,UAAU,EAAY,UAAU;IAChC,sBAAsB,EAAE,sBAAsB;IAC9C,aAAa,EAAS,aAAa;IACnC,oBAAoB,EAAE,oBAAoB;IAC1C,OAAO,EAAe,OAAO;IAC7B,cAAc,EAAQ,cAAc;IACpC,UAAU,EAAY,UAAU;IAChC,YAAY,EAAU,YAAY;IAClC,WAAW,EAAW,WAAW;IACjC,YAAY,EAAU,YAAY;IAClC,MAAM,EAAgB,MAAM;IAC5B,KAAK,EAAiB,KAAK;IAC3B,uBAAuB,EAAE,uBAAuB;IAChD,uBAAuB,EAAE,uBAAuB;IAChD,WAAW,EAAW,OAAO;IAC7B,WAAW,EAAW,OAAO;IAC7B,OAAO,EAAe,OAAO;IAC7B,UAAU,EAAY,UAAU;IAChC,iBAAiB,EAAK,UAAU;IAChC,iBAAiB,EAAK,UAAU;IAChC,WAAW,EAAW,WAAW;IACjC,QAAQ,EAAc,QAAQ;IAC9B,WAAW,EAAW,WAAW;IACjC,UAAU,EAAY,UAAU;IAChC,YAAY,EAAU,YAAY;IAClC,SAAS,EAAa,SAAS;IAC/B,QAAQ,EAAc,QAAQ;IAC9B,OAAO,EAAe,OAAO;IAC7B,QAAQ,EAAc,QAAQ;IAC9B,OAAO,EAAe,OAAO;IAC7B,aAAa,EAAS,aAAa;IACnC,UAAU,EAAY,UAAU;IAChC,SAAS,EAAa,SAAS;IAC/B,UAAU,EAAY,UAAU;IAChC,MAAM,EAAgB,MAAM;IAC5B,MAAM,EAAgB,MAAM;IAC5B,OAAO,EAAe,OAAO;IAC7B,UAAU,EAAY,UAAU;IAChC,SAAS,EAAa,SAAS;IAC/B,iBAAiB,EAAK,SAAS;IAC/B,QAAQ,EAAc,QAAQ;IAC9B,MAAM,EAAgB,MAAM;IAC5B,KAAK,EAAiB,KAAK;IAC3B,UAAU,EAAY,UAAU;IAChC,mBAAmB,EAAG,mBAAmB;IACzC,OAAO,EAAe,MAAM;IAC5B,QAAQ,EAAc,OAAO;IAC7B,OAAO,EAAe,OAAO;IAC7B,OAAO,EAAe,OAAO;IAC7B,MAAM,EAAgB,MAAM;IAC5B,MAAM,EAAgB,MAAM;IAC5B,QAAQ,EAAc,QAAQ;IAC9B,WAAW,EAAW,WAAW;IACjC,UAAU,EAAY,UAAU;IAChC,OAAO,EAAe,OAAO;IAC7B,UAAU,EAAY,UAAU;IAChC,UAAU,EAAY,UAAU;IAChC,aAAa,EAAS,aAAa;IACnC,QAAQ,EAAc,QAAQ;IAC9B,OAAO,EAAe,OAAO;IAC7B,SAAS,EAAa,SAAS;IAC/B,KAAK,EAAiB,KAAK;IAC3B,WAAW,EAAW,MAAM;IAC5B,cAAc,EAAQ,cAAc;IACpC,UAAU,EAAY,UAAU;IAChC,QAAQ,EAAc,QAAQ;IAC9B,QAAQ,EAAc,QAAQ;IAC9B,QAAQ,EAAc,QAAQ;IAC9B,YAAY,EAAU,YAAY;IAClC,MAAM,EAAgB,eAAe;IACrC,WAAW,EAAW,WAAW;IACjC,aAAa,EAAS,SAAS;IAC/B,OAAO,EAAe,OAAO;CAC9B,CAAC;AAmd8C,8CAAiB;AAjdjE,8NAA8N;AAE9N;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,wCAAwC;IACxC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAAA,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,wDAAwD;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,QAAiB;IACxD,IAAI,QAAQ,EAAE,CAAC;QAAA,OAAO,QAAQ,CAAC;IAAA,CAAC;IAChC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,gEAAgE;AAChE,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,oBAAoB;AACpB,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,4MAA4M;AAE5M,MAAa,gBAAiB,SAAQ,qBAAY;IAC/B,OAAO,CAAS;IAChB,KAAK,CAAsC;IAE5D,YAAY,OAAgC;QAC1C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG;YACX,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,QAAQ,EAAU,OAAO,CAAC,QAAQ,IAAY,EAAE;YAChD,cAAc,EAAI,OAAO,CAAC,cAAc,IAAO,EAAE;YACjD,YAAY,EAAM,OAAO,CAAC,YAAY,IAAS,EAAE;YACjD,UAAU,EAAQ,OAAO,CAAC,UAAU,IAAW,CAAC;YAChD,YAAY,EAAM,OAAO,CAAC,YAAY,IAAS,IAAI;YACnD,GAAG,EAAe,OAAO,CAAC,GAAG,IAAkB,OAAO,CAAC,GAAG,EAAE;YAC5D,GAAG,EAAe,OAAO,CAAC,GAAG,IAAkB,EAAE;YACjD,SAAS,EAAS,OAAO,CAAC,SAAS,IAAY,OAAO;YACtD,KAAK,EAAa,OAAO,CAAC,KAAK,KAAiB,KAAK;YACrD,OAAO,EAAW,OAAO,CAAC,OAAO,IAAc,KAAK;SACrD,CAAC;IACJ,CAAC;IAED,+MAA+M;IAE/M;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,QAAqC;QACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAiB,CAAC,CAAC,CAAC,CAAC,CACvD,CAAC;QAEF,MAAM,MAAM,GAAkB;YAC5B,SAAS,EAAS,EAAE;YACpB,gBAAgB,EAAE,EAAE;YACpB,MAAM,EAAY,EAAE;YACpB,OAAO,EAAW,KAAK;YACvB,MAAM,EAAY,EAAE;SACrB,CAAC;QAEF,MAAM,SAAS,GAAkB,EAAE,CAAC;QAEpC,kHAAkH;QAClH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACjE,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClF,MAAM,CAAC,KAAK,CAAC,uBAAuB,UAAU,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBACjE,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,yGAAyG;QACzG,oDAAoD;QACpD,MAAM,UAAU,GAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,CAAC,MAAM,GAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAA8B;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,KAAK,GAAG,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAkB;QAChC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAA,OAAO;QAAA,CAAC;QAEpC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YAC3C,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAO,IAAI,CAAC,KAAK,CAAC,GAAG;YACxB,GAAG,EAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SAChD,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,UAAkB;QAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,WAAmB;QAC5B,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YACtC,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAAA,OAAO,IAAI,CAAC;QAAA,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,WAAmB;QAC7B,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YACtC,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAAA,OAAO,IAAI,CAAC;QAAA,CAAC;QAC/C,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YACtC,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAAA,OAAO,EAAE,CAAC;QAAA,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAA6C,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,QAAkB;QAC3B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YACtC,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAO,IAAI,CAAC,KAAK,CAAC,GAAG;YACxB,GAAG,EAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,kMAAkM;IAElM;;;OAGG;IACK,aAAa,CAAC,UAAkB;QACtC,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,UAAU,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;YAC9C,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SAChD,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,KAAoB,EAAE,UAAmB;QAC7D,MAAM,IAAI,GAAa,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAI,CAAC;YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAA,CAAC;QAC/C,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAAA,CAAC;QACjD,IAAI,UAAU,EAAU,CAAC;YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAAA,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;gBAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAAA,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CACvB,KAAoB,EACpB,UAAmB;QAEnB,MAAM,IAAI,GAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,CAAC,IAAI,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEvD,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,GAAK,EAAE,CAAC;QAEnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAClE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,GAAG,MAAM,CAAC;YAEjB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,+BAA+B;gBAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC9B,MAAM,IAAI,GAAM,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;oBACnD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACzC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,WAA4B,EAAE,OAAO,EAAE,CAAC;gBACzE,CAAC,CAAC,CAAC;gBACH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;YACrD,CAAC;YAED,SAAS,GAAG,MAAM,CAAC;YACnB,MAAM,cAAc,GAAG,qCAAqC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1E,IAAI,CAAC,cAAc,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACzD,MAAM;YACR,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,kCAAkC,KAAK,OAAO,CAAC,CAAC;YAClF,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,qEAAqE;QACrE,MAAM,OAAO,GAAqF,EAAE,CAAC;QAErG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YAC5E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,IAAc;QAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;gBACrC,GAAG,EAAM,IAAI,CAAC,KAAK,CAAC,GAAG;gBACvB,GAAG,EAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC9C,KAAK,EAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aACpC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,MAAM,IAAI,aAAa,CAAC;YAC1B,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEzB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAC1D,aAAa,CACnB,MAAqB,EACrB,UAA4F;QAE5F,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACxD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;gBAC5C,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IAC3B,KAAK,CACX,MAAqB,EACrB,GAAe,EACf,OAAgB,EAChB,KAAgB;QAEhB,MAAM,EAAE,GAAyB,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,oDAAoD;IAC5C,aAAa,CAAC,GAAW;QAC/B,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE;YACpC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,KAAa,EAAY,EAAE;YAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,CAAC,CAAC;QACF,OAAO;YACL,IAAI,EAAQ,GAAG,CAAC,MAAM,CAAC;YACvB,OAAO,EAAK,GAAG,CAAC,SAAS,CAAC;YAC1B,QAAQ,EAAI,GAAG,CAAC,UAAU,CAAC;YAC3B,OAAO,EAAK,GAAG,CAAC,SAAS,CAAC;YAC1B,QAAQ,EAAI,OAAO,CAAC,UAAU,CAAC;YAC/B,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC;SACnC,CAAC;IACJ,CAAC;CACF;AAtYD,4CAsYC;AAED,iNAAiN;AAEjN;;GAEG;AACH,SAAgB,qBAAqB,CACnC,OAAoE;IAEpE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC;IAC1D,OAAO,IAAI,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,OAAgB,EAChB,OAAoE;IAEpE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QACtC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC;QAC7C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAExC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACrE,CAAC"}