cyclops-clientdevbridge-cli 0.1.1

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 (112) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +218 -0
  4. package/dist/artifacts.d.ts +56 -0
  5. package/dist/artifacts.d.ts.map +1 -0
  6. package/dist/artifacts.js +58 -0
  7. package/dist/artifacts.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +348 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/compare.d.ts +27 -0
  13. package/dist/commands/compare.d.ts.map +1 -0
  14. package/dist/commands/compare.js +209 -0
  15. package/dist/commands/compare.js.map +1 -0
  16. package/dist/commands/context.d.ts +25 -0
  17. package/dist/commands/context.d.ts.map +1 -0
  18. package/dist/commands/context.js +36 -0
  19. package/dist/commands/context.js.map +1 -0
  20. package/dist/commands/doctor.d.ts +31 -0
  21. package/dist/commands/doctor.d.ts.map +1 -0
  22. package/dist/commands/doctor.js +234 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/hotswap.d.ts +7 -0
  25. package/dist/commands/hotswap.d.ts.map +1 -0
  26. package/dist/commands/hotswap.js +76 -0
  27. package/dist/commands/hotswap.js.map +1 -0
  28. package/dist/commands/input.d.ts +53 -0
  29. package/dist/commands/input.d.ts.map +1 -0
  30. package/dist/commands/input.js +204 -0
  31. package/dist/commands/input.js.map +1 -0
  32. package/dist/commands/inspect.d.ts +19 -0
  33. package/dist/commands/inspect.d.ts.map +1 -0
  34. package/dist/commands/inspect.js +90 -0
  35. package/dist/commands/inspect.js.map +1 -0
  36. package/dist/commands/lifecycle.d.ts +29 -0
  37. package/dist/commands/lifecycle.d.ts.map +1 -0
  38. package/dist/commands/lifecycle.js +201 -0
  39. package/dist/commands/lifecycle.js.map +1 -0
  40. package/dist/commands/snapshot.d.ts +37 -0
  41. package/dist/commands/snapshot.d.ts.map +1 -0
  42. package/dist/commands/snapshot.js +133 -0
  43. package/dist/commands/snapshot.js.map +1 -0
  44. package/dist/commands/world.d.ts +27 -0
  45. package/dist/commands/world.d.ts.map +1 -0
  46. package/dist/commands/world.js +203 -0
  47. package/dist/commands/world.js.map +1 -0
  48. package/dist/detect.d.ts +58 -0
  49. package/dist/detect.d.ts.map +1 -0
  50. package/dist/detect.js +185 -0
  51. package/dist/detect.js.map +1 -0
  52. package/dist/errors.d.ts +24 -0
  53. package/dist/errors.d.ts.map +1 -0
  54. package/dist/errors.js +37 -0
  55. package/dist/errors.js.map +1 -0
  56. package/dist/hotswap.d.ts +58 -0
  57. package/dist/hotswap.d.ts.map +1 -0
  58. package/dist/hotswap.js +284 -0
  59. package/dist/hotswap.js.map +1 -0
  60. package/dist/index.d.ts +11 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +11 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/initscript.d.ts +49 -0
  65. package/dist/initscript.d.ts.map +1 -0
  66. package/dist/initscript.js +202 -0
  67. package/dist/initscript.js.map +1 -0
  68. package/dist/java.d.ts +47 -0
  69. package/dist/java.d.ts.map +1 -0
  70. package/dist/java.js +114 -0
  71. package/dist/java.js.map +1 -0
  72. package/dist/launcher.d.ts +104 -0
  73. package/dist/launcher.d.ts.map +1 -0
  74. package/dist/launcher.js +609 -0
  75. package/dist/launcher.js.map +1 -0
  76. package/dist/loopback.d.ts +17 -0
  77. package/dist/loopback.d.ts.map +1 -0
  78. package/dist/loopback.js +19 -0
  79. package/dist/loopback.js.map +1 -0
  80. package/dist/output.d.ts +21 -0
  81. package/dist/output.d.ts.map +1 -0
  82. package/dist/output.js +41 -0
  83. package/dist/output.js.map +1 -0
  84. package/dist/paths.d.ts +23 -0
  85. package/dist/paths.d.ts.map +1 -0
  86. package/dist/paths.js +47 -0
  87. package/dist/paths.js.map +1 -0
  88. package/dist/protocol/client.d.ts +35 -0
  89. package/dist/protocol/client.d.ts.map +1 -0
  90. package/dist/protocol/client.js +170 -0
  91. package/dist/protocol/client.js.map +1 -0
  92. package/dist/protocol/types.d.ts +114 -0
  93. package/dist/protocol/types.d.ts.map +1 -0
  94. package/dist/protocol/types.js +38 -0
  95. package/dist/protocol/types.js.map +1 -0
  96. package/dist/session.d.ts +77 -0
  97. package/dist/session.d.ts.map +1 -0
  98. package/dist/session.js +79 -0
  99. package/dist/session.js.map +1 -0
  100. package/dist/snapshot/model.d.ts +327 -0
  101. package/dist/snapshot/model.d.ts.map +1 -0
  102. package/dist/snapshot/model.js +91 -0
  103. package/dist/snapshot/model.js.map +1 -0
  104. package/dist/snapshot/outline.d.ts +35 -0
  105. package/dist/snapshot/outline.d.ts.map +1 -0
  106. package/dist/snapshot/outline.js +135 -0
  107. package/dist/snapshot/outline.js.map +1 -0
  108. package/dist/xvfb.d.ts +30 -0
  109. package/dist/xvfb.d.ts.map +1 -0
  110. package/dist/xvfb.js +66 -0
  111. package/dist/xvfb.js.map +1 -0
  112. package/package.json +66 -0
@@ -0,0 +1,25 @@
1
+ import { BridgeClient } from '../protocol/client.js';
2
+ import type { BridgePaths } from '../paths.js';
3
+ import type { Session } from '../session.js';
4
+ export interface GlobalOptions {
5
+ readonly project: string;
6
+ readonly json: boolean;
7
+ readonly quiet: boolean;
8
+ }
9
+ export interface Connected {
10
+ readonly client: BridgeClient;
11
+ readonly session: Session;
12
+ readonly paths: BridgePaths;
13
+ }
14
+ /**
15
+ * Connects to the running client for the project, or fails with a message that says what to run.
16
+ */
17
+ export declare function connect(options: GlobalOptions): Promise<Connected>;
18
+ /** Runs an action against a connected client and always closes the socket afterwards. */
19
+ export declare function withClient<T>(options: GlobalOptions, action: (connected: Connected) => Promise<T>): Promise<T>;
20
+ export declare function timestampName(prefix: string): string;
21
+ /**
22
+ * Writes a base64 payload to a file and returns its absolute path.
23
+ */
24
+ export declare function writeBase64(directory: string, name: string, base64: string): string;
25
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAIxE;AAED,yFAAyF;AACzF,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOpH;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKnF"}
@@ -0,0 +1,36 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { BridgeClient } from '../protocol/client.js';
4
+ import { requireRunningSession } from '../session.js';
5
+ /**
6
+ * Connects to the running client for the project, or fails with a message that says what to run.
7
+ */
8
+ export async function connect(options) {
9
+ const { session, paths } = requireRunningSession(options.project);
10
+ const client = await BridgeClient.connect({ port: session.port });
11
+ return { client, session, paths };
12
+ }
13
+ /** Runs an action against a connected client and always closes the socket afterwards. */
14
+ export async function withClient(options, action) {
15
+ const connected = await connect(options);
16
+ try {
17
+ return await action(connected);
18
+ }
19
+ finally {
20
+ connected.client.close();
21
+ }
22
+ }
23
+ export function timestampName(prefix) {
24
+ const now = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_').replace('Z', '');
25
+ return `${prefix}_${now}`;
26
+ }
27
+ /**
28
+ * Writes a base64 payload to a file and returns its absolute path.
29
+ */
30
+ export function writeBase64(directory, name, base64) {
31
+ fs.mkdirSync(directory, { recursive: true });
32
+ const file = path.join(directory, name.endsWith('.png') ? name : `${name}.png`);
33
+ fs.writeFileSync(file, Buffer.from(base64, 'base64'));
34
+ return path.resolve(file);
35
+ }
36
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAgBtD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAsB;IAClD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,OAAsB,EAAE,MAA4C;IACtG,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9F,OAAO,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,IAAY,EAAE,MAAc;IACzE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;IAChF,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { GlobalOptions } from './context.js';
2
+ export interface Check {
3
+ readonly name: string;
4
+ readonly ok: boolean;
5
+ readonly detail: string;
6
+ /**
7
+ * True when the check passes only because the CLI works around something. Rendered as `warn`:
8
+ * calling a machine whose JAVA_HOME is too old `ok` is technically true and reads as a
9
+ * contradiction next to a detail that says "too old".
10
+ */
11
+ readonly workedAround?: boolean;
12
+ /** What to actually do about it. Empty when the check passed. */
13
+ readonly fix: string;
14
+ }
15
+ /**
16
+ * The hosts a cold checkout has to reach to build and launch a dev client.
17
+ * Verified empirically; see docs/cloud-setup.md.
18
+ */
19
+ export declare const REQUIRED_HOSTS: readonly {
20
+ host: string;
21
+ why: string;
22
+ }[];
23
+ export declare function collectChecks(projectDir: string, options: {
24
+ network: boolean;
25
+ loader?: string | undefined;
26
+ }): Promise<Check[]>;
27
+ export declare function runDoctor(global: GlobalOptions, options: {
28
+ network: boolean;
29
+ loader?: string | undefined;
30
+ }): Promise<number>;
31
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,iEAAiE;IACjE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAgBlE,CAAC;AA4EF,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACzD,OAAO,CAAC,KAAK,EAAE,CAAC,CAmHlB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACzD,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
@@ -0,0 +1,234 @@
1
+ import * as fs from 'node:fs';
2
+ import * as https from 'node:https';
3
+ import * as path from 'node:path';
4
+ import { ARTIFACT_LINES, artifactId, findLine, GROUP } from '../artifacts.js';
5
+ import { declaredJavaVersion, detectLoaders, detectProject, readGradleProperties } from '../detect.js';
6
+ import { findJavaHome, gradleJava } from '../java.js';
7
+ import { line, printJson } from '../output.js';
8
+ import { commandExists } from '../xvfb.js';
9
+ /**
10
+ * The hosts a cold checkout has to reach to build and launch a dev client.
11
+ * Verified empirically; see docs/cloud-setup.md.
12
+ */
13
+ export const REQUIRED_HOSTS = [
14
+ { host: 'services.gradle.org', why: 'Gradle distribution for the wrapper' },
15
+ { host: 'plugins.gradle.org', why: 'Gradle plugin portal (Loom, ModDevGradle)' },
16
+ { host: 'repo.maven.apache.org', why: 'Maven Central' },
17
+ { host: 'piston-meta.mojang.com', why: 'Minecraft version manifest' },
18
+ { host: 'piston-data.mojang.com', why: 'Minecraft client and server jars' },
19
+ { host: 'libraries.minecraft.net', why: 'Minecraft libraries (LWJGL, authlib)' },
20
+ { host: 'resources.download.minecraft.net', why: 'Minecraft assets' },
21
+ { host: 'maven.neoforged.net', why: 'NeoForge and NeoForm' },
22
+ { host: 'maven.minecraftforge.net', why: 'srgutils/unsafe, pulled in by NeoGradle' },
23
+ { host: 'maven.fabricmc.net', why: 'Fabric loader, Loom and intermediary mappings' },
24
+ { host: 'maven.parchmentmc.org', why: 'Parchment parameter mappings' },
25
+ { host: 'repo.spongepowered.org', why: 'Mixin' },
26
+ { host: 'cyclopsmc.github.io', why: 'the ClientDevBridge builds, from the releases Maven' },
27
+ { host: 'maven.pkg.github.com', why: 'CyclopsMC packages, if the mod under test needs them' },
28
+ { host: 'registry.npmjs.org', why: 'the CLI itself, via npx' },
29
+ ];
30
+ function reachable(host, timeoutMs = 8000) {
31
+ return new Promise((resolve) => {
32
+ const request = https.request({ host, port: 443, method: 'HEAD', path: '/', timeout: timeoutMs }, (response) => {
33
+ response.resume();
34
+ // Any HTTP answer proves the host is reachable; 404 and 401 are perfectly normal for a root path.
35
+ resolve(true);
36
+ });
37
+ request.on('error', () => resolve(false));
38
+ request.on('timeout', () => {
39
+ request.destroy();
40
+ resolve(false);
41
+ });
42
+ request.end();
43
+ });
44
+ }
45
+ function javaCheck(requiredMajor) {
46
+ // The JDK that matters is the one Gradle runs on, which is JAVA_HOME's -- not whatever `java`
47
+ // the PATH happens to resolve to first. A machine with a new `java` on the PATH and an older
48
+ // JAVA_HOME passes every naive check and then fails during Gradle configuration.
49
+ const current = gradleJava();
50
+ if (current.major === null) {
51
+ const missing = current.source === 'PATH' ? 'not found on PATH' : `not usable at ${current.home}`;
52
+ return {
53
+ name: 'java',
54
+ ok: false,
55
+ detail: `${missing} (this project needs Java ${requiredMajor})`,
56
+ fix: `Install a JDK ${requiredMajor} and point JAVA_HOME at it:\n` +
57
+ ` sudo apt-get install -y openjdk-${requiredMajor}-jdk\n` +
58
+ ` export JAVA_HOME=/usr/lib/jvm/java-${requiredMajor}-openjdk-amd64`,
59
+ };
60
+ }
61
+ const where = current.home === null ? 'on PATH' : `from ${current.source}=${current.home}`;
62
+ if (current.major >= requiredMajor) {
63
+ return {
64
+ name: 'java',
65
+ ok: true,
66
+ detail: `${current.versionLine ?? `Java ${current.major}`} ${where} (this project needs ${requiredMajor})`,
67
+ fix: '',
68
+ };
69
+ }
70
+ // Too old, but `start` substitutes a good one when the machine has it, so this is a warning
71
+ // about the environment rather than a reason not to try.
72
+ const substitute = findJavaHome(requiredMajor);
73
+ if (substitute !== null) {
74
+ return {
75
+ name: 'java',
76
+ ok: true,
77
+ workedAround: true,
78
+ detail: `Java ${current.major} ${where} is too old for this project, which needs ${requiredMajor}; ` +
79
+ `Gradle will be run on ${substitute.home} (Java ${substitute.major}) instead`,
80
+ fix: `Nothing has to be done -- 'clientdevbridge start' substitutes that JDK itself. To stop ` +
81
+ `every command mentioning it: export JAVA_HOME=${substitute.home}`,
82
+ };
83
+ }
84
+ return {
85
+ name: 'java',
86
+ ok: false,
87
+ detail: `Java ${current.major} ${where} (this project needs ${requiredMajor})`,
88
+ fix: `This project needs Java ${requiredMajor}, but Gradle would run on Java ${current.major}, ` +
89
+ 'and no newer JDK was found in the usual places. Install it and point JAVA_HOME at it:\n' +
90
+ ` sudo apt-get install -y openjdk-${requiredMajor}-jdk\n` +
91
+ ` export JAVA_HOME=/usr/lib/jvm/java-${requiredMajor}-openjdk-amd64\n` +
92
+ ' A Gradle toolchain is not enough here: the loader plugins refuse to configure when ' +
93
+ 'Gradle itself runs on an older JDK than the Minecraft version needs.',
94
+ };
95
+ }
96
+ export async function collectChecks(projectDir, options) {
97
+ const checks = [];
98
+ // The required Java version is a property of the project, not a constant: Minecraft 1.21 needs
99
+ // 21 and 26 needs 25, and the loader plugins check the JDK Gradle itself runs on.
100
+ checks.push(javaCheck(declaredJavaVersion(readGradleProperties(projectDir))));
101
+ checks.push({
102
+ name: 'node',
103
+ ok: Number(process.versions.node.split('.')[0]) >= 20,
104
+ detail: `v${process.versions.node}`,
105
+ fix: Number(process.versions.node.split('.')[0]) >= 20 ? '' : 'clientdevbridge-cli needs Node 20 or newer.',
106
+ });
107
+ const wrapper = path.join(projectDir, process.platform === 'win32' ? 'gradlew.bat' : 'gradlew');
108
+ const hasWrapper = fs.existsSync(wrapper);
109
+ checks.push({
110
+ name: 'gradle wrapper',
111
+ ok: hasWrapper,
112
+ detail: hasWrapper ? wrapper : `missing at ${wrapper}`,
113
+ fix: hasWrapper ? '' : 'Point --project at a Gradle mod checkout.',
114
+ });
115
+ const headless = process.platform === 'linux' && (process.env['DISPLAY'] ?? '').length === 0;
116
+ if (headless) {
117
+ const hasXvfb = commandExists('xvfb-run');
118
+ checks.push({
119
+ name: 'xvfb',
120
+ ok: hasXvfb,
121
+ detail: hasXvfb ? 'xvfb-run available' : 'not installed and $DISPLAY is unset',
122
+ fix: hasXvfb ? '' : 'sudo apt-get install -y xvfb',
123
+ });
124
+ const driDir = '/usr/lib/x86_64-linux-gnu/dri';
125
+ const hasSoftwareGl = fs.existsSync(path.join(driDir, 'swrast_dri.so')) || fs.existsSync(path.join(driDir, 'kms_swrast_dri.so'));
126
+ checks.push({
127
+ name: 'mesa (software GL)',
128
+ ok: hasSoftwareGl,
129
+ detail: hasSoftwareGl ? `llvmpipe drivers present in ${driDir}` : `no swrast driver in ${driDir}`,
130
+ fix: hasSoftwareGl ? '' : 'sudo apt-get install -y libgl1-mesa-dri mesa-utils',
131
+ });
132
+ }
133
+ if (hasWrapper) {
134
+ try {
135
+ const project = detectProject(projectDir, { loader: options.loader });
136
+ checks.push({
137
+ name: 'project',
138
+ ok: true,
139
+ detail: `Minecraft ${project.minecraftVersion}, ${project.loader}, task ${project.gradleTask}`,
140
+ fix: '',
141
+ });
142
+ const artifactLine = findLine(project.minecraftVersion);
143
+ checks.push({
144
+ name: 'clientdevbridge build',
145
+ ok: artifactLine !== undefined,
146
+ detail: artifactLine === undefined
147
+ ? `no branch maps to Minecraft ${project.minecraftVersion}`
148
+ : `${GROUP}:${artifactId(project.minecraftVersion, project.loader)} from branch ${artifactLine.branch}`,
149
+ fix: artifactLine === undefined
150
+ ? `Supported lines: ${ARTIFACT_LINES.map((entry) => entry.branch).join(', ')}. ` +
151
+ 'Pass --clientdevbridge-version to pin a build explicitly.'
152
+ : '',
153
+ });
154
+ const localRepo = path.join(process.env['HOME'] ?? '', '.m2/repository', GROUP.replace(/\./g, '/'), artifactId(project.minecraftVersion, project.loader));
155
+ const inMavenLocal = fs.existsSync(localRepo);
156
+ checks.push({
157
+ name: 'mavenLocal build',
158
+ ok: true,
159
+ detail: inMavenLocal
160
+ ? `found ${localRepo}`
161
+ : 'none (the released build from GitHub Packages will be used)',
162
+ fix: '',
163
+ });
164
+ }
165
+ catch (error) {
166
+ checks.push({
167
+ name: 'project',
168
+ ok: false,
169
+ detail: error.message,
170
+ fix: 'Pass --mc-version and --loader explicitly.',
171
+ });
172
+ }
173
+ }
174
+ const properties = readGradleProperties(projectDir);
175
+ if (properties['minecraft_version'] !== undefined) {
176
+ checks.push({
177
+ name: 'loaders available',
178
+ ok: true,
179
+ detail: detectLoaders(projectDir).join(', ') || 'none detected',
180
+ fix: '',
181
+ });
182
+ }
183
+ if (options.network) {
184
+ const results = await Promise.all(REQUIRED_HOSTS.map(async (entry) => ({ entry, ok: await reachable(entry.host) })));
185
+ for (const { entry, ok } of results) {
186
+ checks.push({
187
+ name: `net ${entry.host}`,
188
+ ok,
189
+ detail: ok ? entry.why : `unreachable (${entry.why})`,
190
+ fix: ok ? '' : `Allow https://${entry.host} in the sandbox network policy.`,
191
+ });
192
+ }
193
+ }
194
+ return checks;
195
+ }
196
+ export async function runDoctor(global, options) {
197
+ const checks = await collectChecks(global.project, options);
198
+ const failures = checks.filter((check) => !check.ok);
199
+ if (global.json) {
200
+ printJson({ ok: failures.length === 0, checks });
201
+ return failures.length === 0 ? 0 : 2;
202
+ }
203
+ for (const check of checks) {
204
+ const status = !check.ok ? 'FAIL' : check.workedAround === true ? 'warn' : 'ok ';
205
+ line(`${status} ${check.name.padEnd(30)} ${check.detail}`);
206
+ }
207
+ const warnings = checks.filter((check) => check.ok && check.workedAround === true);
208
+ if (warnings.length > 0) {
209
+ line('');
210
+ line('Worked around:');
211
+ for (const warning of warnings) {
212
+ line(` - ${warning.name}: ${warning.fix}`);
213
+ }
214
+ }
215
+ if (failures.length > 0) {
216
+ line('');
217
+ line('To fix:');
218
+ for (const failure of failures) {
219
+ if (failure.fix.length > 0) {
220
+ line(` - ${failure.name}: ${failure.fix}`);
221
+ }
222
+ }
223
+ }
224
+ else {
225
+ line('');
226
+ // Naming the loader that was actually checked: on a multiloader project a bare `start` picks
227
+ // NeoForge, so telling someone who ran `doctor --loader fabric` to run `start` sends them to a
228
+ // different client than the one just vouched for.
229
+ const loader = options.loader === undefined ? '' : ` --loader ${options.loader}`;
230
+ line(`Everything checks out. Run: clientdevbridge start${loader}`);
231
+ }
232
+ return failures.length === 0 ? 0 : 2;
233
+ }
234
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { GlobalOptions } from './context.js';
2
+ export interface HotswapOptions {
3
+ readonly compile: boolean;
4
+ readonly baseline: boolean;
5
+ }
6
+ export declare function runHotswap(global: GlobalOptions, options: HotswapOptions): Promise<void>;
7
+ //# sourceMappingURL=hotswap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hotswap.d.ts","sourceRoot":"","sources":["../../src/commands/hotswap.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAqF9F"}
@@ -0,0 +1,76 @@
1
+ import { detectProject } from '../detect.js';
2
+ import { CliError } from '../errors.js';
3
+ import { detectJetBrainsRuntime, diffClasses, gradleCompile, readPreviousSnapshot, redefineClasses, scanClasses, writeSnapshot, } from '../hotswap.js';
4
+ import { line, printJson } from '../output.js';
5
+ import { requireRunningSession } from '../session.js';
6
+ export async function runHotswap(global, options) {
7
+ const { session, paths } = requireRunningSession(global.project);
8
+ const project = detectProject(global.project, { loader: session.loader, minecraftVersion: session.mcVersion });
9
+ if (options.baseline) {
10
+ writeSnapshot(paths.hotswapState, scanClasses(project.projectDir));
11
+ line('Recorded the current classes as the hotswap baseline; nothing was swapped.');
12
+ return;
13
+ }
14
+ if (session.jdwpPort === null) {
15
+ throw new CliError('This client was started without a debug port, so its classes cannot be redefined.', 2, 'Restart with: clientdevbridge restart --jdwp-port 5005');
16
+ }
17
+ if (options.compile) {
18
+ if (!global.quiet) {
19
+ line('Compiling...');
20
+ }
21
+ gradleCompile(project.projectDir, project.gradleWrapper, project.javaVersion);
22
+ }
23
+ const current = scanClasses(project.projectDir);
24
+ const previous = readPreviousSnapshot(paths.hotswapState);
25
+ const { changed, added } = diffClasses(previous, current);
26
+ if (previous === null) {
27
+ writeSnapshot(paths.hotswapState, current);
28
+ line(`No hotswap baseline existed, so ${current.size} classes were recorded as the baseline and nothing was swapped.`);
29
+ line('Edit your code, then run hotswap again.');
30
+ return;
31
+ }
32
+ if (changed.length === 0) {
33
+ writeSnapshot(paths.hotswapState, current);
34
+ if (global.json) {
35
+ printJson({ swapped: [], failed: [], pending: [], added, needsRestart: false });
36
+ return;
37
+ }
38
+ line(`Nothing changed since the last hotswap${added.length === 0 ? '' : ` (${added.length} new classes)`}.`);
39
+ return;
40
+ }
41
+ const result = redefineClasses(session.jdwpPort, changed);
42
+ writeSnapshot(paths.hotswapState, current);
43
+ if (global.json) {
44
+ printJson({ ...result, added });
45
+ return;
46
+ }
47
+ for (const name of result.swapped) {
48
+ line(`swapped ${name}`);
49
+ }
50
+ for (const failure of result.failed) {
51
+ line(`FAILED ${failure.name}: ${failure.reason}`);
52
+ }
53
+ for (const name of result.pending) {
54
+ line(`pending ${name} (not loaded yet; the new code is used the first time it is)`);
55
+ }
56
+ if (added.length > 0) {
57
+ line(`# ${added.length} new class${added.length === 1 ? '' : 'es'} will be picked up on first use`);
58
+ }
59
+ if (result.swapped.length > 0 && !result.needsRestart) {
60
+ line('');
61
+ line(`Swapped ${result.swapped.length} class${result.swapped.length === 1 ? '' : 'es'} into the running client.`);
62
+ }
63
+ if (result.needsRestart) {
64
+ line('');
65
+ line('Some classes could not be redefined in place. HotSpot can only replace method bodies:');
66
+ line('adding or removing a field, a method, or a superclass needs a full restart.');
67
+ line('Run: clientdevbridge restart');
68
+ if (!detectJetBrainsRuntime()) {
69
+ line('');
70
+ line('The JetBrains Runtime supports much more extensive redefinition (adding methods and');
71
+ line('fields). Pointing JAVA_HOME at a JBR install makes more of these swaps succeed.');
72
+ }
73
+ process.exitCode = 1;
74
+ }
75
+ }
76
+ //# sourceMappingURL=hotswap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hotswap.js","sourceRoot":"","sources":["../../src/commands/hotswap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAQtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAqB,EAAE,OAAuB;IAC7E,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAE/G,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,4EAA4E,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,QAAQ,CAChB,mFAAmF,EACnF,CAAC,EACD,wDAAwD,CACzD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,cAAc,CAAC,CAAC;QACvB,CAAC;QACD,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CACF,mCAAmC,OAAO,CAAC,IAAI,iEAAiE,CACjH,CAAC;QACF,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,yCAAyC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;QAC7G,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE3C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,IAAI,8DAA8D,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,aAAa,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,iCAAiC,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,CAAC;QACT,IAAI,CAAC,WAAW,MAAM,CAAC,OAAO,CAAC,MAAM,SAAS,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,2BAA2B,CAAC,CAAC;IACpH,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE,CAAC,CAAC;QACT,IAAI,CAAC,uFAAuF,CAAC,CAAC;QAC9F,IAAI,CAAC,6EAA6E,CAAC,CAAC;QACpF,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACrC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,CAAC;YACT,IAAI,CAAC,qFAAqF,CAAC,CAAC;YAC5F,IAAI,CAAC,iFAAiF,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { type GlobalOptions } from './context.js';
2
+ export declare function parsePoint(raw: string, what: string): {
3
+ x: number;
4
+ y: number;
5
+ };
6
+ export declare function runClick(global: GlobalOptions, options: {
7
+ at?: string | undefined;
8
+ widget?: string | undefined;
9
+ button: string;
10
+ space: string;
11
+ }): Promise<void>;
12
+ export declare function runType(global: GlobalOptions, text: string): Promise<void>;
13
+ export declare function runKey(global: GlobalOptions, key: string, options: {
14
+ action: string;
15
+ modifiers?: string | undefined;
16
+ }): Promise<void>;
17
+ export declare function runHoldKey(global: GlobalOptions, key: string, options: {
18
+ ticks: string;
19
+ }): Promise<void>;
20
+ export declare function runMouseMove(global: GlobalOptions, at: string, options: {
21
+ space: string;
22
+ }): Promise<void>;
23
+ export declare function runScroll(global: GlobalOptions, options: {
24
+ at: string;
25
+ dy: string;
26
+ dx: string;
27
+ space: string;
28
+ }): Promise<void>;
29
+ export declare function runDrag(global: GlobalOptions, options: {
30
+ from: string;
31
+ to: string;
32
+ button: string;
33
+ steps: string;
34
+ space: string;
35
+ }): Promise<void>;
36
+ export declare function runOpenGui(global: GlobalOptions, x: string, y: string, z: string, options: {
37
+ approach: boolean;
38
+ }): Promise<void>;
39
+ export declare function runCloseScreen(global: GlobalOptions): Promise<void>;
40
+ export declare function runEval(global: GlobalOptions, code: string): Promise<void>;
41
+ export declare function isDescribedObject(value: unknown): value is {
42
+ type: string;
43
+ toString: string;
44
+ };
45
+ export declare function runWaitFor(global: GlobalOptions, options: {
46
+ ticks?: string | undefined;
47
+ screen?: string | undefined;
48
+ expr?: string | undefined;
49
+ inWorld?: boolean | undefined;
50
+ chunk?: string | undefined;
51
+ timeout: string;
52
+ }): Promise<void>;
53
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/commands/input.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,cAAc,CAAC;AAE9D,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAM9E;AAgBD,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/F,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhF;AAED,wBAAsB,MAAM,CAC1B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC1D,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9G;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/G;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7D,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClF,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzE;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAQ7F;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CA4Cf"}