@jiordikengne/velar 0.1.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 (96) hide show
  1. package/README.md +123 -0
  2. package/dist/commands/add.js +85 -0
  3. package/dist/commands/add.js.map +1 -0
  4. package/dist/commands/init-handlers.js +138 -0
  5. package/dist/commands/init-handlers.js.map +1 -0
  6. package/dist/commands/init-new.js +126 -0
  7. package/dist/commands/init-new.js.map +1 -0
  8. package/dist/commands/init-old.js +218 -0
  9. package/dist/commands/init-old.js.map +1 -0
  10. package/dist/commands/init.js +125 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/list.js +69 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/config/ConfigManager.js +89 -0
  15. package/dist/config/ConfigManager.js.map +1 -0
  16. package/dist/errors/ErrorHandler.js +42 -0
  17. package/dist/errors/ErrorHandler.js.map +1 -0
  18. package/dist/errors/errors.js +45 -0
  19. package/dist/errors/errors.js.map +1 -0
  20. package/dist/index.js +30 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/registry/blue.css +0 -0
  23. package/dist/registry/green.css +0 -0
  24. package/dist/registry/neutral.css +29 -0
  25. package/dist/registry/orange.css +0 -0
  26. package/dist/registry/red.css +0 -0
  27. package/dist/registry/rose.css +0 -0
  28. package/dist/registry/themes/blue.css +0 -0
  29. package/dist/registry/themes/green.css +0 -0
  30. package/dist/registry/themes/neutral.css +29 -0
  31. package/dist/registry/themes/orange.css +0 -0
  32. package/dist/registry/themes/red.css +0 -0
  33. package/dist/registry/themes/rose.css +0 -0
  34. package/dist/registry/themes/violet.css +0 -0
  35. package/dist/registry/themes/yellow.css +0 -0
  36. package/dist/registry/violet.css +0 -0
  37. package/dist/registry/yellow.css +0 -0
  38. package/dist/services/AddService.js +98 -0
  39. package/dist/services/AddService.js.map +1 -0
  40. package/dist/services/ComponentService.js +167 -0
  41. package/dist/services/ComponentService.js.map +1 -0
  42. package/dist/services/FileSystemService.js +51 -0
  43. package/dist/services/FileSystemService.js.map +1 -0
  44. package/dist/services/HttpService.js +181 -0
  45. package/dist/services/HttpService.js.map +1 -0
  46. package/dist/services/InitService.js +182 -0
  47. package/dist/services/InitService.js.map +1 -0
  48. package/dist/services/ListService.js +52 -0
  49. package/dist/services/ListService.js.map +1 -0
  50. package/dist/services/RegistryService.js +85 -0
  51. package/dist/services/RegistryService.js.map +1 -0
  52. package/dist/types/index.js +2 -0
  53. package/dist/types/index.js.map +1 -0
  54. package/dist/types/interfaces.js +2 -0
  55. package/dist/types/interfaces.js.map +1 -0
  56. package/dist/types/meta.js +2 -0
  57. package/dist/types/meta.js.map +1 -0
  58. package/dist/types/registry.js +2 -0
  59. package/dist/types/registry.js.map +1 -0
  60. package/dist/utils/alpine-installer.js +46 -0
  61. package/dist/utils/alpine-installer.js.map +1 -0
  62. package/dist/utils/config.js +21 -0
  63. package/dist/utils/config.js.map +1 -0
  64. package/dist/utils/css.js +53 -0
  65. package/dist/utils/css.js.map +1 -0
  66. package/dist/utils/deps.js +24 -0
  67. package/dist/utils/deps.js.map +1 -0
  68. package/dist/utils/environment.js +8 -0
  69. package/dist/utils/environment.js.map +1 -0
  70. package/dist/utils/errors.js +21 -0
  71. package/dist/utils/errors.js.map +1 -0
  72. package/dist/utils/filesystem.js +14 -0
  73. package/dist/utils/filesystem.js.map +1 -0
  74. package/dist/utils/js.js +63 -0
  75. package/dist/utils/js.js.map +1 -0
  76. package/dist/utils/laravel.js +9 -0
  77. package/dist/utils/laravel.js.map +1 -0
  78. package/dist/utils/logger.js +47 -0
  79. package/dist/utils/logger.js.map +1 -0
  80. package/dist/utils/package-manager.js +23 -0
  81. package/dist/utils/package-manager.js.map +1 -0
  82. package/dist/utils/registry.js +17 -0
  83. package/dist/utils/registry.js.map +1 -0
  84. package/dist/utils/remote-registry.js +162 -0
  85. package/dist/utils/remote-registry.js.map +1 -0
  86. package/dist/utils/requirements.js +75 -0
  87. package/dist/utils/requirements.js.map +1 -0
  88. package/dist/utils/spinner.js +40 -0
  89. package/dist/utils/spinner.js.map +1 -0
  90. package/dist/utils/tailwind.js +31 -0
  91. package/dist/utils/tailwind.js.map +1 -0
  92. package/dist/utils/theme.js +32 -0
  93. package/dist/utils/theme.js.map +1 -0
  94. package/dist/utils/type-conversion.js +2 -0
  95. package/dist/utils/type-conversion.js.map +1 -0
  96. package/package.json +64 -0
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # Velar CLI
2
+
3
+ Velar CLI is a command-line tool for adding UI components to Laravel projects.
4
+
5
+ It delivers composable UI components built with **Blade**, **Alpine.js**, and **Tailwind CSS v4**.
6
+ Inspired by shadcn, Velar gives you the code, not a dependency.
7
+
8
+ ---
9
+
10
+ ## What Velar is
11
+
12
+ - A **code delivery tool** for Laravel UI components
13
+ - A way to **copy components into your project**
14
+ - A workflow that keeps **you in control of your code**
15
+
16
+ ## What Velar is not
17
+
18
+ - Not a UI framework
19
+ - Not a runtime dependency
20
+ - Not an auto-updating system
21
+ - Not magic
22
+
23
+ Once components are added, they belong to your project.
24
+
25
+ ---
26
+
27
+ ## Requirements
28
+
29
+ Velar assumes a modern Laravel setup:
30
+
31
+ - Laravel
32
+ - Blade
33
+ - Alpine.js
34
+ - Tailwind CSS **v4 or higher**
35
+
36
+ Tailwind v3 is not supported.
37
+
38
+ ---
39
+
40
+ ## Usage
41
+
42
+ Velar can be executed without installation.
43
+
44
+ ### Initialize Velar in a project
45
+
46
+ ```bash
47
+ npx velar init
48
+ ```
49
+
50
+ This command:
51
+
52
+ - checks your environment
53
+ - prepares the UI components directory
54
+
55
+ ---
56
+
57
+ ### Add a component
58
+
59
+ ```bash
60
+ npx velar add button
61
+ ```
62
+
63
+ Velar will:
64
+
65
+ - fetch the component from the registry
66
+ - resolve its dependencies
67
+ - copy the files into your project
68
+
69
+ By default, components are placed in:
70
+
71
+ ```bash
72
+ resources/views/components/ui
73
+ ```
74
+
75
+ ---
76
+
77
+ ### List available components
78
+
79
+ ```bash
80
+ npx velar list
81
+ ```
82
+
83
+ ---
84
+
85
+ ## How updates work
86
+
87
+ Velar does **not** update your code automatically.
88
+
89
+ If a component changes in the registry and you want the new version:
90
+
91
+ - run `velar add <component>` again
92
+ - review the changes
93
+ - decide what to keep
94
+
95
+ This is intentional.
96
+
97
+ ---
98
+
99
+ ## Philosophy
100
+
101
+ Velar follows a simple principle:
102
+
103
+ > You own your UI code.
104
+
105
+ There are no hidden abstractions and no vendor lock-in.
106
+ Velar exists to help you move faster, not to take control away from you.
107
+
108
+ ---
109
+
110
+ ## Documentation
111
+
112
+ Full documentation lives in the `docs` repository:
113
+
114
+ - Introduction
115
+ - Getting started
116
+ - Component reference
117
+ - Project philosophy
118
+
119
+ ---
120
+
121
+ ## License
122
+
123
+ MIT
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ import { ConfigManager } from "../config/ConfigManager.js";
3
+ import { ErrorHandler } from "../errors/ErrorHandler.js";
4
+ import { AddService } from "../services/AddService.js";
5
+ import { RegistryService } from "../services/RegistryService.js";
6
+ import { logger } from "../utils/logger.js";
7
+ import * as p from "@clack/prompts";
8
+ import { Command } from "commander";
9
+ /**
10
+ * Prompt user to select components
11
+ * @param availableComponents - List of available component names
12
+ * @returns Selected component names or undefined if aborted
13
+ */
14
+ async function promptComponentSelection(availableComponents) {
15
+ const selected = await p.multiselect({
16
+ message: "Select components to add",
17
+ options: availableComponents.map((name) => ({ label: name, value: name })),
18
+ required: true,
19
+ });
20
+ if (p.isCancel(selected)) {
21
+ return undefined;
22
+ }
23
+ return selected;
24
+ }
25
+ /**
26
+ * Register the 'add' command with the CLI program
27
+ * @param program - Commander program instance
28
+ */
29
+ export default function registerAddCommand(program) {
30
+ program
31
+ .command("add")
32
+ .argument("[components...]", "Names of components to add")
33
+ .description("Add one or more UI components to your Laravel project")
34
+ .action(async (components) => {
35
+ const errorHandler = new ErrorHandler();
36
+ try {
37
+ // 1. Initialize services
38
+ const configManager = new ConfigManager();
39
+ await configManager.load();
40
+ const registryService = new RegistryService();
41
+ const addService = new AddService(registryService, configManager);
42
+ // 2. Validate initialization
43
+ try {
44
+ addService.validateInitialization();
45
+ }
46
+ catch {
47
+ logger.error("Velar is not initialized");
48
+ logger.step("Run velar init first");
49
+ process.exit(1);
50
+ }
51
+ // 3. Load registry (spinner handle inside addService/registryService)
52
+ const registry = await addService.getAvailableComponents();
53
+ // 4. Prompt for components if none provided
54
+ let componentNames = components;
55
+ if (!componentNames || componentNames.length === 0) {
56
+ const available = registry.components.map((c) => c.name);
57
+ const selected = await promptComponentSelection(available.sort((a, b) => a.localeCompare(b)));
58
+ if (!selected || selected.length === 0) {
59
+ logger.warning("No component selected");
60
+ process.exit(0);
61
+ }
62
+ componentNames = selected;
63
+ }
64
+ // 5. Validate components exist
65
+ try {
66
+ addService.validateComponents(componentNames, registry);
67
+ }
68
+ catch (err) {
69
+ logger.error(err.message);
70
+ logger.step("Run velar list to see available components");
71
+ process.exit(1);
72
+ }
73
+ // 6. Add components
74
+ const result = await addService.addComponents(componentNames);
75
+ // 7. Display results
76
+ addService.displayResults(result);
77
+ addService.displayNextSteps(result);
78
+ }
79
+ catch (error) {
80
+ errorHandler.handle(error, "add command");
81
+ process.exit(1);
82
+ }
83
+ });
84
+ }
85
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ import prompts from "prompts";
2
+ import { FileSystemService } from "../services/FileSystemService.js";
3
+ import { writeVelarConfig } from "../utils/config.js";
4
+ import { logger } from "../utils/logger.js";
5
+ export const initStepHandlers = {
6
+ validateLaravel: async () => {
7
+ const { isLaravelProject } = await import("../utils/laravel.js");
8
+ if (!isLaravelProject()) {
9
+ logger.error("This is not a Laravel project");
10
+ logger.step("Run velar init at the root of a Laravel project");
11
+ return false;
12
+ }
13
+ logger.success("Laravel project detected");
14
+ return true;
15
+ },
16
+ validateTailwind: async () => {
17
+ const { readPackageJson, detectTailwindV4 } = await import("../utils/tailwind.js");
18
+ const pkg = readPackageJson();
19
+ if (!pkg || !detectTailwindV4(pkg)) {
20
+ logger.error("Tailwind CSS v4 not detected");
21
+ logger.step("Velar requires Tailwind CSS v4+");
22
+ return false;
23
+ }
24
+ logger.success("Tailwind CSS v4 detected");
25
+ return true;
26
+ },
27
+ detectPackageManager: async () => {
28
+ const { detectPackageManager } = await import("../utils/package-manager.js");
29
+ return detectPackageManager();
30
+ },
31
+ choosePackageManager: async (detectedPm) => {
32
+ const res = await prompts({
33
+ type: "select",
34
+ name: "packageManager",
35
+ message: "Which package manager are you using?",
36
+ choices: [
37
+ { title: "npm", value: "npm" },
38
+ { title: "yarn", value: "yarn" },
39
+ { title: "pnpm", value: "pnpm" },
40
+ { title: "bun", value: "bun" },
41
+ ],
42
+ initial: ["npm", "yarn", "pnpm", "bun"].indexOf(detectedPm) >= 0
43
+ ? ["npm", "yarn", "pnpm", "bun"].indexOf(detectedPm)
44
+ : 0,
45
+ });
46
+ if (!res.packageManager) {
47
+ logger.error("Package manager selection cancelled");
48
+ throw new Error("Package manager selection cancelled");
49
+ }
50
+ return res.packageManager;
51
+ },
52
+ chooseTheme: async () => {
53
+ const { THEMES } = await import("../utils/theme.js");
54
+ const res = await prompts({
55
+ type: "select",
56
+ name: "theme",
57
+ message: "Choose a theme:",
58
+ choices: THEMES.map((t) => ({ title: t, value: t })),
59
+ initial: 0,
60
+ });
61
+ if (!res.theme) {
62
+ logger.error("Theme selection cancelled");
63
+ throw new Error("Theme selection cancelled");
64
+ }
65
+ return res.theme;
66
+ },
67
+ setupDirectories: async (fileSystem) => {
68
+ const uiDir = "resources/views/components/ui";
69
+ await fileSystem.ensureDir(uiDir);
70
+ const velarCssPath = "resources/css/velar.css";
71
+ await fileSystem.ensureDir(velarCssPath.split("/").slice(0, -1).join("/"));
72
+ },
73
+ setupTheme: async (theme) => {
74
+ const { copyTheme } = await import("../utils/theme.js");
75
+ const fs = await import("fs");
76
+ const velarCssPath = "resources/css/velar.css";
77
+ if (!fs.existsSync(velarCssPath)) {
78
+ await copyTheme(theme, velarCssPath);
79
+ logger.success("Theme created");
80
+ logger.info("resources/css/velar.css");
81
+ }
82
+ else {
83
+ logger.info("velar.css already exists");
84
+ }
85
+ },
86
+ setupCss: async () => {
87
+ const { findMainCss, hasTailwindImport, injectVelarImport } = await import("../utils/css.js");
88
+ const css = findMainCss();
89
+ const hasCss = Boolean(css);
90
+ const canInject = css ? hasTailwindImport(css.content) : false;
91
+ if (!hasCss) {
92
+ logger.warning("No main CSS file found");
93
+ logger.step("Styles will be created but not auto-imported");
94
+ }
95
+ else if (!canInject) {
96
+ logger.warning("Tailwind import not found in CSS");
97
+ logger.step("Velar styles will not be auto-imported");
98
+ }
99
+ let injected = false;
100
+ if (hasCss && canInject) {
101
+ const res = await prompts({
102
+ type: "confirm",
103
+ name: "inject",
104
+ message: "Import Velar styles into your main CSS file?",
105
+ initial: true,
106
+ });
107
+ if (res.inject) {
108
+ injectVelarImport(css.path);
109
+ injected = true;
110
+ logger.success("Styles imported");
111
+ logger.info(css.path);
112
+ }
113
+ }
114
+ return { path: css?.path || "", injected };
115
+ },
116
+ createConfig: async (config) => {
117
+ writeVelarConfig(config);
118
+ logger.success("Configuration created");
119
+ },
120
+ showSummary: (config, css) => {
121
+ logger.blank();
122
+ logger.success("✨ Velar initialized successfully!");
123
+ logger.blank();
124
+ logger.info("What's ready:");
125
+ logger.step(`• Theme: ${config.theme}`);
126
+ logger.step(`• Package manager: ${config.packageManager}`);
127
+ logger.step(`• Interactivity: ${config.interactivity.framework} (${config.interactivity.source})`);
128
+ logger.step("• UI components directory");
129
+ logger.step(`• Styles: ${css.injected ? "imported" : "ready"}`);
130
+ logger.blank();
131
+ logger.info("Next steps:");
132
+ logger.step("• Add components: velar add button");
133
+ logger.step("• List components: velar list");
134
+ logger.blank();
135
+ logger.success("Happy coding! 🚀");
136
+ },
137
+ };
138
+ //# sourceMappingURL=init-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-handlers.js","sourceRoot":"","sources":["../../src/commands/init-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import { Command } from "commander";
2
+ import prompts from "prompts";
3
+ import { retryWithSpinner } from "../utils/spinner.js";
4
+ import { initStepHandlers } from "./init-handlers.js";
5
+ import { installAlpineJs, addAlpineToAppJs, } from "../utils/alpine-installer.js";
6
+ import { hasAlpineJs, hasLivewire, hasInteractivitySupport, } from "../utils/requirements.js";
7
+ import { FileSystemService } from "../services/FileSystemService.js";
8
+ import { logger } from "../utils/logger.js";
9
+ export default function registerInitCommand(program) {
10
+ const initCmd = program
11
+ .command("init")
12
+ .description("Initialize Velar in a Laravel project")
13
+ .option("-t, --theme <theme>", "Theme to use (default, dark, etc.)")
14
+ .option("-p, --package-manager <pm>", "Package manager (npm, yarn, pnpm, bun)")
15
+ .action(async (options) => {
16
+ try {
17
+ const fileSystem = new FileSystemService();
18
+ // Step 1: Validate Laravel project
19
+ const isValidLaravel = await initStepHandlers.validateLaravel();
20
+ if (!isValidLaravel)
21
+ return;
22
+ // Step 2: Validate Tailwind CSS
23
+ const isValidTailwind = await initStepHandlers.validateTailwind();
24
+ if (!isValidTailwind)
25
+ return;
26
+ // Step 3: Detect existing interactivity
27
+ let hasAlpine = hasAlpineJs();
28
+ let hasLivewireSupport = hasLivewire();
29
+ const detectedPm = await initStepHandlers.detectPackageManager();
30
+ // Step 4: Choose package manager if not provided
31
+ const packageManager = options.packageManager ||
32
+ (await initStepHandlers.choosePackageManager(detectedPm));
33
+ // Step 5: Choose theme if not provided
34
+ const theme = options.theme || (await initStepHandlers.chooseTheme());
35
+ // Step 6: Setup directories
36
+ await retryWithSpinner("Creating directories...", async () => {
37
+ await initStepHandlers.setupDirectories(fileSystem);
38
+ });
39
+ // Step 7: Setup theme
40
+ await retryWithSpinner("Setting up theme...", async () => {
41
+ await initStepHandlers.setupTheme(theme);
42
+ });
43
+ // Step 8: Handle interactivity
44
+ let interactivityConfig = {
45
+ framework: "none",
46
+ source: "existing",
47
+ };
48
+ if (!hasInteractivitySupport()) {
49
+ const res = await prompts({
50
+ type: "confirm",
51
+ name: "installAlpine",
52
+ message: "Velar components work best with Alpine.js. Would you like to install it?",
53
+ initial: true,
54
+ });
55
+ if (res.installAlpine) {
56
+ logger.info(`Installing Alpine.js with ${packageManager}...`);
57
+ const installSuccess = await retryWithSpinner("Installing Alpine.js...", () => installAlpineJs(packageManager));
58
+ if (installSuccess) {
59
+ const addToAppSuccess = await retryWithSpinner("Adding Alpine.js to app.js...", () => addAlpineToAppJs());
60
+ if (addToAppSuccess) {
61
+ hasAlpine = true;
62
+ interactivityConfig = {
63
+ framework: "alpine",
64
+ source: "npm",
65
+ };
66
+ logger.success("Alpine.js ready!");
67
+ }
68
+ }
69
+ else {
70
+ logger.warning("Alpine.js installation completed - you'll need to add it manually");
71
+ logger.step(`${packageManager} add alpinejs`);
72
+ }
73
+ }
74
+ else {
75
+ logger.info("You can install it later:");
76
+ logger.step(`${packageManager} add alpinejs`);
77
+ }
78
+ }
79
+ else if (hasAlpine) {
80
+ interactivityConfig = {
81
+ framework: "alpine",
82
+ source: "existing",
83
+ };
84
+ logger.success("Alpine.js detected - components will be fully interactive");
85
+ }
86
+ else if (hasLivewireSupport) {
87
+ interactivityConfig = {
88
+ framework: "livewire",
89
+ source: "existing",
90
+ };
91
+ logger.success("Livewire detected - components will work with Livewire");
92
+ }
93
+ // Step 9: Setup CSS integration
94
+ const css = await initStepHandlers.setupCss();
95
+ // Step 10: Create configuration
96
+ await retryWithSpinner("Creating configuration...", async () => {
97
+ initStepHandlers.createConfig({
98
+ version: "0.1",
99
+ theme,
100
+ packageManager,
101
+ interactivity: interactivityConfig,
102
+ css: {
103
+ entry: css.path,
104
+ velar: "resources/css/velar.css",
105
+ },
106
+ components: {
107
+ path: "resources/views/components/ui",
108
+ },
109
+ });
110
+ });
111
+ // Step 11: Show summary
112
+ initStepHandlers.showSummary({
113
+ theme,
114
+ packageManager,
115
+ interactivityConfig,
116
+ css,
117
+ });
118
+ }
119
+ catch (error) {
120
+ logger.error("Initialization failed", error.message);
121
+ process.exit(1);
122
+ }
123
+ });
124
+ return initCmd;
125
+ }
126
+ //# sourceMappingURL=init-new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-new.js","sourceRoot":"","sources":["../../src/commands/init-new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,eAAe,EACf,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,WAAW,EACX,WAAW,EACX,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,OAAgB;IAC1D,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;SACnE,MAAM,CACL,4BAA4B,EAC5B,wCAAwC,CACzC;SACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAE3C,mCAAmC;YACnC,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,CAAC;YAChE,IAAI,CAAC,cAAc;gBAAE,OAAO;YAE5B,gCAAgC;YAChC,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;YAClE,IAAI,CAAC,eAAe;gBAAE,OAAO;YAE7B,wCAAwC;YACxC,IAAI,SAAS,GAAG,WAAW,EAAE,CAAC;YAC9B,IAAI,kBAAkB,GAAG,WAAW,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;YAEjE,iDAAiD;YACjD,MAAM,cAAc,GAClB,OAAO,CAAC,cAAc;gBACtB,CAAC,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;YAE5D,uCAAuC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC;YAEtE,4BAA4B;YAC5B,MAAM,gBAAgB,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAC3D,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,sBAAsB;YACtB,MAAM,gBAAgB,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;gBACvD,MAAM,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,+BAA+B;YAC/B,IAAI,mBAAmB,GAAiC;gBACtD,SAAS,EAAE,MAAM;gBACjB,MAAM,EAAE,UAAU;aACnB,CAAC;YAEF,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;oBACxB,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,eAAe;oBACrB,OAAO,EACL,0EAA0E;oBAC5E,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBAEH,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,CAAC,6BAA6B,cAAc,KAAK,CAAC,CAAC;oBAE9D,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAC3C,yBAAyB,EACzB,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,CACtC,CAAC;oBAEF,IAAI,cAAc,EAAE,CAAC;wBACnB,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAC5C,+BAA+B,EAC/B,GAAG,EAAE,CAAC,gBAAgB,EAAE,CACzB,CAAC;wBAEF,IAAI,eAAe,EAAE,CAAC;4BACpB,SAAS,GAAG,IAAI,CAAC;4BACjB,mBAAmB,GAAG;gCACpB,SAAS,EAAE,QAAQ;gCACnB,MAAM,EAAE,KAAK;6BACd,CAAC;4BACF,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;wBACrC,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,OAAO,CACZ,mEAAmE,CACpE,CAAC;wBACF,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,eAAe,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;oBACzC,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,eAAe,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;iBAAM,IAAI,SAAS,EAAE,CAAC;gBACrB,mBAAmB,GAAG;oBACpB,SAAS,EAAE,QAAQ;oBACnB,MAAM,EAAE,UAAU;iBACnB,CAAC;gBACF,MAAM,CAAC,OAAO,CACZ,2DAA2D,CAC5D,CAAC;YACJ,CAAC;iBAAM,IAAI,kBAAkB,EAAE,CAAC;gBAC9B,mBAAmB,GAAG;oBACpB,SAAS,EAAE,UAAU;oBACrB,MAAM,EAAE,UAAU;iBACnB,CAAC;gBACF,MAAM,CAAC,OAAO,CACZ,wDAAwD,CACzD,CAAC;YACJ,CAAC;YAED,gCAAgC;YAChC,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC;YAE9C,gCAAgC;YAChC,MAAM,gBAAgB,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;gBAC7D,gBAAgB,CAAC,YAAY,CAAC;oBAC5B,OAAO,EAAE,KAAK;oBACd,KAAK;oBACL,cAAc;oBACd,aAAa,EAAE,mBAAmB;oBAClC,GAAG,EAAE;wBACH,KAAK,EAAE,GAAG,CAAC,IAAI;wBACf,KAAK,EAAE,yBAAyB;qBACjC;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,+BAA+B;qBACtC;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,wBAAwB;YACxB,gBAAgB,CAAC,WAAW,CAAC;gBAC3B,KAAK;gBACL,cAAc;gBACd,mBAAmB;gBACnB,GAAG;aACJ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}