haac-aikit 0.9.0 → 0.10.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.
package/README.md CHANGED
@@ -6,6 +6,13 @@
6
6
 
7
7
  One command drops a working AI-coding setup into any repo — rules, skills, safety hooks, subagents, MCP stub, CI templates — for Claude Code, Cursor, Copilot, Windsurf, Aider, Gemini CLI, and Codex.
8
8
 
9
+ > [!TIP]
10
+ > **Just want HTML output from Claude Code?** Skip the full kit and install only the html-artifacts skill + 20 templates:
11
+ >
12
+ > ```bash
13
+ > npx haac-aikit init html
14
+ > ```
15
+
9
16
  ## Quickstart
10
17
 
11
18
  ```bash
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: html-artifacts
3
3
  description: Use when producing structured output that benefits from rich layout, comparison, drill-in, or interaction — specs, plans, PR reviews, design systems, prototypes, diagrams, decks, research explainers, reports, and custom editors. Scaffolds from 20 forked reference templates at `.aikit/templates/html-artifacts/` and fills them with project context. Maintains a gallery at `.aikit/artifacts/index.html`.
4
- version: "2.0.0"
4
+ version: "2.3.0"
5
5
  source: haac-aikit
6
6
  license: MIT
7
7
  inspired-by: https://thariqs.github.io/html-effectiveness (templates forked with permission, 2026-05-12)
@@ -35,6 +35,42 @@ When conditions match but the user didn't ask for HTML, say one sentence and wai
35
35
  - **Provenance footer**: every generated artifact ends with `Sources: … — generated <ISO timestamp>`
36
36
  - **AUTO-GENERATED pill**: top-right badge on agent-produced artifacts so readers know the origin
37
37
  - **Prompt callout**: exploration / planning artifacts preserve the originating user request in a cream-tinted box at top
38
+ - **Density-adaptive rendering**: when the artifact's total visible items (milestones + risks + cards + rows across all sections) is ≤ 6, drop decorations designed for dense pages — section numbers, tag chips, colored dot indicators, multi-column summary cards. These visuals were tuned for ~12-item artifacts; on sparse content they read as noise instead of hierarchy. The point of structure is signal; if there's little content, decoration buries it.
39
+ - **Decision callout first**: any artifact that asks the user to decide something starts with a "Decision needed" block at the top — the call-to-action in one sentence, options in chips (`A —` / `B —`), the recommendation marked. Don't make decision-makers scroll to find what to approve.
40
+
41
+ ## Accessibility (a11y)
42
+
43
+ Decision documents get read on phones, with screen readers, in high-contrast mode, by keyboard-only users. The bar is the same as the voice rule — make the artifact work for the actual reading environment, not just a desktop browser.
44
+
45
+ **Hard rules:**
46
+
47
+ 1. **Landmark roles** — wrap top-level structure in `<main>`, `<nav>`, `<article>`, `<aside>`. Screen readers use these to navigate; readers without them have to crawl the document linearly.
48
+ 2. **Alt text on every diagram and icon** — inline `<svg>` gets `<title>` + `aria-labelledby` or `aria-label`; `<img>` gets `alt="..."`. Purely decorative icons get `aria-hidden="true"` so they don't announce as noise.
49
+ 3. **Heading hierarchy never skips levels** — `<h1>` → `<h2>` → `<h3>`. Exactly one `<h1>` per artifact (the title).
50
+ 4. **Native form controls only** — `<input>` paired with `<label for="...">`, `<button>` for buttons, native `<select>`. No div-button hacks.
51
+ 5. **Color contrast ≥ 4.5:1 for body text, ≥ 3:1 for large text** — design tokens already meet WCAG AA; don't override per-artifact in ways that break the ratio.
52
+ 6. **Keyboard focus visible** — never `outline: none` without a `:focus-visible` replacement that meets contrast.
53
+
54
+ ## Voice & plain-language rule
55
+
56
+ The default reader is a smart non-specialist taking a decision. They should understand every sentence on first read without expanding tooltips, looking up jargon, or having prior domain context.
57
+
58
+ **Four sub-rules:**
59
+
60
+ 1. **One concept per sentence** — no "X with Y and Z" compounds.
61
+ 2. **Plain-language verb + concrete object** — "Load images only when the reader scrolls to them" beats "Implement lazy-loading via IntersectionObserver."
62
+ 3. **Jargon lives in tag chips, `<code>` spans, or collapsed `<details>`** — never in the main reading path.
63
+ 4. **Concrete first, abstract term in parens** — "Make sure failed requests retry safely (idempotent)" beats "Idempotent retry on failure."
64
+
65
+ **Three side-by-side examples (bad → good):**
66
+
67
+ | Bad | Good |
68
+ | --- | --- |
69
+ | "Schema & API contract — tRPC router stubs reviewed before anything else lands" | "Define the API the backend will expose. Review the contract before any UI work." |
70
+ | "Optimistic insert with rollback on failure, one level of nesting only" | "Show the comment immediately. Roll back if the server rejects it. One level of replies — no deeper threads." |
71
+ | "Fan-out via realtime channel, per-user read cursors track unread state" | "When a card is open, listen for new comments on it. Push updates to everyone watching." |
72
+
73
+ The technical details (`tRPC`, `optimistic insert`, `fan-out`) still appear in the artifact — but as tag chips beneath the prose, not in the reading path. The visible layer is decision-grade scannable; the chip layer keeps the artifact grep-able and AI-readable.
38
74
 
39
75
  ## Pattern playbook (9 patterns, aligned with the source)
40
76
 
@@ -42,7 +78,7 @@ When conditions match but the user didn't ask for HTML, say one sentence and wai
42
78
  **Templates**: `01-exploration-code-approaches.html`, `02-exploration-visual-designs.html`, `16-implementation-plan.html`
43
79
  **Use for**: comparing N approaches, exploring visual directions, handing off a plan
44
80
  **Concrete techniques**: numbered approach badges (`01`/`02`/`03`) in oat chips · equal-width code blocks for visual symmetry · pro/con tables with colored dot bullets (olive=pro, clay=con) · chip metrics footer (bundle, testability, reuse, SSR safety) · recommendation callout with left clay border + serif 22px · light/dark toggle via single `:root` swap · numbered milestone rows with date columns on left · phase cards with package chips · risks table (RISK / SEV / MITIGATION) · "Decide with · person · before slice N" footer on open questions
45
- **Must-haves**: preserve the originating prompt as a top callout; numbered section dots if > 4 sections
81
+ **Must-haves**: preserve the originating prompt as a top callout; numbered section dots if > 4 sections; **Decision needed block at the very top** — a clay-bordered card stating the call-to-action, the options considered (chips: `A —` / `B —`), and which one is recommended. Buried decisions are the failure mode this prevents.
46
82
 
47
83
  ### 2. Code Review & Understanding
48
84
  **Templates**: `03-code-review-pr.html`, `17-pr-writeup.html`, `04-code-understanding.html`
@@ -105,6 +141,9 @@ When conditions match but the user didn't ask for HTML, say one sentence and wai
105
141
  - Missing keyboard nav for editors — native form controls, not div-clicks
106
142
  - Missing AUTO-GENERATED badge on agent-produced artifacts — readers deserve to know
107
143
  - Missing provenance footer — "where did these numbers come from?" should always be answerable
144
+ - **Jargon-heavy main prose** — using `tRPC`, `fan-out`, `idempotent`, `IntersectionObserver` in the reading path makes the artifact unreadable for non-specialists. Plain-language verb + concrete object in prose; technical terms in tag chips and code blocks.
145
+ - **Decision buried below the fold** — artifact asks the user to approve, choose, or sign off but the call-to-action lives in Milestones or Risks, not at the top. Decision-makers shouldn't have to scroll to find what they're approving.
146
+ - **Missing alt text / aria-label on SVG and `<img>`** — diagrams and charts become invisible to screen readers, low-vision users, and search / indexing. Every visual element gets a text equivalent.
108
147
 
109
148
  ## Template scaffolding
110
149
 
@@ -117,15 +156,26 @@ When conditions match but the user didn't ask for HTML, say one sentence and wai
117
156
  1. **Read the manifest first**: `Read .aikit/templates/html-artifacts/MANIFEST.json`. Find the entry whose `category` matches the pattern from the playbook above and whose `slug` best matches the user's intent.
118
157
  2. **Read the matching template**: `Read .aikit/templates/html-artifacts/<file>.html` (the `file` field from the manifest entry). This is non-optional. If the file is missing, ask the user to run `aikit sync`; do not proceed without it.
119
158
  3. **Gather real project context**: run the appropriate commands — `git diff main...HEAD`, `git log --since=...`, read files mentioned in the prompt, etc. Replace the template's placeholder content with these real facts.
120
- 4. **Preserve structure verbatim** when writing the filled artifact:
159
+ 4. **Prune irrelevant sections before filling**. Scan the template's `<section>` blocks; for any not required by the user's intent, OMIT them from the filled artifact entirely (don't render them with empty placeholders). Aim for the minimum sections that carry signal — keeping all sections "just in case" forces the reader to skim each one to decide whether it's relevant. Section-keep guide:
160
+
161
+ | Templates | Always include | Optional (only if relevant) |
162
+ | --- | --- | --- |
163
+ | `01`, `02`, `16` (Exploration & Planning) | Milestones / Approaches + Risks | Data flow §02 (only if client↔server movement) · Mockups §03 (only if UI work) · Key code §04 (only if specific patterns to highlight) |
164
+ | `03`, `17`, `04` (Code Review) | PR header · Per-file details · Comments | Risk map (only if multiple severities) · Module-map SVG (only for arch reviews) |
165
+ | `11`, `12` (Reports) | Metric band + main table | Velocity chart (only if time series) · Incident timeline (only for incidents) |
166
+ | `18`, `19`, `20` (Editors) | Real columns + export button | Dependency warnings (only if dependencies) |
167
+ | All others | Core content sections of the pattern | Any section where placeholders would carry no signal |
168
+
169
+ 5. **Preserve structure verbatim** when writing the filled artifact:
121
170
  - All `:root` CSS variables (`--clay`, `--slate`, `--ivory`, `--oat`, `--olive`, `--gray-*`)
122
171
  - All class names, layout grids, and microinteraction conventions
123
172
  - All cross-cutting techniques (sticky positioning, `scroll-margin-top`, `<details>` collapsibles, native form controls)
124
173
  - The pattern's visual language (severity colors, badge styles, dot indicators, monospace meta text)
125
- 5. **Add required `<head>` elements**: `<title>`, `<meta name="description">`, and `<meta name="aikit-pattern" content="...">` with one of: `Exploration`, `Code Review`, `Design`, `Prototype`, `Illustrations`, `Deck`, `Research`, `Report`, `Editor`.
126
- 6. **Add AUTO-GENERATED pill** top-right and **provenance footer** (`Sources: ... generated <ISO timestamp>`).
127
- 7. **Save** to `.aikit/artifacts/NN-<slug>.html` (increment `NN` from existing files).
128
- 8. **Regenerate gallery index** per the protocol below.
174
+ - **Apply the Voice & plain-language rule** when writing prose into content nodes (`<p>`, `<h3>`, milestone bodies, risk explanations). Jargon goes in tag chips, `<code>` spans, or `<details>` never in main prose.
175
+ 6. **Add required `<head>` elements**: `<title>`, `<meta name="description">`, and `<meta name="aikit-pattern" content="...">` with one of: `Exploration`, `Code Review`, `Design`, `Prototype`, `Illustrations`, `Deck`, `Research`, `Report`, `Editor`.
176
+ 7. **Add AUTO-GENERATED pill** top-right and **provenance footer** (`Sources: ... generated <ISO timestamp>`).
177
+ 8. **Save** to `.aikit/artifacts/NN-<slug>.html` (increment `NN` from existing files).
178
+ 9. **Regenerate gallery index** per the protocol below.
129
179
 
130
180
  ### User-driven scaffolding (alternative)
131
181
 
@@ -254,7 +254,7 @@
254
254
  </style>
255
255
  </head>
256
256
  <body>
257
- <div class="page">
257
+ <main class="page">
258
258
 
259
259
  <header class="page-head">
260
260
  <div class="eyebrow">Exploration · Birchline web client</div>
@@ -448,6 +448,6 @@
448
448
  </p>
449
449
  </aside>
450
450
 
451
- </div>
451
+ </main>
452
452
  </body>
453
453
  </html>
@@ -392,7 +392,7 @@
392
392
  </div>
393
393
  </div>
394
394
 
395
- <div class="page">
395
+ <main class="page">
396
396
 
397
397
  <header class="page-head">
398
398
  <div class="eyebrow">Exploration · Empty states</div>
@@ -502,7 +502,7 @@
502
502
  </article>
503
503
 
504
504
  </section>
505
- </div>
505
+ </main>
506
506
 
507
507
  <script>
508
508
  const stages = document.querySelectorAll('.stage');
@@ -395,7 +395,7 @@
395
395
  </style>
396
396
  </head>
397
397
  <body>
398
- <div class="page">
398
+ <main class="page">
399
399
 
400
400
  <header class="pr-head">
401
401
  <div class="repo-line">birchline/web · Pull Request #247</div>
@@ -620,7 +620,7 @@
620
620
  </ul>
621
621
  </footer>
622
622
 
623
- </div>
623
+ </main>
624
624
 
625
625
  <script>
626
626
  // Briefly highlight a file card when reached via the risk-map anchors.
@@ -353,7 +353,7 @@
353
353
  </style>
354
354
  </head>
355
355
  <body>
356
- <div class="page">
356
+ <main class="page">
357
357
 
358
358
  <header>
359
359
  <h1>Birchline design system</h1>
@@ -624,6 +624,6 @@
624
624
  </div>
625
625
  </section>
626
626
 
627
- </div>
627
+ </main>
628
628
  </body>
629
629
  </html>
@@ -360,7 +360,7 @@
360
360
  </style>
361
361
  </head>
362
362
  <body>
363
- <div class="page">
363
+ <main class="page">
364
364
 
365
365
  <header>
366
366
  <h1>Card variant matrix</h1>
@@ -553,7 +553,7 @@
553
553
  <pre id="snippet">// hover a card to preview its props</pre>
554
554
  </div>
555
555
 
556
- </div>
556
+ </main>
557
557
 
558
558
  <script>
559
559
  (function () {
@@ -346,7 +346,7 @@
346
346
  </style>
347
347
  </head>
348
348
  <body>
349
- <div class="wrap">
349
+ <main class="wrap">
350
350
 
351
351
  <header>
352
352
  <div class="eyebrow">Birchline / prototype / micro-interaction</div>
@@ -363,7 +363,7 @@
363
363
  <div class="stage">
364
364
  <div class="task" id="task">
365
365
  <div class="check">
366
- <svg viewBox="0 0 16 16"><path d="M3 8.5 L6.5 12 L13 4.5"/></svg>
366
+ <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3 8.5 L6.5 12 L13 4.5"/></svg>
367
367
  </div>
368
368
  <span class="label">Send weekly digest</span>
369
369
  <span class="due">Fri</span>
@@ -433,7 +433,7 @@
433
433
  transition-delay: 600ms; }</pre>
434
434
  </section>
435
435
 
436
- </div>
436
+ </main>
437
437
 
438
438
  <script>
439
439
  var task = document.getElementById('task');
@@ -243,7 +243,7 @@
243
243
  </style>
244
244
  </head>
245
245
  <body>
246
- <div class="wrap">
246
+ <main class="wrap">
247
247
 
248
248
  <header>
249
249
  <div class="eyebrow">Birchline / prototype / interaction</div>
@@ -335,7 +335,7 @@
335
335
  </div>
336
336
 
337
337
  </div>
338
- </div>
338
+ </main>
339
339
 
340
340
  <script>
341
341
  var list = document.getElementById('list');
@@ -368,6 +368,8 @@
368
368
  </head>
369
369
  <body>
370
370
 
371
+ <main>
372
+
371
373
  <!-- ============================================================
372
374
  Slide 1 — Title
373
375
  ============================================================ -->
@@ -555,6 +557,8 @@
555
557
  </div>
556
558
  </section>
557
559
 
560
+ </main>
561
+
558
562
  <!-- ============================================================
559
563
  Slide counter
560
564
  ============================================================ -->
@@ -186,7 +186,7 @@
186
186
  </style>
187
187
  </head>
188
188
  <body>
189
- <div class="sheet">
189
+ <main class="sheet">
190
190
 
191
191
  <header>
192
192
  <h1>Background jobs — header illustrations</h1>
@@ -203,7 +203,8 @@
203
203
  ============================================================ -->
204
204
  <figure>
205
205
  <div class="canvas">
206
- <svg id="ill-queue" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320">
206
+ <svg id="ill-queue" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320" role="img" aria-labelledby="svg-queue-title">
207
+ <title id="svg-queue-title">Background job queue illustration showing five pending jobs and a worker pulling the next job for processing</title>
207
208
  <defs>
208
209
  <style>
209
210
  .m { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; }
@@ -265,7 +266,8 @@
265
266
  ============================================================ -->
266
267
  <figure>
267
268
  <div class="canvas">
268
- <svg id="ill-retry" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320">
269
+ <svg id="ill-retry" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320" role="img" aria-labelledby="svg-retry-title">
270
+ <title id="svg-retry-title">Retry with backoff timeline showing four attempts on a job, with exponential delays of one, two, and four seconds before the fourth succeeds</title>
269
271
  <defs>
270
272
  <style>
271
273
  .m { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; }
@@ -332,7 +334,8 @@
332
334
  ============================================================ -->
333
335
  <figure>
334
336
  <div class="canvas">
335
- <svg id="ill-fanout" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320">
337
+ <svg id="ill-fanout" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320" role="img" aria-labelledby="svg-fanout-title">
338
+ <title id="svg-fanout-title">Fan-out diagram showing an enqueue batch dispatching to multiple parallel worker lanes for concurrent job processing</title>
336
339
  <defs>
337
340
  <style>
338
341
  .m { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; }
@@ -471,7 +474,7 @@
471
474
  </ul>
472
475
  </section>
473
476
 
474
- </div>
477
+ </main>
475
478
 
476
479
  <script>
477
480
  document.querySelectorAll('.dl').forEach(function (btn) {
@@ -302,7 +302,7 @@
302
302
  </style>
303
303
  </head>
304
304
  <body>
305
- <div class="page">
305
+ <main class="page">
306
306
 
307
307
  <header>
308
308
  <div class="header-top">
@@ -523,6 +523,6 @@
523
523
  &nbsp;&mdash;&nbsp; generated Mar 16 2025 18:02
524
524
  </footer>
525
525
 
526
- </div>
526
+ </main>
527
527
  </body>
528
528
  </html>
@@ -393,7 +393,7 @@
393
393
  <a href="#actions">Action items</a>
394
394
  </nav>
395
395
 
396
- <div class="page">
396
+ <main class="page">
397
397
 
398
398
  <header>
399
399
  <div class="inc-id">INC-2025-0412</div>
@@ -591,6 +591,6 @@
591
591
  Authored from on-call notes + alert history &middot; reviewed by Devon Park, Mira Okafor
592
592
  </footer>
593
593
 
594
- </div>
594
+ </main>
595
595
  </body>
596
596
  </html>
@@ -158,7 +158,7 @@
158
158
  </style>
159
159
  </head>
160
160
  <body>
161
- <div class="sheet">
161
+ <main class="sheet">
162
162
 
163
163
  <header>
164
164
  <div class="eyebrow">Illustrations &amp; Diagrams · Flowchart</div>
@@ -173,7 +173,8 @@
173
173
 
174
174
  <div>
175
175
  <div class="canvas">
176
- <svg class="flow" viewBox="0 0 620 920">
176
+ <svg class="flow" viewBox="0 0 620 920" role="img" aria-labelledby="svg-flow-title">
177
+ <title id="svg-flow-title">Deploy pipeline flowchart for git push main showing CI steps, test gates, image build, deploy stages, and rollback path</title>
177
178
  <defs>
178
179
  <marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
179
180
  <path d="M0,0 L10,5 L0,10 z" fill="#87867F"/>
@@ -293,7 +294,7 @@
293
294
  </aside>
294
295
 
295
296
  </div>
296
- </div>
297
+ </main>
297
298
 
298
299
  <script>
299
300
  const DETAIL = {
@@ -191,7 +191,7 @@
191
191
 
192
192
  <div class="demo">
193
193
  <div class="demo-grid">
194
- <svg class="ring" id="ring" viewBox="0 0 260 260"></svg>
194
+ <svg class="ring" id="ring" viewBox="0 0 260 260" role="img" aria-labelledby="svg-ring-title"><title id="svg-ring-title">Consistent hashing ring diagram with nodes and keys placed around a circle; keys assign to the next clockwise node</title></svg>
195
195
  <div class="controls">
196
196
  <div class="row">
197
197
  <label>nodes</label>
@@ -383,7 +383,7 @@
383
383
  </style>
384
384
  </head>
385
385
  <body>
386
- <div class="page">
386
+ <main class="page">
387
387
 
388
388
  <header class="page-head">
389
389
  <div class="eyebrow">Implementation plan · Birchline web client</div>
@@ -462,7 +462,8 @@
462
462
  <p class="sec-intro">Optimistic write path on the left, fan-out on the right. The read cursor update is fire-and-forget — we never block the thread render on it.</p>
463
463
 
464
464
  <div class="diagram">
465
- <svg viewBox="0 0 860 340" xmlns="http://www.w3.org/2000/svg">
465
+ <svg viewBox="0 0 860 340" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="svg-dataflow-title">
466
+ <title id="svg-dataflow-title">Data flow diagram for comment threads showing optimistic write from CommentComposer through tRPC to the database and realtime fan-out to subscribers</title>
466
467
  <defs>
467
468
  <marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
468
469
  <path d="M0,0 L10,5 L0,10 z" fill="#87867F"/>
@@ -697,6 +698,6 @@
697
698
  </div>
698
699
  </section>
699
700
 
700
- </div>
701
+ </main>
701
702
  </body>
702
703
  </html>
@@ -291,7 +291,7 @@
291
291
  </style>
292
292
  </head>
293
293
  <body>
294
- <div class="wrap">
294
+ <main class="wrap">
295
295
 
296
296
  <header>
297
297
  <div class="eyebrow">Birchline / editor / triage</div>
@@ -314,7 +314,7 @@
314
314
 
315
315
  <div class="board" id="board"></div>
316
316
 
317
- </div>
317
+ </main>
318
318
 
319
319
  <script>
320
320
  // ---------- data ----------
@@ -302,7 +302,7 @@
302
302
  </style>
303
303
  </head>
304
304
  <body>
305
- <div class="wrap">
305
+ <main class="wrap">
306
306
 
307
307
  <header>
308
308
  <div class="eyebrow">Birchline / editor / feature-flags</div>
@@ -334,7 +334,7 @@
334
334
  </aside>
335
335
  </div>
336
336
 
337
- </div>
337
+ </main>
338
338
 
339
339
  <script>
340
340
  "use strict";
@@ -287,7 +287,7 @@
287
287
  </style>
288
288
  </head>
289
289
  <body>
290
- <div class="wrap">
290
+ <main class="wrap">
291
291
 
292
292
  <header>
293
293
  <div class="eyebrow">Birchline / editor / prompt-tuner</div>
@@ -328,7 +328,7 @@
328
328
 
329
329
  <footer>Highlighted slots fill from each sample's ticket fields. Anything underlined in dashed clay isn't a known field and will pass through unfilled.</footer>
330
330
 
331
- </div>
331
+ </main>
332
332
 
333
333
  <script>
334
334
  (function () {