modestbench 0.9.1 → 0.9.2

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 (151) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cli/builder.cjs +259 -0
  3. package/dist/cli/builder.cjs.map +1 -0
  4. package/dist/cli/builder.d.cts +37 -0
  5. package/dist/cli/builder.d.cts.map +1 -0
  6. package/dist/cli/builder.d.ts +37 -0
  7. package/dist/cli/builder.d.ts.map +1 -0
  8. package/dist/cli/builder.js +255 -0
  9. package/dist/cli/builder.js.map +1 -0
  10. package/dist/cli/commands/baseline.cjs +4 -33
  11. package/dist/cli/commands/baseline.cjs.map +1 -1
  12. package/dist/cli/commands/baseline.d.cts.map +1 -1
  13. package/dist/cli/commands/baseline.d.ts.map +1 -1
  14. package/dist/cli/commands/baseline.js +2 -31
  15. package/dist/cli/commands/baseline.js.map +1 -1
  16. package/dist/cli/commands/history.cjs +2 -14
  17. package/dist/cli/commands/history.cjs.map +1 -1
  18. package/dist/cli/commands/history.d.cts.map +1 -1
  19. package/dist/cli/commands/history.d.ts.map +1 -1
  20. package/dist/cli/commands/history.js +1 -13
  21. package/dist/cli/commands/history.js.map +1 -1
  22. package/dist/cli/context.cjs +60 -0
  23. package/dist/cli/context.cjs.map +1 -0
  24. package/dist/cli/context.d.cts +28 -0
  25. package/dist/cli/context.d.cts.map +1 -0
  26. package/dist/cli/context.d.ts +28 -0
  27. package/dist/cli/context.d.ts.map +1 -0
  28. package/dist/cli/context.js +56 -0
  29. package/dist/cli/context.js.map +1 -0
  30. package/dist/cli/handlers.cjs +74 -0
  31. package/dist/cli/handlers.cjs.map +1 -0
  32. package/dist/cli/handlers.d.cts +13 -0
  33. package/dist/cli/handlers.d.cts.map +1 -0
  34. package/dist/cli/handlers.d.ts +13 -0
  35. package/dist/cli/handlers.d.ts.map +1 -0
  36. package/dist/cli/handlers.js +70 -0
  37. package/dist/cli/handlers.js.map +1 -0
  38. package/dist/cli/index.cjs +12 -724
  39. package/dist/cli/index.cjs.map +1 -1
  40. package/dist/cli/index.d.cts +4 -39
  41. package/dist/cli/index.d.cts.map +1 -1
  42. package/dist/cli/index.d.ts +4 -39
  43. package/dist/cli/index.d.ts.map +1 -1
  44. package/dist/cli/index.js +9 -722
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/cli/parsers/analyze.cjs +54 -0
  47. package/dist/cli/parsers/analyze.cjs.map +1 -0
  48. package/dist/cli/parsers/analyze.d.cts +37 -0
  49. package/dist/cli/parsers/analyze.d.cts.map +1 -0
  50. package/dist/cli/parsers/analyze.d.ts +37 -0
  51. package/dist/cli/parsers/analyze.d.ts.map +1 -0
  52. package/dist/cli/parsers/analyze.js +51 -0
  53. package/dist/cli/parsers/analyze.js.map +1 -0
  54. package/dist/cli/parsers/baseline.cjs +75 -0
  55. package/dist/cli/parsers/baseline.cjs.map +1 -0
  56. package/dist/cli/parsers/baseline.d.cts +59 -0
  57. package/dist/cli/parsers/baseline.d.cts.map +1 -0
  58. package/dist/cli/parsers/baseline.d.ts +59 -0
  59. package/dist/cli/parsers/baseline.d.ts.map +1 -0
  60. package/dist/cli/parsers/baseline.js +72 -0
  61. package/dist/cli/parsers/baseline.js.map +1 -0
  62. package/dist/cli/parsers/global.cjs +49 -0
  63. package/dist/cli/parsers/global.cjs.map +1 -0
  64. package/dist/cli/parsers/global.d.cts +45 -0
  65. package/dist/cli/parsers/global.d.cts.map +1 -0
  66. package/dist/cli/parsers/global.d.ts +45 -0
  67. package/dist/cli/parsers/global.d.ts.map +1 -0
  68. package/dist/cli/parsers/global.js +46 -0
  69. package/dist/cli/parsers/global.js.map +1 -0
  70. package/dist/cli/parsers/history.cjs +138 -0
  71. package/dist/cli/parsers/history.cjs.map +1 -0
  72. package/dist/cli/parsers/history.d.cts +108 -0
  73. package/dist/cli/parsers/history.d.cts.map +1 -0
  74. package/dist/cli/parsers/history.d.ts +108 -0
  75. package/dist/cli/parsers/history.d.ts.map +1 -0
  76. package/dist/cli/parsers/history.js +135 -0
  77. package/dist/cli/parsers/history.js.map +1 -0
  78. package/dist/cli/parsers/index.cjs +35 -0
  79. package/dist/cli/parsers/index.cjs.map +1 -0
  80. package/dist/cli/parsers/index.d.cts +15 -0
  81. package/dist/cli/parsers/index.d.cts.map +1 -0
  82. package/dist/cli/parsers/index.d.ts +15 -0
  83. package/dist/cli/parsers/index.d.ts.map +1 -0
  84. package/dist/cli/parsers/index.js +15 -0
  85. package/dist/cli/parsers/index.js.map +1 -0
  86. package/dist/cli/parsers/init.cjs +39 -0
  87. package/dist/cli/parsers/init.cjs.map +1 -0
  88. package/dist/cli/parsers/init.d.cts +32 -0
  89. package/dist/cli/parsers/init.d.cts.map +1 -0
  90. package/dist/cli/parsers/init.d.ts +32 -0
  91. package/dist/cli/parsers/init.d.ts.map +1 -0
  92. package/dist/cli/parsers/init.js +36 -0
  93. package/dist/cli/parsers/init.js.map +1 -0
  94. package/dist/cli/parsers/run.cjs +99 -0
  95. package/dist/cli/parsers/run.cjs.map +1 -0
  96. package/dist/cli/parsers/run.d.cts +62 -0
  97. package/dist/cli/parsers/run.d.cts.map +1 -0
  98. package/dist/cli/parsers/run.d.ts +62 -0
  99. package/dist/cli/parsers/run.d.ts.map +1 -0
  100. package/dist/cli/parsers/run.js +96 -0
  101. package/dist/cli/parsers/run.js.map +1 -0
  102. package/dist/cli/parsers/test.cjs +42 -0
  103. package/dist/cli/parsers/test.cjs.map +1 -0
  104. package/dist/cli/parsers/test.d.cts +31 -0
  105. package/dist/cli/parsers/test.d.cts.map +1 -0
  106. package/dist/cli/parsers/test.d.ts +31 -0
  107. package/dist/cli/parsers/test.d.ts.map +1 -0
  108. package/dist/cli/parsers/test.js +39 -0
  109. package/dist/cli/parsers/test.js.map +1 -0
  110. package/dist/cli/theme.cjs +35 -0
  111. package/dist/cli/theme.cjs.map +1 -0
  112. package/dist/cli/theme.d.cts +31 -0
  113. package/dist/cli/theme.d.cts.map +1 -0
  114. package/dist/cli/theme.d.ts +31 -0
  115. package/dist/cli/theme.d.ts.map +1 -0
  116. package/dist/cli/theme.js +32 -0
  117. package/dist/cli/theme.js.map +1 -0
  118. package/dist/errors/base.cjs +3 -12
  119. package/dist/errors/base.cjs.map +1 -1
  120. package/dist/errors/base.d.cts +0 -7
  121. package/dist/errors/base.d.cts.map +1 -1
  122. package/dist/errors/base.d.ts +0 -7
  123. package/dist/errors/base.d.ts.map +1 -1
  124. package/dist/errors/base.js +1 -9
  125. package/dist/errors/base.js.map +1 -1
  126. package/dist/services/profiler/profile-runner.cjs +11 -0
  127. package/dist/services/profiler/profile-runner.cjs.map +1 -1
  128. package/dist/services/profiler/profile-runner.d.cts +2 -0
  129. package/dist/services/profiler/profile-runner.d.cts.map +1 -1
  130. package/dist/services/profiler/profile-runner.d.ts +2 -0
  131. package/dist/services/profiler/profile-runner.d.ts.map +1 -1
  132. package/dist/services/profiler/profile-runner.js +11 -0
  133. package/dist/services/profiler/profile-runner.js.map +1 -1
  134. package/package.json +1 -1
  135. package/src/cli/builder.ts +387 -0
  136. package/src/cli/commands/baseline.ts +7 -33
  137. package/src/cli/commands/history.ts +1 -16
  138. package/src/cli/context.ts +117 -0
  139. package/src/cli/handlers.ts +76 -0
  140. package/src/cli/index.ts +10 -1012
  141. package/src/cli/parsers/analyze.ts +61 -0
  142. package/src/cli/parsers/baseline.ts +92 -0
  143. package/src/cli/parsers/global.ts +51 -0
  144. package/src/cli/parsers/history.ts +168 -0
  145. package/src/cli/parsers/index.ts +28 -0
  146. package/src/cli/parsers/init.ts +45 -0
  147. package/src/cli/parsers/run.ts +118 -0
  148. package/src/cli/parsers/test.ts +46 -0
  149. package/src/cli/theme.ts +33 -0
  150. package/src/errors/base.ts +1 -10
  151. package/src/services/profiler/profile-runner.ts +15 -0
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * CLI Signal Handlers
4
+ *
5
+ * Handles process signals (SIGINT, SIGTERM, etc.) and uncaught errors for
6
+ * graceful shutdown of benchmark runs.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.setupSignalHandlers = void 0;
12
+ const constants_js_1 = require("../constants.cjs");
13
+ const index_js_1 = require("../errors/index.cjs");
14
+ const type_guards_js_1 = require("../utils/type-guards.cjs");
15
+ /**
16
+ * Handle process signals gracefully
17
+ */
18
+ const setupSignalHandlers = (abortController) => {
19
+ let abortRequested = false;
20
+ const handleSignal = (signal) => {
21
+ if (abortRequested) {
22
+ // Second signal, force exit
23
+ console.log(`\nReceived ${signal} again, forcing exit...`);
24
+ process.exit(computeExitCode(signal));
25
+ }
26
+ console.log(`\nReceived ${signal}, aborting benchmarks...`);
27
+ abortRequested = true;
28
+ abortController.abort();
29
+ // Give a short grace period for cleanup, then exit
30
+ setTimeout(() => {
31
+ console.log('\nBenchmark aborted.');
32
+ process.exit(computeExitCode(signal));
33
+ }, constants_js_1.ABORT_TIMEOUT);
34
+ };
35
+ process
36
+ .once('SIGINT', handleSignal)
37
+ .once('SIGQUIT', handleSignal)
38
+ .once('SIGTERM', handleSignal)
39
+ .once('uncaughtException', (error) => {
40
+ // Wrap non-ModestBench errors with UnknownError
41
+ const wrappedError = (0, index_js_1.isModestBenchError)(error)
42
+ ? error
43
+ : new index_js_1.UnknownError(error.message, { cause: error });
44
+ console.error(`${wrappedError}`);
45
+ process.exit(constants_js_1.ExitCodes.RUNTIME_ERROR);
46
+ })
47
+ .once('unhandledRejection', (reason) => {
48
+ const wrappedError = (0, index_js_1.isModestBenchError)(reason)
49
+ ? reason
50
+ : new index_js_1.UnknownError((0, type_guards_js_1.isError)(reason) ? reason.message : String(reason), {
51
+ cause: reason,
52
+ });
53
+ console.error(`${wrappedError}`);
54
+ process.exit(constants_js_1.ExitCodes.RUNTIME_ERROR);
55
+ });
56
+ };
57
+ exports.setupSignalHandlers = setupSignalHandlers;
58
+ /**
59
+ * Compute the exit code based on the signal
60
+ *
61
+ * @param signal - The signal that caused the exit
62
+ * @returns The exit code
63
+ */
64
+ const computeExitCode = (signal) => {
65
+ switch (signal) {
66
+ case 'SIGINT':
67
+ return 130; // 128 + 2
68
+ case 'SIGQUIT':
69
+ return 131; // 128 + 3
70
+ default:
71
+ return 143; // 128 + 15 (SIGTERM)
72
+ }
73
+ };
74
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/cli/handlers.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,mDAA2D;AAC3D,kDAAsE;AACtE,6DAAkD;AAElD;;GAEG;AACI,MAAM,mBAAmB,GAAG,CAAC,eAAgC,EAAQ,EAAE;IAC5E,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,YAAY,GAAG,CAAC,MAAsB,EAAE,EAAE;QAC9C,IAAI,cAAc,EAAE,CAAC;YACnB,4BAA4B;YAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,yBAAyB,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,0BAA0B,CAAC,CAAC;QAC5D,cAAc,GAAG,IAAI,CAAC;QACtB,eAAe,CAAC,KAAK,EAAE,CAAC;QAExB,mDAAmD;QACnD,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC,EAAE,4BAAa,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO;SACJ,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC5B,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;SAC7B,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;SAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QACnC,gDAAgD;QAChD,MAAM,YAAY,GAAU,IAAA,6BAAkB,EAAC,KAAK,CAAC;YACnD,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,uBAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,wBAAS,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC,CAAC;SACD,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QACrC,MAAM,YAAY,GAAU,IAAA,6BAAkB,EAAC,MAAM,CAAC;YACpD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,uBAAY,CAAC,IAAA,wBAAO,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;gBAClE,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,wBAAS,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AA1CW,QAAA,mBAAmB,uBA0C9B;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,MAAsB,EAAU,EAAE;IACzD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC,CAAC,UAAU;QACxB,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC,CAAC,UAAU;QACxB;YACE,OAAO,GAAG,CAAC,CAAC,qBAAqB;IACrC,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CLI Signal Handlers
3
+ *
4
+ * Handles process signals (SIGINT, SIGTERM, etc.) and uncaught errors for
5
+ * graceful shutdown of benchmark runs.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Handle process signals gracefully
11
+ */
12
+ export declare const setupSignalHandlers: (abortController: AbortController) => void;
13
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/cli/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,iBAAiB,eAAe,KAAG,IA0CtE,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CLI Signal Handlers
3
+ *
4
+ * Handles process signals (SIGINT, SIGTERM, etc.) and uncaught errors for
5
+ * graceful shutdown of benchmark runs.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Handle process signals gracefully
11
+ */
12
+ export declare const setupSignalHandlers: (abortController: AbortController) => void;
13
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/cli/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,iBAAiB,eAAe,KAAG,IA0CtE,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * CLI Signal Handlers
3
+ *
4
+ * Handles process signals (SIGINT, SIGTERM, etc.) and uncaught errors for
5
+ * graceful shutdown of benchmark runs.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { ABORT_TIMEOUT, ExitCodes } from "../constants.js";
10
+ import { isModestBenchError, UnknownError } from "../errors/index.js";
11
+ import { isError } from "../utils/type-guards.js";
12
+ /**
13
+ * Handle process signals gracefully
14
+ */
15
+ export const setupSignalHandlers = (abortController) => {
16
+ let abortRequested = false;
17
+ const handleSignal = (signal) => {
18
+ if (abortRequested) {
19
+ // Second signal, force exit
20
+ console.log(`\nReceived ${signal} again, forcing exit...`);
21
+ process.exit(computeExitCode(signal));
22
+ }
23
+ console.log(`\nReceived ${signal}, aborting benchmarks...`);
24
+ abortRequested = true;
25
+ abortController.abort();
26
+ // Give a short grace period for cleanup, then exit
27
+ setTimeout(() => {
28
+ console.log('\nBenchmark aborted.');
29
+ process.exit(computeExitCode(signal));
30
+ }, ABORT_TIMEOUT);
31
+ };
32
+ process
33
+ .once('SIGINT', handleSignal)
34
+ .once('SIGQUIT', handleSignal)
35
+ .once('SIGTERM', handleSignal)
36
+ .once('uncaughtException', (error) => {
37
+ // Wrap non-ModestBench errors with UnknownError
38
+ const wrappedError = isModestBenchError(error)
39
+ ? error
40
+ : new UnknownError(error.message, { cause: error });
41
+ console.error(`${wrappedError}`);
42
+ process.exit(ExitCodes.RUNTIME_ERROR);
43
+ })
44
+ .once('unhandledRejection', (reason) => {
45
+ const wrappedError = isModestBenchError(reason)
46
+ ? reason
47
+ : new UnknownError(isError(reason) ? reason.message : String(reason), {
48
+ cause: reason,
49
+ });
50
+ console.error(`${wrappedError}`);
51
+ process.exit(ExitCodes.RUNTIME_ERROR);
52
+ });
53
+ };
54
+ /**
55
+ * Compute the exit code based on the signal
56
+ *
57
+ * @param signal - The signal that caused the exit
58
+ * @returns The exit code
59
+ */
60
+ const computeExitCode = (signal) => {
61
+ switch (signal) {
62
+ case 'SIGINT':
63
+ return 130; // 128 + 2
64
+ case 'SIGQUIT':
65
+ return 131; // 128 + 3
66
+ default:
67
+ return 143; // 128 + 15 (SIGTERM)
68
+ }
69
+ };
70
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/cli/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,wBAAwB;AAC3D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,2BAA2B;AACtE,OAAO,EAAE,OAAO,EAAE,gCAAgC;AAElD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,eAAgC,EAAQ,EAAE;IAC5E,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,YAAY,GAAG,CAAC,MAAsB,EAAE,EAAE;QAC9C,IAAI,cAAc,EAAE,CAAC;YACnB,4BAA4B;YAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,yBAAyB,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,0BAA0B,CAAC,CAAC;QAC5D,cAAc,GAAG,IAAI,CAAC;QACtB,eAAe,CAAC,KAAK,EAAE,CAAC;QAExB,mDAAmD;QACnD,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC,EAAE,aAAa,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO;SACJ,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC5B,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;SAC7B,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;SAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QACnC,gDAAgD;QAChD,MAAM,YAAY,GAAU,kBAAkB,CAAC,KAAK,CAAC;YACnD,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC,CAAC;SACD,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QACrC,MAAM,YAAY,GAAU,kBAAkB,CAAC,MAAM,CAAC;YACpD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;gBAClE,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,MAAsB,EAAU,EAAE;IACzD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC,CAAC,UAAU;QACxB,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC,CAAC,UAAU;QACxB;YACE,OAAO,GAAG,CAAC,CAAC,qBAAqB;IACrC,CAAC;AACH,CAAC,CAAC"}