skills-doctor 0.5.2 → 0.6.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 (78) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +50 -14
  3. package/dist/cli/commands/scan.d.ts +1 -0
  4. package/dist/cli/commands/scan.d.ts.map +1 -1
  5. package/dist/cli/commands/scan.js +523 -51
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +3 -2
  8. package/dist/cli/utils/cleanup-handoff-to-agent.d.ts.map +1 -1
  9. package/dist/cli/utils/cleanup-handoff-to-agent.js +1 -4
  10. package/dist/cli/utils/handle-error.d.ts +4 -0
  11. package/dist/cli/utils/handle-error.d.ts.map +1 -1
  12. package/dist/cli/utils/handle-error.js +7 -0
  13. package/dist/cli/utils/handoff-to-agent.d.ts +1 -0
  14. package/dist/cli/utils/handoff-to-agent.d.ts.map +1 -1
  15. package/dist/cli/utils/handoff-to-agent.js +19 -9
  16. package/dist/cli/utils/launch-agent.d.ts.map +1 -1
  17. package/dist/cli/utils/launch-agent.js +18 -3
  18. package/dist/cli/utils/prompts.d.ts +6 -0
  19. package/dist/cli/utils/prompts.d.ts.map +1 -1
  20. package/dist/cli/utils/prompts.js +63 -3
  21. package/dist/cli/utils/tui-dashboard.d.ts +20 -0
  22. package/dist/cli/utils/tui-dashboard.d.ts.map +1 -0
  23. package/dist/cli/utils/tui-dashboard.js +516 -0
  24. package/dist/domain/analyze-skill-usage.d.ts +1 -0
  25. package/dist/domain/analyze-skill-usage.d.ts.map +1 -1
  26. package/dist/domain/analyze-skill-usage.js +6 -0
  27. package/dist/domain/build-cleanup-handoff-prompt.d.ts.map +1 -1
  28. package/dist/domain/build-cleanup-handoff-prompt.js +30 -3
  29. package/dist/domain/build-handoff-prompt.d.ts.map +1 -1
  30. package/dist/domain/build-handoff-prompt.js +24 -1
  31. package/dist/domain/build-report.d.ts +5 -1
  32. package/dist/domain/build-report.d.ts.map +1 -1
  33. package/dist/domain/build-report.js +31 -6
  34. package/dist/domain/discover-skill-artifacts.d.ts +3 -0
  35. package/dist/domain/discover-skill-artifacts.d.ts.map +1 -0
  36. package/dist/domain/discover-skill-artifacts.js +222 -0
  37. package/dist/domain/rule-catalog.d.ts +146 -3
  38. package/dist/domain/rule-catalog.d.ts.map +1 -1
  39. package/dist/domain/rule-catalog.js +168 -2
  40. package/dist/domain/rules/quality.d.ts.map +1 -1
  41. package/dist/domain/rules/quality.js +54 -2
  42. package/dist/domain/rules/security.d.ts +57 -0
  43. package/dist/domain/rules/security.d.ts.map +1 -0
  44. package/dist/domain/rules/security.js +1183 -0
  45. package/dist/domain/rules/structural.js +35 -10
  46. package/dist/domain/scan-skills.d.ts.map +1 -1
  47. package/dist/domain/scan-skills.js +16 -1
  48. package/dist/domain/security/capabilities.d.ts +3 -0
  49. package/dist/domain/security/capabilities.d.ts.map +1 -0
  50. package/dist/domain/security/capabilities.js +77 -0
  51. package/dist/domain/security/commands.d.ts +3 -0
  52. package/dist/domain/security/commands.d.ts.map +1 -0
  53. package/dist/domain/security/commands.js +12 -0
  54. package/dist/domain/security/detector-types.d.ts +14 -0
  55. package/dist/domain/security/detector-types.d.ts.map +1 -0
  56. package/dist/domain/security/detector-types.js +12 -0
  57. package/dist/domain/security/network.d.ts +3 -0
  58. package/dist/domain/security/network.d.ts.map +1 -0
  59. package/dist/domain/security/network.js +10 -0
  60. package/dist/domain/security/obfuscation.d.ts +3 -0
  61. package/dist/domain/security/obfuscation.d.ts.map +1 -0
  62. package/dist/domain/security/obfuscation.js +16 -0
  63. package/dist/domain/security/permissions.d.ts +3 -0
  64. package/dist/domain/security/permissions.d.ts.map +1 -0
  65. package/dist/domain/security/permissions.js +14 -0
  66. package/dist/domain/security/secrets.d.ts +4 -0
  67. package/dist/domain/security/secrets.d.ts.map +1 -0
  68. package/dist/domain/security/secrets.js +11 -0
  69. package/dist/domain/summarize-findings.d.ts +15 -1
  70. package/dist/domain/summarize-findings.d.ts.map +1 -1
  71. package/dist/domain/summarize-findings.js +140 -8
  72. package/dist/domain/types.d.ts +64 -1
  73. package/dist/domain/types.d.ts.map +1 -1
  74. package/dist/domain/write-findings-directory.js +33 -0
  75. package/dist/index.d.ts +3 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +2 -1
  78. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -6,6 +6,63 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.6.0] - 2026-07-04
10
+
11
+ ### Added
12
+
13
+ - Added past-30-day detected usage counts to usage summaries and the unused-skill cleanup picker.
14
+ - Added scoped bulk agent handoffs for selected usage recommendation groups.
15
+ - Added `b back` navigation to nested interactive checkbox selectors and select-based submenus with a `Back to main menu` choice.
16
+ - Added severity bucket selection to security repair handoffs so users can select Critical, High, Medium, or Review findings in bulk while still selecting individual findings.
17
+ - Added security review incident grouping for human output while preserving raw security findings in JSON reports.
18
+ - Added security priority and capability aggregate counts to JSON reports, plus `--fail-on-security` for stricter P1/P2 security gates.
19
+ - Added P2 security hygiene rules for missing boundaries, missing human approval, ambiguous authority, unpinned tools, hidden artifacts, and large context bait.
20
+ - Added P1 high-risk security rules for broad tool grants, missing denylists, broad implicit invocation, external dependencies, cross-modal mismatch, self-modifying skills, MCP exposure, and MCP OAuth scope excess.
21
+ - Added P0 security priorities and spec-aligned `SKILL001_*` through `SKILL008_*` rule IDs for blocker security detections.
22
+ - Added derived security capability facts for package artifacts, including secret access, network egress, remote execution, persistence, approval bypass, destructive actions, broad tools, MCP access, and obfuscation indicators.
23
+ - Added package artifact discovery metadata to scan results, including script/resource/config files and symlink status.
24
+ - Added package security model types for future artifact, capability, priority, and cross-file evidence reporting.
25
+ - Added a full-screen interactive TTY dashboard with scan progress, usage metrics, cleanup candidates, and keyboard-driven next-step actions.
26
+ - Added a public security-rule validator API surface for future malicious skill detection rules.
27
+
28
+ ### Changed
29
+
30
+ - Replaced the TUI dashboard completion progress strip with a scan score panel showing the score, label, penalty, and contributing rule counts.
31
+ - Reformatted interactive security review output into severity and category summary tables plus a compact incident table with user-facing Critical/High/Medium labels instead of P-code prose dumps.
32
+ - Made the TUI dashboard adaptive across terminal widths, with percentage progress, a package-version brand card, a security findings metric, and responsive metric wrapping.
33
+ - Human security review output now groups related rule hits into concise incidents and omits rationale/counterevidence noise by default.
34
+ - P0 security findings now fail scan exit-code gates by default.
35
+ - P2 security hygiene findings now contribute to scan score while remaining separate from default severity-based exit gates.
36
+ - Security validation now evaluates package records and can report risky non-`SKILL.md` artifacts while preserving the existing `validateSecurityRules()` API.
37
+ - Added confidence, rationale, and counterevidence metadata to security findings in JSON and human reports.
38
+ - Replaced the plain interactive review prompt with a painted ANSI dashboard while preserving JSON, non-interactive, and injected-prompt output paths.
39
+ - Separated security findings from quality issue counts, scoring, and default exit gates.
40
+ - Added source excerpts to security findings and a per-finding security repair selection flow.
41
+
42
+ ### Fixed
43
+
44
+ - Kept the TUI dashboard repainting on terminal resize and preserved the version brand card on medium-width terminal windows without line overruns.
45
+ - Passed the package version into interactive scan reports so the TUI brand card no longer falls back to a hard-coded version.
46
+ - Enforced non-empty compatibility metadata, string-only metadata maps, and deterministic checks for interactive or unsafe referenced scripts.
47
+ - Reported package-level secret reads and persistence capabilities as their required P0 security findings, and included both secret and network evidence in package exfiltration chains.
48
+ - Reduced prompt-injection false positives for ask-first admin flows and verified confirmation-skip CLI examples.
49
+ - Reduced exfiltration-rule false positives for webhook troubleshooting table rows and notification webhook destinations.
50
+ - Reduced exfiltration-rule false positives for webhook signing-secret setup and official API bearer-token examples while preserving arbitrary external secret-transfer findings.
51
+ - Suppressed prompt-injection false positives for defensive guidance about untrusted content, refusals, secret handling, signatures, and confirmations.
52
+ - Reduced false-positive remote-execution warnings for remote specs piped into local Node or shell parser scripts.
53
+ - Reduced false-positive remote-execution warnings for skills that fetch remote docs or specs for static parsing without executing the fetched content.
54
+ - Suppressed the reported real-world false positives for defensive untrusted-content handling and explicit public-issue confirmation guidance.
55
+ - Made `bun run dev` rebuild ignored `dist/` output before launching the packaged bin so local CLI runs reflect source changes.
56
+
57
+ ### Security
58
+
59
+ - Added package-level MCP, denylist, external-dependency, self-modification, and cross-modal mismatch checks with P1 priority evidence chains.
60
+ - Added standalone local secret-access and persistence-installation blocker detections, including path-like sources such as `~/.ssh`, `.aws`, and shell startup files.
61
+ - Surfaced security findings in the interactive CLI summary and review menu.
62
+ - Integrated security findings into normal skill scans and report exit-code behavior.
63
+ - Added deterministic detection for remote execution, safety-disablement, destructive, and obfuscated command patterns in skill files.
64
+ - Added deterministic detection for instruction-subversion and secret-exfiltration patterns in skill files.
65
+
9
66
  ## [0.5.2] - 2026-06-20
10
67
 
11
68
  ### Added
package/README.md CHANGED
@@ -8,6 +8,9 @@ findings-specific repair prompt to `claude` or `codex`.
8
8
  It can also analyze local Codex usage traces to surface unused skills and
9
9
  skills context-budget pressure before handing a cleanup prompt to a local agent.
10
10
 
11
+ > ★ If Skills Doctor helps you clean up or harden your agent skills, please
12
+ > [star the repo on GitHub](https://github.com/ametel01/skills-doctor).
13
+
11
14
  ## Install And Run
12
15
 
13
16
  From a repository that contains project-local skills, or from anywhere when you
@@ -67,6 +70,11 @@ runs scan only a single unambiguous detected root. If multiple local/global
67
70
  scopes or multiple ecosystems are detected, they fail with a clear user error
68
71
  instead of guessing.
69
72
 
73
+ For each skill package, security scanning also classifies `SKILL.md`,
74
+ `scripts/**`, `references/**`, `assets/**`, agent/MCP/Claude config files,
75
+ hooks, package manifests, shell scripts, Dockerfiles, CI files, hidden files,
76
+ executable artifacts, and symlink metadata.
77
+
70
78
  ## What It Checks
71
79
 
72
80
  The scanner validates skills against `docs/SKILLS_SPEC.md`, which consolidates
@@ -80,11 +88,26 @@ the Agent Skills standards from <https://agentskills.io/home>, including:
80
88
  - script guidance that is non-interactive and reproducible
81
89
  - eval guidance for non-trivial skills
82
90
  - divergent same-name skills across Claude and Codex/agents roots
91
+ - suspicious security patterns across the skill package, including prompt
92
+ override, permission bypass, secret access, exfiltration chains, destructive
93
+ commands, persistence, remote execution, obfuscation, broad tools, missing
94
+ denylists, external dependencies, MCP exposure, self-modification, hidden
95
+ artifacts, and large context bait
83
96
 
84
97
  See `docs/RULES.md` for a full rule catalog, severity, and intended rationale.
85
98
  Programmatic consumers can import `ruleCatalog` for the same metadata as structured data.
86
-
87
- Findings are grouped as blocking errors, warnings, and advisory improvements.
99
+ Security findings are deterministic heuristic findings about suspicious
100
+ instructions or capabilities such as `reads_secrets`, `network_egress`,
101
+ `remote_code_exec`, `persistence`, `bypasses_approval`, or `mcp_access`; they
102
+ are not proof that a skill author intended harm.
103
+
104
+ Quality findings are grouped as blocking errors, warnings, and advisory improvements.
105
+ Security findings stay rule-by-rule in JSON, but human output groups related
106
+ signals into review incidents so a secret read, network transfer, missing
107
+ denylist, and cross-modal mismatch can be reviewed as one issue. Incident cards
108
+ show the primary risk, source excerpt, priority, related rule IDs, and
109
+ capabilities; detailed rationale and counterevidence remain available in JSON
110
+ and repair report files.
88
111
  The human summary opens with a score header showing a face, `0` to `100` score,
89
112
  label, and proportional terminal bar. The score starts at 100 and deducts 1.5
90
113
  points for each distinct error rule and 0.75 points for each distinct warning
@@ -103,17 +126,23 @@ available, reads local Codex usage traces from known `~/.codex` paths. It can:
103
126
  2. Show usage ranking and cleanup recommendations when usage analysis ran.
104
127
  3. Let you choose a repair subset: errors, errors plus warnings, all findings,
105
128
  or selected skills.
106
- 4. Detect local `claude` and `codex` executables.
107
- 5. Write a full report under the OS temp directory, for example
129
+ 4. Let you launch a scoped agent handoff for a selected usage recommendation
130
+ group, such as disable candidates or context-heavy descriptions.
131
+ 5. Detect local `claude` and `codex` executables.
132
+ 6. Write a full report under the OS temp directory, for example
108
133
  `/tmp/skills-doctor-<uid>/reports/<timestamp>/` on Linux.
109
- 6. Generate a compact `handoff-prompt.md` tailored to the selected findings or
134
+ 7. Generate a compact `handoff-prompt.md` tailored to the selected findings or
110
135
  `cleanup-prompt.md` tailored to usage cleanup.
111
- 7. Preview the launch command.
112
- 8. Ask for explicit confirmation before handing the terminal to the selected
136
+ 8. Preview the launch command.
137
+ 9. Ask for explicit confirmation before handing the terminal to the selected
113
138
  agent.
114
- 9. Re-scan the same roots after the agent exits and report changed findings or
139
+ 10. Re-scan the same roots after the agent exits and report changed findings or
115
140
  cleanup summary details.
116
141
 
142
+ Nested repair and cleanup selection menus let you return to the next-step
143
+ chooser without launching an agent. Checkbox prompts show `b back` in the footer
144
+ next to the normal navigation keys.
145
+
117
146
  Launch mappings:
118
147
 
119
148
  - Claude: `claude --dangerously-skip-permissions <prompt>`
@@ -123,10 +152,12 @@ Skills Doctor does not edit skill files during the scan phase. Repairs are made
123
152
  only by the local agent after you confirm the handoff.
124
153
 
125
154
  Cleanup handoff writes `usage.json`, `usage.md`, and `cleanup-prompt.md` before
126
- any agent launch. The prompt tells the agent to preserve recent/frequent skills,
127
- never delete skills, ignore non-disable recommendations during cleanup, disable
128
- unused global/plugin skills only through Codex `[[skills.config]]` entries in
129
- `~/.codex/config.toml`, and verify with `npx skills-doctor@latest`.
155
+ any agent launch. Disable prompts tell the agent to preserve recent/frequent
156
+ skills, never delete skills, ignore non-disable recommendations during cleanup,
157
+ disable unused global/plugin skills only through Codex `[[skills.config]]`
158
+ entries in `~/.codex/config.toml`, and verify with `npx skills-doctor@latest`.
159
+ Grouped usage-recommendation prompts are scoped to the selected action, such as
160
+ shortening context-heavy descriptions or reviewing duplicate skill names.
130
161
  Skills already disabled in Codex config are omitted from scan, usage-ranking,
131
162
  and cleanup-candidate results.
132
163
 
@@ -139,14 +170,19 @@ skills-doctor --json
139
170
  skills-doctor --json --json-compact
140
171
  skills-doctor --yes --json
141
172
  skills-doctor --yes --json --fail-on warning
173
+ skills-doctor --yes --json --fail-on-security P1
142
174
  skills-doctor --yes --json --min-score 95
143
175
  skills-doctor --yes --json --usage
144
176
  ```
145
177
 
146
178
  JSON mode writes one machine-readable report to stdout and suppresses prompts
147
179
  and spinners. Human logs and expected errors stay out of stdout.
148
- By default, the exit code fails only for blocking errors and error diagnostics.
149
- Use `--fail-on warning`, `--fail-on advice`, or `--min-score <number>` for stricter CI gates.
180
+ By default, the exit code fails for blocking quality errors, error diagnostics,
181
+ and P0 security findings. Use `--fail-on warning`, `--fail-on advice`,
182
+ `--fail-on-security P1`, `--fail-on-security P2`, or `--min-score <number>` for
183
+ stricter CI gates. JSON reports include security priority counts, capability
184
+ counts, and per-finding security fields such as `priority`, `capabilities`,
185
+ `confidence`, `rationale`, and `counterevidence`.
150
186
 
151
187
  Use `--usage` to include local Codex usage analysis in JSON or non-interactive
152
188
  runs. Interactive runs analyze usage by default; pass `--no-logs` to skip local
@@ -11,6 +11,7 @@ export type ScanFlags = {
11
11
  readonly logs?: boolean;
12
12
  readonly yes?: boolean;
13
13
  readonly failOn?: string | undefined;
14
+ readonly failOnSecurity?: string | undefined;
14
15
  readonly minScore?: string | undefined;
15
16
  };
16
17
  export type ScanActionOptions = {
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,iBAAiB,EAElB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAI/D,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAEhC,MAAM,wCAAwC,CAAC;AAehD,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAM5F,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGhF,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IACzD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAC9B,KAAK,EAAE,yBAAyB,KAC7B,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAC3B,KAAK,EAAE,sBAAsB,KAC1B,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;CAC3C,CAAC;AAkBF,eAAO,MAAM,UAAU,GACrB,WAAW,MAAM,EACjB,OAAO,SAAS,EAChB,UAAS,iBAAsB,KAC9B,OAAO,CAAC,UAAU,CAwIpB,CAAC"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,iBAAiB,EAGlB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAI/D,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAEhC,MAAM,wCAAwC,CAAC;AAqBhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAM5F,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAQzE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IACzD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAC9B,KAAK,EAAE,yBAAyB,KAC7B,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAC3B,KAAK,EAAE,sBAAsB,KAC1B,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;CAC3C,CAAC;AAqBF,eAAO,MAAM,UAAU,GACrB,WAAW,MAAM,EACjB,OAAO,SAAS,EAChB,UAAS,iBAAsB,KAC9B,OAAO,CAAC,UAAU,CA2JpB,CAAC"}