@asrunjs/asrun 0.11.0 → 0.12.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 (60) hide show
  1. package/.claude/commands/explore-case.md +2 -1
  2. package/.claude/commands/gen-spec.md +2 -1
  3. package/.claude/commands/heal-spec.md +2 -1
  4. package/.claude/commands/make-case.md +2 -1
  5. package/.claude/skills/exploring-cases/SKILL.md +14 -6
  6. package/.claude/skills/exploring-cases/references/case-rules.md +5 -0
  7. package/.claude/skills/exploring-cases/references/open-questions.md +8 -0
  8. package/.claude/skills/exploring-cases/references/user-handoff.md +12 -8
  9. package/.claude/skills/generating-specs/SKILL.md +17 -10
  10. package/.claude/skills/generating-specs/references/conventions.md +6 -2
  11. package/.claude/skills/making-cases/SKILL.md +12 -5
  12. package/.claude/skills/making-cases/references/writes-and-email.md +5 -2
  13. package/AGENTS.md +20 -5
  14. package/README.md +10 -6
  15. package/dist/lib/case-doc.d.ts +1 -1
  16. package/dist/lib/config.d.ts +26 -0
  17. package/dist/lib/config.js +51 -0
  18. package/dist/lib/fixtures.d.ts +1 -1
  19. package/dist/lib/fixtures.js +7 -4
  20. package/dist/lib/records.d.ts +17 -2
  21. package/dist/lib/records.js +32 -2
  22. package/dist/lib/rules.d.ts +57 -0
  23. package/dist/lib/rules.js +140 -0
  24. package/dist/scripts/cleanup.js +10 -1
  25. package/dist/scripts/cli.js +9 -1
  26. package/dist/scripts/doctor.js +27 -48
  27. package/dist/scripts/lint-specs.js +23 -1
  28. package/dist/scripts/rules.d.ts +1 -0
  29. package/dist/scripts/rules.js +148 -0
  30. package/docs/agents/case-format.md +8 -5
  31. package/docs/ai-workflow.md +21 -12
  32. package/docs/cases.md +10 -6
  33. package/docs/commands.md +22 -4
  34. package/docs/install.md +2 -1
  35. package/docs/theme-guide.html +24 -3
  36. package/docs/troubleshooting.md +11 -2
  37. package/docs/web-ui.md +12 -5
  38. package/package.json +2 -1
  39. package/templates/.claude/commands/explore-case.md +3 -1
  40. package/templates/.claude/commands/gen-spec.md +3 -1
  41. package/templates/.claude/commands/heal-spec.md +3 -1
  42. package/templates/.claude/commands/make-case.md +3 -1
  43. package/templates/AGENTS.md +17 -8
  44. package/templates/cases/_template.md +3 -3
  45. package/templates/package.json +4 -0
  46. package/ui/dist/assets/{dist--BXJInTq.js → dist-BX88bMYN.js} +1 -1
  47. package/ui/dist/assets/{dist-BMmNFIUH.js → dist-Bfv586Or.js} +1 -1
  48. package/ui/dist/assets/{dist-C9ra6_BD.js → dist-BjlbPf3t.js} +1 -1
  49. package/ui/dist/assets/{dist-ByLbEOlF.js → dist-CJnqQMvX.js} +1 -1
  50. package/ui/dist/assets/{dist-DTYj2vUD.js → dist-CaAcCNRS.js} +1 -1
  51. package/ui/dist/assets/{dist-BXNaYHeh.js → dist-Clj0wGFy.js} +1 -1
  52. package/ui/dist/assets/{dist-CTrwRc3Q.js → dist-D8TUm3Ai.js} +1 -1
  53. package/ui/dist/assets/{dist-CK8mow8u.js → dist-DUDqh_3e.js} +1 -1
  54. package/ui/dist/assets/{dist-CQS0So-i.js → dist-DkAx5a-Y.js} +1 -1
  55. package/ui/dist/assets/{dist-mV0_nQZe.js → dist-cuboTVh-.js} +1 -1
  56. package/ui/dist/assets/index-DaUQORCy.js +353 -0
  57. package/ui/dist/assets/index-j3W4BBCj.css +2 -0
  58. package/ui/dist/index.html +2 -2
  59. package/ui/dist/assets/index-BzMqkmQ9.js +0 -348
  60. package/ui/dist/assets/index-DcJR-8Mt.css +0 -2
@@ -93,10 +93,11 @@ opened and nothing is written about them, so a case can be explored in passes: A
93
93
  case keeps what the earlier runs recorded. In the web UI the profile picker of the toolbar does the same: every profile
94
94
  that is logged in in that environment is ticked, and the list you tick is remembered for the next run there.
95
95
 
96
- **To accept the suggestion, delete the whole block.** **To answer, write after `Answer:`.** Then run the command
97
- again. In the web UI, the run's **What to do next** bar offers **Answer**: the question list, an answer box,
98
- **Use the suggested defaults** and **Generate spec**. A continued job keeps the same conversation and permissions, and
99
- can be continued once per turn, only while the UI server has not restarted.
96
+ **To keep what the case says, delete the whole block.** **To answer, write after `Answer:`.** Then run the command
97
+ again. In the web UI the panel calls the first action **Keep what the case says**. The run's **What to do next** bar
98
+ offers **Answer**: the question list, an answer box, **Use the suggested defaults** and **Generate spec**. A continued
99
+ job keeps the same conversation and permissions, and can be continued once per turn, only while the UI server has not
100
+ restarted.
100
101
 
101
102
  ### Attended exploration (`--attended`)
102
103
 
@@ -109,9 +110,10 @@ the browser window opens and the agent waits while you do those steps.
109
110
  - Recording starts and stops by itself. If Playwright's own recording toolbar shows at the top of the page, leave it
110
111
  alone: it can stop the recording.
111
112
  - The card records what you did, and the agent writes it into the case under the step as **general recipe lines**
112
- (`- Recipe (phase): ...`): positions instead of names of changeable data, `[asrun]` names for created data, control
113
- labels but no selectors.
114
- - Delete the `[asrun]` items you created before you press Done on the last step.
113
+ (`- Recipe (phase): ...`): positions instead of names of changeable data, created names (project prefix plus the
114
+ run's UTC stamp), control labels but no selectors.
115
+ - Delete the test items you created (they start with the project's test-data prefix and carry this run's timestamp)
116
+ before you press Done on the last step.
115
117
  - Without `--attended` the agent never waits: a step that needs a person becomes a `TODO [blocking]`.
116
118
 
117
119
  In the web UI the **Attended** box is ticked by default for Explore.
@@ -221,6 +223,10 @@ Several binding rules hold in exploring, generating and healing. They live in th
221
223
  - **Case rules.** A `## Rules` bullet says how to run the case, never what it proves. The agent applies it while
222
224
  exploring and generating, marks code that exists only because of a rule with `// rule: <short quote>`, and lists every
223
225
  rule in its report. It never becomes an assertion and never authorizes a write or a person's step.
226
+ - **Test data is findable per run.** Everything a write case creates is named with the project's test-data prefix
227
+ (`package.json` `"asrun"`, default `[asrun]`) and the run's UTC stamp: `testDataName()` builds
228
+ `[autotest] Draft CMA (2026-11-09 12-34-56)`. Two runs never share a name, the stamp matches `reports/<run-id>`, and
229
+ a person can search the product for one run's data. The case's `## Values` holds the base without the stamp.
224
230
  - **Targets.** A check on a logo, image, icon, file, PDF, screenshot or repeated text points to a `[T1]` card under
225
231
  `## Targets`: what it is (and what it is not), where it is, how it is identified (never `.first()` or a bare `img`),
226
232
  when it is ready, and a highlighted reference screenshot under `.explore/targets/`. When in doubt the agent does not
@@ -240,9 +246,10 @@ Checks you can run yourself:
240
246
 
241
247
  | Command | What it checks |
242
248
  |---|---|
243
- | `pnpm spec:lint [case-id]` | fails on screenshots without a target, `.first()` on images, sleeps, `networkidle`, raw download events, a `%PDF` check on its own |
249
+ | `pnpm spec:lint [case-id]` | fails on screenshots without a target, `.first()` on images, sleeps, `networkidle`, raw download events, a `%PDF` check on its own; warns when a tracked test-data name is not built with `testDataName()` |
244
250
  | `pnpm baselines:review [case-id] [--new]` | lists every baseline with the card that says what it must show, so you can look at each new image |
245
251
  | `pnpm case:check [case-id]` | fails on an incomplete card, bad values, a marker inside a question or a question under a marked line; warns on an image check with no card and on a marker that does not say what to decide |
252
+ | `pnpm asrun rules [--json] [--case <id>]` | prints the effective rules (baseline, §2, project settings) the AI steps read; fails on an invalid §2 row or `testDataPrefix` |
246
253
  | `pnpm markers:confirm --case <id> --env <env> [--report <run-id>]` | after a passing run, removes the `🔍 to be confirmed` markers whose line the spec checks with `// unconfirmed:`; `--dry-run` lists them |
247
254
  | `pnpm pdf:render <file.pdf> --out <dir> [--pages all] [--corner top-left]` | renders the pages to images and prints the text, to look at a PDF by hand |
248
255
 
@@ -281,10 +288,12 @@ An override is plain Markdown; write only what differs:
281
288
  - The staging account has no published documents: assert the empty state there instead.
282
289
  ```
283
290
 
284
- The project's `AGENTS.md` §2 is the other place: a table of rule ids (`F7`–`F10`, `R1`, `R3`, `R4`; `F1`–`F6` and
285
- `R2` are fixed) with `narrows` (stricter) or `replaces` (a different default). For example, a project that writes cases in Simplified Chinese
286
- `replaces` `F10`. `pnpm asrun doctor` fails on an unknown id, a missing `Effect`, or a non-negotiable rule, and lists
287
- the overrides it sees.
291
+ The project's `AGENTS.md` §2 is the other place: a table of rule ids (`F7`–`F11`, `R1`, `R3`, `R4`; `F1`–`F6` and
292
+ `R2` are fixed) with `narrows` (stricter) or `replaces` (a different default). A rule the baseline does not have gets
293
+ a project id (`P1`, `P2`, ...) and `adds`. For example, a project that writes cases in Simplified Chinese `replaces`
294
+ `F10`. `pnpm asrun doctor` fails on an unknown id, a missing `Effect`, a duplicate id, a non-negotiable rule or a
295
+ project id without `adds`, and `pnpm asrun rules` prints the effective set (the AI steps read it before they apply
296
+ anything). A project rule is applied as written: a difference from the baseline is never a question.
288
297
 
289
298
  An update never overwrites `AGENTS.md`, `CLAUDE.md` or `.claude/skills/**`: `pnpm asrun init --force` refuses them
290
299
  without `--reset-rules`. Never edit the framework package itself.
package/docs/cases.md CHANGED
@@ -110,13 +110,14 @@ report and the trace read like the case.
110
110
  choice (an existing document, items), `[email]` for a step that sends email. They are written at the end of the
111
111
  step line.
112
112
  - **`- Recipe (phase):`** under a tagged step records what a person did in the browser during an attended
113
- exploration: positions instead of names of changeable data (`select items #1 to #3`), `[asrun]` names for created
114
- data, control labels but no selectors. Several lines per step are normal. A tagged step with no recipe is not
115
- generated: `/gen-spec` stops with `needs-input`.
113
+ exploration: positions instead of names of changeable data (`select items #1 to #3`), created names (project prefix
114
+ plus run stamp), control labels but no selectors. Several lines per step are normal. A tagged step with no recipe is
115
+ not generated: `/gen-spec` stops with `needs-input`.
116
116
  - **Open questions** go in a `🚫 TODO [blocking]` or `❓ TODO [non-blocking]` block under the sentence they are about,
117
117
  with the agent's suggestion written above and a last line `- ✍️ Answer:`. Accepting a question means deleting the
118
- whole block; answering means writing after `Answer:`. Hang the block under the sentence that makes the claim, not
119
- under a broader one above it, and one claim gets one block.
118
+ whole block; answering means writing after `Answer:`. In the web panel the two actions are **Keep what the case
119
+ says** and **Write your answer**. Hang the block under the sentence that makes the claim, not under a broader one
120
+ above it, and one claim gets one block.
120
121
  - **What the AI saw** is marked by what happens if it is wrong: `(seen on <profile>)` is a plain note the run checks by
121
122
  itself, and `(observed on <profile>, 🔍 to be confirmed: <what a person must decide>)` is a line that would pass even
122
123
  if it were wrong, so a person settles it. A marker may name a screenshot (`evidence: .explore/.../x.png`) so nobody
@@ -173,7 +174,10 @@ anything.
173
174
 
174
175
  A case may write only in the environments listed under `writes`, and only data of the test account:
175
176
 
176
- - everything it creates is named `[asrun] ...` (the `records` fixture refuses other names);
177
+ - everything it creates is named with the project's prefix and the run stamp, `<prefix> <base> (<run stamp>)`
178
+ (prefix: `asrun.testDataPrefix` in `package.json`, default `[asrun]`; stamp: the run's UTC time). The spec builds
179
+ the name with `testDataName()` (`records` refuses a name without the prefix), so two runs never collide and a
180
+ person can search the product for one run's data. `## Values` holds the base without the stamp;
177
181
  - created data is registered with `records.track` and removed after the test, also after a failure;
178
182
  - the case's own last step is normally the deletion; `track` is the safety net;
179
183
  - staging needs no confirmation. In any other environment a person confirms every run (typing the environment name,
package/docs/commands.md CHANGED
@@ -10,6 +10,7 @@ thin wrappers, so `pnpm asrun`, `pnpm signin` and the rest work as below. The sa
10
10
  | Install the framework in a project | `pnpm dlx @asrunjs/asrun init --install` |
11
11
  | Upgrade the framework and migrate the workspace | `pnpm asrun upgrade [--version <v>] [--dry-run]` |
12
12
  | Prepare or check the workspace | `pnpm asrun init [--update]`, `pnpm asrun doctor` |
13
+ | See the effective rules and project settings | `pnpm asrun rules [--json] [--case <case-id>]` |
13
14
  | See or apply the workspace migrations after a manual install | `pnpm asrun migrate [--list] [--dry-run]` |
14
15
  | Start over with fresh dependencies | `pnpm asrun reset [--yes] [--state] [--lockfile]` |
15
16
  | Start the web UI | `pnpm go`, `pnpm ui`, `pnpm ui:dev` |
@@ -160,6 +161,21 @@ covers) and `--json` prints the parsed notes for a run that reads them. A note i
160
161
  case when it is missing or stale. `--check` fails on a malformed note and warns about a stale one (it prints the current
161
162
  `caseSha256`); `--hash` prints that hash. Deleting `.explore/notes/` is always safe.
162
163
 
164
+ ## Rules
165
+
166
+ ```bash
167
+ pnpm asrun rules
168
+ pnpm asrun rules --json
169
+ pnpm asrun rules --case conduit/publish-article
170
+ ```
171
+
172
+ Prints the effective rules of the workspace: the framework baseline, the project's `AGENTS.md` §2 table (id, effect
173
+ and text), and the project settings the framework needs at run time (`testDataPrefix` and the resulting data-name
174
+ format). `--case <id>` adds that case's `## Rules`. `--json` is the machine-readable form the AI steps read before
175
+ they apply anything. A §2 row that is invalid — an unknown baseline id, a `[non-negotiable]` rule, a duplicate id, a
176
+ project id (`P1`, ...) without `adds` — is printed as an error and the command exits 1; `doctor` shows the same errors.
177
+ The point is that "§2 wins over the baseline" is a fact the tool states, not a judgment an agent has to make.
178
+
163
179
  ## Cleanup
164
180
 
165
181
  ```bash
@@ -167,10 +183,12 @@ pnpm cleanup --env staging
167
183
  pnpm cleanup --env staging --forget
168
184
  ```
169
185
 
170
- A write case registers everything it creates (named `[asrun] ...`) and removes it after the test, also after a
171
- failure. Whatever could not be removed is listed in the report and by `cleanup`. Delete it by hand in the product,
172
- then run `--forget` so it is not listed again. `--env` is required. `cleanup` is about test data in the product;
173
- `pnpm asrun reset` (below) is the command that removes workspace files and dependencies.
186
+ A write case registers everything it creates (named with the project's prefix and a run stamp, for example
187
+ `[asrun] Draft CMA (2026-11-09 12-34-56)`) and removes it after the test, also after a failure. Whatever could not be
188
+ removed is listed in the report and by `cleanup`. Delete it by hand in the product, then run `--forget` so it is not
189
+ listed again. The run stamp matches the report folder and the ledger entry, so one run's leftovers are easy to find.
190
+ `--env` is required. `cleanup` is about test data in the product; `pnpm asrun reset` (below) is the command that
191
+ removes workspace files and dependencies.
174
192
 
175
193
  ## Web UI
176
194
 
package/docs/install.md CHANGED
@@ -163,7 +163,8 @@ Run it after changing profiles, rules or overrides, and after an update. It chec
163
163
  - that `.gitignore` ignores `.auth/` and `reports/`;
164
164
  - whether the installed version is behind the package's templates, and whether `dist/` is out of date;
165
165
  - the workspace migrations: the baseline in `.asrun.json`, what still applies, and the manual steps left open;
166
- - the project rule table in `AGENTS.md` §2 (unknown ids, a missing `Effect`, a non-negotiable rule);
166
+ - the project rule table in `AGENTS.md` §2 (unknown ids, a missing `Effect`, a duplicate id, a non-negotiable rule, a
167
+ project id without `adds`) and the project settings in `package.json` `"asrun"` (for example `testDataPrefix`);
167
168
  - the framework skills and the project overrides under `.claude/skills/<skill>.md`, and lists the ones it sees.
168
169
 
169
170
  ## Which workspace a command runs against
@@ -144,6 +144,13 @@
144
144
  }
145
145
  .btn:hover { transform: translateY(-1px); }
146
146
  .btn[disabled] { opacity: .5; cursor: not-allowed; box-shadow: none; transform: none; }
147
+ /* A button disabled because something must happen first: gold with a lock, not faded (see "Blocked" below). */
148
+ .btn[disabled][data-blocked] {
149
+ opacity: 1;
150
+ background: var(--gold-bg);
151
+ color: var(--gold-deep);
152
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--gold-deep) 45%, transparent);
153
+ }
147
154
  .btn svg { flex: none; }
148
155
  .btn-primary, .btn-success {
149
156
  color: #fff;
@@ -518,6 +525,11 @@
518
525
  <button class="btn btn-info">Full screen</button>
519
526
  <button class="btn btn-danger">Cancel</button>
520
527
  <button class="btn btn-secondary" disabled>Disabled</button>
528
+ <button class="btn btn-secondary" disabled data-blocked>
529
+ <!-- Lock icon from Feather (https://feathericons.com/) -->
530
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>
531
+ Blocked
532
+ </button>
521
533
  </div>
522
534
  <table>
523
535
  <thead><tr><th>Variant</th><th>Use for</th></tr></thead>
@@ -531,7 +543,12 @@
531
543
  <tr><td><code>invalid</code> (red field)</td><td>A control that is required and still empty, drawn as a button because it opens a panel instead of a native list (the environment picker of the case toolbar). The same red as an invalid dropdown; it is not an action.</td></tr>
532
544
  </tbody>
533
545
  </table>
534
- <p class="small muted">Hover lifts the button 1px; disabled is 50% opacity with no shadow. With an icon, add <code>gap-1.5</code> to the button.</p>
546
+ <p class="small muted">Hover lifts the button 1px. Disabled has two looks, and they must not be mixed up: a control with
547
+ nothing to do yet, or one that waits for the app (a running job, a pending request), is 50% opacity with no shadow;
548
+ a control that is disabled because <b>you</b> must do something first (save the file, choose an environment, tick a
549
+ profile, fix a name) is <b>blocked</b>: the gold tint above, a Feather <code>Lock</code> icon instead of its usual icon, and a
550
+ tooltip that says what to do (<code>blocked()</code> in <code>components/status.tsx</code> sets
551
+ <code>data-blocked</code>). With an icon, add <code>gap-1.5</code> to the button.</p>
535
552
 
536
553
  <h2 id="badges">Badges</h2>
537
554
  <div class="demo">
@@ -834,7 +851,10 @@ import {FilterChips} from '../components/filter-chips';
834
851
  Write a plain <code>title="..."</code> on the element. <code>lib/tooltip.ts</code> (tippy.js) turns every <code>title</code> into
835
852
  a dark tooltip with an arrow on hover, so the browser's native tooltip never shows. Do not set up tippy per component and do not
836
853
  use a <code>title</code> on an <code>iframe</code>. Each <code>\n</code> in the text starts a new paragraph, and a line that starts with <code># </code> is a bold heading. Keep it short: a heading, then one or two sentences. Never put a command line or other long raw text in a tooltip. Disabled buttons and inputs get the
837
- tooltip too, so a <code>title</code> that says why something is disabled works. The box is styled by <code>.tippy-box[data-theme~='tip']</code>
854
+ tooltip too, so a <code>title</code> that says why something is disabled works. Point at the control, not at a
855
+ position: never write "above", "below", "left" or "right", because a layout change silently makes it wrong; name the
856
+ control or the bar instead ("in the AI toolbar below the tabs"). A tooltip of a disabled control says what to do
857
+ first, and when it is <b>blocked</b> (see the buttons above) the lock and the gold say so without opening it. The box is styled by <code>.tippy-box[data-theme~='tip']</code>
838
858
  in <code>index.css</code>; the keyword help of the case editor and the ? help of the case panel have their own
839
859
  <code>inkstone</code> theme, and both open on click (see <code>ui/web/src/lib/section-help.ts</code>).
840
860
  A target card is too long for a tooltip: it opens as a window (<code>components/case-panel/target-card-dialog.tsx</code>).
@@ -1006,7 +1026,8 @@ import {FilterChips} from '../components/filter-chips';
1006
1026
  <code>text-ink-2</code> on the warm strip. The name is <code>font-mono</code>; the kind in front of it is
1007
1027
  <code>text-xs tracking-wider</code>, <code>text-theme-ink</code> when active and <code>text-ink-3</code> otherwise.</li>
1008
1028
  <li>Unsaved changes are a 6px <code>bg-gold-deep</code> dot on the tab, never a badge in the page header. A file
1009
- that does not exist yet keeps its tab, disabled at 45% opacity, with a tooltip that says how to create it.</li>
1029
+ that does not exist yet keeps its tab, disabled with <code>data-blocked</code> (gold tint and a Feather
1030
+ <code>Lock</code>), with a tooltip that says where to create it (the AI toolbar below the tabs).</li>
1010
1031
  <li>The switches of the bar under the tabs are a segmented control, not buttons: active <code>bg-theme-btn</code>
1011
1032
  with white text, the others <code>bg-card</code>, the whole group ringed with <code>ring-1 ring-line-mid</code>, and
1012
1033
  a <code>text-xs text-ink-3</code> label in front (<code>Layout</code>, <code>Pane</code>). A switch group without a
@@ -164,8 +164,17 @@ environment, aliases or gateway expose.
164
164
 
165
165
  **Thinking does nothing** — it is an OpenCode flag. Claude Code has no such flag; its model and settings decide.
166
166
 
167
- **A project rule does nothing** — `AGENTS.md` §2 needs the rule id and an `Effect` of `narrows` or `replaces`.
168
- `F1`..`F6` cannot be changed. `pnpm asrun doctor` names a wrong id, a missing `Effect` or a non-negotiable rule.
167
+ **A project rule does nothing** — `AGENTS.md` §2 needs the rule id and an `Effect` of `narrows`, `replaces` or `adds`.
168
+ A rule the baseline does not have needs a project id (`P1`, `P2`, ...) and `adds`. `F1`..`F6` and `R2` cannot be
169
+ changed. `pnpm asrun doctor` names a wrong id, a missing `Effect`, a duplicate id or a non-negotiable rule, and
170
+ `pnpm asrun rules` prints what the AI steps will actually read. A difference between §2 and a framework default is
171
+ not a conflict: it is applied, not turned into a question.
172
+
173
+ **A test-data prefix is not `[asrun]`** — set it in `package.json`: `"asrun": { "testDataPrefix": "[autotest]" }`.
174
+ The runtime (`records.track`), `pnpm cleanup` and the AI steps all read that one value; without it the default
175
+ `[asrun]` applies. Created names get the run stamp on top: `[autotest] <base> (2026-11-09 12-34-56)`. A prefix written
176
+ only as prose in `AGENTS.md` cannot reach the runtime: `doctor` and `pnpm asrun rules` report the mismatch and name the
177
+ `package.json` value to set.
169
178
 
170
179
  **A skill override does nothing** — it must be `.claude/skills/<skill>.md` (the skill name, for example
171
180
  `generating-specs`, not the command name), and it is not discovered as a standalone skill: the command and the skill
package/docs/web-ui.md CHANGED
@@ -58,14 +58,19 @@ One row per profile, with the same login check as `pnpm status`.
58
58
  The case list is grouped by folder and collapses. A case opens on the **Case** tab, with the **Spec** tab beside it:
59
59
 
60
60
  - **Case** (`favorite-article.md`) is the source a person writes: the steps, values, rules and questions.
61
- - **Spec** (`favorite-article.spec.ts`) is what a generate or heal run wrote from it. It stays visible but disabled
62
- until the case has a spec, and its tooltip says how to make one.
61
+ - **Spec** (`favorite-article.spec.ts`) is what a generate or heal run wrote from it. It stays visible but blocked (gold,
62
+ with a lock) until the case has a spec; its tooltip says to choose **Generate spec** in the AI toolbar below the tabs,
63
+ pick an environment and press **Run AI**.
63
64
 
64
65
  The tab is the page's state: it lives in the URL (`?view=spec`), so a reload, a shared link and the Back button land on
65
66
  the same file, and every other link opens the case. Each tab keeps its own unsaved draft while you switch between them;
66
67
  an amber dot on a tab means that file has unsaved changes, and **Save** (`Ctrl/Cmd+S`) and **Discard** always sit at the
67
68
  right of the tab strip and act on the file on screen.
68
69
 
70
+ A control that is disabled because **you** must do something first (save a file, choose an environment, tick a profile) is
71
+ **blocked**: gold with a lock, and its tooltip says what to do; the Run AI button for example names the tab whose draft is
72
+ unsaved. A faded control instead just has nothing to do yet or waits for the app (a running job, a pending request).
73
+
69
74
  Under the tabs, the first row is the AI toolbar (command, environment, profiles, attended, **Run AI**, copy the shell
70
75
  command, AI guide). It is the same on both tabs, because every AI command acts on the case. The row below holds the
71
76
  tools of the file on screen: on **Case** the **Layout** (Split / Single) and **Pane** (Panel / Editor / Doc) switches
@@ -83,9 +88,11 @@ right (drag the divider to resize, double-click to reset).
83
88
  green. Hover for a tooltip; the small X after a marker removes it (or the whole question block for a `TODO`) in one
84
89
  step, with Undo; the file is saved when you save it.
85
90
  - **New case** takes an optional folder and runs `pnpm case:new`.
86
- - **The Panel** shows the case as a form, with the open questions first (accept one to delete the question, or write an
87
- answer and the AI folds it in). Then the front matter (title, login, suites, writes and its note, environments), the
88
- `## Rules` bullets, the steps (sentence, `[writes]` / `[input]` / `[email]` tags, `- Ready when:` lines,
91
+ - **The Panel** shows the case as a form, with the open questions first: each one shows what the case says above it,
92
+ then the question, and offers **Keep what the case says** (the question block disappears, that text stays) or
93
+ **Write your answer** (the AI folds it in). Only the two texts jump to the source; the rest of the row does not.
94
+ Then the front matter (title, login, suites, writes and its note, environments), the `## Rules` bullets, the steps
95
+ (sentence, `[writes]` / `[input]` / `[email]` tags, `- Ready when:` lines,
89
96
  `- Recipe:` lines), the `## Expected` and `## Visual checks` bullets (drag to reorder), the `## Values` table (one
90
97
  column per profile; an
91
98
  empty cell inherits `default`), and the `## Targets` cards read-only, with what each is missing. With two or more
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asrunjs/asrun",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "Multi-profile end-to-end test suite: plain-language cases, AI-written Playwright specs, evidence for every run.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Zoro Chen",
@@ -49,6 +49,7 @@
49
49
  "status": "tsx scripts/status.ts",
50
50
  "reset": "tsx scripts/cli.ts reset",
51
51
  "asrun": "tsx scripts/cli.ts",
52
+ "rules": "tsx scripts/cli.ts rules",
52
53
  "report": "tsx scripts/report.ts",
53
54
  "heal:evidence": "node scripts/heal-evidence.mjs",
54
55
  "explore": "tsx scripts/explore.ts",
@@ -6,7 +6,9 @@ Load the framework skill `{{framework}}/.claude/skills/exploring-cases/SKILL.md`
6
6
 
7
7
  Rules combine in this order, and a later one wins where they conflict: the framework baseline
8
8
  `{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/exploring-cases.md` if it exists, then the workspace
9
- `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. Project facts are in `AGENTS.md` §3.
9
+ `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
10
+ applied as written and is never turned into a question (a difference from a framework default is not a conflict).
11
+ Project facts are in `AGENTS.md` §3.
10
12
 
11
13
  Arguments: `<case-id> <env> [--attended] [--profiles a,b] [--hints <file>]`. The case id is the path below `cases/` without `.md` (it may include a
12
14
  group folder, e.g. `documents/landing-page`) and is required. `<env>` is `staging` or `production`; it is required and there
@@ -7,7 +7,9 @@ $ARGUMENTS
7
7
 
8
8
  Rules combine in this order, and a later one wins where they conflict: the framework baseline
9
9
  `{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/generating-specs.md` if it exists, then the workspace
10
- `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. Project facts are in `AGENTS.md` §3.
10
+ `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
11
+ applied as written and is never turned into a question (a difference from a framework default is not a conflict).
12
+ Project facts are in `AGENTS.md` §3.
11
13
 
12
14
  Arguments: `<case-id> [<env>] [--force] [--hints <file>]`. The case file is `cases/<case-id>.md` (the id may include one group folder,
13
15
  e.g. `documents/landing-page`). `<env>` is the environment to explore in (`staging` or `production`); there is no default. If
@@ -7,7 +7,9 @@ spec", and follow it exactly.
7
7
 
8
8
  Rules combine in this order, and a later one wins where they conflict: the framework baseline
9
9
  `{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/generating-specs.md` if it exists, then the workspace
10
- `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. Project facts are in `AGENTS.md` §3.
10
+ `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
11
+ applied as written and is never turned into a question (a difference from a framework default is not a conflict).
12
+ Project facts are in `AGENTS.md` §3.
11
13
 
12
14
  Arguments: $ARGUMENTS
13
15
  Format: `<case-id> <env> [--profiles a,b] [--report <run-id>] [--hints <file>]`, with optional free text after them.
@@ -7,7 +7,9 @@ documents: $ARGUMENTS
7
7
 
8
8
  Rules combine in this order, and a later one wins where they conflict: the framework baseline
9
9
  `{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/making-cases.md` if it exists, then the workspace
10
- `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. Project facts are in `AGENTS.md` §3.
10
+ `AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
11
+ applied as written and is never turned into a question (a difference from a framework default is not a conflict).
12
+ Project facts are in `AGENTS.md` §3.
11
13
 
12
14
  The input is either text or a path to a file with the notes. Follow the skill's procedure exactly. Ask me the open
13
15
  questions before writing any case file. Do not generate specs; that is `/gen-spec`.
@@ -22,24 +22,31 @@ The framework skills are loaded by the commands in `.claude/commands/` (Claude C
22
22
 
23
23
  ## 2. Project rules
24
24
 
25
- Only what differs from the baseline: name the rule id, and whether it `narrows` (stricter) or `replaces` (a different
26
- default, for example the artifact language) the baseline rule. `replaces` is refused for `F1`–`F6` and `R2`. Rows
27
- whose first cell is not a rule id are ignored, so the placeholder below can stay until you need it.
25
+ Only what differs from the baseline. A row names the baseline rule it changes and whether it `narrows` (stricter) or
26
+ `replaces` (a different default, for example the artifact language) it. A rule the baseline does not have gets a
27
+ project id (`P1`, `P2`, ...) and `adds`. `replaces` is refused for `F1`–`F6` and `R2`. Rows whose first cell is not a
28
+ rule id are ignored, so the placeholder below can stay until you need it.
28
29
 
29
30
  | Rule | Project rule | Effect |
30
31
  |---|---|---|
31
- | <rule id, e.g. F10> | <what this project does differently from the baseline> | narrows |
32
+ | <rule id, e.g. F10 or P1> | <what this project does differently from the baseline> | <narrows / replaces / adds> |
32
33
 
33
34
  Examples (delete what you do not use; the fenced block is an example, not a rule):
34
35
 
35
36
  ```markdown
36
37
  | F10 | Case prose, report summaries and assertion messages in Simplified Chinese; code and commit messages stay English. | replaces |
37
- | F9 | Staging writes are limited to accounts named `qa-*` and names starting with `[asrun]`. | narrows |
38
- | F7 | This project runs production profiles only from a scheduled job; people use `--env staging`. | narrows |
38
+ | F11 | Test data carries the ticket id as well as the run stamp: `[autotest] ABC-123 <title> (<run stamp>)`. | narrows |
39
+ | P1 | Staging writes are limited to accounts named `qa-*`. | adds |
39
40
  ```
40
41
 
41
- `pnpm asrun doctor` fails when this table names a `[non-negotiable]` rule, an unknown rule id, or an `Effect` that is
42
- not `narrows` or `replaces`.
42
+ `pnpm asrun doctor` fails when this table names a `[non-negotiable]` rule, an unknown baseline id, a duplicate id, a
43
+ project id without `adds`, or an `Effect` that is not `narrows`, `replaces` or `adds`. `pnpm asrun rules` prints the
44
+ effective set, and every AI step reads it before it applies the rules: **§2 is applied as written and is never a
45
+ question.** A difference between §2 and a framework default is not a conflict.
46
+
47
+ The test-data prefix is not written here: it is `asrun.testDataPrefix` in `package.json` (default `[asrun]`), so the
48
+ document and the code read the same value. A case's data is named `testDataName(base)`:
49
+ `<prefix> <base> (<UTC time of the run>)`, so two runs never collide.
43
50
 
44
51
  The structural tokens are fixed English whatever the project language: the section headings (`## Values`, `## Rules`,
45
52
  `## Targets`, ...), a step's `- Recipe (phase): ...` lines, `### T<n>`, the `TODO` blocks with their `Answer:` line,
@@ -60,6 +67,8 @@ and the front-matter keys. See "Fixed tokens" in the framework baseline.
60
67
  - `cases/**/*.md` human-written test cases (committed)
61
68
  - `tests/**/*.spec.ts` generated Playwright specs and their `*-snapshots/` baselines (committed)
62
69
  - `profiles.yaml` one entry per environment, connection settings only (committed)
70
+ - `package.json` npm scripts and the framework dependency; its `"asrun"` object holds project settings
71
+ (`testDataPrefix`, committed)
63
72
  - `.claude/commands/` `/make-case`, `/explore-case`, `/gen-spec`, `/heal-spec` for Claude Code
64
73
  - `.opencode/commands/` the same commands for OpenCode (it does not read `.claude/commands`)
65
74
  - `.claude/skills/` optional overrides of a framework skill: `<skill>.md`
@@ -4,7 +4,7 @@ title: One-line summary of what this case proves
4
4
  login: required # required | none (none = public page, no saved session needed)
5
5
  suites: [smoke, regression] # a case may be in several suites; filter with `pnpm asrun --suite <name>`
6
6
  # writes: [staging] # omit = read-only. The environments in which the case may create or change data of the test accounts (and cleans it up); elsewhere it is skipped with a notice
7
- # writes-note: What the case creates or changes, e.g. one draft named "[asrun] ...", deleted at the end. (required when writes is set)
7
+ # writes-note: What the case creates or changes, e.g. one draft named "[asrun] ... (<run stamp>)", deleted at the end. (required when writes is set)
8
8
  # envs: [production, staging] # optional: run only in these environments (default: all); must include every environment in `writes`
9
9
  ---
10
10
 
@@ -24,8 +24,8 @@ none.
24
24
  row. It says when to look; what must be true afterwards goes under Expected.>
25
25
  2. <What to look at or click.>
26
26
  3. <A step that needs a person's choice or writes something.> [input] [writes]
27
- - Recipe (start): <what the person did, recorded by /explore-case --attended: positions, [asrun] names, control
28
- labels; never selectors or ids. One line per phase.>
27
+ - Recipe (start): <what the person did, recorded by /explore-case --attended: positions, created names (project
28
+ prefix plus the run's UTC stamp), control labels; never selectors or ids. One line per phase.>
29
29
 
30
30
  ## Expected
31
31
  - <Behaviour that must hold for every profile.>
@@ -8,6 +8,7 @@
8
8
  "scripts": {
9
9
  "go": "asrun go",
10
10
  "asrun": "asrun",
11
+ "rules": "asrun rules",
11
12
  "signin": "asrun signin",
12
13
  "status": "asrun status",
13
14
  "reset": "asrun reset",
@@ -31,5 +32,8 @@
31
32
  "@playwright/test": "1.64.1",
32
33
  "@types/node": "^22.20.5",
33
34
  "typescript": "^7.0.2"
35
+ },
36
+ "asrun": {
37
+ "testDataPrefix": "[asrun]"
34
38
  }
35
39
  }
@@ -1 +1 @@
1
- import{C as e,D as t,L as n,h as r,n as i,r as a,s as o,u as s,x as c,z as l}from"./dist-Dr9crbBz.js";import{r as u}from"./index-BzMqkmQ9.js";var d=110,f=1,p=2,m=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288];function h(e){return e>=65&&e<=90||e>=97&&e<=122||e>=161}function g(e){return e>=48&&e<=57}var _=new i((e,t)=>{if(e.next==40){let t=e.peek(-1);(h(t)||g(t)||t==95||t==45)&&e.acceptToken(p,1)}}),v=new i(e=>{if(m.indexOf(e.peek(-1))>-1){let{next:t}=e;(h(t)||t==95||t==35||t==46||t==91||t==58||t==45)&&e.acceptToken(d)}}),y=new i(e=>{if(m.indexOf(e.peek(-1))<0){let{next:t}=e;if(t==37&&(e.advance(),e.acceptToken(f)),h(t)){do e.advance();while(h(e.next));e.acceptToken(f)}}}),b=n({"import charset namespace keyframes media supports when":l.definitionKeyword,"from to selector":l.keyword,NamespaceName:l.namespace,KeyframeName:l.labelName,TagName:l.tagName,ClassName:l.className,PseudoClassName:l.constant(l.className),IdName:l.labelName,"FeatureName PropertyName PropertyVariable":l.propertyName,AttributeName:l.attributeName,NumberLiteral:l.number,KeywordQuery:l.keyword,UnaryQueryOp:l.operatorKeyword,"CallTag ValueName":l.atom,VariableName:l.variableName,"AtKeyword Interpolation":l.special(l.variableName),Callee:l.operatorKeyword,Unit:l.unit,"UniversalSelector NestingSelector":l.definitionOperator,MatchOp:l.compareOperator,"ChildOp SiblingOp, LogicOp":l.logicOperator,BinOp:l.arithmeticOperator,Important:l.modifier,"Comment LineComment":l.blockComment,ColorLiteral:l.color,"ParenthesizedContent StringLiteral":l.string,Escape:l.special(l.string),": ...":l.punctuation,"PseudoOp #":l.derefOperator,"; ,":l.separator,"( )":l.paren,"[ ]":l.squareBracket,"{ }":l.brace}),x={__proto__:null,lang:40,"nth-child":40,"nth-last-child":40,"nth-of-type":40,"nth-last-of-type":40,dir:40,"host-context":40,and:244,or:244,not:74,only:74,url:86,"url-prefix":86,domain:86,regexp:86,when:117,selector:142,from:172,to:174},S={__proto__:null,"@import":126,"@plugin":126,"@media":152,"@charset":156,"@namespace":160,"@keyframes":166,"@supports":178},C=a.deserialize({version:14,states:"@^O!gQWOOO!nQaO'#CeOOQP'#Cd'#CdO$RQWO'#CgO$xQaO'#EaO%cQWO'#CiO%kQWO'#DZO%pQWO'#D^O%uQaO'#DfOOQP'#Es'#EsO'YQWO'#DlO'yQWO'#DyO(QQWO'#D{O(xQWO'#D}O)TQWO'#EQO'bQWO'#EWO)YQ`O'#FTO)]Q`O'#FTO)hQ`O'#FTO)vQWO'#EYOOQO'#Er'#ErOOQO'#FV'#FVOOQO'#Ec'#EcO){QWO'#EqO*WQWO'#EqQOQWOOOOQP'#Ch'#ChOOQP,59R,59RO$RQWO,59RO*bQWO'#EdO+PQWO,58|O+_QWO,59TO%kQWO,59uO%pQWO,59xO*bQWO,59{O*bQWO,59}OOQO'#De'#DeO*bQWO,5:OO,bQpO'#E}O,iQWO'#DkOOQO,58|,58|O(QQWO,58|O,pQWO,5:{OOQO,5:{,5:{OOQT'#Cl'#ClO-UQeO,59TO.cQ[O,59TOOQP'#D]'#D]OOQP,59u,59uOOQO'#D_'#D_O.hQpO,59xOOQO'#EZ'#EZO.pQ`O,5;oOOQO,5;o,5;oO/OQWO,5:WO/VQWO,5:WOOQS'#Dn'#DnO/rQWO'#DsO/yQ!fO'#FRO0eQWO'#DtOOQS'#FS'#FSO+YQWO,5:eO'bQWO'#DrOOQS'#Cu'#CuO(QQWO'#CwO0jQ!hO'#CyO2^Q!fO,5:gO2oQWO'#DWOOQS'#Ex'#ExO(QQWO'#DQOOQO'#EP'#EPO2tQWO,5:iO2yQWO,5:iOOQO'#ES'#ESO3RQWO,5:lO3WQ!fO,5:rO3iQ`O'#EkO.pQ`O,5;oOOQO,5:|,5:|O3zQWO,5:tOOQO,5:},5:}O4XQWO,5;]OOQO-E8a-E8aOOQP1G.m1G.mOOQP'#Ce'#CeO5RQaO,5;OOOQP'#Df'#DfOOQO-E8b-E8bOOQO1G.h1G.hO(QQWO1G.hO5fQWO1G.hO5nQeO1G.oO.cQ[O1G.oOOQP1G/a1G/aO6{QpO1G/dO7fQaO1G/gO8cQaO1G/iO9`QaO1G/jO:]Q!fO'#FOO:yQ!fO'#ExOOQO'#FO'#FOOOQO,5;i,5;iO<^QWO,5;iO<iQWO,5:VO<nQ!fO1G.hOOQO1G0g1G0gO=PQWO'#CnOOQP1G.o1G.oO=WQWO'#CqOOQP1G/d1G/dO(QQWO1G/dO=_Q`O1G1ZOOQO1G1Z1G1ZO=mQWO1G/rO=rQ!fO'#FQO>WQWO1G/rO>]Q!fO'#DnO>qQWO,5:ZO>vQ!fO,5:_OOQO'#DP'#DPO'bQWO,5:]O?XQWO'#DwOOQS,5:b,5:bO?`QWO,5:dO'bQWO'#EiO?gQWO,5;mO*bQWO,5:`OOQO1G0P1G0PO?uQ!fO,5:^O@aQ!fO,59cOOQS,59e,59eO(QQWO,59iOOQS,59n,59nO@rQWO,59pOOQO1G0R1G0RO@yQ#tO,59rOARQ!fO,59lOOQO1G0T1G0TOBrQWO1G0TOBwQWO'#ETOOQO1G0W1G0WOOQO1G0^1G0^OOQO,5;V,5;VOOQO-E8i-E8iOCVQ!fO1G0bOCvQWO1G0`O%kQWO'#E_O$RQWO'#E`OEZQWO'#E^OOQO1G0b1G0bPEkQWO'#EcO<nQ!fO7+$SOOQO7+$S7+$SO(QQWO7+$SOOQP7+$Z7+$ZOOQP7+%O7+%OO(QQWO7+%OOEpQ!fO'#EeOF}QWO,5;jO(QQWO,5;jOOQO,5;j,5;jO+gQpO'#EgOG[QWO1G1TOOQO1G1T1G1TOOQO1G/q1G/qOGgQaO'#EvOGnQWO,59YOGsQWO'#EwOG}QWO,59]OHSQ!fO7+%OOOQO7+&u7+&uOOQO7+%^7+%^O(QQWO'#EhOHeQWO,5;lOHmQWO7+%^O(QQWO1G/uOOQS1G/y1G/yOOQS1G/w1G/wOHrQWO,5:cOHwQ!fO1G0OOOQS1G0O1G0OOIYQ!fO,5;TOOQO-E8g-E8gOItQaO1G/zOOQS1G.}1G.}OOQS1G/T1G/TOI{Q!fO1G/[OOQS1G/[1G/[OJ^QWO1G/^OOQO7+%o7+%oOJcQYO'#CyO+YQWO'#EjOJkQWO,5:oOOQO,5:o,5:oOJyQ!fO'#ElO(QQWO'#ElOL^QWO7+%|OOQO7+%|7+%|OOQO7+%z7+%zOOQO,5:y,5:yOOQO,5:z,5:zOLqQaO,5:xOOQO,5:x,5:xOOQO<<Gn<<GnO<nQ!fO<<GnOMRQ!fO<<HjOOQO-E8c-E8cOMdQWO1G1UOOQO,5;R,5;ROOQO-E8e-E8eOOQO7+&o7+&oOMqQWO,5;bOOQP1G.t1G.tO(QQWO'#EfOMyQWO,5;cOOQT1G.w1G.wOOQP<<Hj<<HjONRQ!fO,5;SOOQO-E8f-E8fO/OQWO<<HxONgQWO7+%aOOQS1G/}1G/}OOQS7+%j7+%jOOQS7+%f7+%fOOQS7+$v7+$vOOQS7+$x7+$xOOQO,5;U,5;UOOQO-E8h-E8hOOQO1G0Z1G0ZONnQ!fO,5;WOOQO-E8j-E8jOOQO<<Ih<<IhOOQO1G0d1G0dOOQOAN=YAN=YOOQPAN>UAN>UO!!RQWO,5;QOOQO-E8d-E8dO!!]QWOAN>dOOQS<<H{<<H{OOQOG24OG24O",stateData:"!!n~O#dOSROSSOS~OVXOYXO^TO_TOfaOgbOoaOpWOyVO!OUO!aYO!nZO!p[O!r]O!u^O!{_O#hPO#iRO~O#a#eP~P]O^XX^!}X_XXcXXjXXp!}XyXX!OXX!UXX!ZXX![XX!^XX#PXX#aXX#bXX#iXX#oXX#pXX#p!}X#x!}X!]XX~O#hjO~O^oO_oOcmOyqO!OpO!UrO#bsO#ilO#otO#ptO~OjvO![yO!^wO#P{O!Z#TX#a#TX!]#TX~P$WOd!OO#h|O~O#h!PO~O#h!RO~O#h!TO#p!VO#x!VO^!YX^#wX_!YXc!YXj!YXy!YX!O!YX!U!YX!Z!YX![!YX!^!YX#P!YX#a!YX#b!YX#i!YX#o!YX#p!YX!]!YX~Oj!XOn!WO~Og!^Oj!ZOo!^Op!^Ou!`O!i!]O#h!YO~O!^#uP~P'bOf!fOg!fOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO~On!iO{!eO#h!hO~O#h!kO~Op!nO#p!VO#x!VO^#wX~OjvO#p!VO#x!VO^#wX~O^!qO~O!Z!rO#a#eX!]#eX~O#a#eX!]#eX~P]OVXOYXO^TO_TOp!xOyVO!OUO#h!vO#iRO~OcmOjvO![!{O!^wO~Od#OO#h|O~Of!fOg#VOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO#s#WO~Oa#XO~P+gO!]#eP~P]O![!{O!^wO#P#]O!Z#Ta#a#Ta!]#Ta~OQ#^O^]a_]ac]aj]ay]a!O]a!U]a!Z]a![]a!^]a#P]a#a]a#b]a#i]a#o]a#p]a!]]aa]a~OQ#`O~Ow#aO!S#bO~Op!nO#p#dO#x#dO^#wa~O!Z#uP~P'bOa#tP~P(QOg!^Oj!ZOo!^Op!^Ou!`O!i!]O~O#h#hO~P/^OQ#mOc#pOr#lOy#oO#n#kO!^#uX!Z#uXa#uX~Oj#rO~OP#vOQmXrmXymX!ZmX#nmX^mXamXcmXfmXgmXhmXjmXlmXnmXomXpmXumX{mX#hmX#mmX!^mX#PmX#amXwmX!]mX~OQ#`Or#wOy#yO!Z#zO#n#kO~Oj#{O~O!Z#}O~On$OO{!eO~O!^$PO~OQ#mOr#lOy#oO!^wO#n#kO~O#h!TO^#_Xp#_X#p#_X#x#_X~O!O$WO!^wO#i$XO~P(QO!Z!rO#a#ea!]#ea~O^oO_oOyqO!OpO!UrO#bsO#ilO#otO#ptO~Oc#Waj#Wa![#Wa!^#Waa#Wa~P4dO![$_O!^wO~OQ#^O^]i_]ic]ij]iy]i!O]i!U]i!Z]i![]i!^]i#P]i#a]i#b]i#i]i#o]i#p]i!]]ia]i~Ow$aO!S$bO~O^oO_oOyqO!OpO#ilO~Oc!Tij!Ti!U!Ti!Z!Ti![!Ti!^!Ti#P!Ti#a!Ti#b!Ti#o!Ti#p!Ti!]!Tia!Ti~P7TOc!Vij!Vi!U!Vi!Z!Vi![!Vi!^!Vi#P!Vi#a!Vi#b!Vi#o!Vi#p!Vi!]!Via!Vi~P7TOc!Wij!Wi!U!Wi!Z!Wi![!Wi!^!Wi#P!Wi#a!Wi#b!Wi#o!Wi#p!Wi!]!Wia!Wi~P7TOQ#`O^$eOr#wOy#yO#n#kOa#rXc#rX!Z#rX~P(QO#s$fOQ#lX^#lXa#lXc#lXf#lXg#lXh#lXj#lXl#lXn#lXo#lXp#lXr#lXu#lXy#lX{#lX!Z#lX#h#lX#m#lX#n#lX~Oa$iOc$gO!Z$gO~O!]$jO~OQ#`Or#wOy#yO!^wO#n#kO~Oa#jP~P*bOa#kP~P(QOp!nO#p$pO#x$pO^#wi~O!Z$qO~OQ#`Oc$rOr#wOy#yO#n#kOa#tX~Oa$tO~OQ!bX^!dXa!bXr!bXy!bX#n!bX~O^$uO~OQ#mOa$vOr#lOy#oO#n#kO~Oa#uP~P'bOw$zO~P(QOc#pO!^#ua!Z#uaa#ua~OQ#mOr#lOy#oO#n#kOc!fa!^!fa!Z!faa!fa~OQ#`Oa%OOr#wOy#yO#n#kO~Ow%RO~P(QOn%SO|%SO~OQ#`Or#wOy#yO#n#kO!Zta^taatactaftagtahtajtaltantaotaptauta{ta#hta#mta!^ta#Pta#atawta!]ta~O!Z%TO~O!]%XO!x%VO!y%VO#m%UO~OQ#`Oc%ZOr#wOy#yO#P%]O#n#kO!Z#Oi#a#Oi!]#Oi~P(QO!Z%^OV!|iY!|i^!|i_!|if!|ig!|io!|ip!|iy!|i!O!|i!a!|i!n!|i!p!|i!r!|i!u!|i!{!|i#a!|i#h!|i#i!|i!]!|i~OjvO!Z#QX#a#QX!]#QX~P*bO!Z!rO~OQ#`Or#wOy#yO#n#kOa#XXc#XXf#XXg#XXh#XXj#XXl#XXn#XXo#XXp#XXu#XX{#XX!Z#XX#h#XX#m#XX~Oa#rac#ra!Z#ra~P(QOa%jOc$gO!Z$gO~Oa#jX~P$WOa%lO~Oc%mOa#kX~P(QOa%oO~OQ#`Or#wOw%pOy#yO#n#kO~Oc$rOa#ta~On%sO~Oa%uO~OQ#`Or#wOw%vOy#yO#n#kO~OQ#mOr#lOy#oO#n#kOc#]a!^#]a!Z#]aa#]a~Oa%wO~P4dOQ#`Or#wOw%xOy#yO#n#kO~Oa%yO~OP#vO!^mX~O!]%|O!x%VO!y%VO#m%UO~OQ#`Or#wOy#yO#n#kOc#`Xf#`Xg#`Xh#`Xj#`Xl#`Xn#`Xo#`Xp#`Xu#`X{#`X!Z#`X#P#`X#a#`X#h#`X#m#`X!]#`X~Oc%ZO#P&PO!Z#Oq#a#Oq!]#Oq~P(QOjvO!Z#Qa#a#Qa!]#Qa~P4dOQ#`Or#wOw&SOy#yO#n#kO~Oa#ric#ri!Z#ri~P(QOcmOa#ja~Oc%mOa#ka~OQ#`Or#wOy#yO#n#kOa#[ac#[a~Oa&WO~P(QOQ#`Or#wOy#yO#n#kOc#`af#`ag#`ah#`aj#`al#`an#`ao#`ap#`au#`a{#`a!Z#`a#P#`a#a#`a#h#`a#m#`a!]#`a~Oa#Yac#Ya~P(QO!Z&XO~Of#dpg#m|#iRSRr~",goto:"0^#zPPPPPP#{P$Q$^P$Q$j$QPP$sP$yPP%PPPP%jP%jP&ZPPP%jP'O%jP%jP%jP'jPP$QP(a$Q(jP$QP$Q$Q(p$QPPPP(w#{P)f)f)q)f)f)f)fP)f)t)f#{P#{P#{P){#{P*O*RPP#{P#{*U*aP*f*i*i*a*a*l*s*}+e+k+q+w+},T,_PPPP,e,k,pPP-[-_-bPPPP.u/UP/[/_/k0QP0VVdOhweXOhmrsuw#^#r$YeQOhmrsuw#^#r$YQkRQ!ulR%`$XQ}TR!}oQ#_}R$`!}Q#_!Or#x!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}R$`#O!]!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&T![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TT%V$P%WY#l![!m#j#t${s#w!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TQ!i]R$O!jQ!QUQ#PpR%_$WQ!SVR#QqZuS!w$k$}%aQxSS!znzQ#s!_Q$R!mQ$V!qS$^!|#[Q%c$]Q%z%VR&R%dc!^Z_!W!Z!`#l#m#p%sR#i!ZZ#n![!m#j#t${R!j]R!l^R$Q!lU`OhwQ!UWR$S!nVeOhwR$Z!qR$Y!qShOwR!thQnSS!yn%kR%k$kQ$d#UQ$m#`Y%f$d$m%g%t&TQ%g$eQ%t$uR&T%mQ%n$mR&U%nQ$h#YR%i$hQ$s#fR%r$sQ#q![R$|#qQ%W$PR%{%WQ!o`Q#c!UT$T!o#cQ%[$UR&O%[QiOR#ZwVfOhwUSOhwQ!wmQ#RrQ#SsQ#TuQ$k#^Q$}#rR%a$YR$l#^R$n#`Q!d[S#Uv$gQ#[yQ#f!XQ#u!bQ#|!gQ$U!qQ$]!{d$c#U#`$d$e$m$u%g%m%t&TQ$o#bQ$y#oQ%P#wQ%Q#yS%Y$U%[Q%d$_Q%e$bQ%q$rR%}%ZQzSQ!pbQ!|nQ%b$YR&Q%aQ#YvR%h$gR#g!XQ!_ZQ#e!WQ$x#mR&V%sW![Z!W#m%sQ!m_Q#j!ZQ#t!`Q$w#lR${#pVcOhwSgOwR!sh",nodeNames:`⚠ Unit ( Comment LineComment StyleSheet RuleSet UniversalSelector TagSelector TagName NestingSelector ClassSelector ClassName PseudoClassSelector : :: PseudoClassName ) ArgList , PseudoClassName ArgList VariableName AtKeyword PropertyVariable ValueName ( ParenthesizedValue ColorLiteral NumberLiteral StringLiteral Escape Interpolation BinaryExpression BinOp LogicOp UnaryExpression UnaryQueryOp CallExpression ] SubscriptExpression [ CallLiteral CallTag ParenthesizedContent IdSelector # IdName AttributeSelector AttributeName MatchOp ChildSelector ChildOp DescendantSelector SiblingSelector SiblingOp InterpolatedSelector ; when } { Block ImportStatement import KeywordQuery FeatureQuery FeatureName BinaryQuery UnaryQuery ParenthesizedQuery SelectorQuery selector CallQuery ArgList SubscriptQuery MediaStatement media CharsetStatement charset NamespaceStatement namespace NamespaceName KeyframesStatement keyframes KeyframeName KeyframeList from to SupportsStatement supports DetachedRuleSet PropertyName Declaration Important Inclusion IdSelector ClassSelector Inclusion CallExpression`,maxTerm:133,nodeProps:[[`isolate`,-3,3,4,30,``],[`openedBy`,17,`(`,59,`{`],[`closedBy`,26,`)`,60,`}`]],propSources:[b],skippedNodes:[0,3,4],repeatNodeCount:10,tokenData:"!2q~R!ZOX$tX^%l^p$tpq%lqr)Ors-xst/ltu6Zuv$tvw8^wx:Uxy;syz<Uz{<Z{|<t|}BQ}!OBc!O!PDo!P!QFY!Q![Jw![!]Kr!]!^Ln!^!_MP!_!`M{!`!aNl!a!b$t!b!c! m!c!}!&R!}#O!'y#O#P$t#P#Q!([#Q#R!(m#R#T$t#T#o!&R#o#p!)S#p#q!(m#q#r!)e#r#s!)v#s#y$t#y#z%l#z$f$t$f$g%l$g#BY$t#BY#BZ%l#BZ$IS$t$IS$I_%l$I_$I|$t$I|$JO%l$JO$JT$t$JT$JU%l$JU$KV$t$KV$KW%l$KW&FU$t&FU&FV%l&FV;'S$t;'S;=`!2k<%lO$t`$wSOy%Tz;'S%T;'S;=`%f<%lO%T`%YS|`Oy%Tz;'S%T;'S;=`%f<%lO%T`%iP;=`<%l%T~%qh#d~OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%T~'dh#d~|`OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%Tk)RUOy%Tz#]%T#]#^)e#^;'S%T;'S;=`%f<%lO%Tk)jU|`Oy%Tz#a%T#a#b)|#b;'S%T;'S;=`%f<%lO%Tk*RU|`Oy%Tz#d%T#d#e*e#e;'S%T;'S;=`%f<%lO%Tk*jU|`Oy%Tz#c%T#c#d*|#d;'S%T;'S;=`%f<%lO%Tk+RU|`Oy%Tz#f%T#f#g+e#g;'S%T;'S;=`%f<%lO%Tk+jU|`Oy%Tz#h%T#h#i+|#i;'S%T;'S;=`%f<%lO%Tk,RU|`Oy%Tz#T%T#T#U,e#U;'S%T;'S;=`%f<%lO%Tk,jU|`Oy%Tz#b%T#b#c,|#c;'S%T;'S;=`%f<%lO%Tk-RU|`Oy%Tz#h%T#h#i-e#i;'S%T;'S;=`%f<%lO%Tk-lS#PZ|`Oy%Tz;'S%T;'S;=`%f<%lO%T~-{WOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f<%lO-x~.jOn~~.mRO;'S-x;'S;=`.v;=`O-x~.yXOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f;=`<%l-x<%lO-x~/iP;=`<%l-xo/qY!OROy%Tz!Q%T!Q![0a![!c%T!c!i0a!i#T%T#T#Z0a#Z;'S%T;'S;=`%f<%lO%Tm0fY|`Oy%Tz!Q%T!Q![1U![!c%T!c!i1U!i#T%T#T#Z1U#Z;'S%T;'S;=`%f<%lO%Tm1ZY|`Oy%Tz!Q%T!Q![1y![!c%T!c!i1y!i#T%T#T#Z1y#Z;'S%T;'S;=`%f<%lO%Tm2QYl]|`Oy%Tz!Q%T!Q![2p![!c%T!c!i2p!i#T%T#T#Z2p#Z;'S%T;'S;=`%f<%lO%Tm2wYl]|`Oy%Tz!Q%T!Q![3g![!c%T!c!i3g!i#T%T#T#Z3g#Z;'S%T;'S;=`%f<%lO%Tm3lY|`Oy%Tz!Q%T!Q![4[![!c%T!c!i4[!i#T%T#T#Z4[#Z;'S%T;'S;=`%f<%lO%Tm4cYl]|`Oy%Tz!Q%T!Q![5R![!c%T!c!i5R!i#T%T#T#Z5R#Z;'S%T;'S;=`%f<%lO%Tm5WY|`Oy%Tz!Q%T!Q![5v![!c%T!c!i5v!i#T%T#T#Z5v#Z;'S%T;'S;=`%f<%lO%Tm5}Sl]|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm6^YOy%Tz!_%T!_!`6|!`!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Td7TS!SS|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm7h[h]|`Oy%Tz}%T}!O7a!O!Q%T!Q![7a![!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Ta8c[YPOy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%Ta9`[YP|`Oy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%T~:XWOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m<%lO:U~:tRO;'S:U;'S;=`:};=`O:U~;QXOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m;=`<%l:U<%lO:U~;pP;=`<%l:Uo;xSj_Oy%Tz;'S%T;'S;=`%f<%lO%T~<ZOa~m<bUVPrWOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%To<{Y#pQrWOy%Tz!O%T!O!P=k!P!Q%T!Q![@p![#R%T#R#SAm#S;'S%T;'S;=`%f<%lO%Tm=pU|`Oy%Tz!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%Tm>ZY#m]|`Oy%Tz!Q%T!Q![>S![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%Tm?OY|`Oy%Tz{%T{|?n|}%T}!O?n!O!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm?sU|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@^U#m]|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@w[#m]|`Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TbAtS#xQ|`Oy%Tz;'S%T;'S;=`%f<%lO%TkBVScZOy%Tz;'S%T;'S;=`%f<%lO%TmBhXrWOy%Tz}%T}!OCT!O!P=k!P!Q%T!Q![@p![;'S%T;'S;=`%f<%lO%TmCYW|`Oy%Tz!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%TmCy[f]|`Oy%Tz}%T}!OCr!O!Q%T!Q![Cr![!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%ToDtW#iROy%Tz!O%T!O!PE^!P!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%TlEcU|`Oy%Tz!O%T!O!PEu!P;'S%T;'S;=`%f<%lO%TlE|S#s[|`Oy%Tz;'S%T;'S;=`%f<%lO%T~F_VrWOy%Tz{Ft{!P%T!P!QIl!Q;'S%T;'S;=`%f<%lO%T~FyU|`OyFtyzG]z{Hd{;'SFt;'S;=`If<%lOFt~G`TOzG]z{Go{;'SG];'S;=`H^<%lOG]~GrVOzG]z{Go{!PG]!P!QHX!Q;'SG];'S;=`H^<%lOG]~H^OR~~HaP;=`<%lG]~HiW|`OyFtyzG]z{Hd{!PFt!P!QIR!Q;'SFt;'S;=`If<%lOFt~IYS|`R~Oy%Tz;'S%T;'S;=`%f<%lO%T~IiP;=`<%lFt~IsV|`S~OYIlYZ%TZyIlyzJYz;'SIl;'S;=`Jq<%lOIl~J_SS~OYJYZ;'SJY;'S;=`Jk<%lOJY~JnP;=`<%lJY~JtP;=`<%lIlmJ|[#m]Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TkKwU^ZOy%Tz![%T![!]LZ!];'S%T;'S;=`%f<%lO%TcLbS_R|`Oy%Tz;'S%T;'S;=`%f<%lO%TkLsS!ZZOy%Tz;'S%T;'S;=`%f<%lO%ThMUUrWOy%Tz!_%T!_!`Mh!`;'S%T;'S;=`%f<%lO%ThMoS|`rWOy%Tz;'S%T;'S;=`%f<%lO%TlNSW!SSrWOy%Tz!^%T!^!_Mh!_!`%T!`!aMh!a;'S%T;'S;=`%f<%lO%TjNsV!UQrWOy%Tz!_%T!_!`Mh!`!a! Y!a;'S%T;'S;=`%f<%lO%Tb! aS!UQ|`Oy%Tz;'S%T;'S;=`%f<%lO%To! rYg]Oy%Tz!b%T!b!c!!b!c!}!#R!}#T%T#T#o!#R#o#p!$O#p;'S%T;'S;=`%f<%lO%Tm!!iWg]|`Oy%Tz!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%Tm!#Y[g]|`Oy%Tz}%T}!O!#R!O!Q%T!Q![!#R![!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%To!$TW|`Oy%Tz!c%T!c!}!$m!}#T%T#T#o!$m#o;'S%T;'S;=`%f<%lO%To!$r^|`Oy%Tz}%T}!O!$m!O!Q%T!Q![!$m![!c%T!c!}!$m!}#T%T#T#o!$m#o#q%T#q#r!%n#r;'S%T;'S;=`%f<%lO%To!%uSp_|`Oy%Tz;'S%T;'S;=`%f<%lO%To!&W[#h_Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%To!'T[#h_|`Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%Tk!(OSyZOy%Tz;'S%T;'S;=`%f<%lO%Tm!(aSw]Oy%Tz;'S%T;'S;=`%f<%lO%Td!(pUOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tk!)XS!^ZOy%Tz;'S%T;'S;=`%f<%lO%Tk!)jS!]ZOy%Tz;'S%T;'S;=`%f<%lO%To!){Y#oQOr%Trs!*ksw%Twx!.wxy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tm!*pZ|`OY!*kYZ%TZr!*krs!+csy!*kyz!+vz#O!*k#O#P!-j#P;'S!*k;'S;=`!.q<%lO!*km!+jSo]|`Oy%Tz;'S%T;'S;=`%f<%lO%T]!+yWOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d<%lO!+v]!,hOo]]!,kRO;'S!+v;'S;=`!,t;=`O!+v]!,wXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!+v<%lO!+v]!-gP;=`<%l!+vm!-oU|`Oy!*kyz!+vz;'S!*k;'S;=`!.R;=`<%l!+v<%lO!*km!.UXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!*k<%lO!+vm!.tP;=`<%l!*km!.|Z|`OY!.wYZ%TZw!.wwx!+cxy!.wyz!/oz#O!.w#O#P!1^#P;'S!.w;'S;=`!2e<%lO!.w]!/rWOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W<%lO!/o]!0_RO;'S!/o;'S;=`!0h;=`O!/o]!0kXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!/o<%lO!/o]!1ZP;=`<%l!/om!1cU|`Oy!.wyz!/oz;'S!.w;'S;=`!1u;=`<%l!/o<%lO!.wm!1xXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!.w<%lO!/om!2hP;=`<%l!.w`!2nP;=`<%l$t",tokenizers:[v,y,_,0,1,2,3,4],topRules:{StyleSheet:[0,5]},specialized:[{term:116,get:e=>x[e]||-1},{term:23,get:e=>S[e]||-1}],tokenPrec:2180}),w=o.define({name:`less`,parser:C.configure({props:[t.add({Declaration:r()}),e.add({Block:c})]}),languageData:{commentTokens:{block:{open:`/*`,close:`*/`},line:`//`},indentOnInput:/^\s*\}$/,wordChars:`@-`}}),T=u(e=>e.name==`VariableName`||e.name==`AtKeyword`);function E(){return new s(w,w.data.of({autocomplete:T}))}export{E as less};
1
+ import{C as e,D as t,L as n,h as r,n as i,r as a,s as o,u as s,x as c,z as l}from"./dist-Dr9crbBz.js";import{r as u}from"./index-DaUQORCy.js";var d=110,f=1,p=2,m=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288];function h(e){return e>=65&&e<=90||e>=97&&e<=122||e>=161}function g(e){return e>=48&&e<=57}var _=new i((e,t)=>{if(e.next==40){let t=e.peek(-1);(h(t)||g(t)||t==95||t==45)&&e.acceptToken(p,1)}}),v=new i(e=>{if(m.indexOf(e.peek(-1))>-1){let{next:t}=e;(h(t)||t==95||t==35||t==46||t==91||t==58||t==45)&&e.acceptToken(d)}}),y=new i(e=>{if(m.indexOf(e.peek(-1))<0){let{next:t}=e;if(t==37&&(e.advance(),e.acceptToken(f)),h(t)){do e.advance();while(h(e.next));e.acceptToken(f)}}}),b=n({"import charset namespace keyframes media supports when":l.definitionKeyword,"from to selector":l.keyword,NamespaceName:l.namespace,KeyframeName:l.labelName,TagName:l.tagName,ClassName:l.className,PseudoClassName:l.constant(l.className),IdName:l.labelName,"FeatureName PropertyName PropertyVariable":l.propertyName,AttributeName:l.attributeName,NumberLiteral:l.number,KeywordQuery:l.keyword,UnaryQueryOp:l.operatorKeyword,"CallTag ValueName":l.atom,VariableName:l.variableName,"AtKeyword Interpolation":l.special(l.variableName),Callee:l.operatorKeyword,Unit:l.unit,"UniversalSelector NestingSelector":l.definitionOperator,MatchOp:l.compareOperator,"ChildOp SiblingOp, LogicOp":l.logicOperator,BinOp:l.arithmeticOperator,Important:l.modifier,"Comment LineComment":l.blockComment,ColorLiteral:l.color,"ParenthesizedContent StringLiteral":l.string,Escape:l.special(l.string),": ...":l.punctuation,"PseudoOp #":l.derefOperator,"; ,":l.separator,"( )":l.paren,"[ ]":l.squareBracket,"{ }":l.brace}),x={__proto__:null,lang:40,"nth-child":40,"nth-last-child":40,"nth-of-type":40,"nth-last-of-type":40,dir:40,"host-context":40,and:244,or:244,not:74,only:74,url:86,"url-prefix":86,domain:86,regexp:86,when:117,selector:142,from:172,to:174},S={__proto__:null,"@import":126,"@plugin":126,"@media":152,"@charset":156,"@namespace":160,"@keyframes":166,"@supports":178},C=a.deserialize({version:14,states:"@^O!gQWOOO!nQaO'#CeOOQP'#Cd'#CdO$RQWO'#CgO$xQaO'#EaO%cQWO'#CiO%kQWO'#DZO%pQWO'#D^O%uQaO'#DfOOQP'#Es'#EsO'YQWO'#DlO'yQWO'#DyO(QQWO'#D{O(xQWO'#D}O)TQWO'#EQO'bQWO'#EWO)YQ`O'#FTO)]Q`O'#FTO)hQ`O'#FTO)vQWO'#EYOOQO'#Er'#ErOOQO'#FV'#FVOOQO'#Ec'#EcO){QWO'#EqO*WQWO'#EqQOQWOOOOQP'#Ch'#ChOOQP,59R,59RO$RQWO,59RO*bQWO'#EdO+PQWO,58|O+_QWO,59TO%kQWO,59uO%pQWO,59xO*bQWO,59{O*bQWO,59}OOQO'#De'#DeO*bQWO,5:OO,bQpO'#E}O,iQWO'#DkOOQO,58|,58|O(QQWO,58|O,pQWO,5:{OOQO,5:{,5:{OOQT'#Cl'#ClO-UQeO,59TO.cQ[O,59TOOQP'#D]'#D]OOQP,59u,59uOOQO'#D_'#D_O.hQpO,59xOOQO'#EZ'#EZO.pQ`O,5;oOOQO,5;o,5;oO/OQWO,5:WO/VQWO,5:WOOQS'#Dn'#DnO/rQWO'#DsO/yQ!fO'#FRO0eQWO'#DtOOQS'#FS'#FSO+YQWO,5:eO'bQWO'#DrOOQS'#Cu'#CuO(QQWO'#CwO0jQ!hO'#CyO2^Q!fO,5:gO2oQWO'#DWOOQS'#Ex'#ExO(QQWO'#DQOOQO'#EP'#EPO2tQWO,5:iO2yQWO,5:iOOQO'#ES'#ESO3RQWO,5:lO3WQ!fO,5:rO3iQ`O'#EkO.pQ`O,5;oOOQO,5:|,5:|O3zQWO,5:tOOQO,5:},5:}O4XQWO,5;]OOQO-E8a-E8aOOQP1G.m1G.mOOQP'#Ce'#CeO5RQaO,5;OOOQP'#Df'#DfOOQO-E8b-E8bOOQO1G.h1G.hO(QQWO1G.hO5fQWO1G.hO5nQeO1G.oO.cQ[O1G.oOOQP1G/a1G/aO6{QpO1G/dO7fQaO1G/gO8cQaO1G/iO9`QaO1G/jO:]Q!fO'#FOO:yQ!fO'#ExOOQO'#FO'#FOOOQO,5;i,5;iO<^QWO,5;iO<iQWO,5:VO<nQ!fO1G.hOOQO1G0g1G0gO=PQWO'#CnOOQP1G.o1G.oO=WQWO'#CqOOQP1G/d1G/dO(QQWO1G/dO=_Q`O1G1ZOOQO1G1Z1G1ZO=mQWO1G/rO=rQ!fO'#FQO>WQWO1G/rO>]Q!fO'#DnO>qQWO,5:ZO>vQ!fO,5:_OOQO'#DP'#DPO'bQWO,5:]O?XQWO'#DwOOQS,5:b,5:bO?`QWO,5:dO'bQWO'#EiO?gQWO,5;mO*bQWO,5:`OOQO1G0P1G0PO?uQ!fO,5:^O@aQ!fO,59cOOQS,59e,59eO(QQWO,59iOOQS,59n,59nO@rQWO,59pOOQO1G0R1G0RO@yQ#tO,59rOARQ!fO,59lOOQO1G0T1G0TOBrQWO1G0TOBwQWO'#ETOOQO1G0W1G0WOOQO1G0^1G0^OOQO,5;V,5;VOOQO-E8i-E8iOCVQ!fO1G0bOCvQWO1G0`O%kQWO'#E_O$RQWO'#E`OEZQWO'#E^OOQO1G0b1G0bPEkQWO'#EcO<nQ!fO7+$SOOQO7+$S7+$SO(QQWO7+$SOOQP7+$Z7+$ZOOQP7+%O7+%OO(QQWO7+%OOEpQ!fO'#EeOF}QWO,5;jO(QQWO,5;jOOQO,5;j,5;jO+gQpO'#EgOG[QWO1G1TOOQO1G1T1G1TOOQO1G/q1G/qOGgQaO'#EvOGnQWO,59YOGsQWO'#EwOG}QWO,59]OHSQ!fO7+%OOOQO7+&u7+&uOOQO7+%^7+%^O(QQWO'#EhOHeQWO,5;lOHmQWO7+%^O(QQWO1G/uOOQS1G/y1G/yOOQS1G/w1G/wOHrQWO,5:cOHwQ!fO1G0OOOQS1G0O1G0OOIYQ!fO,5;TOOQO-E8g-E8gOItQaO1G/zOOQS1G.}1G.}OOQS1G/T1G/TOI{Q!fO1G/[OOQS1G/[1G/[OJ^QWO1G/^OOQO7+%o7+%oOJcQYO'#CyO+YQWO'#EjOJkQWO,5:oOOQO,5:o,5:oOJyQ!fO'#ElO(QQWO'#ElOL^QWO7+%|OOQO7+%|7+%|OOQO7+%z7+%zOOQO,5:y,5:yOOQO,5:z,5:zOLqQaO,5:xOOQO,5:x,5:xOOQO<<Gn<<GnO<nQ!fO<<GnOMRQ!fO<<HjOOQO-E8c-E8cOMdQWO1G1UOOQO,5;R,5;ROOQO-E8e-E8eOOQO7+&o7+&oOMqQWO,5;bOOQP1G.t1G.tO(QQWO'#EfOMyQWO,5;cOOQT1G.w1G.wOOQP<<Hj<<HjONRQ!fO,5;SOOQO-E8f-E8fO/OQWO<<HxONgQWO7+%aOOQS1G/}1G/}OOQS7+%j7+%jOOQS7+%f7+%fOOQS7+$v7+$vOOQS7+$x7+$xOOQO,5;U,5;UOOQO-E8h-E8hOOQO1G0Z1G0ZONnQ!fO,5;WOOQO-E8j-E8jOOQO<<Ih<<IhOOQO1G0d1G0dOOQOAN=YAN=YOOQPAN>UAN>UO!!RQWO,5;QOOQO-E8d-E8dO!!]QWOAN>dOOQS<<H{<<H{OOQOG24OG24O",stateData:"!!n~O#dOSROSSOS~OVXOYXO^TO_TOfaOgbOoaOpWOyVO!OUO!aYO!nZO!p[O!r]O!u^O!{_O#hPO#iRO~O#a#eP~P]O^XX^!}X_XXcXXjXXp!}XyXX!OXX!UXX!ZXX![XX!^XX#PXX#aXX#bXX#iXX#oXX#pXX#p!}X#x!}X!]XX~O#hjO~O^oO_oOcmOyqO!OpO!UrO#bsO#ilO#otO#ptO~OjvO![yO!^wO#P{O!Z#TX#a#TX!]#TX~P$WOd!OO#h|O~O#h!PO~O#h!RO~O#h!TO#p!VO#x!VO^!YX^#wX_!YXc!YXj!YXy!YX!O!YX!U!YX!Z!YX![!YX!^!YX#P!YX#a!YX#b!YX#i!YX#o!YX#p!YX!]!YX~Oj!XOn!WO~Og!^Oj!ZOo!^Op!^Ou!`O!i!]O#h!YO~O!^#uP~P'bOf!fOg!fOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO~On!iO{!eO#h!hO~O#h!kO~Op!nO#p!VO#x!VO^#wX~OjvO#p!VO#x!VO^#wX~O^!qO~O!Z!rO#a#eX!]#eX~O#a#eX!]#eX~P]OVXOYXO^TO_TOp!xOyVO!OUO#h!vO#iRO~OcmOjvO![!{O!^wO~Od#OO#h|O~Of!fOg#VOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO#s#WO~Oa#XO~P+gO!]#eP~P]O![!{O!^wO#P#]O!Z#Ta#a#Ta!]#Ta~OQ#^O^]a_]ac]aj]ay]a!O]a!U]a!Z]a![]a!^]a#P]a#a]a#b]a#i]a#o]a#p]a!]]aa]a~OQ#`O~Ow#aO!S#bO~Op!nO#p#dO#x#dO^#wa~O!Z#uP~P'bOa#tP~P(QOg!^Oj!ZOo!^Op!^Ou!`O!i!]O~O#h#hO~P/^OQ#mOc#pOr#lOy#oO#n#kO!^#uX!Z#uXa#uX~Oj#rO~OP#vOQmXrmXymX!ZmX#nmX^mXamXcmXfmXgmXhmXjmXlmXnmXomXpmXumX{mX#hmX#mmX!^mX#PmX#amXwmX!]mX~OQ#`Or#wOy#yO!Z#zO#n#kO~Oj#{O~O!Z#}O~On$OO{!eO~O!^$PO~OQ#mOr#lOy#oO!^wO#n#kO~O#h!TO^#_Xp#_X#p#_X#x#_X~O!O$WO!^wO#i$XO~P(QO!Z!rO#a#ea!]#ea~O^oO_oOyqO!OpO!UrO#bsO#ilO#otO#ptO~Oc#Waj#Wa![#Wa!^#Waa#Wa~P4dO![$_O!^wO~OQ#^O^]i_]ic]ij]iy]i!O]i!U]i!Z]i![]i!^]i#P]i#a]i#b]i#i]i#o]i#p]i!]]ia]i~Ow$aO!S$bO~O^oO_oOyqO!OpO#ilO~Oc!Tij!Ti!U!Ti!Z!Ti![!Ti!^!Ti#P!Ti#a!Ti#b!Ti#o!Ti#p!Ti!]!Tia!Ti~P7TOc!Vij!Vi!U!Vi!Z!Vi![!Vi!^!Vi#P!Vi#a!Vi#b!Vi#o!Vi#p!Vi!]!Via!Vi~P7TOc!Wij!Wi!U!Wi!Z!Wi![!Wi!^!Wi#P!Wi#a!Wi#b!Wi#o!Wi#p!Wi!]!Wia!Wi~P7TOQ#`O^$eOr#wOy#yO#n#kOa#rXc#rX!Z#rX~P(QO#s$fOQ#lX^#lXa#lXc#lXf#lXg#lXh#lXj#lXl#lXn#lXo#lXp#lXr#lXu#lXy#lX{#lX!Z#lX#h#lX#m#lX#n#lX~Oa$iOc$gO!Z$gO~O!]$jO~OQ#`Or#wOy#yO!^wO#n#kO~Oa#jP~P*bOa#kP~P(QOp!nO#p$pO#x$pO^#wi~O!Z$qO~OQ#`Oc$rOr#wOy#yO#n#kOa#tX~Oa$tO~OQ!bX^!dXa!bXr!bXy!bX#n!bX~O^$uO~OQ#mOa$vOr#lOy#oO#n#kO~Oa#uP~P'bOw$zO~P(QOc#pO!^#ua!Z#uaa#ua~OQ#mOr#lOy#oO#n#kOc!fa!^!fa!Z!faa!fa~OQ#`Oa%OOr#wOy#yO#n#kO~Ow%RO~P(QOn%SO|%SO~OQ#`Or#wOy#yO#n#kO!Zta^taatactaftagtahtajtaltantaotaptauta{ta#hta#mta!^ta#Pta#atawta!]ta~O!Z%TO~O!]%XO!x%VO!y%VO#m%UO~OQ#`Oc%ZOr#wOy#yO#P%]O#n#kO!Z#Oi#a#Oi!]#Oi~P(QO!Z%^OV!|iY!|i^!|i_!|if!|ig!|io!|ip!|iy!|i!O!|i!a!|i!n!|i!p!|i!r!|i!u!|i!{!|i#a!|i#h!|i#i!|i!]!|i~OjvO!Z#QX#a#QX!]#QX~P*bO!Z!rO~OQ#`Or#wOy#yO#n#kOa#XXc#XXf#XXg#XXh#XXj#XXl#XXn#XXo#XXp#XXu#XX{#XX!Z#XX#h#XX#m#XX~Oa#rac#ra!Z#ra~P(QOa%jOc$gO!Z$gO~Oa#jX~P$WOa%lO~Oc%mOa#kX~P(QOa%oO~OQ#`Or#wOw%pOy#yO#n#kO~Oc$rOa#ta~On%sO~Oa%uO~OQ#`Or#wOw%vOy#yO#n#kO~OQ#mOr#lOy#oO#n#kOc#]a!^#]a!Z#]aa#]a~Oa%wO~P4dOQ#`Or#wOw%xOy#yO#n#kO~Oa%yO~OP#vO!^mX~O!]%|O!x%VO!y%VO#m%UO~OQ#`Or#wOy#yO#n#kOc#`Xf#`Xg#`Xh#`Xj#`Xl#`Xn#`Xo#`Xp#`Xu#`X{#`X!Z#`X#P#`X#a#`X#h#`X#m#`X!]#`X~Oc%ZO#P&PO!Z#Oq#a#Oq!]#Oq~P(QOjvO!Z#Qa#a#Qa!]#Qa~P4dOQ#`Or#wOw&SOy#yO#n#kO~Oa#ric#ri!Z#ri~P(QOcmOa#ja~Oc%mOa#ka~OQ#`Or#wOy#yO#n#kOa#[ac#[a~Oa&WO~P(QOQ#`Or#wOy#yO#n#kOc#`af#`ag#`ah#`aj#`al#`an#`ao#`ap#`au#`a{#`a!Z#`a#P#`a#a#`a#h#`a#m#`a!]#`a~Oa#Yac#Ya~P(QO!Z&XO~Of#dpg#m|#iRSRr~",goto:"0^#zPPPPPP#{P$Q$^P$Q$j$QPP$sP$yPP%PPPP%jP%jP&ZPPP%jP'O%jP%jP%jP'jPP$QP(a$Q(jP$QP$Q$Q(p$QPPPP(w#{P)f)f)q)f)f)f)fP)f)t)f#{P#{P#{P){#{P*O*RPP#{P#{*U*aP*f*i*i*a*a*l*s*}+e+k+q+w+},T,_PPPP,e,k,pPP-[-_-bPPPP.u/UP/[/_/k0QP0VVdOhweXOhmrsuw#^#r$YeQOhmrsuw#^#r$YQkRQ!ulR%`$XQ}TR!}oQ#_}R$`!}Q#_!Or#x!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}R$`#O!]!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&T![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TT%V$P%WY#l![!m#j#t${s#w!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TQ!i]R$O!jQ!QUQ#PpR%_$WQ!SVR#QqZuS!w$k$}%aQxSS!znzQ#s!_Q$R!mQ$V!qS$^!|#[Q%c$]Q%z%VR&R%dc!^Z_!W!Z!`#l#m#p%sR#i!ZZ#n![!m#j#t${R!j]R!l^R$Q!lU`OhwQ!UWR$S!nVeOhwR$Z!qR$Y!qShOwR!thQnSS!yn%kR%k$kQ$d#UQ$m#`Y%f$d$m%g%t&TQ%g$eQ%t$uR&T%mQ%n$mR&U%nQ$h#YR%i$hQ$s#fR%r$sQ#q![R$|#qQ%W$PR%{%WQ!o`Q#c!UT$T!o#cQ%[$UR&O%[QiOR#ZwVfOhwUSOhwQ!wmQ#RrQ#SsQ#TuQ$k#^Q$}#rR%a$YR$l#^R$n#`Q!d[S#Uv$gQ#[yQ#f!XQ#u!bQ#|!gQ$U!qQ$]!{d$c#U#`$d$e$m$u%g%m%t&TQ$o#bQ$y#oQ%P#wQ%Q#yS%Y$U%[Q%d$_Q%e$bQ%q$rR%}%ZQzSQ!pbQ!|nQ%b$YR&Q%aQ#YvR%h$gR#g!XQ!_ZQ#e!WQ$x#mR&V%sW![Z!W#m%sQ!m_Q#j!ZQ#t!`Q$w#lR${#pVcOhwSgOwR!sh",nodeNames:`⚠ Unit ( Comment LineComment StyleSheet RuleSet UniversalSelector TagSelector TagName NestingSelector ClassSelector ClassName PseudoClassSelector : :: PseudoClassName ) ArgList , PseudoClassName ArgList VariableName AtKeyword PropertyVariable ValueName ( ParenthesizedValue ColorLiteral NumberLiteral StringLiteral Escape Interpolation BinaryExpression BinOp LogicOp UnaryExpression UnaryQueryOp CallExpression ] SubscriptExpression [ CallLiteral CallTag ParenthesizedContent IdSelector # IdName AttributeSelector AttributeName MatchOp ChildSelector ChildOp DescendantSelector SiblingSelector SiblingOp InterpolatedSelector ; when } { Block ImportStatement import KeywordQuery FeatureQuery FeatureName BinaryQuery UnaryQuery ParenthesizedQuery SelectorQuery selector CallQuery ArgList SubscriptQuery MediaStatement media CharsetStatement charset NamespaceStatement namespace NamespaceName KeyframesStatement keyframes KeyframeName KeyframeList from to SupportsStatement supports DetachedRuleSet PropertyName Declaration Important Inclusion IdSelector ClassSelector Inclusion CallExpression`,maxTerm:133,nodeProps:[[`isolate`,-3,3,4,30,``],[`openedBy`,17,`(`,59,`{`],[`closedBy`,26,`)`,60,`}`]],propSources:[b],skippedNodes:[0,3,4],repeatNodeCount:10,tokenData:"!2q~R!ZOX$tX^%l^p$tpq%lqr)Ors-xst/ltu6Zuv$tvw8^wx:Uxy;syz<Uz{<Z{|<t|}BQ}!OBc!O!PDo!P!QFY!Q![Jw![!]Kr!]!^Ln!^!_MP!_!`M{!`!aNl!a!b$t!b!c! m!c!}!&R!}#O!'y#O#P$t#P#Q!([#Q#R!(m#R#T$t#T#o!&R#o#p!)S#p#q!(m#q#r!)e#r#s!)v#s#y$t#y#z%l#z$f$t$f$g%l$g#BY$t#BY#BZ%l#BZ$IS$t$IS$I_%l$I_$I|$t$I|$JO%l$JO$JT$t$JT$JU%l$JU$KV$t$KV$KW%l$KW&FU$t&FU&FV%l&FV;'S$t;'S;=`!2k<%lO$t`$wSOy%Tz;'S%T;'S;=`%f<%lO%T`%YS|`Oy%Tz;'S%T;'S;=`%f<%lO%T`%iP;=`<%l%T~%qh#d~OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%T~'dh#d~|`OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%Tk)RUOy%Tz#]%T#]#^)e#^;'S%T;'S;=`%f<%lO%Tk)jU|`Oy%Tz#a%T#a#b)|#b;'S%T;'S;=`%f<%lO%Tk*RU|`Oy%Tz#d%T#d#e*e#e;'S%T;'S;=`%f<%lO%Tk*jU|`Oy%Tz#c%T#c#d*|#d;'S%T;'S;=`%f<%lO%Tk+RU|`Oy%Tz#f%T#f#g+e#g;'S%T;'S;=`%f<%lO%Tk+jU|`Oy%Tz#h%T#h#i+|#i;'S%T;'S;=`%f<%lO%Tk,RU|`Oy%Tz#T%T#T#U,e#U;'S%T;'S;=`%f<%lO%Tk,jU|`Oy%Tz#b%T#b#c,|#c;'S%T;'S;=`%f<%lO%Tk-RU|`Oy%Tz#h%T#h#i-e#i;'S%T;'S;=`%f<%lO%Tk-lS#PZ|`Oy%Tz;'S%T;'S;=`%f<%lO%T~-{WOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f<%lO-x~.jOn~~.mRO;'S-x;'S;=`.v;=`O-x~.yXOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f;=`<%l-x<%lO-x~/iP;=`<%l-xo/qY!OROy%Tz!Q%T!Q![0a![!c%T!c!i0a!i#T%T#T#Z0a#Z;'S%T;'S;=`%f<%lO%Tm0fY|`Oy%Tz!Q%T!Q![1U![!c%T!c!i1U!i#T%T#T#Z1U#Z;'S%T;'S;=`%f<%lO%Tm1ZY|`Oy%Tz!Q%T!Q![1y![!c%T!c!i1y!i#T%T#T#Z1y#Z;'S%T;'S;=`%f<%lO%Tm2QYl]|`Oy%Tz!Q%T!Q![2p![!c%T!c!i2p!i#T%T#T#Z2p#Z;'S%T;'S;=`%f<%lO%Tm2wYl]|`Oy%Tz!Q%T!Q![3g![!c%T!c!i3g!i#T%T#T#Z3g#Z;'S%T;'S;=`%f<%lO%Tm3lY|`Oy%Tz!Q%T!Q![4[![!c%T!c!i4[!i#T%T#T#Z4[#Z;'S%T;'S;=`%f<%lO%Tm4cYl]|`Oy%Tz!Q%T!Q![5R![!c%T!c!i5R!i#T%T#T#Z5R#Z;'S%T;'S;=`%f<%lO%Tm5WY|`Oy%Tz!Q%T!Q![5v![!c%T!c!i5v!i#T%T#T#Z5v#Z;'S%T;'S;=`%f<%lO%Tm5}Sl]|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm6^YOy%Tz!_%T!_!`6|!`!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Td7TS!SS|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm7h[h]|`Oy%Tz}%T}!O7a!O!Q%T!Q![7a![!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Ta8c[YPOy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%Ta9`[YP|`Oy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%T~:XWOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m<%lO:U~:tRO;'S:U;'S;=`:};=`O:U~;QXOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m;=`<%l:U<%lO:U~;pP;=`<%l:Uo;xSj_Oy%Tz;'S%T;'S;=`%f<%lO%T~<ZOa~m<bUVPrWOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%To<{Y#pQrWOy%Tz!O%T!O!P=k!P!Q%T!Q![@p![#R%T#R#SAm#S;'S%T;'S;=`%f<%lO%Tm=pU|`Oy%Tz!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%Tm>ZY#m]|`Oy%Tz!Q%T!Q![>S![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%Tm?OY|`Oy%Tz{%T{|?n|}%T}!O?n!O!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm?sU|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@^U#m]|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@w[#m]|`Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TbAtS#xQ|`Oy%Tz;'S%T;'S;=`%f<%lO%TkBVScZOy%Tz;'S%T;'S;=`%f<%lO%TmBhXrWOy%Tz}%T}!OCT!O!P=k!P!Q%T!Q![@p![;'S%T;'S;=`%f<%lO%TmCYW|`Oy%Tz!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%TmCy[f]|`Oy%Tz}%T}!OCr!O!Q%T!Q![Cr![!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%ToDtW#iROy%Tz!O%T!O!PE^!P!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%TlEcU|`Oy%Tz!O%T!O!PEu!P;'S%T;'S;=`%f<%lO%TlE|S#s[|`Oy%Tz;'S%T;'S;=`%f<%lO%T~F_VrWOy%Tz{Ft{!P%T!P!QIl!Q;'S%T;'S;=`%f<%lO%T~FyU|`OyFtyzG]z{Hd{;'SFt;'S;=`If<%lOFt~G`TOzG]z{Go{;'SG];'S;=`H^<%lOG]~GrVOzG]z{Go{!PG]!P!QHX!Q;'SG];'S;=`H^<%lOG]~H^OR~~HaP;=`<%lG]~HiW|`OyFtyzG]z{Hd{!PFt!P!QIR!Q;'SFt;'S;=`If<%lOFt~IYS|`R~Oy%Tz;'S%T;'S;=`%f<%lO%T~IiP;=`<%lFt~IsV|`S~OYIlYZ%TZyIlyzJYz;'SIl;'S;=`Jq<%lOIl~J_SS~OYJYZ;'SJY;'S;=`Jk<%lOJY~JnP;=`<%lJY~JtP;=`<%lIlmJ|[#m]Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TkKwU^ZOy%Tz![%T![!]LZ!];'S%T;'S;=`%f<%lO%TcLbS_R|`Oy%Tz;'S%T;'S;=`%f<%lO%TkLsS!ZZOy%Tz;'S%T;'S;=`%f<%lO%ThMUUrWOy%Tz!_%T!_!`Mh!`;'S%T;'S;=`%f<%lO%ThMoS|`rWOy%Tz;'S%T;'S;=`%f<%lO%TlNSW!SSrWOy%Tz!^%T!^!_Mh!_!`%T!`!aMh!a;'S%T;'S;=`%f<%lO%TjNsV!UQrWOy%Tz!_%T!_!`Mh!`!a! Y!a;'S%T;'S;=`%f<%lO%Tb! aS!UQ|`Oy%Tz;'S%T;'S;=`%f<%lO%To! rYg]Oy%Tz!b%T!b!c!!b!c!}!#R!}#T%T#T#o!#R#o#p!$O#p;'S%T;'S;=`%f<%lO%Tm!!iWg]|`Oy%Tz!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%Tm!#Y[g]|`Oy%Tz}%T}!O!#R!O!Q%T!Q![!#R![!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%To!$TW|`Oy%Tz!c%T!c!}!$m!}#T%T#T#o!$m#o;'S%T;'S;=`%f<%lO%To!$r^|`Oy%Tz}%T}!O!$m!O!Q%T!Q![!$m![!c%T!c!}!$m!}#T%T#T#o!$m#o#q%T#q#r!%n#r;'S%T;'S;=`%f<%lO%To!%uSp_|`Oy%Tz;'S%T;'S;=`%f<%lO%To!&W[#h_Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%To!'T[#h_|`Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%Tk!(OSyZOy%Tz;'S%T;'S;=`%f<%lO%Tm!(aSw]Oy%Tz;'S%T;'S;=`%f<%lO%Td!(pUOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tk!)XS!^ZOy%Tz;'S%T;'S;=`%f<%lO%Tk!)jS!]ZOy%Tz;'S%T;'S;=`%f<%lO%To!){Y#oQOr%Trs!*ksw%Twx!.wxy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tm!*pZ|`OY!*kYZ%TZr!*krs!+csy!*kyz!+vz#O!*k#O#P!-j#P;'S!*k;'S;=`!.q<%lO!*km!+jSo]|`Oy%Tz;'S%T;'S;=`%f<%lO%T]!+yWOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d<%lO!+v]!,hOo]]!,kRO;'S!+v;'S;=`!,t;=`O!+v]!,wXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!+v<%lO!+v]!-gP;=`<%l!+vm!-oU|`Oy!*kyz!+vz;'S!*k;'S;=`!.R;=`<%l!+v<%lO!*km!.UXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!*k<%lO!+vm!.tP;=`<%l!*km!.|Z|`OY!.wYZ%TZw!.wwx!+cxy!.wyz!/oz#O!.w#O#P!1^#P;'S!.w;'S;=`!2e<%lO!.w]!/rWOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W<%lO!/o]!0_RO;'S!/o;'S;=`!0h;=`O!/o]!0kXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!/o<%lO!/o]!1ZP;=`<%l!/om!1cU|`Oy!.wyz!/oz;'S!.w;'S;=`!1u;=`<%l!/o<%lO!.wm!1xXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!.w<%lO!/om!2hP;=`<%l!.w`!2nP;=`<%l$t",tokenizers:[v,y,_,0,1,2,3,4],topRules:{StyleSheet:[0,5]},specialized:[{term:116,get:e=>x[e]||-1},{term:23,get:e=>S[e]||-1}],tokenPrec:2180}),w=o.define({name:`less`,parser:C.configure({props:[t.add({Declaration:r()}),e.add({Block:c})]}),languageData:{commentTokens:{block:{open:`/*`,close:`*/`},line:`//`},indentOnInput:/^\s*\}$/,wordChars:`@-`}}),T=u(e=>e.name==`VariableName`||e.name==`AtKeyword`);function E(){return new s(w,w.data.of({autocomplete:T}))}export{E as less};